diff --git a/.changeset/chatty-queens-hide.md b/.changeset/chatty-queens-hide.md new file mode 100644 index 00000000..c5686e41 --- /dev/null +++ b/.changeset/chatty-queens-hide.md @@ -0,0 +1,6 @@ +--- +'@cobalt-ui/core': minor +'@cobalt-ui/cli': minor +--- + +Deprecate Figma sync CLI and core functionality (in favor of Tokens Studio support) diff --git a/.changeset/clever-rats-hammer.md b/.changeset/clever-rats-hammer.md new file mode 100644 index 00000000..2db5159a --- /dev/null +++ b/.changeset/clever-rats-hammer.md @@ -0,0 +1,6 @@ +--- +'@cobalt-ui/core': minor +'@cobalt-ui/cli': minor +--- + +Add Tokens Studio support diff --git a/docs/package.json b/docs/package.json index c661d338..54008b5e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,14 +14,14 @@ "dev:serve": "astro dev" }, "devDependencies": { - "@cobalt-ui/cli": "^1.0.0", - "@cobalt-ui/core": "^1.0.0", - "@cobalt-ui/plugin-css": "^1.2.0", - "@cobalt-ui/plugin-sass": "^1.2.0", - "astro": "^2.5.4", + "@cobalt-ui/cli": "workspace:^", + "@cobalt-ui/core": "workspace:^", + "@cobalt-ui/plugin-css": "workspace:^", + "@cobalt-ui/plugin-sass": "workspace:^", + "astro": "^2.5.7", "npm-run-all": "^4.1.5", "sass": "^1.62.1", "shiki": "^0.14.2", - "vite": "^4.3.8" + "vite": "^4.3.9" } } diff --git a/docs/public/images/tokens-studio-for-figma.png b/docs/public/images/tokens-studio-for-figma.png new file mode 100644 index 00000000..8d16e8b5 Binary files /dev/null and b/docs/public/images/tokens-studio-for-figma.png differ diff --git a/docs/src/docs-manifest.json b/docs/src/docs-manifest.json index ec06cfc0..2203e1e3 100644 --- a/docs/src/docs-manifest.json +++ b/docs/src/docs-manifest.json @@ -23,14 +23,14 @@ {"title": "Guides", "pathname": "/docs/guides"}, {"title": "Best Practices", "pathname": "/docs/guides/best-practices"}, {"title": "Modes", "pathname": "/docs/guides/modes"}, - {"title": "Figma", "pathname": "/docs/guides/figma"}, + {"title": "Tokens Studio", "pathname": "/docs/guides/tokens-studio"}, {"title": "Create Plugins", "pathname": "/docs/guides/plugins"}, {"title": "Plugins", "pathname": "/docs/plugins"}, {"title": "CSS", "pathname": "/docs/plugins/css"}, {"title": "Sass", "pathname": "/docs/plugins/sass"}, {"title": "JS/JSON/TS", "pathname": "/docs/plugins/js"}, {"title": "Reference", "pathname": "/docs/reference"}, - {"title": "Config", "pathname": "/docs/reference/config"}, + {"title": "Config API", "pathname": "/docs/reference/config"}, {"title": "About", "pathname": "/docs/reference/about"} ] } diff --git a/docs/src/pages/docs/getting-started/generation.md b/docs/src/pages/docs/getting-started/generation.md index e68c4eab..d6801361 100644 --- a/docs/src/pages/docs/getting-started/generation.md +++ b/docs/src/pages/docs/getting-started/generation.md @@ -44,6 +44,8 @@ import pluginJS from '@cobalt-ui/plugin-js'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [pluginCSS(), pluginJS()], }; ``` diff --git a/docs/src/pages/docs/getting-started/index.md b/docs/src/pages/docs/getting-started/index.md index bb3a9c09..2db5bbc5 100644 --- a/docs/src/pages/docs/getting-started/index.md +++ b/docs/src/pages/docs/getting-started/index.md @@ -20,7 +20,7 @@ The W3C Community Group’s approach differs in being the [largest collaborative ## Requirements -- [Node.js](https://nodejs.org) v16 or higher (newer is always recommended). +- [Node.js](https://nodejs.org) v18 or higher (newer is always recommended). ## Install @@ -47,6 +47,8 @@ import pluginCSS from '@cobalt-ui/plugin-css'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [pluginCSS()], }; ``` @@ -62,7 +64,7 @@ This will generate a **tokens/tokens.css** file in your project for you to use. ## Next steps - [Learn about tokens](/docs/tokens) -- [Sync with Figma](/docs/guides/figma) +- [Sync with Figma using Tokens Studio](/docs/guides/tokens-studio) - [Learn how to configure Cobalt](/docs/reference/config) - [Add plugins](/docs/plugins) diff --git a/docs/src/pages/docs/guides/figma.md b/docs/src/pages/docs/guides/figma.md index b9334faf..cbc7825d 100644 --- a/docs/src/pages/docs/guides/figma.md +++ b/docs/src/pages/docs/guides/figma.md @@ -1,220 +1,8 @@ --- -title: Figma +title: Syncing with Figma layout: ../../../layouts/docs.astro --- # Figma -## Setup - -1. Start a new project with `npx co init` -2. Generate a [new Figma API Key][figma-api-key]. -3. Save this key as `FIGMA_API_KEY` in a [`.env` file][dotenv]. - - ``` - FIGMA_API_KEY=285541-dd09c1b4-c1d3-41a2-802b-f3866f0dadc1 - ``` - - …or as an [environment variable in your system][env-system] - -4. In your Figma Doc, click **Share**, then **Copy link**. -5. In `tokens.config.mjs`, under `figma`, paste your share link, and specify component names and properties within each link ([instructions](#mapping)): - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - /** docs to sync */ - docs: [ - { - url: 'https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2', // “Share” > Copy link - tokens: [ - {style: 'Blue', token: 'color.blue', type: 'color'}, - {component: 'Icon.Alert', token: 'icon.alert', type: 'file'}, - ], - }, - ], - }, -}; -``` - -6. Run `npx co sync` to update `tokens.json` with the new values - -## Mapping - -Give Cobalt a list of every Figma file you want to sync, along with components -and styles, and Cobalt will do the rest! After the initial setup, you’ll only -have to edit mappings when adding or removing components. - -| Property | Description | -| :--------------------- | :----------------------------------------------------------------------------- | -| `style` \| `component` | Specify the name of a Figma style or component (must be one or the other) | -| `type` | The [type][types] of token. Only a few types are supported (documented below). | -| `token` | Where you’d like the token to live in `tokens.json`. | - -### Colors / Gradients - -![](/images/figma-colors.png) - -| Type | Effect | -| :--------- | :-------------------------------------------------------- | -| `color` | Extract any **solid fills** from a style or component. | -| `gradient` | Extract any **gradient fills** from a style or component. | - -Use `type: "color"` or `type: "gradient"` to extract fills from a Figma style or component. - - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - docs: [ - { - url: "https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2", // “Share” > Copy link - tokens: [ - {style: "Black", token: "color.black", type: "color"}, - {style: "Dark Gray", token: "color.dark-gray", type: "color"}, - {style: "Blue", token: "color.blue", type: "color"}, - {style: "Red", token: "color.red", type: "color"}, - {style: "Green", token: "color.green", type: "color"}, - {style: "Purple", token: "color.purple", type: "color"}, - {style: "Red Gradient", token: "gradient.red", type: "gradient"}, - ], - }, - ], - }, -}; -``` - -### Files / Icons - -![](/images/figma-icons.png) - -By using `type: "link"` along with a `filename` path you can save a component locally or to a Git repo. This is great for icons. - - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - docs: [ - { - url: "https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2", // “Share” > Copy link - tokens: [ - {component: "alert", token: "icon.alert", type: "link", filename: "./icons/alert.svg"}, - {component: "download", token: "icon.download", type: "link", filename: "./icons/download.svg"}, - {component: "refresh", token: "icon.refresh", type: "link", filename: "./icons/refresh.svg"}, - ], - }, - ], - }, -}; -``` - -Note that the more icons you sync, the longer it may take to update your tokens. But even if this takes a few minutes, it still beats having to download them all manually. - -#### Optimization - -Sometimes you’ll find Figma exports needing a little cleanup. By adding the `figma.optimize` option, you can run optimizers over the downloaded files: - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - docs: [ - { - url: 'https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2', - tokens: [{component: 'alert', token: 'icon.alert', type: 'file', filename: './icons/alert.svg'}], - }, - ], - optimize: { - svgo: { - // SVGO options (to use defaults, leave object empty or set svgo: true) - removeTitle: false, - }, - }, - }, -}; -``` - -To disable optimizers, either omit them from the config, or set them to `false`. - -##### Supported optimizers - -- [SVGO](https://github.com/svg/svgo) -- Images coming soon? - -##### Token overrides - -If the default optimization settings are messing up a few tokens, you can override them by adding the same `optimize` settings on an individual token itself. This will override any defaults. Or, you may disable optimization by setting `optimize: false` or `optimize.svgo: false` on an individual token to skip optimization just for that token. - -### Shadow - -To pull a **Drop Shadow** from Figma, use the `shadow` type. - - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - docs: [ - { - url: "https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2", // “Share” > Copy link - tokens: [ - {style: 'Distance / Medium', token: 'shadow.distance-medium', type: 'shadow'}, - {style: 'Distance / Far', token: 'shadow.distance-far', type: 'shadow'}, - ], - }, - ], - }, -}; -``` - -### Typography - -![](/images/figma-typography.png) - -To extract a **Text Style** from Figma, use the `fontFamily` or `typography` type. - -| Type | Effect | -| :----------- | :----------------------------------------------------------- | -| `fontFamily` | Extract only the font family name from a style or component. | -| `typography` | Extract all text styles from a style or component. | - - -```js -/** @type import('@cobalt-ui/core').Config */ -export default { - figma: { - docs: [ - { - url: "https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/MyFile?node-id=2%3A2", // “Share” > Copy link - tokens: [ - {style: "Brand Sans", token: "typography.family.brand-sans", type: "fontFamily"}, - {style: "Typography / Body", token: "typography.body", type: "typography"}, - {style: "Typography / Heading 1", token: "typography.heading-1", type: "typography"}, - {style: "Typography / Heading 2", token: "typography.heading-2", type: "typography"}, - ], - }, - ], - }, -}; -``` - -## Troubleshooting - -If you’re having trouble syncing from Figma, here are some quick tips: - -- Make sure you are trying to extract a **style** or **component**. Normal layers aren’t supported for extraction. -- Every style/component must be located within the share link specified (if using shared components, **use the file they are defined in**, not _a_ file that uses them). -- Every style/component should have a unique name within its own Figma doc (using the same name in different docs is OK) -- Make sure `tokens.config.mjs` _perfectly_ matches your component name in Figma (watch for typos!) - -[alias]: /docs/tokens#aliasing -[dotenv]: https://github.com/motdotla/dotenv -[env-system]: https://gist.github.com/iest/58692bf1001b0424c257 -[issues]: https://github.com/drwpow/cobalt-ui/issues -[modes]: /docs/guides/modes -[figma-api]: /docs/reference/config#figma -[figma-api-key]: https://www.figma.com/developers/api#access-tokens -[types]: /docs/tokens#types +Syncing with Figma since `1.1.0` is now done via the [Tokens Studio plugin for Figma](/docs/guides/tokens-studio). The previous version of Figma syncing was buggy and incomplete. diff --git a/docs/src/pages/docs/guides/index.md b/docs/src/pages/docs/guides/index.md index 67c69519..a4673919 100644 --- a/docs/src/pages/docs/guides/index.md +++ b/docs/src/pages/docs/guides/index.md @@ -7,4 +7,4 @@ layout: ../../../layouts/docs.astro - [Best Practices](/docs/guides/best-practices/) - [Thinking in Modes](/docs/guides/modes) -- [Syncing with Figma](/docs/figma) +- [Syncing with Figma using Tokens Studio](/docs/guides/tokens-studio) diff --git a/docs/src/pages/docs/guides/tokens-studio.md b/docs/src/pages/docs/guides/tokens-studio.md new file mode 100644 index 00000000..5610e812 --- /dev/null +++ b/docs/src/pages/docs/guides/tokens-studio.md @@ -0,0 +1,27 @@ +--- +title: Tokens Studio for Figma +layout: ../../../layouts/docs.astro +--- + +# Tokens Studio for Figma + +![Tokens Studio for Figma](/images/tokens-studio-for-figma.png) + +[Tokens Studio for Figma](https://tokens.studio/) is a free plugin that makes managing design tokens in Figma easy ([docs](https://docs.tokens.studio/)). While it doesn’t use the W3C Design Tokens format like Cobalt does, Cobalt supports most of Tokens Studio’s format. + +To use Tokens Studio, first export a `tokens.json` file using [any of the approved sync methods](https://docs.tokens.studio/sync/sync). Then use Cobalt as you would normally: + +```js +import pluginCSS from '@cobalt-ui/plugin-css'; + +/** @type import('@cobalt-ui/core').Config */ +export default { + tokens: './tokens.json', + outDir: './tokens/', + plugins: [pluginCSS()], +}; +``` + +> ⚠️ **Compatibility Warning** +> +> While Cobalt will do the best job it can converting from Tokens Studio for Figma’s format, some types may be incompatible. If you encounter any problems, please [file an issue](https://github.com/drwpow/cobalt-ui/issues). diff --git a/docs/src/pages/docs/plugins/css.md b/docs/src/pages/docs/plugins/css.md index dd2dafd1..73fa3141 100644 --- a/docs/src/pages/docs/plugins/css.md +++ b/docs/src/pages/docs/plugins/css.md @@ -21,6 +21,8 @@ import pluginCSS from '@cobalt-ui/plugin-css'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [pluginCSS()], }; ``` @@ -57,6 +59,8 @@ import pluginCSS from '@cobalt-ui/plugin-css'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginCSS({ /** set the filename inside outDir */ @@ -133,6 +137,8 @@ import css from '@cobalt-ui/plugin-css'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ css({ modeSelectors: { @@ -181,6 +187,8 @@ import css from '@cobalt-ui/plugin-css'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ css({ modeSelectors: { @@ -226,6 +234,8 @@ Inside plugin options, you can specify an optional `transform()` function. ```js /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginCSS({ transform(token, mode) { @@ -249,6 +259,8 @@ If you have your own custom token type, e.g. `my-custom-type`, you’ll have to ```js /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginCSS({ transform(token, mode) { @@ -276,6 +288,8 @@ To use this, replace this plugin with @cobalt-ui/plugin-sass in `tokens.config.m /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ - pluginCSS({ filename: 'tokens.css }), + pluginSass({ diff --git a/docs/src/pages/docs/plugins/js.md b/docs/src/pages/docs/plugins/js.md index cafa4a75..5e6be82a 100644 --- a/docs/src/pages/docs/plugins/js.md +++ b/docs/src/pages/docs/plugins/js.md @@ -17,6 +17,8 @@ import pluginJS from '@cobalt-ui/plugin-js'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginJS({ /** output JS (with TS types)? boolean or filename (default: true) */ @@ -72,6 +74,8 @@ import pluginJS from '@cobalt-ui/plugin-js'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginJS({ /** output JS? boolean or filename */ @@ -92,6 +96,8 @@ Inside plugin options, you can specify an optional `transform()` function. ```js /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginJS({ transform(token, mode) { diff --git a/docs/src/pages/docs/plugins/sass.md b/docs/src/pages/docs/plugins/sass.md index be5bfbfd..f95a29aa 100644 --- a/docs/src/pages/docs/plugins/sass.md +++ b/docs/src/pages/docs/plugins/sass.md @@ -19,6 +19,8 @@ import pluginSass from '@cobalt-ui/plugin-sass'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginSass({ /** set the filename inside outDir */ @@ -74,6 +76,8 @@ import pluginSass from '@cobalt-ui/plugin-sass'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginSass({ cssVars: true, @@ -202,6 +206,8 @@ Inside plugin options, you can specify an optional `transform()` function: ```js /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginSass({ transform(token, mode) { @@ -225,6 +231,8 @@ If you have your own custom token type, e.g. `my-custom-type`, you’ll have to ```js /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', + outDir: './tokens/', plugins: [ pluginSass({ transform(token, mode) { diff --git a/docs/src/pages/docs/reference/config.md b/docs/src/pages/docs/reference/config.md index a6d9387e..928d4c69 100644 --- a/docs/src/pages/docs/reference/config.md +++ b/docs/src/pages/docs/reference/config.md @@ -12,10 +12,8 @@ import pluginJS from '@cobalt-ui/plugin-js'; /** @type import('@cobalt-ui/core').Config */ export default { + tokens: './tokens.json', outDir: './tokens/', - figma: { - // figma settings - }, plugins: [pluginJS()], }; ``` @@ -31,9 +29,9 @@ To load tokens from an npm package, update `config.tokens` to point to the **ful + tokens: "@my-scope/my-tokens/tokens.json", // ✅ Cobalt can locate this just fine ``` -## Figma +## Syncing with Figma -[View Figma docs](../guides/figma) +You can sync tokens with Figma by using the [Tokens Studio for Figma](../guides/tokens-studio) plugin. ## Plugins diff --git a/docs/tokens.config.js b/docs/tokens.config.js index 6e6b6598..2bb1ddd5 100644 --- a/docs/tokens.config.js +++ b/docs/tokens.config.js @@ -12,63 +12,4 @@ export default { }), pluginSass(), ], - figma: { - docs: [ - { - url: 'https://www.figma.com/file/Mm0nTq0UXZKG1WXu7PeCmS/Cobalt-Test?node-id=2%3A2', - tokens: [ - // colors - {style: 'Black', token: 'color.black', type: 'color'}, - {style: 'Blue', token: 'color.blue', type: 'color'}, - {style: 'Dark Gray', token: 'color.dark-gray', type: 'color'}, - {style: 'Green', token: 'color.green', type: 'color'}, - {style: 'Purple', token: 'color.purple', type: 'color'}, - {style: 'Red', token: 'color.red', type: 'color'}, - {style: 'White', token: 'color.white', type: 'color'}, - {style: 'Red Gradient', token: 'gradient.red', type: 'gradient'}, - - // typography - {style: 'Brand Sans', token: 'typography.family.brand', type: 'fontFamily'}, - {style: 'Heading 1', token: 'typography.heading-1', type: 'typography'}, - {style: 'Heading 2', token: 'typography.heading-2', type: 'typography'}, - {style: 'Heading 3', token: 'typography.heading-3', type: 'typography'}, - {style: 'Body', token: 'typography.body', type: 'typography'}, - - // icons - {component: 'cloud--download', token: 'icon.cloud-download', type: 'file', filename: './icon/cloud-download.svg'}, - {component: 'cloud--upload', token: 'icon.cloud-upload', type: 'file', filename: './icon/cloud-upload.svg'}, - {component: 'crop', token: 'icon.crop', type: 'file', filename: './icon/crop.svg'}, - {component: 'delete', token: 'icon.delete', type: 'file', filename: './icon/delete.svg'}, - {component: 'do-not--02', token: 'icon.do-not-2', type: 'file', filename: './icon/do-not-2.svg'}, - {component: 'do-not', token: 'icon.do-not', type: 'file', filename: './icon/do-not.svg'}, - {component: 'download--01', token: 'icon.download-1', type: 'file', filename: './icon/download-1.svg'}, - {component: 'download--02', token: 'icon.download-2', type: 'file', filename: './icon/download-2.svg'}, - {component: 'embed', token: 'icon.embed', type: 'file', filename: './icon/embed.svg'}, - {component: 'export--01', token: 'icon.export-1', type: 'file', filename: './icon/export-1.svg'}, - {component: 'export--02', token: 'icon.export-2', type: 'file', filename: './icon/export-2.svg'}, - {component: 'launch', token: 'icon.launch', type: 'file', filename: './icon/launch.svg'}, - {component: 'love', token: 'icon.love', type: 'file', filename: './icon/love.svg'}, - {component: 'maximize', token: 'icon.maximize', type: 'file', filename: './icon/maximize.svg'}, - {component: 'minimize', token: 'icon.minimize', type: 'file', filename: './icon/minimize.svg'}, - {component: 'paperclip', token: 'icon.paperclip', type: 'file', filename: './icon/paperclip.svg'}, - {component: 'player--flow', token: 'icon.player-flow', type: 'file', filename: './icon/player-flow.svg'}, - {component: 'refresh', token: 'icon.refresh', type: 'file', filename: './icon/refresh.svg'}, - {component: 'renew', token: 'icon.renew', type: 'file', filename: './icon/renew.svg'}, - {component: 'repeat', token: 'icon.repeat', type: 'file', filename: './icon/repeat.svg'}, - {component: 'reset', token: 'icon.reset', type: 'file', filename: './icon/reset.svg'}, - {component: 'trash', token: 'icon.trash', type: 'file', filename: './icon/trash.svg'}, - {component: 'upload--01', token: 'icon.upload-1', type: 'file', filename: './icon/upload-1.svg'}, - {component: 'upload--02', token: 'icon.upload-2', type: 'file', filename: './icon/upload-2.svg'}, - - // shadows - {style: 'Distance / Near', token: 'distance.near', type: 'shadow'}, - {style: 'Distance / Med', token: 'distance.med', type: 'shadow'}, - {style: 'Distance / Far', token: 'distance.far', type: 'shadow'}, - ], - }, - ], - optimize: { - svgo: {}, - }, - }, }; diff --git a/docs/tokens.json b/docs/tokens.json index 63b51f7d..58071bee 100644 --- a/docs/tokens.json +++ b/docs/tokens.json @@ -42,7 +42,7 @@ "$extensions": { "mode": { "light": "{color.white}", - "dark": "{color.black}" + "dark": "#001824" } } }, @@ -62,7 +62,7 @@ "$extensions": { "mode": { "light": "{color.blue.50}", - "dark": "{color.blue.70}" + "dark": "{color.blue.80}" } } } diff --git a/docs/tokens/index.scss b/docs/tokens/index.scss index 4ca28ac7..1c863492 100644 --- a/docs/tokens/index.scss +++ b/docs/tokens/index.scss @@ -83,7 +83,7 @@ $__token-values: ( "ui.bg": ( default: (#ffffff), "light": (#ffffff), - "dark": (#00193f), + "dark": (#001824), ), "ui.fg": ( default: (#00193f), @@ -93,7 +93,7 @@ $__token-values: ( "ui.action": ( default: (#2b3faa), "light": (#2b3faa), - "dark": (#4887c9), + "dark": (#5ca9d7), ), "font.family.ppNeue": ( default: ("PP Neue Montreal", system-ui, ui-sans-serif, -apple-system, "Helvetica Neue", Helvetica, Arial, sans-serif), diff --git a/docs/tokens/tokens.css b/docs/tokens/tokens.css index dbaf1eb8..8838a85c 100644 --- a/docs/tokens/tokens.css +++ b/docs/tokens/tokens.css @@ -75,16 +75,16 @@ body[data-color-mode="light"] { } body[data-color-mode="dark"] { - --ui-bg: var(--color-black); + --ui-bg: #001824; --ui-fg: var(--color-white); - --ui-action: var(--color-blue-70); + --ui-action: var(--color-blue-80); } @media(prefers-color-scheme:dark) { :root { - --ui-bg: var(--color-black); + --ui-bg: #001824; --ui-fg: var(--color-white); - --ui-action: var(--color-blue-70); + --ui-action: var(--color-blue-80); } } @@ -119,10 +119,12 @@ body[data-color-mode="dark"] { } body[data-color-mode="dark"] { + --ui-bg: color(display-p3 0 0.094118 0.141176); } @media(prefers-color-scheme:dark) { :root { + --ui-bg: color(display-p3 0 0.094118 0.141176); } } } diff --git a/examples/salesforce/package.json b/examples/salesforce/package.json index 32cd54bc..f9b7d1e0 100644 --- a/examples/salesforce/package.json +++ b/examples/salesforce/package.json @@ -13,7 +13,7 @@ "@cobalt-ui/plugin-js": "^1.2.0", "@cobalt-ui/plugin-sass": "^1.2.0", "@salesforce-ux/design-system": "^2.16.2", - "better-color-tools": "^0.10.0", + "better-color-tools": "^0.12.3", "postcss": "^8.4.16" } } diff --git a/package.json b/package.json index a78f9ae9..017cb709 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "build:examples:shopify": "cd examples/shopify && npm run build:tokens", "build:packages": "tsc -b packages/cli packages/plugin-css packages/plugin-js packages/plugin-sass", "build:utils": "tsc -b packages/utils", - "cf:build": "pnpm i --no-frozen-lockfile && npm run build && cd docs && npm run build", + "cf:build": "npm run build && cd docs && npm run build", "changeset": "changeset", "dev": "run-p -s dev:*", "dev:core": "cd packages/core && npm run dev", @@ -41,15 +41,14 @@ "devDependencies": { "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.1", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", "del-cli": "^4.0.1", - "eslint": "^8.41.0", + "eslint": "^8.42.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "npm-run-all": "^4.1.5", - "pnpm": "^8.5.1", "prettier": "^2.8.8", - "typescript": "^5.0.4" + "typescript": "^5.1.3" } } diff --git a/packages/cli/README.md b/packages/cli/README.md index 5ba5de33..c1a2068b 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -23,16 +23,6 @@ export default { outDir: './tokens/', /** plugins to generate different outputs */ plugins: [], - /** map Figma styles & components to tokens.json */ - figma: { - docs: [ - // add Figma docs - ], - /** optional: specify optimization settings */ - optimization: { - svgo: false, - }, - }, }; ``` diff --git a/packages/cli/bin/cli.js b/packages/cli/bin/cli.js index 0ad733ec..4182a0bc 100755 --- a/packages/cli/bin/cli.js +++ b/packages/cli/bin/cli.js @@ -14,7 +14,6 @@ import {fileURLToPath, URL} from 'node:url'; import parser from 'yargs-parser'; import {init as initConfig} from '../dist/config.js'; import {build} from '../dist/build.js'; -import figma from '../dist/figma/index.js'; const [, , cmd, ...args] = process.argv; const cwd = new URL(`file://${process.cwd()}/`); @@ -50,7 +49,7 @@ async function main() { } // --- - // full-run commands: build, sync, check + // full-run commands: build, check // setup: load tokens.config.js and tokens.config.json let configPath; @@ -132,27 +131,8 @@ async function main() { break; } case 'sync': { - if (!fs.existsSync(config.tokens)) { - console.error(` ${FG_RED}✘ Could not locate ${config.tokens}. To create one, run \`npx cobalt init\`.${RESET}`); - process.exit(1); - } - - let rawSchema = JSON.parse(fs.readFileSync(config.tokens), 'utf8'); - - const updates = await figma(config); - for (const [id, token] of Object.entries(updates)) { - let namespaces = id.split('.'); - let node = rawSchema; - for (const namespace of namespaces) { - if (!node[namespace]) node[namespace] = {}; - node = node[namespace]; - } - for (const [k, v] of Object.entries(token)) { - node[k] = v; // - } - } - fs.writeFileSync(config.tokens, JSON.stringify(rawSchema, undefined, 2), 'utf8'); - console.log(` ${FG_GREEN}✔${RESET} Tokens updated from Figma`); + console.error(` ${FG_YELLOW}! "co sync" was deprecated. See https://cobalt-ui.pages.dev/docs/guides/figma`); + process.exit(1); break; } case 'check': { @@ -203,7 +183,6 @@ function showHelp() { [commands] build Build token artifacts from tokens.json --watch, -w Watch tokens.json for changes and recompile - sync Sync tokens.json with Figma init Create a starter tokens.json file check [path] Check tokens.json for errors @@ -245,11 +224,11 @@ function time(start) { /** Print errors */ export function printErrors(errors) { if (!errors || !Array.isArray(errors)) return; - errors.forEach((e) => console.error(` ${FG_RED}✘ ${e}${RESET}`)); + for (const err of errors) console.error(` ${FG_RED}✘ ${err}${RESET}`); } /** Print warnings */ export function printWarnings(warnings) { if (!warnings || !Array.isArray(warnings)) return; - warnings.forEach((w) => console.warn(` ${FG_YELLOW}! ${w}${RESET}`)); + for (const warn of warnings) console.warn(` ${FG_YELLOW}! ${warn}${RESET}`); } diff --git a/packages/cli/package.json b/packages/cli/package.json index 3b56688a..7baab10f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -34,9 +34,9 @@ "@cobalt-ui/core": "^1.0.0", "@cobalt-ui/utils": "^1.0.0", "@types/csso": "^5.0.0", - "better-color-tools": "^0.10.2", + "better-color-tools": "^0.12.3", "chokidar": "^3.5.3", - "dotenv": "^16.0.3", + "dotenv": "^16.1.4", "number-precision": "^1.6.0", "piscina": "^3.2.0", "svgo": "^3.0.2", @@ -44,9 +44,9 @@ "yargs-parser": "^21.1.1" }, "devDependencies": { - "@types/node": "^20.2.3", + "@types/node": "^20.2.5", "figma-api": "^1.11.0", "npm-run-all": "^4.1.5", - "vitest": "^0.31.1" + "vitest": "^0.31.4" } } diff --git a/packages/cli/src/config.ts b/packages/cli/src/config.ts index 7ba65be3..c1d3a07c 100644 --- a/packages/cli/src/config.ts +++ b/packages/cli/src/config.ts @@ -57,28 +57,6 @@ export async function init(userConfig: Config, cwd: URL): Promise { - const ext = path.extname(filename); - let data = (await fetchFile(url, componentID, filename)).toString('utf8'); - if (optimize) { - if ((optimize === true || optimize.svgo) && ext === '.svg') { - const svgoOpts: Config | undefined = optimize && typeof optimize === 'object' && 'svgo' in optimize && optimize.svgo ? (optimize.svgo as Config) : undefined; - data = svgo.optimize(data, svgoOpts).data; - } - } - fs.mkdirSync(path.dirname(filename), {recursive: true}); - fs.writeFileSync(filename, data); -} diff --git a/packages/cli/src/figma/index.ts b/packages/cli/src/figma/index.ts deleted file mode 100644 index 93684f48..00000000 --- a/packages/cli/src/figma/index.ts +++ /dev/null @@ -1,153 +0,0 @@ -import type {FigmaToken, ResolvedConfig, Token} from '@cobalt-ui/core'; -import type * as Figma from 'figma-api'; -// @ts-expect-error needs https://github.com/piscinajs/piscina/pull/239 -import Piscina from 'piscina'; -import {fileURLToPath, URL} from 'node:url'; -import {collectChildren, collectStylesAndComponents, fetchDoc, padRight} from './util.js'; -import {colorToHex} from './paint.js'; - -const LEADING_SLASH_RE = /^\//; -const TEXT_CASE: Record = { - UPPER: 'uppercase', - LOWER: 'lowercase', - TITLE: 'capitalize', - ORIGINAL: undefined, - SMALL_CAPS: undefined, - SMALL_CAPS_FORCED: undefined, -}; - -async function load(config: ResolvedConfig): Promise> { - // validate config - if (!config.figma) throw new Error(`"figma" missing in tokens.config.mjs (see https://cobalt-ui.pages.dev)`); - const {optimize: defaultOptimize = false} = config.figma; - - // create a workerpool for every file downloaded - const fileQueue = new Piscina({ - filename: new URL('./file-worker.js', import.meta.url).href, - maxQueue: 'auto', - }); - - // save final updates - const tokenUpdates: Record = {}; - - // optimization: make sure duplicate URLs are fetched together - const docs: Record = {}; - let downloadCount = 0; - let totalFiles = 0; - for (const {url, tokens} of config.figma.docs) { - totalFiles += tokens.reduce((count, token) => count + (token.type === 'file' ? 1 : 0), 0); - docs[url] = [...(docs[url] || []), ...tokens]; - } - let countWidth = String(totalFiles).length; - - // load all URLs - await Promise.all( - Object.entries(docs).map(async ([url, tokens]) => { - const doc = await fetchDoc(url); - const {styles, components} = collectStylesAndComponents(doc); - - await Promise.all( - tokens.map(async ({type: nodeType, token: id, style: styleName, component: componentName, filename, optimize: tokenOptimize}) => { - const figmaName = styleName || componentName; - const figmaNode = (styleName && styles.get(styleName)) || (componentName && components.get(componentName)); - if (!figmaNode) throw new Error(`could not locate "${figmaName}"`); - - switch (nodeType) { - case 'color': { - let node = figmaNode as any; - if (!Array.isArray(node.fills) || !node.fills.length) { - const children = collectChildren(node); - node = children.find((n) => Array.isArray((n as any).fills) && (n as any).fills.length); - if (!node) throw new Error(`${id}: could not find fills on "${figmaName}"`); - } - const solidFill = (node as Figma.VECTOR).fills.find((p) => p.type === 'SOLID' && !!p.color); - if (!solidFill) throw new Error(`${id}: could not find solid fill on "${figmaName}"`); - tokenUpdates[id] = { - $type: 'color', - $value: colorToHex(solidFill.color as Figma.Color), - }; - break; - } - case 'link': { - await fileQueue.run({ - url, - componentID: figmaNode.id, - filename: fileURLToPath(new URL((filename as string).replace(LEADING_SLASH_RE, './'), config.outDir)), - optimize: tokenOptimize || defaultOptimize || false, - }); - downloadCount += 1; - console.log(` ✔ Downloaded file ${padRight(String(downloadCount), countWidth)}/${totalFiles}`); // eslint-disable-line no-console - tokenUpdates[id] = { - $type: 'link', - $value: filename as string, - }; - break; - } - case 'gradient': { - let node = figmaNode as any; - if (!Array.isArray(node.fills) || !node.fills.length) { - const children = collectChildren(node); - node = children.find((n) => Array.isArray((n as any).fills) && (n as any).fills.length); - if (!node) throw new Error(`${id}: could not find fills on "${figmaName}"`); - } - const gradientFill = (node as Figma.VECTOR).fills.find((p) => p.type.startsWith('GRADIENT_') && !!p.gradientStops && !!p.gradientStops.length); - if (!gradientFill) throw new Error(`${id}: could not find gradient fill on "${figmaName}"`); - const {gradientStops = []} = gradientFill; - tokenUpdates[id] = { - $type: 'gradient', - $value: gradientStops.map((stop) => ({color: colorToHex(stop.color), position: stop.position})), - }; - break; - } - case 'shadow': { - let node = figmaNode as any; - if (!node.effects || !node.effects.some((e: Figma.Effect) => e.type === 'DROP_SHADOW' || e.type === 'INNER_SHADOW')) { - const children = collectChildren(node); - node = children.find((n: any) => n.effects && n.effects.some((e: Figma.Effect) => e.type === 'DROP_SHADOW' || e.type === 'INNER_SHADOW')); - } - if (!node) throw new Error(`${id}: could not find shadow effect on "${figmaName}"`); - const shadowEffect = node.effects.find((e: Figma.Effect) => e.type === 'DROP_SHADOW' || e.type === 'INNER_SHADOW') as Figma.EffectShadow; - tokenUpdates[id] = { - $type: 'shadow', - $value: { - offsetX: shadowEffect.offset.x ? `${shadowEffect.offset.x}px` : '0', - offsetY: shadowEffect.offset.y ? `${shadowEffect.offset.y}px` : '0', - blur: shadowEffect.radius ? `${shadowEffect.radius}px` : '0', - spread: '0', - color: colorToHex(shadowEffect.color), - }, - }; - break; - } - case 'typography': { - let node = figmaNode as any; - if (node.type !== 'TEXT') { - const children = collectChildren(node); - node = children.find((n) => n.type === 'TEXT'); - if (!node) throw new Error(`${id}: could not find text style on "${figmaName}"`); - } - const {fontFamily, fontWeight, fontSize, italic, letterSpacing, lineHeightPercentFontSize, textCase} = node.style as Figma.TypeStyle; - tokenUpdates[id] = { - $type: 'typography', - $value: { - fontFamily: [fontFamily], - fontSize: `${fontSize}px`, - ...(italic ? {'font-style': 'italic'} : {}), - fontWeight: fontWeight, - letterSpacing: `${letterSpacing / fontSize}em`, - lineHeight: (lineHeightPercentFontSize || 100) / 100, - ...(textCase && TEXT_CASE[textCase] ? {'text-transform': TEXT_CASE[textCase]} : {}), - }, - }; - break; - } - } - }), - ); - }), - ); - - return tokenUpdates; -} - -export default load; diff --git a/packages/cli/src/figma/paint.ts b/packages/cli/src/figma/paint.ts deleted file mode 100644 index e33333f1..00000000 --- a/packages/cli/src/figma/paint.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type Figma from 'figma-api'; -import color from 'better-color-tools'; -import NP from 'number-precision'; - -export function colorToHex(c: Figma.Color): string { - const {r, g, b, a} = c; - return color.from([r, g, b, a]).hex; -} - -export function linearGradient(node: Figma.Paint): string { - let deg = 0; - if (node.gradientHandlePositions) { - const [{x: x1, y: y1}, {x: x2, y: y2}] = node.gradientHandlePositions; - deg = NP.round(radToDeg(Math.atan2(x2 - x1, -(y2 - y1))), 2); // linear-gradient angles is so dumb :( - } - const colors = (node.gradientStops || []).map((stop) => `${color.from(colorToHex(stop.color))} ${NP.round(100 * stop.position, 2)}%`); - return `linear-gradient(${deg}deg, ${colors.join(', ')})`; -} - -function radToDeg(rad: number): number { - return (rad * 180) / Math.PI; -} diff --git a/packages/cli/src/figma/util.ts b/packages/cli/src/figma/util.ts deleted file mode 100644 index 33d76734..00000000 --- a/packages/cli/src/figma/util.ts +++ /dev/null @@ -1,98 +0,0 @@ -import type * as Figma from 'figma-api'; -import type {GetFileResult} from 'figma-api/lib/api-types.js'; -import {FG_RED, RESET, UNDERLINE} from '@cobalt-ui/utils'; -import path from 'node:path'; -import {URL} from 'node:url'; -import undici from 'undici'; - -const SHARE_URL_RE = /^https:\/\/www\.figma\.com\/file\/([A-Za-z0-9]+)\//; -const FIGMA = { - FILES: 'https://api.figma.com/v1/files/', - IMAGES: 'https://api.figma.com/v1/images/', -}; - -interface Collection { - components: Map; - styles: Map; -} - -/** collect all components within document */ -export function collectStylesAndComponents(doc: GetFileResult, collection: Collection = {components: new Map(), styles: new Map()}): Collection { - JSON.stringify(doc.document.children, (_, v) => { - if (!v) return v; - - if (v.type === 'COMPONENT') { - const componentName = doc.components[v.id].name; - collection.components.set(componentName, v); - } else if (v.styles) { - for (const id of Object.values(v.styles)) { - const styleName = doc.styles[id as string].name; - collection.styles.set(styleName, v); - } - } - - return v; - }); - - return collection; -} - -/** collect all deep node children as a flattened array (depth-first) */ -export function collectChildren(node: Figma.Node, children: Figma.Node[] = []): Figma.Node[] { - if (!Array.isArray((node as any).children) || !(node as any).children.length) return children; - for (const c of children) { - children.push(c); - collectChildren(c, children); - } - return children; -} - -/** Get Figma document */ -export async function fetchDoc(shareURL: string): Promise { - if (!process.env.FIGMA_API_KEY) throw new Error(` ${FG_RED}✘ FIGMA_API_KEY not set. See ${UNDERLINE}https://www.figma.com/developers/api#access-tokens${RESET}${FG_RED} for instructions.${RESET}`); - if (!SHARE_URL_RE.test(shareURL)) throw new Error(` ${FG_RED}✘ Share URL must match ${UNDERLINE}https://www.figma.com/file/[id]${RESET}`); - const id = (shareURL.match(SHARE_URL_RE) as RegExpMatchArray)[1]; - const res = await undici.request(new URL(id, FIGMA.FILES), { - method: 'GET', - headers: { - 'X-Figma-Token': process.env.FIGMA_API_KEY, - }, - }); - if (res.statusCode != 200) throw new Error(await res.body.text()); - return await res.body.json(); -} - -/** export file from Figma */ -export async function fetchFile(shareURL: string, componentID: string, filename: string): Promise { - if (!process.env.FIGMA_API_KEY) throw new Error(` ${FG_RED}✘ FIGMA_API_KEY not set. See ${UNDERLINE}https://www.figma.com/developers/api#access-tokens${RESET}${FG_RED} for instructions.${RESET}`); - if (!SHARE_URL_RE.test(shareURL)) throw new Error(` ${FG_RED}✘ Share URL must match ${UNDERLINE}https://www.figma.com/file/[id]${RESET}`); - const id = (shareURL.match(SHARE_URL_RE) as RegExpMatchArray)[1]; - const search = new URLSearchParams({ - ids: componentID, - format: path.extname(filename).replace(/^\./, ''), - }); - - // First, get download link from Figma - const fileRes = await undici.request(new URL(`${id}/?${search.toString()}`, FIGMA.IMAGES), { - method: 'GET', - headers: { - 'X-Figma-Token': process.env.FIGMA_API_KEY, - }, - }); - if (fileRes.statusCode !== 200) throw new Error(await fileRes.body.text()); - const fileUrl = (await fileRes.body.json()).images[componentID]; - if (!fileUrl) throw new Error(`Could not fetch image for component ${componentID}"`); - - // Next, download data (don’t bother streaming to file because we may need to optimize) - const fileData = await undici.request(fileUrl, {method: 'GET'}); - if (fileData.statusCode !== 200) throw new Error(await fileData.body.text()); - return new Buffer(Buffer.from(await fileData.body.arrayBuffer())); -} - -export function padRight(input: string, width = 2): string { - let output = input; - while (output.length < width) { - output += ' '; - } - return output; -} diff --git a/packages/cli/test/figma/paint.test.js b/packages/cli/test/figma/paint.test.js deleted file mode 100644 index 04d33e1d..00000000 --- a/packages/cli/test/figma/paint.test.js +++ /dev/null @@ -1,76 +0,0 @@ -import {describe, expect, test} from 'vitest'; -import {linearGradient} from '../../dist/figma/paint.js'; - -describe('paint', () => { - // TODO: these are busted - test.skip('linear gradient', () => { - // rad -> blue (to right) - expect( - linearGradient({ - type: 'GRADIENT_LINEAR', - gradientHandlePositions: [ - {x: 0.00001, y: 0.49999}, - {x: 1, y: 0.5}, - {x: 0, y: 1}, - ], - gradientStops: [ - {color: {r: 1, g: 0, b: 0, a: 1}, position: 0}, - {color: {r: 0, g: 0, b: 1, a: 1}, position: 1}, - ], - }), - ).toBe('linear-gradient(90deg, #ff0000 0%, #0000ff 100%)'); - - // teal -> blue -> violet (to bottom-right) - expect( - linearGradient({ - type: 'GRADIENT_LINEAR', - gradientHandlePositions: [ - {x: 0, y: 0}, - {x: 1, y: 1}, - {x: -0.5, y: 0.5}, - ], - gradientStops: [ - {color: {r: 0.4424999952316284, g: 0.8999999761581421, b: 0.543150007724762, a: 1}, position: 0}, - {color: {r: 0, g: 0, b: 1, a: 1}, position: 0.5520833134651184}, - {color: {r: 0.2560001313686371, g: 0, b: 0.800000011920929, a: 1}, position: 1}, - ], - }), - ).toBe('linear-gradient(to right bottom, #71e58b 0%, #0000ff 55.21%, #4100cc 100%)'); - }); - - // magenta -> blue (to bottom-left) - expect( - linearGradient({ - blendMode: 'NORMAL', - type: 'GRADIENT_LINEAR', - gradientHandlePositions: [ - {x: 0.9296874806477716, y: -0.11718749416468227}, - {x: 0.12890621485712495, y: 1.2851562414061841}, - {x: 0.22851561286233846, y: -0.5175781270600057}, - ], - gradientStops: [ - {color: {r: 0.949999988079071, g: 0.22562503814697266, b: 0.7906373143196106, a: 1}, position: 0}, - {color: {r: 0.3791668117046356, g: 0.14583337306976318, b: 0.875, a: 1}, position: 1}, - ], - }), - ).toBe('linear-gradient(-150.27deg, #f23aca 0%, #6125df 100%)'); - // TODO: calculate overshot gradients, e.g.: - // linear-gradient(-150.27deg, #f23aca -4.9%, #6125df 113.47%) - - // yellow -> orange (to top-right) - expect( - linearGradient({ - type: 'GRADIENT_LINEAR', - gradientHandlePositions: [ - {x: 1.0000000748914315, y: 0.7148437409205116}, - {x: 5.141919334761269e-8, y: 0.09765627530486909}, - {x: 1.3085938076992527, y: 0.21484372918439254}, - ], - gradientStops: [ - {color: {r: 0.949999988079071, g: 0.8775625228881836, b: 0.22562503814697266, a: 1}, position: 0.11866136640310287}, - {color: {r: 0.875, g: 0.40833336114883423, b: 0.14583337306976318, a: 1}, position: 0.7677738070487976}, - ], - }), - ).toBe('linear-gradient(-58.32deg, #f2e03a 11.87%, #df6825 76.78%)'); - // TODO: calculate to corners -}); diff --git a/packages/core/package.json b/packages/core/package.json index c564cf4d..f7472598 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -29,13 +29,12 @@ "dependencies": { "@cobalt-ui/utils": "^1.0.0", "@types/csso": "^5.0.0", - "better-color-tools": "^0.10.2", - "svgo": "^3.0.2" + "better-color-tools": "^0.12.3" }, "devDependencies": { - "@types/node": "^20.2.3", + "@types/node": "^20.2.5", "esbuild": "^0.17.19", "npm-run-all": "^4.1.5", - "vitest": "^0.31.1" + "vitest": "^0.31.4" } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6f0be2cb..d814a76e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,3 @@ -import type SVGO from 'svgo'; import type {Group, ParsedToken} from './token.js'; export type { BorderToken, @@ -52,38 +51,10 @@ export interface BuildResult { contents: string | Buffer; } -export interface FigmaDoc { - url: string; - tokens: FigmaToken[]; -} - -export interface FigmaToken { - style?: string; - component?: string; - token: string; - type: string; - filename?: string; - /** optional: override default optimization settings for this instance */ - optimize?: FigmaOptimizationSettings | boolean; -} - -export interface FigmaOptimizationSettings { - /** Default SVGO settings */ - svgo?: SVGO.Config | boolean; -} - -export interface FigmaSettings { - /** Figma docs to sync (required if "figma" is specified) */ - docs: FigmaDoc[]; - /** set default optimizations */ - optimize?: FigmaOptimizationSettings | boolean; -} - export interface ResolvedConfig { tokens: URL; outDir: URL; plugins: Plugin[]; - figma?: FigmaSettings; } export interface Plugin { @@ -101,8 +72,6 @@ export interface Config { outDir?: string; /** specify plugins */ plugins: Plugin[]; - /** map Figma styles & components to tokens.json */ - figma?: FigmaSettings; } export default { diff --git a/packages/core/src/parse/index.ts b/packages/core/src/parse/index.ts index c2f682ce..9c918139 100644 --- a/packages/core/src/parse/index.ts +++ b/packages/core/src/parse/index.ts @@ -15,6 +15,7 @@ import {normalizeGradientValue} from './tokens/gradient.js'; import {normalizeTypographyValue} from './tokens/typography.js'; import {normalizeFontWeightValue} from './tokens/fontWeight.js'; import {normalizeNumberValue} from './tokens/number.js'; +import {convertTokensStudioFormat, isTokensStudioFormat} from './tokens-studio.js'; export interface ParseResult { errors?: string[]; @@ -25,26 +26,29 @@ export interface ParseResult { }; } +interface InheritedGroup { + $type?: TokenType; + $extensions: { + requiredModes: string[]; + }; +} + const ALIAS_RE = /^\{([^}]+)\}$/; const RESERVED_KEYS = new Set(['$description', '$name', '$type', '$value', '$extensions']); -export function parse(schema: Group): ParseResult { +export function parse(rawTokens: unknown): ParseResult { const errors: string[] = []; const warnings: string[] = []; const result: ParseResult = {result: {metadata: {}, tokens: []}}; - if (!schema || typeof schema !== 'object' || Array.isArray(schema)) { - errors.push(`Invalid schema type. Expected object, received "${Array.isArray(schema) ? 'Array' : typeof schema}"`); + if (!rawTokens || typeof rawTokens !== 'object' || Array.isArray(rawTokens)) { + errors.push(`Invalid schema type. Expected object, received "${Array.isArray(rawTokens) ? 'Array' : typeof rawTokens}"`); result.errors = errors; return result; } - interface InheritedGroup { - $type?: TokenType; - $extensions: { - requiredModes: string[]; - }; - } + // 0. Handle Tokens Studio for Figma format + const schema: Group = isTokensStudioFormat(rawTokens) ? convertTokensStudioFormat(rawTokens as any) : (rawTokens as Group); // 1. collect tokens const tokens: Record = {}; @@ -132,7 +136,7 @@ export function parse(schema: Group): ParseResult { const topNodes: Record = {}; for (const k of Object.keys(schema)) { if (k.startsWith('$')) { - if (k === '$extensions') group.$extensions = {...group.$extensions, ...schema.$extensions}; + if (k === '$extensions') group.$extensions = {...schema.$extensions, ...group.$extensions}; else (group as any)[k] = schema[k]; if (!RESERVED_KEYS.has(k)) { if (!result.warnings) result.warnings = []; diff --git a/packages/core/src/parse/tokens-studio.ts b/packages/core/src/parse/tokens-studio.ts new file mode 100644 index 00000000..cc202fb0 --- /dev/null +++ b/packages/core/src/parse/tokens-studio.ts @@ -0,0 +1,205 @@ +/** + * Handle format for Tokens Studio for Figma + * This works by first converting the Tokens Studio format + * into an equivalent W3C Design Tokens format, then parsing that result + */ + +import type {GradientStop, Group, Token} from '../token.js'; + +export function convertTokensStudioFormat(rawTokens: Record): Group { + const w3cTokens: Group = {}; + + function addToken(value: Token, path: string[]): void { + const parts = [...path]; + const id = parts.pop()!; + let tokenNode = w3cTokens; + for (const p of parts) { + if (!(p in tokenNode)) tokenNode[p] = {}; + tokenNode = tokenNode[p] as Group; + } + tokenNode[id] = value; + } + + function walk(node: unknown, path: string[]): void { + if (!node || typeof node !== 'object') return; + for (const [k, v] of Object.entries(node)) { + if (k.startsWith('$')) continue; // don’t scan meta properties like $themes or $metadata + + // token + if (!!v && typeof v === 'object' && 'type' in v && 'value' in v) { + // resolve aliases + const tokenSet = path[0]; + if (typeof v.value === 'string') { + if (v.value.trim().startsWith('{') && !v.value.trim().startsWith(`{${tokenSet}`)) { + v.value = v.value.trim().replace('{', `{${tokenSet}.`); + } + } else if (v.value && typeof v.value === 'object') { + for (const [property, propertyValue] of Object.entries(v.value)) { + if (typeof propertyValue !== 'string') continue; + if (propertyValue.trim().startsWith('{') && !propertyValue.trim().startsWith(`{${tokenSet}`)) { + v.value[property] = v.value[property].trim().replace('{', `{${tokenSet}.`); + } + } + } + + switch (v.type) { + case 'border': { + addToken({$type: 'border', $value: v.value}, [...path, k]); + break; + } + case 'borderRadius': { + // invalid token: surface error + if (typeof v.value !== 'string') { + // @ts-expect-error invalid value type; throw error + addToken({$type: 'borderRadius', $value: v.value}, [...path, k]); + break; + } + const values = v.value.trim().split(' ').filter(Boolean); + if (values.length === 1) { + addToken({$type: 'dimension', $value: v.value.trim()}, [...path, k]); + } else if (values.length === 2) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}TopRight`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}BottomRight`]); + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}BottomLeft`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}TopLeft`]); + } else if (values.length === 3) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}TopRight`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}BottomRight`]); + addToken({$type: 'dimension', $value: values[2]}, [...path, `${k}BottomLeft`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}TopLeft`]); + } else if (values.length === 4) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}TopRight`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}BottomRight`]); + addToken({$type: 'dimension', $value: values[2]}, [...path, `${k}BottomLet`]); + addToken({$type: 'dimension', $value: values[3]}, [...path, `${k}TopLeft`]); + } else { + // @ts-expect-error invalid value type; throw error + addToken({$type: 'borderRadius', $value: v.value}, [...path, k]); + } + break; + } + case 'boxShadow': { + // invalid token: surface error + if (!v.value || typeof v.value !== 'object') { + addToken({$type: 'shadow', $value: v.value}, [...path, k]); + break; + } + addToken( + { + $type: 'shadow', + $value: { + offsetX: v.value.x, + offsetY: v.value.y, + blur: v.value.blur, + spread: v.value.spread, + color: v.value.color, + // type: ignore??? + }, + }, + [...path, k], + ); + break; + } + case 'color': { + // …because gradient tokens share the same type why not :/ + if (v.value.includes('linear-gradient(')) { + const stops: GradientStop[] = []; + const [_, ...rawStops] = v.value.replace(')', '').split(','); + for (const s of rawStops) { + let [color, position] = s.trim().split(' '); + + // normalize color + // why do aliases follow a different syntax here entirely :/ + if (color.includes('$')) color = `{${tokenSet}.${color.replace('$', '')}}`; + + // normalize position + if (position.includes('%')) position = parseFloat(position) / 100; + else if (typeof position === 'string' && position.length) position = parseFloat(position); + + stops.push({color, position}); + } + addToken({$type: 'gradient', $value: stops}, [...path, k]); + break; + } + addToken({$type: 'color', $value: v.value}, [...path, k]); + break; + } + case 'fontFamilies': { + addToken({$type: 'fontFamily', $value: v.value}, [...path, k]); + break; + } + case 'borderWidth': + case 'dimension': + case 'fontSizes': + case 'letterSpacing': + case 'lineHeights': + case 'sizing': { + addToken({$type: 'dimension', $value: v.value}, [...path, k]); + break; + } + case 'fontWeights': { + addToken({$type: 'fontWeight', $value: v.value}, [...path, k]); + break; + } + // unsupported + case 'opacity': { + // @ts-expect-error this should throw a warning + addToken({$type: 'opacity', $value: v.value}, [...path, k]); + break; + } + case 'spacing': { + // invalid token: surface error + if (typeof v.value !== 'string') { + // @ts-expect-error invalid value type; throw error + addToken({$type: 'spacing', $value: v.value}, [...path, k]); + break; + } + const values = v.value.trim().split(' ').filter(Boolean); + if (values.length === 1) { + addToken({$type: 'dimension', $value: v.value.trim()}, [...path, k]); + } else if (values.length === 2) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}Top`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}Right`]); + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}Bottom`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}Left`]); + } else if (values.length === 3) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}Top`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}Right`]); + addToken({$type: 'dimension', $value: values[2]}, [...path, `${k}Bottom`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}Left`]); + } else if (values.length === 4) { + addToken({$type: 'dimension', $value: values[0]}, [...path, `${k}Top`]); + addToken({$type: 'dimension', $value: values[1]}, [...path, `${k}Right`]); + addToken({$type: 'dimension', $value: values[2]}, [...path, `${k}Bottom`]); + addToken({$type: 'dimension', $value: values[3]}, [...path, `${k}Left`]); + } else { + // @ts-expect-error invalid value type; throw error + addToken({$type: 'spacing', $value: v.value}, [...path, k]); + } + break; + } + case 'textDecoration': + case 'textCase': { + // ignore; these either get used in "typography" token or silently skipped + break; + } + case 'typography': { + // fortunately, the format supports + addToken({$type: 'typography', $value: v.value}, [...path, k]); + break; + } + } + continue; + } + + // group + walk(v, [...path, k]); + } + } + walk(rawTokens, []); + return w3cTokens; +} + +export function isTokensStudioFormat(rawTokens: unknown): boolean { + return !!rawTokens && typeof rawTokens === 'object' && '$themes' in rawTokens && Array.isArray(rawTokens.$themes) && '$metadata' in rawTokens && typeof rawTokens.$metadata === 'object'; +} diff --git a/packages/core/src/parse/tokens/shadow.ts b/packages/core/src/parse/tokens/shadow.ts index 11c389e5..519f2dad 100644 --- a/packages/core/src/parse/tokens/shadow.ts +++ b/packages/core/src/parse/tokens/shadow.ts @@ -20,12 +20,12 @@ export function normalizeShadowValue(value: unknown): ShadowValue { if (!value) throw new Error('missing value'); if (typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid shadow'); const v = value as any; - ['offsetX', 'offsetX', 'blur', 'spread', 'color'].forEach((k) => { + for (const k of ['offsetX', 'offsetX', 'blur', 'spread', 'color']) { if (typeof v[k] === 'number' && v[k] > 0) throw new Error(`${k} missing units`); if (k === 'offsetX' || k === 'offsetY') { if (typeof v[k] !== 'string' && v[k] !== 0) throw new Error(`missing ${k}`); } - }); + } return { offsetX: normalizeDimensionValue(v.offsetX || '0'), offsetY: normalizeDimensionValue(v.offsetY || '0'), diff --git a/packages/core/test/tokens-studio.test.js b/packages/core/test/tokens-studio.test.js new file mode 100644 index 00000000..8314af1d --- /dev/null +++ b/packages/core/test/tokens-studio.test.js @@ -0,0 +1,272 @@ +/** + * Tokens Studio for Figma format + */ +import {FG_RED, RESET} from '@cobalt-ui/utils'; +import {describe, expect, test} from 'vitest'; +import {parse} from '../dist/index.js'; + +/** parse schema and expect no errors */ +function getTokens(json) { + // the presence of top-level "$themes" and "$metadata" is necessary to detect + // Tokens Studio format, as it always outputs these, and these are invalid + // for the W3C format) + if (!('$themes' in json)) json.$themes = []; + if (!('$metadata' in json)) json.$metadata = {}; + + const {errors, result} = parse(json); + if (errors) { + for (const err of errors) { + console.error(`${FG_RED}${err}${RESET}`); // eslint-disable-line no-console + } + } + expect(errors).to.not.be.ok; + + return result.tokens; +} + +describe('Sizing', () => { + test('basic', () => { + const json = { + global: { + sizing: { + s: {type: 'sizing', value: '8px'}, + m: {type: 'sizing', value: '16'}, + l: {type: 'sizing', value: '2rem'}, + }, + }, + }; + const tokens = getTokens(json); + + expect(tokens.find((t) => t.id === 'global.sizing.s').$value).toEqual(expect.objectContaining({$type: 'dimension', $value: '32px'})); + expect(tokens.find((t) => t.id === 'global.sizing.m').$value).toEqual(expect.objectContaining({$type: 'dimension', $value: '32'})); + expect(tokens.find((t) => t.id === 'global.sizing.l').$value).toEqual(expect.objectContaining({$type: 'dimension', $value: '2rem'})); + }); +}); + +describe('Spacing', () => { + test('single', () => { + const json = { + global: { + spacing: {type: 'spacing', value: '8px'}, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.spacing')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + }); + + test('multi', () => { + const json = { + global: { + spacing: { + xy: {type: 'spacing', value: '8px 16px'}, + txb: {type: 'spacing', value: '6px 16px 8px'}, + trbl: {type: 'spacing', value: '6px 16px 8px 12px'}, + }, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.spacing.xyTop')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.spacing.xyRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.spacing.xyBottom')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.spacing.xyLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + + expect(tokens.find((t) => t.id === 'global.spacing.txbTop')).toEqual(expect.objectContaining({$type: 'dimension', $value: '6px'})); + expect(tokens.find((t) => t.id === 'global.spacing.txbRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.spacing.txbBottom')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.spacing.txbLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + + expect(tokens.find((t) => t.id === 'global.spacing.trblTop')).toEqual(expect.objectContaining({$type: 'dimension', $value: '6px'})); + expect(tokens.find((t) => t.id === 'global.spacing.trblRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.spacing.trblBottom')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.spacing.trblLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '12px'})); + }); +}); + +describe('Color', () => { + test('CSS color', () => { + // note: better-color-tools will parse any CSS-valid color so we don’t need to be exhaustive here + const json = { + global: { + color: { + red: { + 60: {type: 'color', value: '#ef4c43'}, + }, + ui: { + danger: { + 60: {type: 'color', value: '{color.red.60}'}, + }, + }, + }, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.color.red.60')).toEqual(expect.objectContaining({$type: 'color', $value: '#ef4c43'})); + expect(tokens.find((t) => t.id === 'global.color.ui.danger.60')).toEqual(expect.objectContaining({$type: 'color', $value: '#ef4c43'})); + }); + + test('Gradient', () => { + const json = { + global: { + color: { + blue: { + 30: {type: 'color', value: '#002466'}, + }, + green: { + 60: {type: 'color', value: '#00b98a'}, + 80: {type: 'color', value: '#83e4be'}, + }, + }, + gradient: { + base: {type: 'color', value: 'linear-gradient(45deg, #002466 0%, #00b98a 45%, #83e4be 100%)'}, + alias: {type: 'color', value: 'linear-gradient(45deg, $color.blue.30 0%, $color.green.60 45%, $color.green.80 100%'}, + }, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.gradient.base')).toEqual( + expect.objectContaining({ + $type: 'gradient', + value: [ + {color: '#002466', position: 0}, + {color: '00b98a', position: 0.45}, + {color: '#83e4be', position: 1}, + ], + }), + ); + expect(tokens.find((t) => t.id === 'global.gradient.alias')).toEqual( + expect.objectContaining({ + $type: 'gradient', + value: [ + {color: '#002466', position: 0}, + {color: '00b98a', position: 0.45}, + {color: '#83e4be', position: 1}, + ], + }), + ); + }); + + describe('Border Radius', () => { + test('single', () => { + const json = { + global: { + radius: {s: {type: 'borderRadius', value: '0.25rem'}}, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.radius.s')).toEqual(expect.objectContaining({$type: 'dimension', $value: '0.25rem'})); + }); + + test('multi', () => { + const json = { + global: { + radius: { + xy: {type: 'borderRadius', value: '8px 16px'}, + txb: {type: 'borderRadius', value: '6px 16px 8px'}, + trbl: {type: 'borderRadius', value: '6px 16px 8px 12px'}, + }, + }, + }; + const tokens = getTokens(json); + + expect(tokens.find((t) => t.id === 'global.radius.xyTopRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.radius.xyBottomRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.radius.xyBottomLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.radius.xyTopLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + + expect(tokens.find((t) => t.id === 'global.radius.txbTopRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '6px'})); + expect(tokens.find((t) => t.id === 'global.radius.txbBottomRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.radius.txbBottomLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.radius.txbTopLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + + expect(tokens.find((t) => t.id === 'global.radius.trblTopRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '6px'})); + expect(tokens.find((t) => t.id === 'global.radius.trblBottomRight')).toEqual(expect.objectContaining({$type: 'dimension', $value: '16px'})); + expect(tokens.find((t) => t.id === 'global.radius.trblBottomLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '8px'})); + expect(tokens.find((t) => t.id === 'global.radius.trblTopLeft')).toEqual(expect.objectContaining({$type: 'dimension', $value: '12px'})); + }); + }); + + describe('Border Width', () => { + test('basic', () => { + const json = { + global: { + borderWidth: {type: 'borderWidth', value: '1px'}, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.borderWidth')).toEqual(expect.objectContaining({$type: 'dimension', $value: '1px'})); + }); + }); + + describe('Typography', () => { + test('basic', () => { + const json = { + global: { + typography: { + family: { + sans: {type: 'fontFamilies', value: 'Helvetica'}, + mono: {type: 'fontFamilies', value: 'JetBrains Mono'}, + }, + weight: { + base: {type: 'fontWeights', value: '400'}, + bold: {type: 'fontWeights', value: '700'}, + }, + size: { + s: {type: 'fontSizes', value: '11px'}, + m: {type: 'fontSizes', value: '14px'}, + l: {type: 'fontSizes', value: '18px'}, + }, + lineHeight: { + s: {type: 'lineHeights', value: '1'}, + m: {type: 'lineHeights', value: '1.4'}, + l: {type: 'lineHeights', value: '1.75'}, + }, + letterSpacing: { + base: {type: 'letterSpacing', value: '0'}, + s: {type: 'letterSpacing', value: '0.03125em'}, + m: {type: 'letterSpacing', value: '0.0625em'}, + l: {type: 'letterSpacing', value: '0.125em'}, + }, + textDecoration: { + base: {type: 'textDecoration', value: 'none'}, + underline: {type: 'textDecoration', value: 'underline'}, + lineThrough: {type: 'textDecoration', value: 'line-through'}, + }, + textCase: { + base: {type: 'textCase', value: 'none'}, + upper: {type: 'textCase', value: 'uppercase'}, + lower: {type: 'textCase', value: 'lowercase'}, + caps: {type: 'textCase', value: 'capitalize'}, + }, + base: { + value: { + fontFamily: '{typography.family.sans}', + fontSize: '{typography.size.m}', + fontWeight: '{typography.weight.base}', + letterSpacing: '{typography.letterSpacing.base}', + lineHeight: '{typography.lineHeight.m}', + textCase: '{typography.textCase.base}', + textDecoration: '{typography.textDecoration.base}', + }, + type: 'typography', + }, + }, + }, + }; + const tokens = getTokens(json); + expect(tokens.find((t) => t.id === 'global.typography.base')).toEqual( + expect.objectContaining({ + $type: 'typography', + $value: { + fontFamily: ['Helvetica'], + fontSize: '14px', + fontWeight: 400, + letterSpacing: 0, + lineHeight: 1.4, + textCase: 'none', + textDecoration: 'none', + }, + }), + ); + }); + }); +}); diff --git a/packages/core/test/token.test.js b/packages/core/test/w3c.test.js similarity index 98% rename from packages/core/test/token.test.js rename to packages/core/test/w3c.test.js index 465227c7..38cd7830 100644 --- a/packages/core/test/token.test.js +++ b/packages/core/test/w3c.test.js @@ -1,17 +1,20 @@ /** - * Schema tests - * tests support of the Design Tokens W3C spec + * W3C Design Tokens specification */ - import {FG_RED, RESET} from '@cobalt-ui/utils'; import {describe, expect, test} from 'vitest'; import {parse} from '../dist/index.js'; -// parse schema and expect no errors +/** parse schema and expect no errors */ function getTokens(json) { const {errors, result} = parse(json); - if (errors) errors.forEach((e) => console.error(`${FG_RED}${e}${RESET}`)); // eslint-disable-line no-console + if (errors) { + for (const err of errors) { + console.error(`${FG_RED}${err}${RESET}`); // eslint-disable-line no-console + } + } expect(errors).to.not.be.ok; + return result.tokens; } diff --git a/packages/plugin-css/package.json b/packages/plugin-css/package.json index 3ae9e6d6..be10e0f7 100644 --- a/packages/plugin-css/package.json +++ b/packages/plugin-css/package.json @@ -28,7 +28,7 @@ "dependencies": { "@cobalt-ui/utils": "^1.0.0", "@types/csso": "^5.0.0", - "better-color-tools": "^0.10.2", + "better-color-tools": "^0.12.3", "mime": "^3.0.0", "svgo": "^3.0.2" }, @@ -36,8 +36,8 @@ "@cobalt-ui/cli": "^1.0.0", "@cobalt-ui/core": "^1.0.0", "@types/mime": "^2.0.3", - "@types/node": "^20.2.3", + "@types/node": "^20.2.5", "npm-run-all": "^4.1.5", - "vitest": "^0.31.1" + "vitest": "^0.31.4" } } diff --git a/packages/plugin-js/package.json b/packages/plugin-js/package.json index c63c1d6a..d2446724 100644 --- a/packages/plugin-js/package.json +++ b/packages/plugin-js/package.json @@ -34,6 +34,6 @@ "@cobalt-ui/core": "^1.0.0", "fast-glob": "^3.2.12", "npm-run-all": "^4.1.5", - "vitest": "^0.31.1" + "vitest": "^0.31.4" } } diff --git a/packages/plugin-sass/package.json b/packages/plugin-sass/package.json index e6035ef8..66613a64 100644 --- a/packages/plugin-sass/package.json +++ b/packages/plugin-sass/package.json @@ -36,8 +36,8 @@ "@cobalt-ui/cli": "^1.0.0", "@cobalt-ui/core": "^1.0.0", "@types/mime": "^2.0.3", - "@types/node": "^20.2.3", + "@types/node": "^20.2.5", "npm-run-all": "^4.1.5", - "vitest": "^0.31.1" + "vitest": "^0.31.4" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 9feda499..e112cf47 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -14,6 +14,6 @@ "dev": "tsc -w" }, "devDependencies": { - "@types/node": "^20.2.3" + "@types/node": "^20.2.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c06206a9..414fd9ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,8 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false importers: @@ -11,53 +15,50 @@ importers: specifier: ^2.26.1 version: 2.26.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.59.7 - version: 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.41.0)(typescript@5.0.4) + specifier: ^5.59.8 + version: 5.59.8(@typescript-eslint/parser@5.59.8)(eslint@8.42.0)(typescript@5.1.3) '@typescript-eslint/parser': - specifier: ^5.59.7 - version: 5.59.7(eslint@8.41.0)(typescript@5.0.4) + specifier: ^5.59.8 + version: 5.59.8(eslint@8.42.0)(typescript@5.1.3) del-cli: specifier: ^4.0.1 version: 4.0.1 eslint: - specifier: ^8.41.0 - version: 8.41.0 + specifier: ^8.42.0 + version: 8.42.0 eslint-config-prettier: specifier: ^8.8.0 - version: 8.8.0(eslint@8.41.0) + version: 8.8.0(eslint@8.42.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.41.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@2.8.8) npm-run-all: specifier: ^4.1.5 version: 4.1.5 - pnpm: - specifier: ^8.5.1 - version: 8.5.1 prettier: specifier: ^2.8.8 version: 2.8.8 typescript: - specifier: ^5.0.4 - version: 5.0.4 + specifier: ^5.1.3 + version: 5.1.3 docs: devDependencies: '@cobalt-ui/cli': - specifier: ^1.0.0 + specifier: workspace:^ version: link:../packages/cli '@cobalt-ui/core': - specifier: ^1.0.0 + specifier: workspace:^ version: link:../packages/core '@cobalt-ui/plugin-css': - specifier: ^1.2.0 + specifier: workspace:^ version: link:../packages/plugin-css '@cobalt-ui/plugin-sass': - specifier: ^1.2.0 + specifier: workspace:^ version: link:../packages/plugin-sass astro: - specifier: ^2.5.4 - version: 2.5.4(sass@1.62.1) + specifier: ^2.5.7 + version: 2.5.7(sass@1.62.1) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -68,8 +69,8 @@ importers: specifier: ^0.14.2 version: 0.14.2 vite: - specifier: ^4.3.8 - version: 4.3.8(sass@1.62.1) + specifier: ^4.3.9 + version: 4.3.9(sass@1.62.1) examples/adobe: devDependencies: @@ -164,8 +165,8 @@ importers: specifier: ^2.16.2 version: 2.16.2(postcss@8.4.18) better-color-tools: - specifier: ^0.10.0 - version: 0.10.0 + specifier: ^0.12.3 + version: 0.12.3 postcss: specifier: ^8.4.16 version: 8.4.18 @@ -197,14 +198,14 @@ importers: specifier: ^5.0.0 version: 5.0.0 better-color-tools: - specifier: ^0.10.2 - version: 0.10.2 + specifier: ^0.12.3 + version: 0.12.3 chokidar: specifier: ^3.5.3 version: 3.5.3 dotenv: - specifier: ^16.0.3 - version: 16.0.3 + specifier: ^16.1.4 + version: 16.1.4 number-precision: specifier: ^1.6.0 version: 1.6.0 @@ -222,8 +223,8 @@ importers: version: 21.1.1 devDependencies: '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 figma-api: specifier: ^1.11.0 version: 1.11.0 @@ -231,8 +232,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 vitest: - specifier: ^0.31.1 - version: 0.31.1 + specifier: ^0.31.4 + version: 0.31.4 packages/core: dependencies: @@ -243,15 +244,12 @@ importers: specifier: ^5.0.0 version: 5.0.0 better-color-tools: - specifier: ^0.10.2 - version: 0.10.2 - svgo: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^0.12.3 + version: 0.12.3 devDependencies: '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 esbuild: specifier: ^0.17.19 version: 0.17.19 @@ -259,8 +257,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 vitest: - specifier: ^0.31.1 - version: 0.31.1 + specifier: ^0.31.4 + version: 0.31.4 packages/plugin-css: dependencies: @@ -271,8 +269,8 @@ importers: specifier: ^5.0.0 version: 5.0.0 better-color-tools: - specifier: ^0.10.2 - version: 0.10.2 + specifier: ^0.12.3 + version: 0.12.3 mime: specifier: ^3.0.0 version: 3.0.0 @@ -290,14 +288,14 @@ importers: specifier: ^2.0.3 version: 2.0.3 '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 npm-run-all: specifier: ^4.1.5 version: 4.1.5 vitest: - specifier: ^0.31.1 - version: 0.31.1 + specifier: ^0.31.4 + version: 0.31.4 packages/plugin-js: dependencies: @@ -318,8 +316,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 vitest: - specifier: ^0.31.1 - version: 0.31.1 + specifier: ^0.31.4 + version: 0.31.4 packages/plugin-sass: dependencies: @@ -349,20 +347,20 @@ importers: specifier: ^2.0.3 version: 2.0.3 '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 npm-run-all: specifier: ^4.1.5 version: 4.1.5 vitest: - specifier: ^0.31.1 - version: 0.31.1 + specifier: ^0.31.4 + version: 0.31.4 packages/utils: devDependencies: '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 packages: @@ -378,22 +376,22 @@ packages: resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} dev: false - /@astrojs/compiler@1.4.2: - resolution: {integrity: sha512-xoRp7JpiMZPK/beUcZEM5kM44Z/h20wwwQcl54duPqQMyySG9vZ5xMM6dYiQmn7b3XzpZs0cT6TRDoJJ5gwHAQ==} + /@astrojs/compiler@1.5.0: + resolution: {integrity: sha512-k04X/7nlMklU0HQUScxbCTf5n8/Vr+0U0bawb9QWulWxd6qJf3FmBrNATgTYiltjB4pc5HBqmmttAfFi7m4lLg==} dev: true - /@astrojs/language-server@1.0.5: - resolution: {integrity: sha512-HG/9nWk+b9Ol9KgBz4Osg1iuq4DGI75GGF7Kvre0GT5rxksoGiJRK96Vd5NLyS7qOhAgX8SgXZ//5USF/fqsQA==} + /@astrojs/language-server@1.0.8: + resolution: {integrity: sha512-gssRxLGb8XnvKpqSzrDW5jdzdFnXD7eBXVkPCkkt2hv7Qzb+SAzv6hVgMok3jDCxpR1aeB+XNd9Qszj2h29iog==} hasBin: true dependencies: - '@astrojs/compiler': 1.4.2 + '@astrojs/compiler': 1.5.0 '@jridgewell/trace-mapping': 0.3.18 '@vscode/emmet-helper': 2.8.8 events: 3.3.0 prettier: 2.8.8 - prettier-plugin-astro: 0.8.1 - vscode-css-languageservice: 6.2.5 - vscode-html-languageservice: 5.0.5 + prettier-plugin-astro: 0.9.1 + vscode-css-languageservice: 6.2.6 + vscode-html-languageservice: 5.0.6 vscode-languageserver: 8.1.0 vscode-languageserver-protocol: 3.17.3 vscode-languageserver-textdocument: 1.0.8 @@ -401,13 +399,13 @@ packages: vscode-uri: 3.0.7 dev: true - /@astrojs/markdown-remark@2.2.1(astro@2.5.4): + /@astrojs/markdown-remark@2.2.1(astro@2.5.7): resolution: {integrity: sha512-VF0HRv4GpC1XEMLnsKf6jth7JSmlt9qpqP0josQgA2eSpCIAC/Et+y94mgdBIZVBYH/yFnMoIxgKVe93xfO2GA==} peerDependencies: astro: ^2.5.0 dependencies: '@astrojs/prism': 2.1.2 - astro: 2.5.4(sass@1.62.1) + astro: 2.5.7(sass@1.62.1) github-slugger: 1.5.0 import-meta-resolve: 2.2.2 rehype-raw: 6.1.1 @@ -447,8 +445,8 @@ packages: - supports-color dev: true - /@astrojs/webapi@2.1.1: - resolution: {integrity: sha512-mHZ7VgPNMeV3TYIw3SGHTKaJosBxA8bTzZ3QhNw509qvCJca4Lkjes8JywimuwTn+TMjEiv7ksNfwRluad3jqA==} + /@astrojs/webapi@2.2.0: + resolution: {integrity: sha512-mHAOApWyjqSe5AQMOUD9rsZJqbMQqe3Wosb1a40JV6Okvyxj1G6GTlthwYadWCymq/lbgwh0PLiY8Fr4eFxtuQ==} dependencies: undici: 5.22.1 dev: true @@ -460,25 +458,25 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data@7.21.9: - resolution: {integrity: sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==} + /@babel/compat-data@7.22.3: + resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.21.8: - resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==} + /@babel/core@7.22.1: + resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.9 - '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.8) - '@babel/helper-module-transforms': 7.21.5 - '@babel/helpers': 7.21.5 - '@babel/parser': 7.21.9 + '@babel/generator': 7.22.3 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.4 '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -488,11 +486,11 @@ packages: - supports-color dev: true - /@babel/generator@7.21.9: - resolution: {integrity: sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==} + /@babel/generator@7.22.3: + resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -502,25 +500,25 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true - /@babel/helper-compilation-targets@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==} + /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1): + resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.9 - '@babel/core': 7.21.8 + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 + browserslist: 4.21.7 lru-cache: 5.1.1 semver: 6.3.0 dev: true - /@babel/helper-environment-visitor@7.21.5: - resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} + /@babel/helper-environment-visitor@7.22.1: + resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} engines: {node: '>=6.9.0'} dev: true @@ -529,35 +527,35 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@babel/helper-module-imports@7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true - /@babel/helper-module-transforms@7.21.5: - resolution: {integrity: sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==} + /@babel/helper-module-transforms@7.22.1: + resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-module-imports': 7.21.4 '@babel/helper-simple-access': 7.21.5 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 transitivePeerDependencies: - supports-color dev: true @@ -571,14 +569,14 @@ packages: resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@babel/helper-string-parser@7.21.5: @@ -596,13 +594,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.21.5: - resolution: {integrity: sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==} + /@babel/helpers@7.22.3: + resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 transitivePeerDependencies: - supports-color dev: true @@ -616,40 +614,40 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.9: - resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} + /@babel/parser@7.22.4: + resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.8): + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/plugin-transform-react-jsx@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==} + /@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.21.5 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.8) - '@babel/types': 7.21.5 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) + '@babel/types': 7.22.4 dev: true - /@babel/runtime@7.21.5: - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} + /@babel/runtime@7.22.3: + resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -660,30 +658,30 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 dev: true - /@babel/traverse@7.21.5: - resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} + /@babel/traverse@7.22.4: + resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.9 - '@babel/helper-environment-visitor': 7.21.5 + '@babel/generator': 7.22.3 + '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.21.5: - resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + /@babel/types@7.22.4: + resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.21.5 @@ -719,7 +717,7 @@ packages: /@changesets/apply-release-plan@6.1.3: resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/config': 2.3.0 '@changesets/get-version-range-type': 0.3.2 '@changesets/git': 2.0.0 @@ -737,7 +735,7 @@ packages: /@changesets/assemble-release-plan@5.2.3: resolution: {integrity: sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/errors': 0.1.4 '@changesets/get-dependents-graph': 1.3.5 '@changesets/types': 5.2.1 @@ -765,7 +763,7 @@ packages: resolution: {integrity: sha512-XnTa+b51vt057fyAudvDKGB0Sh72xutQZNAdXkCqPBKO2zvs2yYZx5hFZj1u9cbtpwM6Sxtcr02/FQJfZOzemQ==} hasBin: true dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/apply-release-plan': 6.1.3 '@changesets/assemble-release-plan': 5.2.3 '@changesets/changelog-git': 0.1.14 @@ -840,7 +838,7 @@ packages: /@changesets/get-release-plan@3.0.16: resolution: {integrity: sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/assemble-release-plan': 5.2.3 '@changesets/config': 2.3.0 '@changesets/pre': 1.0.14 @@ -856,7 +854,7 @@ packages: /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -881,7 +879,7 @@ packages: /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -891,7 +889,7 @@ packages: /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/parse': 0.3.16 @@ -912,7 +910,7 @@ packages: /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 @@ -1133,13 +1131,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.41.0 + eslint: 8.42.0 eslint-visitor-keys: 3.4.1 dev: true @@ -1165,13 +1163,13 @@ packages: - supports-color dev: true - /@eslint/js@8.41.0: - resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} + /@eslint/js@8.42.0: + resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1231,7 +1229,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -1240,7 +1238,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.3 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -1269,8 +1267,8 @@ packages: fastq: 1.15.0 dev: true - /@pkgr/utils@2.4.0: - resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==} + /@pkgr/utils@2.4.1: + resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: cross-spawn: 7.0.3 @@ -1278,7 +1276,7 @@ packages: is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 - tslib: 2.5.2 + tslib: 2.5.3 dev: true /@primer/octicons@16.3.1: @@ -1304,33 +1302,33 @@ packages: engines: {node: '>=10.13.0'} dev: false - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.5 + '@types/babel__traverse': 7.20.1 dev: true /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 dev: true - /@types/babel__traverse@7.18.5: - resolution: {integrity: sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==} + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.4 dev: true /@types/chai-subset@1.3.3: @@ -1371,8 +1369,8 @@ packages: ci-info: 3.8.0 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true /@types/json5@0.0.30: @@ -1411,8 +1409,8 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@20.2.3: - resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==} + /@types/node@20.2.5: + resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} dev: true /@types/normalize-package-data@2.4.1: @@ -1443,8 +1441,8 @@ packages: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.41.0)(typescript@5.0.4): - resolution: {integrity: sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==} + /@typescript-eslint/eslint-plugin@5.59.8(@typescript-eslint/parser@5.59.8)(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1455,24 +1453,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.7(eslint@8.41.0)(typescript@5.0.4) - '@typescript-eslint/scope-manager': 5.59.7 - '@typescript-eslint/type-utils': 5.59.7(eslint@8.41.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.8(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.59.8 + '@typescript-eslint/type-utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) debug: 4.3.4 - eslint: 8.41.0 + eslint: 8.42.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.5.1 - tsutils: 3.21.0(typescript@5.0.4) - typescript: 5.0.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4): - resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==} + /@typescript-eslint/parser@5.59.8(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1481,26 +1479,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.59.7 - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.4) + '@typescript-eslint/scope-manager': 5.59.8 + '@typescript-eslint/types': 5.59.8 + '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) debug: 4.3.4 - eslint: 8.41.0 - typescript: 5.0.4 + eslint: 8.42.0 + typescript: 5.1.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.59.7: - resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==} + /@typescript-eslint/scope-manager@5.59.8: + resolution: {integrity: sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/visitor-keys': 5.59.7 + '@typescript-eslint/types': 5.59.8 + '@typescript-eslint/visitor-keys': 5.59.8 dev: true - /@typescript-eslint/type-utils@5.59.7(eslint@8.41.0)(typescript@5.0.4): - resolution: {integrity: sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==} + /@typescript-eslint/type-utils@5.59.8(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1509,23 +1507,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.0.4) + '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) debug: 4.3.4 - eslint: 8.41.0 - tsutils: 3.21.0(typescript@5.0.4) - typescript: 5.0.4 + eslint: 8.42.0 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.59.7: - resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==} + /@typescript-eslint/types@5.59.8: + resolution: {integrity: sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.4): - resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} + /@typescript-eslint/typescript-estree@5.59.8(typescript@5.1.3): + resolution: {integrity: sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1533,31 +1531,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/visitor-keys': 5.59.7 + '@typescript-eslint/types': 5.59.8 + '@typescript-eslint/visitor-keys': 5.59.8 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.1 - tsutils: 3.21.0(typescript@5.0.4) - typescript: 5.0.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.59.7(eslint@8.41.0)(typescript@5.0.4): - resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==} + /@typescript-eslint/utils@5.59.8(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) - '@types/json-schema': 7.0.11 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) + '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.59.7 - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.4) - eslint: 8.41.0 + '@typescript-eslint/scope-manager': 5.59.8 + '@typescript-eslint/types': 5.59.8 + '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) + eslint: 8.42.0 eslint-scope: 5.1.1 semver: 7.5.1 transitivePeerDependencies: @@ -1565,47 +1563,47 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.59.7: - resolution: {integrity: sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==} + /@typescript-eslint/visitor-keys@5.59.8: + resolution: {integrity: sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/types': 5.59.8 eslint-visitor-keys: 3.4.1 dev: true - /@vitest/expect@0.31.1: - resolution: {integrity: sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==} + /@vitest/expect@0.31.4: + resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==} dependencies: - '@vitest/spy': 0.31.1 - '@vitest/utils': 0.31.1 + '@vitest/spy': 0.31.4 + '@vitest/utils': 0.31.4 chai: 4.3.7 dev: true - /@vitest/runner@0.31.1: - resolution: {integrity: sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==} + /@vitest/runner@0.31.4: + resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==} dependencies: - '@vitest/utils': 0.31.1 + '@vitest/utils': 0.31.4 concordance: 5.0.4 p-limit: 4.0.0 - pathe: 1.1.0 + pathe: 1.1.1 dev: true - /@vitest/snapshot@0.31.1: - resolution: {integrity: sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==} + /@vitest/snapshot@0.31.4: + resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==} dependencies: magic-string: 0.30.0 - pathe: 1.1.0 + pathe: 1.1.1 pretty-format: 27.5.1 dev: true - /@vitest/spy@0.31.1: - resolution: {integrity: sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==} + /@vitest/spy@0.31.4: + resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==} dependencies: - tinyspy: 2.1.0 + tinyspy: 2.1.1 dev: true - /@vitest/utils@0.31.1: - resolution: {integrity: sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==} + /@vitest/utils@0.31.4: + resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==} dependencies: concordance: 5.0.4 loupe: 2.3.6 @@ -1622,8 +1620,8 @@ packages: vscode-uri: 2.1.2 dev: true - /@vscode/l10n@0.0.13: - resolution: {integrity: sha512-A3uY356uOU9nGa+TQIT/i3ziWUgJjVMUrGGXSrtRiTwklyCFjGVWIOHoEIHbJpiyhDkJd9kvIWUOfXK1IkK8XQ==} + /@vscode/l10n@0.0.14: + resolution: {integrity: sha512-/yrv59IEnmh655z1oeDnGcvMYwnEzNzHLgeYcQCkhYX0xBvYWrAuefoiLcPBUkMpJsb46bqQ6Yv4pwTTQ4d3Qg==} dev: true /acorn-jsx@5.3.2(acorn@8.8.2): @@ -1763,8 +1761,8 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /astro@2.5.4(sass@1.62.1): - resolution: {integrity: sha512-mTeXK44fJU3xX0hvwyY+BXjunpzMRcSvVEu2GpduLU4XfoPy+pbvyBphbwYq360hXupfiJbqFpRc7gLlWKSoGg==} + /astro@2.5.7(sass@1.62.1): + resolution: {integrity: sha512-qYKMIN4tXAOAsm10vU4f+Q7LfC05JmEbQiJmSBqIEhp+wnQcEUFkGLrHMSsps3oBzMtjErUdDDW5tGJcn5eVlA==} engines: {node: '>=16.12.0', npm: '>=6.14.0'} hasBin: true peerDependencies: @@ -1773,18 +1771,18 @@ packages: sharp: optional: true dependencies: - '@astrojs/compiler': 1.4.2 - '@astrojs/language-server': 1.0.5 - '@astrojs/markdown-remark': 2.2.1(astro@2.5.4) + '@astrojs/compiler': 1.5.0 + '@astrojs/language-server': 1.0.8 + '@astrojs/markdown-remark': 2.2.1(astro@2.5.7) '@astrojs/telemetry': 2.1.1 - '@astrojs/webapi': 2.1.1 - '@babel/core': 7.21.8 - '@babel/generator': 7.21.9 - '@babel/parser': 7.21.9 - '@babel/plugin-transform-react-jsx': 7.21.5(@babel/core@7.21.8) - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 - '@types/babel__core': 7.20.0 + '@astrojs/webapi': 2.2.0 + '@babel/core': 7.22.1 + '@babel/generator': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1) + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 + '@types/babel__core': 7.20.1 '@types/yargs-parser': 21.0.0 acorn: 8.8.2 boxen: 6.2.1 @@ -1819,14 +1817,14 @@ packages: shiki: 0.14.2 slash: 4.0.0 string-width: 5.1.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 supports-esm: 1.0.0 tsconfig-resolver: 3.0.1 - typescript: 5.0.4 + typescript: 5.1.3 unist-util-visit: 4.1.2 vfile: 5.3.7 - vite: 4.3.8(sass@1.62.1) - vitefu: 0.2.4(vite@4.3.8) + vite: 4.3.9(sass@1.62.1) + vitefu: 0.2.4(vite@4.3.9) yargs-parser: 21.1.1 zod: 3.21.4 transitivePeerDependencies: @@ -1863,13 +1861,8 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /better-color-tools@0.10.0: - resolution: {integrity: sha512-Val/kKqyKK43YYZuMxSPG2lgJL7P7kTm/wSrxPz3y/wXAbx4zrTTBR4A8pi10H9KFPCNcNyLBGsgZPIrnP9Yig==} - dev: true - - /better-color-tools@0.10.2: - resolution: {integrity: sha512-YVu7jDYb19XUfosvEmSb0dD+gkQrW1rJ0hDEwcW5KoJOC1iTiUMrXpDWlkU34Q3V24qbAovCR9FwnjgSxD8gpw==} - dev: false + /better-color-tools@0.12.3: + resolution: {integrity: sha512-0XEdDUO1JpAM1++x7dYJA6ggRypAkGbGHWsD/eirddkC8p+5qNU1nbfOwraqMDsJr6ttktpeqEI0VH3VS+ZkPw==} /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -1937,21 +1930,21 @@ packages: dependencies: fill-range: 7.0.1 - /breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} dependencies: wcwidth: 1.0.1 dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + /browserslist@4.21.7: + resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.405 - node-releases: 2.0.11 - update-browserslist-db: 1.0.11(browserslist@4.21.5) + caniuse-lite: 1.0.30001494 + electron-to-chromium: 1.4.419 + node-releases: 2.0.12 + update-browserslist-db: 1.0.11(browserslist@4.21.7) dev: true /buffer@6.0.3: @@ -2020,8 +2013,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + /caniuse-lite@1.0.30001494: + resolution: {integrity: sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==} dev: true /ccount@2.0.1: @@ -2482,8 +2475,8 @@ packages: domhandler: 5.0.3 dev: false - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + /dotenv@16.1.4: + resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} engines: {node: '>=12'} dev: false @@ -2501,8 +2494,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.405: - resolution: {integrity: sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==} + /electron-to-chromium@1.4.419: + resolution: {integrity: sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==} dev: true /emmet@2.4.4: @@ -2656,16 +2649,16 @@ packages: engines: {node: '>=12'} dev: true - /eslint-config-prettier@8.8.0(eslint@8.41.0): + /eslint-config-prettier@8.8.0(eslint@8.42.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.41.0 + eslint: 8.42.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.41.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2676,8 +2669,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.41.0 - eslint-config-prettier: 8.8.0(eslint@8.41.0) + eslint: 8.42.0 + eslint-config-prettier: 8.8.0(eslint@8.42.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -2703,16 +2696,16 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.41.0: - resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} + /eslint@8.42.0: + resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@eslint-community/regexpp': 4.5.1 '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.41.0 - '@humanwhocodes/config-array': 0.11.8 + '@eslint/js': 8.42.0 + '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -3864,19 +3857,19 @@ packages: unist-util-visit-parents: 5.1.3 dev: true - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: '@types/mdast': 3.0.11 '@types/unist': 2.0.6 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 unist-util-stringify-position: 3.0.3 uvu: 0.5.6 transitivePeerDependencies: @@ -3889,7 +3882,7 @@ packages: '@types/mdast': 3.0.11 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.1.0 + micromark-util-character: 1.2.0 dev: true /mdast-util-gfm-footnote@1.0.2: @@ -3897,7 +3890,7 @@ packages: dependencies: '@types/mdast': 3.0.11 mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.0.0 + micromark-util-normalize-identifier: 1.1.0 dev: true /mdast-util-gfm-strikethrough@1.0.3: @@ -3912,7 +3905,7 @@ packages: dependencies: '@types/mdast': 3.0.11 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color @@ -3928,7 +3921,7 @@ packages: /mdast-util-gfm@2.0.2: resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 mdast-util-gfm-footnote: 1.0.2 mdast-util-gfm-strikethrough: 1.0.3 @@ -3952,7 +3945,7 @@ packages: '@types/hast': 2.3.4 '@types/mdast': 3.0.11 mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 @@ -3967,7 +3960,7 @@ packages: longest-streak: 3.1.0 mdast-util-phrasing: 3.0.1 mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.0.2 + micromark-util-decode-string: 1.1.0 unist-util-visit: 4.1.2 zwitch: 2.0.4 dev: true @@ -4035,249 +4028,248 @@ packages: engines: {node: '>= 8'} dev: true - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true - /micromark-extension-gfm-autolink-literal@1.0.4: - resolution: {integrity: sha512-WCssN+M9rUyfHN5zPBn3/f0mIA7tqArHL/EKbv3CZK+LT2rG77FEikIQEqBkv46fOqXQK4NEW/Pc7Z27gshpeg==} + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-extension-gfm-footnote@1.1.0: - resolution: {integrity: sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA==} + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} dependencies: - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true - /micromark-extension-gfm-strikethrough@1.0.5: - resolution: {integrity: sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w==} + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true - /micromark-extension-gfm-table@1.0.6: - resolution: {integrity: sha512-92pq7Q+T+4kXH4M6kL+pc8WU23Z9iuhcqmtYFWdFWjm73ZscFpH2xE28+XFpGWlvgq3LUwcN0XC0PGCicYFpgA==} + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true /micromark-extension-gfm-tagfilter@1.0.2: resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: - micromark-util-types: 1.0.2 + micromark-util-types: 1.1.0 dev: true - /micromark-extension-gfm-task-list-item@1.0.4: - resolution: {integrity: sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ==} + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true /micromark-extension-gfm@2.0.3: resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} dependencies: - micromark-extension-gfm-autolink-literal: 1.0.4 - micromark-extension-gfm-footnote: 1.1.0 - micromark-extension-gfm-strikethrough: 1.0.5 - micromark-extension-gfm-table: 1.0.6 + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.4 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 dev: true - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: true - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 dev: true - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: true - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 dev: true - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} dev: true - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} dev: true - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: true - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: - micromark-util-types: 1.0.2 + micromark-util-types: 1.1.0 dev: true - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 dev: true - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: true - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: true - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: true - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.8 debug: 4.3.4 decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 transitivePeerDependencies: - supports-color @@ -4331,11 +4323,11 @@ packages: engines: {node: '>= 8.0.0'} dev: true - /mlly@1.2.1: - resolution: {integrity: sha512-1aMEByaWgBPEbWV2BOPEMySRrzl7rIHXmQxam4DM8jVjalTQDjpN2ZKOLUrwyhfZQO7IXHml2StcHMhooDeEEQ==} + /mlly@1.3.0: + resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==} dependencies: acorn: 8.8.2 - pathe: 1.1.0 + pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.1.2 dev: true @@ -4412,8 +4404,8 @@ packages: dev: false optional: true - /node-releases@2.0.11: - resolution: {integrity: sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==} + /node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} dev: true /normalize-package-data@2.5.0: @@ -4556,7 +4548,7 @@ packages: is-unicode-supported: 1.3.0 log-symbols: 5.1.0 stdin-discarder: 0.1.0 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 wcwidth: 1.0.1 dev: true @@ -4714,8 +4706,8 @@ packages: engines: {node: '>=8'} dev: true - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true /pathval@1.1.1: @@ -4766,14 +4758,8 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.2.1 - pathe: 1.1.0 - dev: true - - /pnpm@8.5.1: - resolution: {integrity: sha512-W6elL7Nww0a/MCICkzpkbxW6f99TQuX4DuJoDjWp39X08PKDkEpg4cgj3d6EtgYADcdQWl/eM8NdlLJVE3RgpA==} - engines: {node: '>=16.14'} - hasBin: true + mlly: 1.3.0 + pathe: 1.1.1 dev: true /postcss@8.4.18: @@ -4785,8 +4771,8 @@ packages: source-map-js: 1.0.2 dev: true - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + /postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -4816,11 +4802,11 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-astro@0.8.1: - resolution: {integrity: sha512-lJ/mG/Lz/ccSwNtwqpFS126mtMVzFVyYv0ddTF9wqwrEG4seECjKDAyw/oGv915rAcJi8jr89990nqfpmG+qdg==} + /prettier-plugin-astro@0.9.1: + resolution: {integrity: sha512-pYZXSbdq0eElvzoIMArzv1SBn1NUXzopjlcnt6Ql8VW32PjC12NovwBjXJ6rh8qQLi7vF8jNqAbraKW03UPfag==} engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'} dependencies: - '@astrojs/compiler': 1.4.2 + '@astrojs/compiler': 1.5.0 prettier: 2.8.8 sass-formatter: 0.7.6 synckit: 0.8.5 @@ -5035,7 +5021,7 @@ packages: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: - supports-color @@ -5142,8 +5128,8 @@ packages: glob: 7.2.3 dev: true - /rollup@3.23.0: - resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} + /rollup@3.23.1: + resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -5313,7 +5299,7 @@ packages: hasBin: true dependencies: array.prototype.flat: 1.3.1 - breakword: 1.0.5 + breakword: 1.0.6 grapheme-splitter: 1.0.4 strip-ansi: 6.0.1 wcwidth: 1.0.1 @@ -5401,7 +5387,7 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /string.prototype.padend@3.1.4: @@ -5458,8 +5444,8 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 @@ -5563,8 +5549,8 @@ packages: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: - '@pkgr/utils': 2.4.0 - tslib: 2.5.2 + '@pkgr/utils': 2.4.1 + tslib: 2.5.3 dev: true /term-size@2.2.1: @@ -5590,8 +5576,8 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} engines: {node: '>=14.0.0'} dev: true @@ -5655,18 +5641,18 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} dev: true - /tsutils@3.21.0(typescript@5.0.4): + /tsutils@3.21.0(typescript@5.1.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.0.4 + typescript: 5.1.3 dev: true /tty-table@4.2.1: @@ -5733,9 +5719,9 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} hasBin: true dev: true @@ -5834,13 +5820,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.5): + /update-browserslist-db@1.0.11(browserslist@4.21.7): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 + browserslist: 4.21.7 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -5896,17 +5882,17 @@ packages: vfile-message: 3.1.4 dev: true - /vite-node@0.31.1(@types/node@20.2.3): - resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==} + /vite-node@0.31.4(@types/node@20.2.5): + resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.2.1 - pathe: 1.1.0 + mlly: 1.3.0 + pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.3.8(@types/node@20.2.3) + vite: 4.3.9(@types/node@20.2.5) transitivePeerDependencies: - '@types/node' - less @@ -5917,8 +5903,8 @@ packages: - terser dev: true - /vite@4.3.8(@types/node@20.2.3): - resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==} + /vite@4.3.9(@types/node@20.2.5): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -5942,16 +5928,16 @@ packages: terser: optional: true dependencies: - '@types/node': 20.2.3 + '@types/node': 20.2.5 esbuild: 0.17.19 - postcss: 8.4.23 - rollup: 3.23.0 + postcss: 8.4.24 + rollup: 3.23.1 optionalDependencies: fsevents: 2.3.2 dev: true - /vite@4.3.8(sass@1.62.1): - resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==} + /vite@4.3.9(sass@1.62.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -5976,14 +5962,14 @@ packages: optional: true dependencies: esbuild: 0.17.19 - postcss: 8.4.23 - rollup: 3.23.0 + postcss: 8.4.24 + rollup: 3.23.1 sass: 1.62.1 optionalDependencies: fsevents: 2.3.2 dev: true - /vitefu@0.2.4(vite@4.3.8): + /vitefu@0.2.4(vite@4.3.9): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: vite: ^3.0.0 || ^4.0.0 @@ -5991,11 +5977,11 @@ packages: vite: optional: true dependencies: - vite: 4.3.8(sass@1.62.1) + vite: 4.3.9(sass@1.62.1) dev: true - /vitest@0.31.1: - resolution: {integrity: sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==} + /vitest@0.31.4: + resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: @@ -6027,12 +6013,12 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 20.2.3 - '@vitest/expect': 0.31.1 - '@vitest/runner': 0.31.1 - '@vitest/snapshot': 0.31.1 - '@vitest/spy': 0.31.1 - '@vitest/utils': 0.31.1 + '@types/node': 20.2.5 + '@vitest/expect': 0.31.4 + '@vitest/runner': 0.31.4 + '@vitest/snapshot': 0.31.4 + '@vitest/spy': 0.31.4 + '@vitest/utils': 0.31.4 acorn: 8.8.2 acorn-walk: 8.2.0 cac: 6.7.14 @@ -6041,14 +6027,14 @@ packages: debug: 4.3.4 local-pkg: 0.4.3 magic-string: 0.30.0 - pathe: 1.1.0 + pathe: 1.1.1 picocolors: 1.0.0 std-env: 3.3.3 strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.5.0 - vite: 4.3.8(@types/node@20.2.3) - vite-node: 0.31.1(@types/node@20.2.3) + vite: 4.3.9(@types/node@20.2.5) + vite-node: 0.31.4(@types/node@20.2.5) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -6059,19 +6045,19 @@ packages: - terser dev: true - /vscode-css-languageservice@6.2.5: - resolution: {integrity: sha512-/1oyBZK3jfx6A0cA46FCUpy6OlqEsMT47LUIldCIP1YMKRYezJ9No+aNj9IM0AqhRZ92DxZ1DmU5lJ+biuiacA==} + /vscode-css-languageservice@6.2.6: + resolution: {integrity: sha512-SA2WkeOecIpUiEbZnjOsP/fI5CRITZEiQGSHXKiDQDwLApfKcnLhZwMtOBbIifSzESVcQa7b/shX/nbnF4NoCg==} dependencies: - '@vscode/l10n': 0.0.13 + '@vscode/l10n': 0.0.14 vscode-languageserver-textdocument: 1.0.8 vscode-languageserver-types: 3.17.3 vscode-uri: 3.0.7 dev: true - /vscode-html-languageservice@5.0.5: - resolution: {integrity: sha512-7788ZT+I7/UhFoI4+bzaAiGGZEW7X39kTeuytLtw6jJA6W7ez85bWKYoFDcwrPNmywj3n/IkU9Op9asaje44jg==} + /vscode-html-languageservice@5.0.6: + resolution: {integrity: sha512-gCixNg6fjPO7+kwSMBAVXcwDRHdjz1WOyNfI0n5Wx0J7dfHG8ggb3zD1FI8E2daTZrwS1cooOiSoc1Xxph4qRQ==} dependencies: - '@vscode/l10n': 0.0.13 + '@vscode/l10n': 0.0.14 vscode-languageserver-textdocument: 1.0.8 vscode-languageserver-types: 3.17.3 vscode-uri: 3.0.7 @@ -6245,7 +6231,7 @@ packages: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /wrappy@1.0.2: