diff --git a/content/posts/2022-year-end-summary.md b/content/posts/2022-year-end-summary.md deleted file mode 100644 index 1640263..0000000 --- a/content/posts/2022-year-end-summary.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "2022年终总结 💪" -description: "2022,回忆过去,展望未来" -uid: 501 -ctime: 2022-12-31T07:02:48.054Z -mtime: 2022-12-31T07:02:48.054Z ---- - - - -:ArticleToc -:ArticleHeader - -## 关键词 -2022,我的关键词是:**成长** - -> 当你看到这篇文章的时候,说明2022已经 Happy Ending,祝你新年快乐 🎉 - -## 数据 -![2022 Activity](/images/insights.png) - -2022年最后一天,目前`GitHub`{lang=ts}有`93`{lang=ts}的粉丝,b站个`12`{lang=ts}粉丝,感谢大家的喜欢。追随偶像的步伐,一步一步的在慢慢变优秀。 - -## 忆往昔 - -### UnoCSS -`UnoCSS`{lang=ts} 对我意义可太大了,它是我第一个疯狂参与贡献的开源项目。 - -我很荣幸陪伴了`Uno`{lang=ts}在整个2022年的成长。从最早的保持关注,再到我的第一个`PR`{lang=ts},再到受邀加入`Uno`{lang=ts}团队,最后再以维护者的身份维护`Uno`{lang=ts}。我和`Uno`{lang=ts}相辅相成,互相成长。 - -![unocss_invite](/images/unocss_invite.png) - -在维护`Uno`{lang=ts}的时间里,我帮助了很多人解答了`Uno`{lang=ts}相关的疑问,收获的很多的`Thanks`{lang=ts},这使我无比开心。同时也涨了很多粉,哈哈哈,谢谢大家的关注与喜欢,厚爱了。也结识到了很多大佬,很高兴认识你们,向你们学习。 - -截止目前,它`8.1k`{lang=ts}的`star`{lang=ts},超级开心😄。 - -### Onu-UI -提到`Uno`{lang=ts},便不得不提`Onu`{lang=ts}了,它是我使用`Uno`{lang=ts}开发的一个组件库。很有意思的是,它是名字也是来源的`Uno`{lang=ts},是`Uno`{lang=ts}的反写。哈哈哈😂,我恰好也很喜欢这个名字,真是妙不可言。 - -我开始研究多个很多组件库的源码,学习它们的结构,思想,然后摸索着搭建出`Onu`{lang=ts}的雏形。很厚脸皮的在`antfu`{lang=ts}群里发了个链接,想点点`star`{lang=ts}。然后被`antfu`{lang=ts}关注并鼓励到,经过`antfu`{lang=ts}的点赞,`star`{lang=ts}瞬间涨了很多。我信心大增,开始着手开发`Onu`{lang=ts}。 - -![antfu_reply_wechat](/images/antfu_reply_wechat.png) - -起初,`Onu`{lang=ts}的初衷是想作为一套拟态的组件库而使用,后来将它交给一位UI小姐姐指导,直接否定它与拟态不沾边,哈哈哈。后来,我就把它当作一套基础组件库来开发,它的目标是:**简单,易用,轻量**,想把`Uno`{lang=ts}的方便发挥到极致。途中,我遇到了另一位开源好友 [@yzh990918](https://github.com/yzh990918),很高兴认识他,并与他一起维护和开发`Onu`{lang=ts}。后面由于我的持续摆烂,我也将`Onu`{lang=ts}交给他来维护,我只是偶尔的参与一下。:(真是很对不起他的积极性,也对不起社区对`Onu`{lang=ts}的期望,明年我会认真维护和开发`Onu`{lang=ts}的。 - -### 书单 -- [x] 《Vue的设计与实现》- [霍春阳](https://github.com/HcySunYang) -- [x] 《活着》 - 余华 - -惭愧,只看了2本书,本是对文字敏感的人,却想饱腹诗书。谈起读书的感觉,很奇妙,真的可以让人静下心来好好思考,好好感受。 - -我花了中午午休的时间读完了《Vue的设计与实现》,不懂的地方立即打开电脑细读源码(我当时真的好认真)。 - -《活着》便是我在网络的节奏下,了解到了这本书,我对其中的魅力充满好奇,于是花了2个晚上读完了它。活着便是最好的幸运,亦是最大的勇气。 - -### 软考 -参加软考,这可真算是一件趣事了~~🤣 某月某日,公司群里突然响起说报名参加软考,**报销**。本着免费,不薅白不薅的心态和几个同事积极参与了报名。到最后,我们都没有复习,笑死😆,而且他们都鸽了,最后只剩我一人孤身奋战 :(不得不吐槽他们一句,可太菜了 -> 我不会告诉你,去年我也报名了,最后也鸽掉了🤪 - -经历2个月的折磨等待,成绩出来了,笑死,裸考差点就过(45分的及格线)。我当时心想:“啊,就这?认真一点不是必拿下吗?” -![](/images/ruankao_grades.png) - - -### 游戏 -少不了游戏哦(手游为主),它丰富了我的业余生活,哈哈哈。 -- 王者荣耀 - 最高段位:荣耀王者 🏆 (终于上去了) -- 英雄联盟 - 最高段位:超凡大师 🏆 (说实话,感觉很简单,只是不想多玩) -- 原神 - 一起去冒险吧/ 玩不太懂,杰杰快带我玩😭 -- etc... - 偶尔一些其他的 - -我感觉有在克制自己的游戏时间了,没有很痴狂了。当意识到在玩游戏而没有去学习的时候,我真的好惭愧,超后悔,呜呜呜。所以我国庆断了7天的Github提交记录,骂我自己,我是废物😭 - -### Covid-19 -呜呜呜🥹,我真的是服了,阳的太快了,太难受了,咳~咳咳~ -记录一下症状吧 -- 头晕,乏力,怕冷 🤕 -- 发烧 🤒️ -- 双腿疼~疼~疼 🤕 -- 咳嗽 🤧 -- 我服了,我还在咳嗽 🤧(应该是G了) - -明年我一定要多运动。希望大家都好好的,身体倍儿棒,吃麻麻香。 - - - -## 未来 -憧憬未来,我希望下一年的关键词是:**机遇**。 - -我期待着有很多的机会在等待着我去把握,也期待遇见结识优秀的人一起成长,更期待遇见对的人脱单。 - -明年也希望能收获一个满意的`Offer`{lang=ts},再有时间去旅游。第一站,那必然是我心心念念的`苏州`{lang=ts}了,在离开苏州的这几年,我好想它,故地重游,应该别有一番韵味吧。 - -## Flags -抱着试一试的心态,去年参加了掘金的立`Flag`{lang=ts}活动,斗胆给自己立了3个小目标,幸好还算是都完成了。Chris,辛苦了🤣。 - -
- -2022 Flag Aim - -- [x] 写个有用的`vite`{lang=ts}插件 -- [x] 写个有用的预设 -- [x] 写个`ui`{lang=ts}库,100`star`{lang=ts} - -
- -
- -- [ ] 女朋友、小猫咪(名儿我都想好了🤣) 统统拿下 -- [ ] 学车,拿到驾照 -- [ ] 认真维护自己的开源项目 -- [ ] 通过软考(拜托,你复习一下吧) -- [ ] 找到一个兴趣爱好,并且坚持下去 -- [ ] 买个相机,拍照,剪视频 - -2023年,请加倍努力💪 - -## Ending - -谢谢遇见的所有人,感恩发生的所有事。 - -最后祝看到这篇文章的人,2023年,祝你希望的希望都有希望。 - -也想对自己说:愿你永远保持纯真,奔赴热爱,不负时光,不负自己。 diff --git a/content/posts/about-auto-release-script.md b/content/posts/about-auto-release-script.md deleted file mode 100644 index 738bd6e..0000000 --- a/content/posts/about-auto-release-script.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -title: "About Auto Release Script 🚀" -description: "This is a description of the post." -uid: 501 -ctime: 2022-10-17T07:02:48.054Z -mtime: 2022-10-17T07:02:48.054Z ---- - -:ArticleToc -:ArticleHeader - - -## Background - -可能大家在公司写业务的时候,可能都会涉及到不同环境的分支的上线部署。测试,预发,正式服也都是不同的分支,打不同的`tag`{lang=html}去触发`CI/CD`{lang=html}。 - -我们可能会在测试服改很多次 bug,打很多的`tag`{lang=html},发布不同的测试版本。基于我司的`CI/CD`{lang=html}是自动化流程,和相匹配的契机,便写了一个自动化的脚本,来帮助我们快速的发布各种版本。 - -## Principle - -1. 通过命令获取发布的环境 -2. 根据环境和配置进行匹配 -3. 修改`package.json`{lang=html}中的`version`{lang=html}字段 -4. 通过`bummp`{lang=html}进行`Release`{lang=html} - -## Implementation -我们借助[`zx`{lang=ts}](https://github.com/google/zx)来实现这个脚本。 -> [`zx`{lang=ts}](https://github.com/google/zx) A tool for writing better scripts - -### Script - -首先我们在`scripts`{lang=html}文件夹下面建立我们的`release`{lang=html}脚本文件,然后思考,如何接受我们需要接受的环境变量`env`{lang=ts}呢? - -于是我们可以在`package.json`{lang=ts}中定义我们命令,通过命令的方式传入写入环境。 -```json -// package.json -"scripts": { - "release:test": "zx scripts/release.mjs -- test", - "release:pre": "zx scripts/release.mjs -- pre", - "release:prod": "zx scripts/release.mjs -- prod", -} -``` - -### Env -上面我们脚本命令传入参数,区别与不同的环境,于是我们接受环境变量`env`{lang=ts} -```ts -const [,,,, env] = process.argv // test or pre or prod -``` -这样我们就拿到了环境变量。但是出于严谨性判断,可能我们会在错误的分支上打`tag`{lang=html},于是我们需要对命令发布的时机和当前分支做判断 - -首先我们建立环境变量和正确分支之前的映射关系: - -```ts -const tag2branch = { - test: 'test', - pre: 'pre', - prod: 'main', -} -``` - -然后判断当前分支是否在映射表里,如何查看当前分支呢?很简单,我们使用`zx`{lang=ts} 执行 `git branch`{lang=ts} - -![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/81fda787925a4165bbc85aa1460fb3c3~tplv-k3u1fbpfcp-watermark.image?) - -我们发现当前分支前面有一个`*`{lang=html}进行标记,于是我们根据这一点,获取当前分支名。 -```ts -const res = await $`git branch` -const branchs = res.stdout.split('\n') -const currentBranch = branchs.find(b => b.includes('*')).replace(/[\*|\s]*/g, '') -``` - -然后判断`currentBranch`{lang=ts}是否是`env`{lang=ts}所对应的正确分支。 - -### NewVersion - -我们做了`env`{lang=ts}与`branch`{lang=ts}的判断,接下来我们需要生成下一次正确发布的版本。于是很简单 我们只需要对上一次的版本号进行+1操作就好了 - -如何获取上一次的发布的版本号呢? `git tag`{lang=ts}这个命令就很符合我们的要求,他会列出所有的`tag`{lang=html}。 - -于是 我们使用`zx`{lang=ts} 执行 `git tag`{lang=ts}。 - -![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3ed36bd4b02141efb827bd071f9f6106~tplv-k3u1fbpfcp-watermark.image?) - -> 截取一小部分,我们发现我们需要对`tags`{lang=html}进行`env`{lang=ts}的过滤 - -![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cabe8bb9a45d43d8ad8fbcc8256bd8b4~tplv-k3u1fbpfcp-watermark.image?) - -我们还发现`tags`{lang=html}的排序也有问题,并不是按照正确的版本顺序排,我们还需要正确的`sort`{lang=ts}一下。 - -> 根据个人情况而定。我司的`tag`{lang=html}都是 `${env}-${version}`{lang=ts}格式 - -获取`env`{lang=ts}对应的所有`versions`{lang=ts} - -```ts -const res = await $`git tag` -const allVersions = res.stdout.split('\n') - .filter(tag => tag.includes(env)) - .map(tag => tag.replace(new RegExp(`v(.+)-${env}`), '$1')) -``` -然后在对`veisons`{lang=ts}进行正确的排序。 -> 排序算法参考的别人的算法,待会见源码 - -```ts -const sortVersions = sortVersion(allVersions) -``` -这样`sortVersions[sortVersions.length - 1]`{lang=ts}便是我们的最新的版本号。 - -为了配合`bummp`{lang=ts}并且确保`package.json`{lang=html}的版本号也是正确的,我们需要将`package.json`{lang=html}的版本号也更新一下。 - -```ts -await modifyPkgVersion(sortVersions[sortVersions.length - 1] ?? '0.0.0') - -async function modifyPkgVersion(version) { - const pkg = await $`cat package.json` - await $`echo ${pkg.stdout.replace(/\"version\":\s*\"[^\"]+\"/, `"version": "${version}"`)} > package.json` -} -``` - -### Bummp Realease -我们已经将`package.json`{lang=html}更新为最新的版本,那么我们就可以使用`bummp`{lang=ts}进行发布了。 - -```ts -async function release() { - await $`pnpm exec bumpp package.json --commit "chore: release ${env} v%s" --push --tag "v%s-${env}"` - console.log(`${env} release success !`) -} -``` -> 每个人的`bumpp`{lang=ts}的配置可能不一样,这里只是一个简单的示例,我司的`tag`{lang=html}格式是`v${version}-${env}`{lang=ts}。 - -## Source Code -```ts -import { $ } from 'zx' - -const env = getEnv() -const tag2branch = { - test: 'test', - pre: 'pre', - prod: 'main', -} - -run() - -async function run() { - const isRightBranch = await isEnvBranch(env) - if (!isRightBranch) { - console.log('不是正确的分支') - return - } - - await modifyLastVersion() - await release() -} - -function getEnv() { - const [, , , , env] = process.argv - return env -} - -// 修改最新的版本号 -async function modifyLastVersion() { - const lastVersion = await getLatestTag() - if (!lastVersion) - console.log('没有历史 tag 版本,自动从 0.0.0 开始') - - await modifyPkgVersion(lastVersion ?? '0.0.0') -} - -// 修改package.json的版本号 -async function modifyPkgVersion(version) { - const pkg = await $`cat package.json` - await $`echo ${pkg.stdout.replace(/\"version\":\s*\"[^\"]+\"/, `"version": "${version}"`)} > package.json` - await clearLog() -} - -async function release() { - await $`pnpm exec bumpp package.json --commit "chore: release ${env} v%s" --push --tag "v%s-${env}"` - await clearLog() - console.log(`${env} release success !`) -} - -async function isEnvBranch() { - const res = await $`git branch` - const branchs = res.stdout.split('\n') - const currentBranch = branchs.find(b => b.includes('*')).replace(/[\*|\s]*/g, '') - - const aimBranch = tag2branch[env] - await clearLog() - return aimBranch === currentBranch -} - -async function getLatestTag() { - const res = await $`git tag` - const allVersions = res.stdout.split('\n') - .filter(tag => tag.includes(env)) - .map(tag => tag.replace(new RegExp(`v(.+)-${env}`), '$1')) - const sortVersions = sortVersion(allVersions) - await clearLog() - return sortVersions[sortVersions.length - 1] || undefined -} - -async function clearLog() { - await $`clear` -} - -function sortVersion(arr) { - const result = [...arr] - result.sort((a, b) => { - const items1 = a.split('.') - const items2 = b.split('.') - let k = 0 - for (const i in items1) { - const a1 = items1[i] - const b1 = items2[i] - if (typeof a1 === 'undefined') { - k = -1 - break - } - else if (typeof b1 === 'undefined') { - k = 1 - break - } - else { - if (a1 === b1) - continue - k = Number(a1) - Number(b1) - break - } - } - return k - }) - - return result -} -``` diff --git a/content/posts/analyzing-pinia-source-code.md b/content/posts/analyzing-pinia-source-code.md deleted file mode 100644 index a3affad..0000000 --- a/content/posts/analyzing-pinia-source-code.md +++ /dev/null @@ -1,436 +0,0 @@ ---- -title: 'Analyzing Pinia Source Code ✨' -description: 'A deep dive into Pinia source code' -uid: 501 -ctime: 2022-10-17T10:56:06.284Z -mtime: 2022-10-17T10:56:06.284Z ---- - -:ArticleToc -:ArticleHeader - -## 前言 -最近翻看`vue`的rfcs提案时,忽然看到`vuex5.0`{lang=ts}的提案,看到社区也有很多的探索讲解,于是我想给大家来点干货,顺便记录下我学习`pinia`{lang=ts}的过程。 - - - -![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d96b0f1f65dd443f888e8bce38a3c0b2~tplv-k3u1fbpfcp-watermark.image) -5.0的提案非常具有新鲜感,对比`vuex4`具有很大的改进 -- 支持`options api`{lang=ts} and `composition api`{lang=ts} -- 没有`mutations`{lang=ts} -- 没有嵌套的模块 -- 更好`typescript`{lang=ts}支持 -- 自动化的代码差分 - -于是我`fork`的一份代码,为了充分的理解`pinia`的流程,我在`examples`文件夹下使用`webpack`搭建了一个本地服务进行代码调试,欢迎大家`clone`和`debug` - -备注:`pinia version: 2.0` - -官网:[https://pinia.esm.dev/](https://pinia.esm.dev) - -我的git地址:[https://github.com/zyyv/learn-pinia](https://github.com/zyyv/learn-pinia) - -> 以下直接进行源码拆分讲解,api部分参考官网 - -## 入口 `createPinia` -假设你阅读或使用过`pinia`,我们知道`pinia`的入口是通过`createPinia`创建的`Pinia`实例,当我们在`vue`中使用时,使用`app.use(pinia)`加载`pinia` -```ts -import { createApp } from 'vue' -import { createPinia } from 'pinia' -import App from './App.vue' - -const pinia = createPinia() -const app = createApp(App).use(pinia) -app.mount('#app') -``` - -看下源码实现 -```ts -export function createPinia(): Pinia { - const state = ref({}) - let localApp: App | undefined - const _p: Pinia['_p'] = [] - const toBeInstalled: PiniaStorePlugin[] = [] - - // 这是当前的pinia实例 - const pinia: Pinia = markRaw({ - install(app: App) { // pinia 通过vue的插件机制,暴露对外的install方法 - pinia._a = localApp = app - app.provide(piniaSymbol, pinia) // 通过provide提供pinia实例,供后续使用 - app.config.globalProperties.$pinia = pinia // 暴露全局属性 $pinia - if (IS_CLIENT) - setActivePinia(pinia) // 设置当前活跃的 pinia - - toBeInstalled.forEach(plugin => _p.push(plugin)) // 加载pinia插件 - }, - - use(plugin) { // 这是pinia暴露的插件用法 - if (!localApp) - toBeInstalled.push(plugin) // 将插件存入[],待初始化的时候使用 - else - _p.push(plugin) - - return this - }, - - _p, - - _a: localApp!, // app 实例 - - state, // 所有状态 - }) - - return pinia -} -``` - -> 详细注释已标明 - -可以看到 `pinia 实例`拥有`state = ref({})` 这其实是所有的state的集合,后面会在`init`的时候,将其他模块的`state`挂载到`pinia`下 - -其实`pinia`也更好的集成了 `vue devtools` - -```ts -if (__DEV__ && IS_CLIENT) - pinia.use(devtoolsPlugin) -``` - -![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3a52d3485f554cf0954645dca9dfba3b~tplv-k3u1fbpfcp-watermark.image) - - -## 定义store `defineStore` -我们回顾一下 `defineStore Api`,可以看到,使用`defineStore`需要传入一个`options`配置,定义每一个`store` -```ts -import { defineStore } from 'pinia' - -// useStore could be anything like useUser, useCart -export const useStore = defineStore({ - // unique id of the store across your application - id: 'storeId', -}) -``` -我们来看下源码是如何写的呢? - -![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/710f457604bc4ee78a01a20f7eb11914~tplv-k3u1fbpfcp-watermark.image) - -可以清晰的看到,`defineStore` 简单的返回定义好的`useStore`,并标记唯一`$id` - -我们看看内部的`useStore`是如何处理传入的`options` - -> 个人见解:我将`useStore`分为4部分处理,下面逐一讲解 - -### 初始化形参`pinia` -粘贴部分代码讲解 -```ts -const currentInstance = getCurrentInstance() -const shouldProvide = currentInstance && !pinia - -pinia - = (__TEST__ && activePinia && activePinia._testing ? null : pinia) - || (currentInstance && inject(piniaSymbol)) -``` - -```ts -if (shouldProvide) - provide(storeAndDescriptor[2], store) -``` - -首先通过`vue`的`getCurrentInstance`拿到当前的vue实例,并判断形参的`pinia`是否存在,以后须判断是否需要向`children`提供当前的`store` - -> 这里提前讲有点懵,可以先略过,稍后再回顾 - -`pinia` 如果没有则会通过`inject`获取,因为在 `app.use`的时候,`install`方法内已经提供了 - -### 设置`activePinia` -```ts -if (pinia) setActivePinia(pinia) -pinia = getActivePinia() -``` -主要是设置当前活跃的是哪个`pinia`实例,当有多个`pinia`实例时,方便获取当前活跃的`pinia`实例 - -```ts -export let activePinia: Pinia | undefined - -export const setActivePinia = (pinia: Pinia | undefined) => - (activePinia = pinia) - -export const getActivePinia = () => { - if (__DEV__ && !activePinia) { - warn( - '[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?\n\n' - + 'const pinia = createPinia()\n' - + 'app.use(pinia)\n\n' - + 'This will fail in production.', - ) - } - - return activePinia! -} -``` - - -### 添加store缓存 -```ts -export const storesMap = new WeakMap< -Pinia, -Map< -string, -[ - StoreWithState, - StateDescriptor, - InjectionKey, -] -> ->() -``` -首先会导入一个`storesMap`,它的数据结构为`WeakMap`,`key`时一个`pinia`实例,`value`是一个`Map`结构 - -```ts -let storeCache = storesMap.get(pinia) -if (!storeCache) storesMap.set(pinia, (storeCache = new Map())) -``` - -先通过`pinia`作为`key`取`store`的缓存,如果缓存不存在,那么便设置一个新的`Map` -```ts -let storeAndDescriptor = storeCache.get(id) - -let store: Store - -if (!storeAndDescriptor) { - // 下面传入的参数:{options.id, options.state, 还记得pinia实例的state吗shi?是个Ref对象} - storeAndDescriptor = initStore(id, state, pinia.state.value[id]) - storeCache.set(id, storeAndDescriptor) - - ... -} else { - ... -} -``` -可以清晰看到,`storeCahe`通过`id`获取store的缓存与store的一些描述符(`storeAndDescriptor`) - -当我们没有获取到`storeCahe`时,会进行`initStore`的操作,并且可以看出`initStore`的返回结果,就是我们想要的`storeAndDescriptor`,并重新添加到缓存里面 - -### initStore -先看看 initStore 的参数与返回值 -```ts -function initStore< - Id extends string, - S extends StateTree, - G extends GettersTree, - A, /* extends ActionsTree */ ->( - $id: Id, // 每一个模块的id - buildState: () => S = () => ({} as S), // 模块的state - initialState?: S | undefined, // pinia实例下`{id}`的状态 -): [ - StoreWithState, - { get: () => S, set: (newValue: S) => void }, - InjectionKey, - ] { - // .. someCode -} - ``` - 形参在注释中标注,而我们可以看到返回值这一块,它将返回一个数组格式, - - `StoreWithState`这是交给外部使用的`store`实例 - - 第二位其实是`state`的属性描述符 - - 这是一个需要`provide`提供的`InjectionKey` - -然后看程序主体这一块 -```ts -const pinia = getActivePinia() -pinia.state.value[$id] = initialState || buildState() -``` -拿到当前活跃的`pinia`, 将模块的`state`通过`id`挂在到`pinia.state`下面 - - -![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5465363df38040c39adee7de5e2c2fce~tplv-k3u1fbpfcp-watermark.image) - -后面是定义了一些变量,有我们经常使用的`patch`函数,然后是一些依赖的收集与触发,我们留到下一章再讲 - -```ts -const storeWithState: StoreWithState = { - $id, - _p: pinia, - _as: actionSubscriptions as unknown as StoreOnActionListener[], - - // $state is added underneath - - $patch, - $subscribe, - $onAction, - $reset, -} as StoreWithState - -const injectionSymbol = __DEV__ - ? Symbol(`PiniaStore(${$id})`) - : /* istanbul ignore next */ - Symbol() - ``` - - 我们可以看到`storeWithState`的完整形态,它包含了一些属性与方法暴露给外部使用 - - 而我们的`injectionSymbol`是一个包含`$id`的`Symbol`类型 - - ```ts - return [ - storeWithState, - { - get: () => pinia.state.value[$id] as S, - set: (newState: S) => { - isListening = false - pinia.state.value[$id] = newState - isListening = true - }, - }, - injectionSymbol, - ] -``` -值得注意的是,数组的第二位是我们`descriptor`,主要是对state的获取与设置,因为我们可以通过在`pinia`实例上通过`id`拿到模块的`state` - -最后返回用数组包装的数据。`initStore`结束 - -### buildStoreToUse -回到`defineStore`的过程,当我们`initStore`结束,拿到`storeAndDescriptor`,会进行一个设置缓存的动作(上面有提到) - -那么`store`到底是什么数据格式呢,其实还是要通过`buildStoreToUse`包装一下 - -```ts -store = buildStoreToUse< -Id, -S, -G, -// @ts-expect-error: A without extends -A ->( - storeAndDescriptor[0], // storeWithState - storeAndDescriptor[1], // descriptor - id, // options.id - getters, // options.getters - actions, // options.actions - options, -) - ``` -那我们来看看是如何包装的把 - -#### getters -首先拿到当前活跃的`pinia`实例 -```ts -const pinia = getActivePinia() - -const computedGetters: StoreWithGetters = {} as StoreWithGetters -for (const getterName in getters) { - computedGetters[getterName] = computed(() => { - setActivePinia(pinia) - return getters[getterName].call(store, store) - }) as StoreWithGetters[typeof getterName] -} -``` -可以看到,使用了`for in`循环处理我们的配置的`getters`,同时,`getters`的`key`缓存到了`computedGetters`里面,并且使用`computed`包裹,实现了真正的计算属性。对`getters`通过`call`绑定`this`到`store`,并传入`store`到`getters`内 - - -#### actions -```ts -const wrappedActions: StoreWithActions = {} as StoreWithActions -for (const actionName in actions) { - wrappedActions[actionName] = function(this: Store) { - setActivePinia(pinia) - const args = Array.from(arguments) as Parameters - const localStore = this || store // 兼容箭头函数处理 - - let afterCallback: ( - resolvedReturn: UnwrapPromise> - ) => void = noop - let onErrorCallback: (error: unknown) => void = noop - function after(callback: typeof afterCallback) { - afterCallback = callback - } - function onError(callback: typeof onErrorCallback) { - onErrorCallback = callback - } - - partialStore._as.forEach((callback) => { - callback({ args, name: actionName, store: localStore, after, onError }) - }) - - let ret: ReturnType - try { - ret = actions[actionName].apply(localStore, args as unknown as any[]) - Promise.resolve(ret).then(afterCallback).catch(onErrorCallback) - } catch (error) { - onErrorCallback(error) - throw error - } - - return ret - } as StoreWithActions[typeof actionName] -} -``` -同样看到使用`for in`循环处理我们的`actions`,`actions`的`key`处理到了`wrappedActions`里面, -当我们触发`action`时,首先会设置最新的`pinia`实例。定义了一个`localStore`,并对其做了一个兼容处理,当时`action`为箭头函数时,`localStore`会指向`store`。 - -```ts -partialStore._as.forEach((callback) => { - callback({ args, name: actionName, store: localStore, after, onError }) -}) -``` -然后`action`的触发会对收集到的依赖进行发布 - -```ts -let ret: ReturnType -try { - ret = actions[actionName].apply(localStore, args as unknown as any[]) - Promise.resolve(ret).then(afterCallback).catch(onErrorCallback) -} catch (error) { - onErrorCallback(error) - throw error -} -return ret -``` -可以看到`action`的触发通过`apply`的方式传参,绑定`this`为`localStore`,同时它讲`arguments`数组化作为`payload`传入第二个参数,这意味着,在我们的`actions`中,可以有多个`payload`进行传递 - -我们`actions`执行的结果保存到`ret`中,再用`promise`包裹一层,最后我们返回原始的`ret`值。其实在这里我们可以看到,`Pinia`实现了将`actions`同步和异步的共同处理。对比`vuex`,`actions`是处理异步任务的配置项,返回结果用`promise`包装。而`Pinia`则是直接返回`actions`的返回值,通过`promise`进行事件循环的微任务执行,达到异步的处理。 - -#### store - -```ts -const store: Store = reactive( - assign( - __DEV__ && IS_CLIENT - ? // devtools custom properties - { - _customProperties: markRaw(new Set()), - } - : {}, - partialStore, - // using this means no new properties can be added as state - computedFromState(pinia.state, $id), - computedGetters, - wrappedActions, - ), -) as Store - ``` -然后处理我们的store,其实是使用了`Object.assign`进行混合 - -其实我们已经理解到`store`的`state`、`getters`都是用`computed`进行包装。使得我们可以直接对`state`进行直接的修改,对比`vuex`的`mutations`修改,操作上也是简化了不少 - -```ts -Object.defineProperty(store, '$state', descriptor) -``` -然后给`store`的`$state`添加我们传过来的属性描述符 - -最后返回`store`,`buildStoreToUse`结束。 - - -```ts -if (shouldProvide) - provide(storeAndDescriptor[2], store) - ``` - 回到最初的`shouldProvide`,它决定是否允许`child`重用这个`store`以避免创建一个新的`store` - -## 总结 - -第一章,简单介绍了入门篇章,后面将持续讲解,不定期更新。 - -以上及以下是我对`Pinia`的个人理解,如果不足或失误,请指正。 - -![pinia_1.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/63bdb685dd27444d99ff1cc682acf6fc~tplv-k3u1fbpfcp-watermark.image) diff --git a/content/posts/hello-world.md b/content/posts/hello-world.md deleted file mode 100644 index 45861c2..0000000 --- a/content/posts/hello-world.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: 'Hello World Test ✨' -description: 'Hello World Test' -uid: 501 -ctime: 2022-11-11T07:43:45.683Z -mtime: 2022-11-11T10:56:06.284Z -draft: true ---- - -:ArticleToc -:ArticleHeader -# H1 Heading - -## H2 Heading - -### H3 Heading - -#### H4 Heading - -##### H5 Heading - -###### H6 Heading - -## Paragraphs - -### English - -Most people would find the picture of our universe as an infinite tower of tortoises rather ridiculous, but why do we think we know better? What do we know about the universe, and how do we know it? Where did the universe come from, and where is it going? Did the universe have a beginning, and if so, what happened before then? What is the nature of time? Will it ever come to an end? Can we go back in time? - -Recent breakthroughs in physics, made possible in part by fantastic new technologies, suggest answers to some of these longstanding questions. Someday these answers may seem as obvious to us as the earth orbiting the sun – or perhaps as ridiculous as a tower of tortoises. Only time (whatever that may be) will tell. - -*Italic text*。**Bold text**。***Bold and nested italic text***。~~Strikethrough text~~。==highlight text==。 - -### 中文 - -大部分人会觉得,把我们的宇宙喻为一个无限的乌龟塔相当荒谬,可是为什么我们自以为知道得更多一些呢?我们对宇宙了解了多少?而我们又是怎样才知道的呢?宇宙从何而来又将向何处去?宇宙有开端吗?如果有的话,在这开端之前发生了什么?时间的本质是什么?它会有一个终结吗? - -在物理学上的一些最新突破,使一部分奇妙的新技术得以实现,从而对于回答这些长期以来悬而未决的某些问题有所启发。也许有一天这些答案会像我们认为地球绕着太阳运动那样显而易见——当然也可能像乌龟塔那般荒唐可笑。不管怎样,惟有让时间来判断了。 - -*斜体文本*。**加粗文本**。***加粗斜体文本***。~~删除文本~~。==高亮文本==。 - -## Link - - Github: https://github.com/zyyv - - Project: [Anyway](https://zyob.top) - - -## List - -- cz-git -- czg -- cz-git-extension(Todo) - diff --git a/content/posts/how-to-write-a-pinia-plugin.md b/content/posts/how-to-write-a-pinia-plugin.md deleted file mode 100644 index ee67f1c..0000000 --- a/content/posts/how-to-write-a-pinia-plugin.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: "How to write a pinia plugin 🤔️" -description: "一文带入走进 Pinia 插件的世界" -uid: 501 -ctime: 2022-10-17T10:51:13.858Z -mtime: 2022-10-17T10:51:13.858Z ---- - -:ArticleToc -:ArticleHeader - - -## plugin 能干嘛 - -- 向`store`添加新属性 -- 定义`store`时添加新选项 -- 向`store`添加新方法 -- 包装现有方法 -- 更改甚至取消操作 -- 实现本地存储等副作用 -- **只**对特定的`store`应用 - -## plugin本质 - -`pinia`的插件本质是一个函数,函数的返回值会混入到`store` - -案例上手: -```typescript -import { createPinia } from 'pinia' - -// 向所有的store混入一个secret属性 -function SecretPiniaPlugin() { - return { secret: 'the cake is a lie' } -} - -const pinia = createPinia() -pinia.use(SecretPiniaPlugin) -``` -```typescript -// 使用 -const store = useStore() -store.secret // 'the cake is a lie' -``` - -```typescript -export interface Pinia { - install: Exclude - state: Ref> - use(plugin: PiniaStorePlugin): Pinia // 使用插件 - _p: Array - _a: App - _testing?: boolean -} -``` - -```typescript -use(plugin) { - if (!localApp) { - toBeInstalled.push(plugin) - } else { - _p.push(plugin) - } - return this -} -``` -看一下源码的类型定义,我们可以看到`pinia`通过`use`使用插件,使用的插件会存放在实例的`_p`数组中,并返回`this`,即当前的实例。 - -## 插件的使用时机 -```typescript -function buildStoreToUse( - partialStore: StoreWithState, - descriptor: StateDescriptor, - $id: Id, - getters: G = {} as G, - actions: A = {} as A, - options: DefineStoreOptions -) { - ... // 省略部分代码 - // apply all plugins - pinia._p.forEach((extender) => { - if (__DEV__ && IS_CLIENT) { - // @ts-expect-error: conflict between A and ActionsTree - const extensions = extender({ store, app: pinia._a, pinia, options }) - Object.keys(extensions || {}).forEach((key) => - store._customProperties.add(key) - ) - assign(store, extensions) - } else { - // 插件返回的结果混合到 store 上面 - // @ts-expect-error: conflict between A and ActionsTree - assign(store, extender({ store, app: pinia._a, pinia, options })) - } - }) - - return store -} -``` -在`buildStoreToUse`函数中我们可以看到插件的应用,而`buildStoreToUse`恰好也是`useStore`的最后一步,此时我们可以拿到`store`的完整所有属性。 - -我们看到函数对`pinia._p`的所有插件进行循环,`extender`即我们`use`的插件。插件在此刻运行,把`{ store, app: pinia._a, pinia, options }`作为参数传递给我们的插件,而这个参数就是我们插件拿到的上下文。最后插件的返回结果会通过`Object.assign`进行混合。 - -即插件应用成功。此刻我们的`store`的能力就进行增加。 - -```typescript -export function myPiniaPlugin(context) { - context.pinia // the pinia created with `createPinia()` - context.app // the current app created with `createApp()` (Vue 3 only) - context.store // the store the plugin is augmenting - context.options // the options object defining the store passed to `defineStore()` - // ... -} -``` - -## 简单的案例 - -我们可以通过简单地在插件中返回它们的对象来向每个商店添加属性: - -```typescript -pinia.use(() => ({ hello: 'world' })) -``` - -还可以直接在`store`上设置属性 - -```typescript -pinia.use(({ store }) => { - store.hello = 'world' -}) -``` - -插件*返回*的任何属性都将被 devtools 自动跟踪,因此为了`hello`在 devtools 中可见,请确保`store._customProperties` 仅当您想在 devtools 中调试它时才将其添加到dev 模式: - -```typescript -// from the example above -pinia.use(({ store }) => { - store.hello = 'world' - // make sure your bundler handle this. webpack and vite should do it by default - if (process.env.NODE_ENV === 'development') { - store._customProperties.add('secret') - } -}) -``` diff --git a/content/posts/unocss-core-workflow.md b/content/posts/unocss-core-workflow.md deleted file mode 100644 index fafa040..0000000 --- a/content/posts/unocss-core-workflow.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -title: "带你深入了解 UnoCSS 核心引擎" -description: "一文带你深入了解 UnoCSS 核心引擎" -uid: 501 -ctime: 2022-10-19T07:43:45.683Z -mtime: 2022-10-19T07:43:45.683Z -draft: false ---- - -:ArticleToc - - -# {{ $doc.title}} - -{{ $doc.ctime }} - -## Dirs -```md -src/ -├── extractors/ # UnoCSS 提取器(提取给`UnoCSS`引擎进行解析) -│ └── ... -├── generator/ # 引擎核心功能 -│ └── index.ts -├── utils/ # UnoCSS 工具函数 -│ └── index.ts -└── config.ts/ # ResolveConfig -``` - -## Generator - -如果你想使用`UnoCSS`{lang=html}的核心功能,你可以直接使用`createGenerator`{lang=ts}函数。 - -```ts -const uno = createGenerator({ // 你的配置 }) -``` - -```ts -export function createGenerator(config?: UserConfig, defaults?: UserConfigDefaults) { - return new UnoGenerator(config, defaults) -} -``` -我们可以看到,`createGenerator`{lang=ts} 函数返回了一个`UnoGenerator`{lang=ts}类的实例,这个类包含了所有的核心功能。 - -```ts -export class UnoGenerator { - constructor( - public userConfig: UserConfig = {}, - public defaults: UserConfigDefaults = {}, - ) { - this.config = resolveConfig(userConfig, defaults) - this.events.emit('config', this.config) - } - - // ... -``` - -`UnoCSS`{lang=html} 在构造实例的时候会先去合并用户的配置和默认的配置项`resolveConfig`{lang=ts}。 - -## ResolveConfig -于是我们进入到 `config.ts`{lang=ts},我们来看看是如何合并用户配置的。 - -```ts -const config = Object.assign({}, defaults, userConfig) as UserConfigDefaults -const rawPresets = (config.presets || []).flatMap(toArray).map(resolvePreset) - -const sortedPresets = [ - ...rawPresets.filter(p => p.enforce === 'pre'), - ...rawPresets.filter(p => !p.enforce), - ...rawPresets.filter(p => p.enforce === 'post'), - ] - -const layers = Object.assign(DEFAULT_LAYERS, ...rawPresets.map(i => i.layers), userConfig.layers) -``` -`UnoCSS`{lang=html} 采用`assign`{lang=ts}合并配置,并对配置中的预设进行`enforce`{lang=ts} 排序,也对`layer`{lang=ts}进行合并。 - -```ts -type mergeKey = 'rules' | 'variants' | 'extractors' | 'shortcuts' | 'preflights' | 'preprocess' | 'postprocess' | 'extendTheme' | 'safelist' - -function mergePresets(key: T): Required[T] { - return uniq([ - ...sortedPresets.flatMap(p => toArray(p[key] || []) as any[]), - ...toArray(config[key] || []) as any[], - ]) -} -``` -`mergePresets`{lang=ts} 函数会对预设中的部分`key`{lang=ts}进行合并,并返回一个数组。 -> 此举主要是为了合并多个预设中的相同字段的值进行汇总。 - -### extractors -```ts -const extractors = mergePresets('extractors') -if (!extractors.length) - extractors.push(extractorSplit) -extractors.sort((a, b) => (a.order || 0) - (b.order || 0)) -``` - -用户可以在预设中,自定义提取器,于是我们对其进行合并,并对它的执行顺序进行排序 - -### rules -我们都知道,`UnoCSS`{lang=html}有动静态规则,用户可以完全控制规则,使`UnoCSS`{lang=html} 按照其逻辑进行返回内容。 - -```ts -const rules = mergePresets('rules') -const rulesStaticMap: ResolvedConfig['rulesStaticMap'] = {} - -const rulesSize = rules.length - -const rulesDynamic = rules - .map((rule, i) => { - if (isStaticRule(rule)) { - const prefix = rule[2]?.prefix || '' - rulesStaticMap[prefix + rule[0]] = [i, rule[1], rule[2], rule] - // delete static rules so we can't skip them in matching - // but keep the order - return undefined - } - return [i, ...rule] - }) - .filter(Boolean) - .reverse() as ResolvedConfig['rulesDynamic'] -``` -我们通过循环所有的规则将动静态规则分离: -```ts -// types -{ - rulesStaticMap: Record - rulesDynamic: [number, ...DynamicRule][] // [规则的索引, 具体的规则逻辑][] -} -``` -`UnoCSS`{lang=html} 的动态解析逻辑为倒序解析,所以在最后会有 `reverse`{lang=ts} 动作。因为静态规则是一个对象,如果遇到重复的 `key`,会后者覆盖前者。 -> 用户自定义动态规则时,优先会解析后面的规则 -如果你的静态规则与`presetUno`{lang=ts} 或者其他预设规则冲突,不必担心,在`mergePresets`{lang=ts}时,优先以用户规则为主。 - -> Check The [Playground](https://uno.antfu.me/play/?html=DwEwlgbgUABDDGBXAzgFwPYFsC0AnRANgKbIAiAngHYCGmY8sMqRAHqtgEwsFQB8j%2BYmSq16UYAHpwEfuOmMkaLHkJFGzNp258Bq4TToNJ0-kA&config=JYWwDg9gTgLgBAbzgEwKYDNgDtUGEJaYDmANHGFKgM6owCCMMUwARgK4zDoCeZF1tAKpYIcAL5x0UCCDgByNiIDGVKnIBQ61AA9IsFBgCGbADbw0mHPkLAiACgTq4cKKeoAuOAG0nz73KU2KhgZAFpXE1Q5MiQlCBNoTzkWEzYo8QBdEl9nLwCgkJBwt2jEODiEqCTKZDlM7JzvAHoAPUDgsIjqABFuLEMQYCUAEiayOwBKOABeAD44B3L4xPkaurEJrMavVvbC4siqXv7BkbGFqbmF2OWq%2BRS09c3s5y3nfhoYKk8vD6ERSZ8SifBhMVgcLjcSZbDbqIA&options=N4IgzgLgTglgxhEAuaBXApgGhNAhgOzADMB7KAW2SNwBswsQp0wAHEwmAN3StvoF8gA) - - -### shortcuts -我们知道我们的`shortcuts`{lang=ts}也有动静态区分,`StaticShortcutMap`{lang=ts} `DynamicShortcut`{lang=ts},而且`shortcuts`的类型不一,既可以是`Array`{lang=ts} Or `Object`{lang=ts},所以我们需要对其进行处理: -```ts -export function resolveShortcuts(shortcuts: UserShortcuts): Shortcut[] { - return toArray(shortcuts).flatMap((s) => { - if (Array.isArray(s)) - return [s] - return Object.entries(s) - }) -} -``` - -还记得我们的`rawPreset`{lang=ts}吗?在`preset`{lang=ts} `Resolve`{lang=html} 时,我们会将`shortcuts`{lang=ts}和`rules`{lang=ts}进行一并处理 -主要是因为当我们的`preset`{lang=ts}中指定了`prefix`{lang=ts} `layer`{lang=ts}时,为了使其工作在正确的预设环境中,我们需要将其进行一次`Resolve`{lang=html}。 -```ts -if (preset.prefix || preset.layer) { - const apply = (i: Rule | Shortcut) => { - if (!i[2]) - i[2] = {} - const meta = i[2] - if (meta.prefix == null && preset.prefix) - meta.prefix = preset.prefix - if (meta.layer == null && preset.layer) - meta.prefix = preset.layer - } - shortcuts?.forEach(apply) - preset.rules?.forEach(apply) -} -``` - -### themes -```ts -const theme = clone([ - ...sortedPresets.map(p => p.theme || {}), - config.theme || {}, -].reduce((a, p) => mergeDeep(a, p), {})) - -;(mergePresets('extendTheme') as ThemeExtender[]).forEach(extendTheme => extendTheme(theme)) -``` -我们将所有预设中的 `theme`{lang=ts} 和用户自定义的 `theme`{lang=ts} 进行深度合并,最后将 `extendTheme`{lang=ts} 中的函数执行,将 `theme`{lang=ts} 作为参数传入,这样用户就可以对 `theme`{lang=ts} 进行扩展。 - -> 将来我会在`presetMini`{lang=ts}中解析 `theme`{lang=ts},并介绍其中的用法,敬请期待。 - -### autocomplete -提取每个预设中的 `autocomplete`{lang=ts},并将其合并为一个数组,最后将其作为 `autocomplete`{lang=ts} 的值。 -```ts -const autocomplete = { - templates: uniq(sortedPresets.map(p => toArray(p.autocomplete?.templates)).flat()), - extractors: sortedPresets.map(p => toArray(p.autocomplete?.extractors)).flat() - .sort((a, b) => (a.order || 0) - (b.order || 0)), -} -``` - -`ResolveConfig` 流程结束,最后返回我们的 `config`{lang=ts}。 -```ts -return { - mergeSelectors: true, - warn: true, - blocklist: [], - sortLayers: layers => layers, - ...config, - presets: sortedPresets, - envMode: config.envMode || 'build', - shortcutsLayer: config.shortcutsLayer || 'shortcuts', - layers, - theme, - rulesSize, - rulesDynamic, - rulesStaticMap, - preprocess: mergePresets('preprocess') as Preprocessor[], - postprocess: mergePresets('postprocess') as Postprocessor[], - preflights: mergePresets('preflights'), - autocomplete, - variants: mergePresets('variants').map(normalizeVariant), - shortcuts: resolveShortcuts(mergePresets('shortcuts')), - extractors, - safelist: mergePresets('safelist'), -} -``` - -## Generate -`UnoCSS`{lang=html} 的 `Generate`{lang=html} 核心,主要是将我们的 `input`{lang=ts} 解析生成 `css`{lang=ts}。 - -```ts -async generate( - input: string | Set | string[], - options: GenerateOptions = {}, -): Promise { - const { - id, // 在提取token阶段用到文件id - scope, // 生成的css的作用域 - preflights = true, // 是否生成preflights - safelist = true, // 是否应用safelist - minify = false, // 是否压缩css - } = options - - // ... -} -``` -首先我们先观察函数的参数与返回值,我们可以看到,`input`{lang=ts} 可以是 `string`{lang=ts} `Set`{lang=ts} `Array`{lang=ts},`options`{lang=ts} 有 `id`{lang=ts} `scope`{lang=ts} `preflights`{lang=ts} `safelist`{lang=ts} `minify`{lang=ts},返回值是一个`Promise`{lang=ts} `GenerateResult`{lang=ts}。 - - -### applyExtractors -`UnoCSS`{lang=html} 会将 `input`{lang=ts} 交给 `extractors`{lang=ts} 进行解析提取`token`{lang=ts},最终提取出的 `token`{lang=ts} 会是`Set`{lang=ts} `string`{lang=ts}的形式,确保每个 `token`{lang=ts} 是唯一的。 -```ts -const tokens: Readonly> = isString(input) - ? await this.applyExtractors(input, id) - : Array.isArray(input) - ? new Set(input) - : input -``` - -因为我们的 `config.extractors`{lang=ts} 是一个数组,所以我们需要遍历它,将 `input`{lang=ts} 交给每个 `extractor`{lang=ts} 进行解析,最后将所有解析出来的 `token`{lang=ts} 合并为一个 `Set`{lang=ts}。 -```ts -const context: ExtractorContext = { - get original() { return code }, - code, - id, -} - -for (const extractor of this.config.extractors) { - const result = await extractor.extract(context) - if (result) { - for (const token of result) - set.add(token) - } -} -``` - -如果我们应用了`safelist`{lang=ts},那么我们还需要将`safelist`{lang=ts}中的`token`{lang=ts}合并到`set`{lang=ts}中。 -```ts -if (safelist) - this.config.safelist.forEach(s => tokens.add(s)) -``` - -最后我们得到了我们需要去解析的所有`token`{lang=ts},接下来将这些`token`{lang=ts}解析成`css`{lang=ts}。 diff --git a/nuxt.config.ts b/nuxt.config.ts index ac060a7..1cefedd 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -5,7 +5,7 @@ export default defineNuxtConfig({ modules: [ '@vueuse/nuxt', '@unocss/nuxt', - '@nuxt/content', + // '@nuxt/content', // '@vite-pwa/nuxt', ], experimental: { diff --git a/package.json b/package.json index 81493a3..5cd81bd 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "eslint": "^8.48.0", "esno": "^0.17.0", "fs-extra": "^11.1.1", - "nuxt": "3.7.0", + "nuxt": "3.6.5", "sass": "^1.66.1", "typescript": "5.1.6", "unocss-preset-scrollbar": "^0.2.1", diff --git a/pages/posts/[...slug].vue b/pages/posts/[...slug].vue deleted file mode 100644 index 6ab95a5..0000000 --- a/pages/posts/[...slug].vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/pages/posts/index.vue b/pages/posts/index.vue deleted file mode 100644 index 1c58271..0000000 --- a/pages/posts/index.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49c091b..9ebd0a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ devDependencies: version: /@nuxt/content-edge@2.7.2-28219454.aa61d9f(vue@3.3.4) '@nuxt/devtools': specifier: ^0.8.0 - version: 0.8.2(nuxt@3.7.0)(vite@4.4.9) + version: 0.8.2(nuxt@3.6.5)(vite@4.4.9) '@types/fs-extra': specifier: ^11.0.1 version: 11.0.1 @@ -55,7 +55,7 @@ devDependencies: version: 0.55.3(postcss@8.4.28)(vite@4.4.9)(webpack@5.88.2) '@vueuse/nuxt': specifier: ^10.4.0 - version: 10.4.1(nuxt@3.7.0)(vue@3.3.4) + version: 10.4.1(nuxt@3.6.5)(vue@3.3.4) eslint: specifier: ^8.48.0 version: 8.48.0 @@ -66,8 +66,8 @@ devDependencies: specifier: ^11.1.1 version: 11.1.1 nuxt: - specifier: 3.7.0 - version: 3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) + specifier: 3.6.5 + version: 3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) sass: specifier: ^1.66.1 version: 1.66.1 @@ -531,6 +531,15 @@ packages: get-tsconfig: 4.7.0 dev: true + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -549,6 +558,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -567,6 +585,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -585,6 +612,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -603,6 +639,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -621,6 +666,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -639,6 +693,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -657,6 +720,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -675,6 +747,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -693,6 +774,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -711,6 +801,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -729,6 +828,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -747,6 +855,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -765,6 +882,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -783,6 +909,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -801,6 +936,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -819,6 +963,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -837,6 +990,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -855,6 +1017,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -873,6 +1044,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -891,6 +1071,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -909,6 +1098,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -1278,7 +1476,7 @@ packages: resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} dev: true - /@nuxt/devtools-kit@0.8.2(nuxt@3.7.0)(vite@4.4.9): + /@nuxt/devtools-kit@0.8.2(nuxt@3.6.5)(vite@4.4.9): resolution: {integrity: sha512-GEqpBxa/ojfhAM9HN5L/OzCADpfH9nDbcC7INHFgao6KuAu6JclTpcuV6VZP6LthsETBsd2cKAt93WY+vEJnnQ==} peerDependencies: nuxt: ^3.6.5 @@ -1287,8 +1485,8 @@ packages: '@nuxt/kit': /@nuxt/kit-edge@3.7.1-28219436.a256c874 '@nuxt/schema': 3.7.0 execa: 7.2.0 - nuxt: 3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) - vite: 4.4.9(sass@1.66.1) + nuxt: 3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - rollup - supports-color @@ -1311,7 +1509,7 @@ packages: semver: 7.5.4 dev: true - /@nuxt/devtools@0.8.2(nuxt@3.7.0)(vite@4.4.9): + /@nuxt/devtools@0.8.2(nuxt@3.6.5)(vite@4.4.9): resolution: {integrity: sha512-E3ycLEkqTlXpdz3P7lJRMdB4AnC4tzALM6N6eCUskSCtUQfF57mjk0k7z1duHIjU8xTIFm6gnsotJnR/n6/B0g==} hasBin: true peerDependencies: @@ -1319,7 +1517,7 @@ packages: vite: '*' dependencies: '@antfu/utils': 0.7.6 - '@nuxt/devtools-kit': 0.8.2(nuxt@3.7.0)(vite@4.4.9) + '@nuxt/devtools-kit': 0.8.2(nuxt@3.6.5)(vite@4.4.9) '@nuxt/devtools-wizard': 0.8.2 '@nuxt/kit': /@nuxt/kit-edge@3.7.1-28219436.a256c874 birpc: 0.2.13 @@ -1339,7 +1537,7 @@ packages: launch-editor: 2.6.0 local-pkg: 0.4.3 magicast: 0.2.10 - nuxt: 3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) + nuxt: 3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) nypm: 0.3.1 ofetch: 1.3.3 ohash: 1.1.3 @@ -1353,7 +1551,7 @@ packages: simple-git: 3.19.1 sirv: 2.0.3 unimport: 3.2.0(rollup@3.28.1) - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) vite-plugin-inspect: 0.7.38(@nuxt/kit-edge@3.7.1-28219436.a256c874)(vite@4.4.9) vite-plugin-vue-inspector: 3.6.0(vite@4.4.9) wait-on: 7.0.1 @@ -1414,6 +1612,24 @@ packages: - supports-color dev: true + /@nuxt/schema@3.6.5: + resolution: {integrity: sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==} + engines: {node: ^14.18.0 || >=16.10.0} + dependencies: + defu: 6.1.2 + hookable: 5.5.3 + pathe: 1.1.1 + pkg-types: 1.0.3 + postcss-import-resolver: 2.0.0 + std-env: 3.4.3 + ufo: 1.3.0 + unimport: 3.2.0(rollup@3.28.1) + untyped: 1.4.0 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + /@nuxt/schema@3.7.0: resolution: {integrity: sha512-fNRAubny1x6rIibm/HcacnEGeAQri/FkJ5ei24aY4YjQ12+xDfi7bljfFr6C2+CrEGc1beYd4OQcUqXqEpz5+g==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1466,22 +1682,22 @@ packages: resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==} dev: true - /@nuxt/vite-builder@3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6)(vue@3.3.4): - resolution: {integrity: sha512-bRJy3KarHrFm/xLGHoHeZyqI/h6c4UFRCF5ngRZ/R9uebJEHuL4UhAioxDLTFu7D0vEeK7XaDgx6+NPLhBg51g==} + /@nuxt/vite-builder@3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6)(vue@3.3.4): + resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==} engines: {node: ^14.18.0 || >=16.10.0} peerDependencies: vue: ^3.3.4 dependencies: '@nuxt/kit': /@nuxt/kit-edge@3.7.1-28219436.a256c874 '@rollup/plugin-replace': 5.0.2(rollup@3.28.1) - '@vitejs/plugin-vue': 4.3.3(vite@4.4.9)(vue@3.3.4) - '@vitejs/plugin-vue-jsx': 3.0.2(vite@4.4.9)(vue@3.3.4) + '@vitejs/plugin-vue': 4.3.3(vite@4.3.9)(vue@3.3.4) + '@vitejs/plugin-vue-jsx': 3.0.2(vite@4.3.9)(vue@3.3.4) autoprefixer: 10.4.15(postcss@8.4.28) clear: 0.1.0 consola: 3.2.3 cssnano: 6.0.1(postcss@8.4.28) defu: 6.1.2 - esbuild: 0.19.2 + esbuild: 0.18.20 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 externality: 1.0.2 @@ -1503,11 +1719,11 @@ packages: strip-literal: 1.3.0 ufo: 1.3.0 unplugin: 1.4.0 - vite: 4.4.9(sass@1.66.1) - vite-node: 0.33.0(sass@1.66.1) - vite-plugin-checker: 0.6.2(eslint@8.48.0)(typescript@5.1.6)(vite@4.4.9) + vite: 4.3.9(@types/node@20.5.7)(sass@1.66.1) + vite-node: 0.33.0(@types/node@20.5.7)(sass@1.66.1) + vite-plugin-checker: 0.6.2(eslint@8.48.0)(typescript@5.1.6)(vite@4.3.9) vue: 3.3.4 - vue-bundle-renderer: 2.0.0 + vue-bundle-renderer: 1.0.3 transitivePeerDependencies: - '@types/node' - eslint @@ -2503,7 +2719,7 @@ packages: '@unocss/core': 0.55.3 '@unocss/reset': 0.55.3 '@unocss/vite': 0.55.3(vite@4.4.9) - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - rollup dev: true @@ -2733,7 +2949,7 @@ packages: chokidar: 3.5.3 fast-glob: 3.3.1 magic-string: 0.30.3 - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - rollup dev: true @@ -2778,7 +2994,7 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue-jsx@3.0.2(vite@4.4.9)(vue@3.3.4): + /@vitejs/plugin-vue-jsx@3.0.2(vite@4.3.9)(vue@3.3.4): resolution: {integrity: sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2788,20 +3004,20 @@ packages: '@babel/core': 7.22.11 '@babel/plugin-transform-typescript': 7.22.11(@babel/core@7.22.11) '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.22.11) - vite: 4.4.9(sass@1.66.1) + vite: 4.3.9(@types/node@20.5.7)(sass@1.66.1) vue: 3.3.4 transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-vue@4.3.3(vite@4.4.9)(vue@3.3.4): + /@vitejs/plugin-vue@4.3.3(vite@4.3.9)(vue@3.3.4): resolution: {integrity: sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.9(sass@1.66.1) + vite: 4.3.9(@types/node@20.5.7)(sass@1.66.1) vue: 3.3.4 dev: true @@ -2963,7 +3179,7 @@ packages: resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==} dev: true - /@vueuse/nuxt@10.4.1(nuxt@3.7.0)(vue@3.3.4): + /@vueuse/nuxt@10.4.1(nuxt@3.6.5)(vue@3.3.4): resolution: {integrity: sha512-tJ25KCkozZaQEy0qli4Ta8WXlbMIjSD7gPnVfLScZ2DpSSgImMB5R66PQEkrbSg4GfFj0OuoYc4+vCHQ/FqTsw==} peerDependencies: nuxt: ^3.0.0 @@ -2972,7 +3188,7 @@ packages: '@vueuse/core': 10.4.1(vue@3.3.4) '@vueuse/metadata': 10.4.1 local-pkg: 0.4.3 - nuxt: 3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) + nuxt: 3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6) vue-demi: 0.14.6(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' @@ -4453,6 +4669,36 @@ packages: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} dev: true + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -7622,8 +7868,8 @@ packages: boolbase: 1.0.0 dev: true - /nuxi@3.7.2: - resolution: {integrity: sha512-WNczi4X5ms8v63BTlCH+ZZDPzoFI0/V5KW8an4Zv6qOngtONHALw1u6qvtcAqG2tuMDu8gdJuzxMZL2845Dbig==} + /nuxi@3.6.5: + resolution: {integrity: sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==} engines: {node: ^14.18.0 || >=16.10.0} hasBin: true optionalDependencies: @@ -7667,8 +7913,8 @@ packages: - supports-color dev: true - /nuxt@3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6): - resolution: {integrity: sha512-y0/xHYqwuJt20r26xezjpr74FLWR144dMpwSxZ/O2XXUrQUnyO7vHm3fEY4vi+miKbf343YMH5B78GXAELO/Vw==} + /nuxt@3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6): + resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==} engines: {node: ^14.18.0 || >=16.10.0} hasBin: true peerDependencies: @@ -7677,16 +7923,14 @@ packages: peerDependenciesMeta: '@parcel/watcher': optional: true - '@types/node': - optional: true dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': /@nuxt/kit-edge@3.7.1-28219436.a256c874 - '@nuxt/schema': 3.7.0 + '@nuxt/schema': 3.6.5 '@nuxt/telemetry': 2.4.1 '@nuxt/ui-templates': 1.3.1 - '@nuxt/vite-builder': 3.7.0(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6)(vue@3.3.4) - '@unhead/dom': 1.3.9 + '@nuxt/vite-builder': 3.6.5(@types/node@20.5.7)(eslint@8.48.0)(sass@1.66.1)(typescript@5.1.6)(vue@3.3.4) + '@types/node': 20.5.7 '@unhead/ssr': 1.3.9 '@unhead/vue': 1.3.9(vue@3.3.4) '@vue/shared': 3.3.4 @@ -7697,7 +7941,7 @@ packages: defu: 6.1.2 destr: 2.0.1 devalue: 4.3.2 - esbuild: 0.19.2 + esbuild: 0.18.20 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fs-extra: 11.1.1 @@ -7707,19 +7951,18 @@ packages: jiti: 1.19.3 klona: 2.0.6 knitwork: 1.0.0 + local-pkg: 0.4.3 magic-string: 0.30.3 mlly: 1.4.1 nitropack: 2.6.2 - nuxi: 3.7.2 - nypm: 0.3.1 + nuxi: 3.6.5 + nypm: 0.2.2 ofetch: 1.3.3 ohash: 1.1.3 pathe: 1.1.1 perfect-debounce: 1.0.0 - pkg-types: 1.0.3 prompts: 2.4.2 scule: 1.0.0 - std-env: 3.4.3 strip-literal: 1.3.0 ufo: 1.3.0 ultrahtml: 1.3.0 @@ -7731,7 +7974,7 @@ packages: unplugin-vue-router: 0.6.4(vue-router@4.2.4)(vue@3.3.4) untyped: 1.4.0 vue: 3.3.4 - vue-bundle-renderer: 2.0.0 + vue-bundle-renderer: 1.0.3 vue-devtools-stub: 0.1.0 vue-router: 4.2.4(vue@3.3.4) transitivePeerDependencies: @@ -7765,6 +8008,13 @@ packages: - vue-tsc dev: true + /nypm@0.2.2: + resolution: {integrity: sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==} + engines: {node: ^14.16.0 || >=16.10.0} + dependencies: + execa: 7.2.0 + dev: true + /nypm@0.3.1: resolution: {integrity: sha512-WbyW4kp5TEIchdfdAUW4PdFlxl508nPAJsZml0ONk+A29vNHSW+3HEq3OmLvbDWYZrSVZ+Ios++7D/ENnv1YlA==} engines: {node: ^14.16.0 || >=16.10.0} @@ -9828,7 +10078,7 @@ packages: '@unocss/transformer-variant-group': 0.55.3 '@unocss/vite': 0.55.3(vite@4.4.9) '@unocss/webpack': 0.55.3(webpack@5.88.2) - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - postcss - rollup @@ -10055,7 +10305,7 @@ packages: vfile-message: 4.0.2 dev: true - /vite-node@0.33.0(sass@1.66.1): + /vite-node@0.33.0(@types/node@20.5.7)(sass@1.66.1): resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} engines: {node: '>=v14.18.0'} hasBin: true @@ -10065,7 +10315,7 @@ packages: mlly: 1.4.1 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - '@types/node' - less @@ -10077,7 +10327,7 @@ packages: - terser dev: true - /vite-plugin-checker@0.6.2(eslint@8.48.0)(typescript@5.1.6)(vite@4.4.9): + /vite-plugin-checker@0.6.2(eslint@8.48.0)(typescript@5.1.6)(vite@4.3.9): resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==} engines: {node: '>=14.16'} peerDependencies: @@ -10123,7 +10373,7 @@ packages: strip-ansi: 6.0.1 tiny-invariant: 1.3.1 typescript: 5.1.6 - vite: 4.4.9(sass@1.66.1) + vite: 4.3.9(@types/node@20.5.7)(sass@1.66.1) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 @@ -10149,7 +10399,7 @@ packages: open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.3 - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - rollup - supports-color @@ -10169,12 +10419,46 @@ packages: kolorist: 1.8.0 magic-string: 0.30.3 shell-quote: 1.8.1 - vite: 4.4.9(sass@1.66.1) + vite: 4.4.9(@types/node@20.5.7)(sass@1.66.1) transitivePeerDependencies: - supports-color dev: true - /vite@4.4.9(sass@1.66.1): + /vite@4.3.9(@types/node@20.5.7)(sass@1.66.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.7 + esbuild: 0.17.19 + postcss: 8.4.28 + rollup: 3.28.1 + sass: 1.66.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@4.4.9(@types/node@20.5.7)(sass@1.66.1): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -10202,6 +10486,7 @@ packages: terser: optional: true dependencies: + '@types/node': 20.5.7 esbuild: 0.18.20 postcss: 8.4.28 rollup: 3.28.1 @@ -10250,8 +10535,8 @@ packages: resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} dev: true - /vue-bundle-renderer@2.0.0: - resolution: {integrity: sha512-oYATTQyh8XVkUWe2kaKxhxKVuuzK2Qcehe+yr3bGiaQAhK3ry2kYE4FWOfL+KO3hVFwCdLmzDQTzYhTi9C+R2A==} + /vue-bundle-renderer@1.0.3: + resolution: {integrity: sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==} dependencies: ufo: 1.3.0 dev: true