diff --git a/.changeset/rude-berries-train.md b/.changeset/rude-berries-train.md new file mode 100644 index 0000000..9f1cc41 --- /dev/null +++ b/.changeset/rude-berries-train.md @@ -0,0 +1,5 @@ +--- +'@tokens-studio/sd-transforms': minor +--- + +BREAKING: update to Style Dictionary `v4.0.0-prerelease.27`, set preprocessor name to `'tokens-studio'`, which now has to be applied if you want to exclude parent keys, expand composite types or add font style properties to typography values. diff --git a/README.md b/README.md index 29357c2..16e9aee 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ## Table of contents - [Installation](#installation) +- [Compatibility](#compatibility) - [Getting Started](#usage) - [Using the transforms](#using-the-transforms) - [Custom Transform Group](#custom-transform-group) @@ -55,13 +56,31 @@ With [NPM](https://www.npmjs.com/): npm install @tokens-studio/sd-transforms ``` +## Compatibility + +This package is to be used in combination with [Style Dictionary](https://github.com/amzn/style-dictionary). + +There are some caveats however, with regards to which versions of Style Dictionary are compatible with which versions of this package: + +| Style Dictionary | sd-transforms | +| --------------------------------------------------------- | ----------------------- | +| **3.0.0** - **4.0.0**-prerelease.**1** | <= **0.12.2** | +| **4.0.0**-prerelease.**2** - **4.0.0**-prerelease.**18** | **0.13.0** - **0.14.4** | +| **4.0.0**-prerelease.**18** - **4.0.0**-prerelease.**26** | **0.13.0** - **0.15.2** | +| >= **4.0.0**-prerelease.**27** | >= **0.16.0** | + +This may seem a little tedious, but the reason is because `sd-transforms` is still in alpha, and Style Dictionary v4 is still being worked on, iteratively doing lots of breaking changes. + +This will be much simpler when Style Dictionary v4 is released, at that point `sd-transforms` v1 will be released and be out of alpha. +Both APIs will be stable then. + ## Usage > Note: this library is available both in CJS and ESM ```js -const { registerTransforms } = require('@tokens-studio/sd-transforms'); -const StyleDictionary = require('style-dictionary'); +import { registerTransforms } from '@tokens-studio/sd-transforms'; +import StyleDictionary from 'style-dictionary'; // will register them on StyleDictionary object // that is installed as a dependency of this package. @@ -69,9 +88,10 @@ registerTransforms(StyleDictionary); const sd = StyleDictionary.extend({ source: ['**/*.json'], // <-- make sure to have this match your token files!!! + preprocessors: ['tokens-studio'], // <-- since 0.16.0 this must be explicit platforms: { css: { - transformGroup: 'tokens-studio', + transformGroup: 'tokens-studio', // <-- apply the tokens-studio transformGroup to apply all transforms transforms: ['name/kebab'], // <-- add a token name transform for generating token names, default is camel buildPath: 'build/css/', files: [ @@ -98,11 +118,25 @@ node build-output.js > From Style-Dictionary `4.0.0-prerelease.18`, [`transformGroup` and `transforms` can now be combined in a platform inside your config](https://github.com/amzn/style-dictionary/blob/v4/CHANGELOG.md#400-prerelease18). +### Using the preprocessor + +If you want to use `excludeParentKeys`, `expand` or allow this package to extract the `fontStyle` from the `fontWeight` e.g. `regular italic`, +you must add the `'tokens-studio'` preprocessor explicitly in the configuration: + +```json +{ + "source": ["**/*.tokens.json"], + "preprocessors": ["tokens-studio"], + "platforms": {} +} +``` + ### Using the transforms ```json { "source": ["**/*.tokens.json"], + "preprocessors": ["tokens-studio"], "platforms": { "css": { "transformGroup": "tokens-studio", @@ -130,18 +164,18 @@ node build-output.js ``` More fine-grained control is possible, every transformation is available as a raw JavaScript function -for you to create your own Style-Dictionary transformer out of. +for you to create your own Style-Dictionary transform out of. ```js -const { transformDimension } = require('@tokens-studio/sd-transforms'); -const StyleDictionary = require('style-dictionary'); +import { transformDimension } from '@tokens-studio/sd-transforms'; +import StyleDictionary from 'style-dictionary'; StyleDictionary.registerTransform({ name: 'my/size/px', type: 'value', transitive: true, - matcher: token => ['fontSizes', 'dimension', 'borderRadius', 'spacing'].includes(token.type), - transformer: token => transformDimension(token.value), + filter: token => ['fontSizes', 'dimension', 'borderRadius', 'spacing'].includes(token.type), + transform: token => transformDimension(token.value), }); ``` @@ -149,12 +183,12 @@ StyleDictionary.registerTransform({ > From Style-Dictionary `4.0.0-prerelease.18`, [`transformGroup` and `transforms` can now be combined in a platform inside your config](https://github.com/amzn/style-dictionary/blob/v4/CHANGELOG.md#400-prerelease18). -You can create a custom transformGroup that includes the individual transforms from this package. -If you wish to use the transformGroup, but adjust or remove a few transforms, your best option is to create a custom transform group: +You can create a custom `transformGroup` that includes the individual transforms from this package. +If you wish to use the `transformGroup`, but adjust or remove a few transforms, your best option is to create a custom transform group: ```js -const { transforms } = require('@tokens-studio/sd-transforms'); -const StyleDictionary = require('style-dictionary'); +import { transforms } from '@tokens-studio/sd-transforms'; +import StyleDictionary from 'style-dictionary'; // Register custom tokens-studio transform group // without 'px' being added to numbers without a unit @@ -215,9 +249,9 @@ Here's a full example of how you can use this in conjunction with Style Dictiona Run this script: ```cjs -const { registerTransforms } = require('@tokens-studio/sd-transforms'); -const StyleDictionary = require('style-dictionary'); -const { promises } = require('fs'); +import { registerTransforms } from '@tokens-studio/sd-transforms'; +import StyleDictionary from 'style-dictionary'; +import { promises } from 'fs'; registerTransforms(StyleDictionary, { /* options here if needed */ @@ -229,6 +263,7 @@ async function run() { source: Object.entries(theme.selectedTokenSets) .filter(([, val]) => val !== 'disabled') .map(([tokenset]) => `${tokenset}.json`), + preprocessors: ['tokens-studio'], // <-- since 0.16.0 this must be explicit platforms: { css: { transformGroup: 'tokens-studio', @@ -289,8 +324,8 @@ Running `permutateThemes` on these themes will generate 4 theme combinations: See details below: ```js -const { permutateThemes } = require('@tokens-studio/sd-transforms'); -const fs = require('fs'); +import { permutateThemes } from '@tokens-studio/sd-transforms'; +import fs from 'fs'; /** * Input: @@ -347,9 +382,9 @@ Note that it is a best practice to generate standalone output files for each the Full example with multi-dimensional themes: ```js -const { registerTransforms, permutateThemes } = require('@tokens-studio/sd-transforms'); -const StyleDictionary = require('style-dictionary'); -const { promises } = require('fs'); +import { registerTransforms, permutateThemes } from '@tokens-studio/sd-transforms'; +import StyleDictionary from 'style-dictionary'; +import { promises } from 'fs'; registerTransforms(StyleDictionary, { /* options here if needed */ @@ -360,6 +395,7 @@ async function run() { const themes = permutateThemes($themes, { separator: '_' }); const configs = Object.entries(themes).map(([name, tokensets]) => ({ source: tokensets.map(tokenset => `${tokenset}.json`), + preprocessors: ['tokens-studio'], // <-- since 0.16.0 this must be explicit platforms: { css: { transformGroup: 'tokens-studio', diff --git a/package-lock.json b/package-lock.json index 11e6ec0..cb74e95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tokens-studio/sd-transforms", - "version": "0.15.0", + "version": "0.15.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@tokens-studio/sd-transforms", - "version": "0.15.0", + "version": "0.15.2", "license": "MIT", "dependencies": { "@tokens-studio/types": "^0.4.0", @@ -15,8 +15,7 @@ "deepmerge": "^4.3.1", "expr-eval-fork": "^2.0.2", "is-mergeable-object": "^1.1.1", - "postcss-calc-ast-parser": "^0.1.4", - "style-dictionary": "^4.0.0-prerelease.22" + "postcss-calc-ast-parser": "^0.1.4" }, "devDependencies": { "@changesets/cli": "^2.26.0", @@ -50,6 +49,9 @@ }, "engines": { "node": ">=17.0.0" + }, + "peerDependencies": { + "style-dictionary": "^4.0.0-prerelease.27" } }, "node_modules/@75lb/deep-merge": { @@ -125,6 +127,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/@bundled-es-modules/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-Rk453EklPUPC3NRWc3VUNI/SSUjdBaFoaQvFRmNBNtMHVtOFD5AntiWg5kEE1hqcPqedYFDzxE3ZcMYPcA195w==", + "peer": true, "dependencies": { "deepmerge": "^4.3.1" } @@ -134,6 +137,7 @@ "resolved": "https://registry.npmjs.org/@bundled-es-modules/glob/-/glob-10.3.13.tgz", "integrity": "sha512-eK+st/vwMmQy0pVvHLa2nzsS+p6NkNVR34e8qfiuzpzS1he4bMU3ODl0gbyv4r9INq5x41GqvRmFr8PtNw4yRA==", "hasInstallScript": true, + "peer": true, "dependencies": { "buffer": "^6.0.3", "events": "^3.3.0", @@ -163,22 +167,23 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "node_modules/@bundled-es-modules/memfs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/memfs/-/memfs-4.2.3.tgz", - "integrity": "sha512-staos4ByDNS0Ikx2fHYMgluoDdbN5yEpB1hobjDkU7b946+NXAik50pLhWWZ/JC3wXqYW4B00ul1tNxgDz4TOQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/memfs/-/memfs-4.8.1.tgz", + "integrity": "sha512-9BodQuihWm3XJGKYuV/vXckK8Tkf9EDiT/au1NJeFUyBMe7EMYRtOqL9eLzrjqJSDJUFoGwQFHvraFHwR8cysQ==", + "peer": true, "dependencies": { "assert": "^2.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "memfs": "^4.2.1", + "memfs": "^4.8.1", "path": "^0.12.7", - "process": "^0.11.10", "stream": "^0.0.2", "util": "^0.12.5" } @@ -201,6 +206,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -1007,6 +1013,60 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", + "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "peer": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz", + "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -2375,7 +2435,8 @@ "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "peer": true }, "node_modules/accepts": { "version": "1.3.8", @@ -2644,6 +2705,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -2674,6 +2736,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -2864,13 +2927,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3025,7 +3093,8 @@ "node_modules/change-case": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.3.0.tgz", - "integrity": "sha512-Eykca0fGS/xYlx2fG5NqnGSnsWauhSGiSXYhB1kO6E909GUfo8S54u4UZNS7lMJmgZumZ2SUpWaoLgAcfQRICg==" + "integrity": "sha512-Eykca0fGS/xYlx2fG5NqnGSnsWauhSGiSXYhB1kO6E909GUfo8S54u4UZNS7lMJmgZumZ2SUpWaoLgAcfQRICg==", + "peer": true }, "node_modules/chardet": { "version": "0.7.0", @@ -3558,16 +3627,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -3580,10 +3652,11 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3691,6 +3764,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==", + "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -3793,6 +3867,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", @@ -4449,6 +4542,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "peer": true, "engines": { "node": ">=0.8.x" } @@ -4554,12 +4648,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "peer": true - }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -4658,6 +4746,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "peer": true, "dependencies": { "micromatch": "^4.0.2" } @@ -4863,14 +4952,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5058,6 +5151,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -5084,11 +5178,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5130,6 +5224,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5237,6 +5342,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "peer": true, "engines": { "node": ">=10.18" } @@ -5371,6 +5477,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5583,6 +5690,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "peer": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -5804,7 +5912,8 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true }, "node_modules/isbinaryfile": { "version": "5.0.0", @@ -5926,41 +6035,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-joy": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/json-joy/-/json-joy-9.9.1.tgz", - "integrity": "sha512-/d7th2nbQRBQ/nqTkBe6KjjvDciSwn9UICmndwk3Ed/Bk9AqkTRm4PnLVfXG4DKbT0rEY0nKnwE7NqZlqKE6kg==", - "dependencies": { - "arg": "^5.0.2", - "hyperdyperid": "^1.2.0" - }, - "bin": { - "jj": "bin/jj.js", - "json-pack": "bin/json-pack.js", - "json-pack-test": "bin/json-pack-test.js", - "json-patch": "bin/json-patch.js", - "json-patch-test": "bin/json-patch-test.js", - "json-pointer": "bin/json-pointer.js", - "json-pointer-test": "bin/json-pointer-test.js", - "json-unpack": "bin/json-unpack.js" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "quill-delta": "^5", - "rxjs": "7", - "tslib": "2" - } - }, - "node_modules/json-joy/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5983,6 +6057,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", "integrity": "sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==", + "peer": true, "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -6006,6 +6081,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -6026,6 +6102,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6055,6 +6132,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "peer": true, "dependencies": { "graceful-fs": "^4.1.11" } @@ -6450,11 +6528,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "node_modules/lodash.assignwith": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", @@ -6467,18 +6540,6 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "peer": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "peer": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6776,12 +6837,15 @@ } }, "node_modules/memfs": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.6.0.tgz", - "integrity": "sha512-I6mhA1//KEZfKRQT9LujyW6lRbX7RkC24xKododIDO3AGShcaFAMKElv1yFGWX8fD4UaSiwasr3NeQ5TdtHY1A==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.2.tgz", + "integrity": "sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ==", + "peer": true, "dependencies": { - "json-joy": "^9.2.0", - "thingies": "^1.11.1" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.1.2", + "sonic-forest": "^1.0.0", + "tslib": "^2.0.0" }, "engines": { "node": ">= 4.0.0" @@ -6789,9 +6853,6 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" } }, "node_modules/memorystream": { @@ -7507,12 +7568,13 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -7785,6 +7847,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "peer": true, "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", @@ -7814,6 +7877,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7828,6 +7892,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7843,6 +7908,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -7853,12 +7919,14 @@ "node_modules/patch-package/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true }, "node_modules/patch-package/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -7873,6 +7941,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7892,6 +7961,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { "node": ">=8" } @@ -7900,6 +7970,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -7911,6 +7982,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -7926,6 +7998,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -7937,6 +8010,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7951,6 +8025,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "peer": true, "engines": { "node": ">=6" } @@ -7959,6 +8034,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7970,6 +8046,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -7978,6 +8055,7 @@ "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "peer": true, "dependencies": { "process": "^0.11.1", "util": "^0.10.3" @@ -8057,17 +8135,20 @@ "node_modules/path-unified": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/path-unified/-/path-unified-0.1.0.tgz", - "integrity": "sha512-/Oaz9ZJforrkmFrwkR/AcvjVsCAwGSJHO0X6O6ISj8YeFbATjIEBXLDcZfnK3MO4uvCBrJTdVIxdOc79PMqSdg==" + "integrity": "sha512-/Oaz9ZJforrkmFrwkR/AcvjVsCAwGSJHO0X6O6ISj8YeFbATjIEBXLDcZfnK3MO4uvCBrJTdVIxdOc79PMqSdg==", + "peer": true }, "node_modules/path/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "peer": true }, "node_modules/path/node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "peer": true, "dependencies": { "inherits": "2.0.3" } @@ -8389,6 +8470,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "peer": true, "engines": { "node": ">= 0.6.0" } @@ -8527,20 +8609,6 @@ "node": ">=8" } }, - "node_modules/quill-delta": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", - "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", - "peer": true, - "dependencies": { - "fast-diff": "^1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, "node_modules/rambda": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", @@ -9005,6 +9073,7 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -9074,14 +9143,16 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9312,6 +9383,25 @@ "node": ">=8" } }, + "node_modules/sonic-forest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz", + "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==", + "peer": true, + "dependencies": { + "tree-dump": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/sort-object-keys": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", @@ -9473,6 +9563,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", + "peer": true, "dependencies": { "emitter-component": "^1.1.1" } @@ -9711,20 +9802,20 @@ } }, "node_modules/style-dictionary": { - "version": "4.0.0-prerelease.22", - "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-4.0.0-prerelease.22.tgz", - "integrity": "sha512-UUBFCmNvjHAArkIxE6DMWbeUzD43/P5XzI3R4738pqjvtJsL7TE7lYUnjVPn7I4QFEYZtr7v/NMVc085p25FVQ==", + "version": "4.0.0-prerelease.27", + "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-4.0.0-prerelease.27.tgz", + "integrity": "sha512-mi0cSYdPRZqQG0S2g7+31HGwfeE+SxJVqD861ZuHLPqbHIEedaJ9cTAhW+JXACqL44AuGIQ4/H/ZqN5XHQU5cg==", "hasInstallScript": true, + "peer": true, "dependencies": { "@bundled-es-modules/deepmerge": "^4.3.1", "@bundled-es-modules/glob": "^10.3.13", - "@bundled-es-modules/memfs": "^4.2.3", + "@bundled-es-modules/memfs": "^4.8.1", "chalk": "^5.3.0", "change-case": "^5.3.0", "commander": "^8.3.0", "is-plain-obj": "^4.1.0", "json5": "^2.2.2", - "lodash-es": "^4.17.21", "patch-package": "^8.0.0", "path-unified": "^0.1.0", "tinycolor2": "^1.6.0" @@ -9740,6 +9831,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -9751,6 +9843,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "peer": true, "engines": { "node": ">= 12" } @@ -9759,6 +9852,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "peer": true, "engines": { "node": ">=12" }, @@ -9876,9 +9970,10 @@ "dev": true }, "node_modules/thingies": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.15.0.tgz", - "integrity": "sha512-ZSJlvEpD8QllYim0VSGlbAoob/iPrTWNlV/m8ltizMvMmzzU2gVJvHfH9ijLstyciWF70ZiQXqz+BCXWJq+ZQw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "peer": true, "engines": { "node": ">=10.18" }, @@ -9940,6 +10035,22 @@ "node": ">=12" } }, + "node_modules/tree-dump": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", + "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -10442,6 +10553,7 @@ "version": "0.11.3", "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "peer": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -10450,12 +10562,14 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "peer": true }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "peer": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", diff --git a/package.json b/package.json index a68e872..241b3cb 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,10 @@ "deepmerge": "^4.3.1", "expr-eval-fork": "^2.0.2", "is-mergeable-object": "^1.1.1", - "postcss-calc-ast-parser": "^0.1.4", - "style-dictionary": "^4.0.0-prerelease.22" + "postcss-calc-ast-parser": "^0.1.4" + }, + "peerDependencies": { + "style-dictionary": "^4.0.0-prerelease.27" }, "devDependencies": { "@changesets/cli": "^2.26.0", diff --git a/src/parsers/expand-composites.ts b/src/parsers/expand-composites.ts index 8564a03..8890c08 100644 --- a/src/parsers/expand-composites.ts +++ b/src/parsers/expand-composites.ts @@ -76,7 +76,7 @@ export function expandToken(token: Expandables, isShadow = false): SingleToken { expandedObj[index + 1][key] = { ...copyMeta, - [`${uses$ ? '$' : ''}value`]: `${value}`, + [`${uses$ ? '$' : ''}value`]: value, [`${uses$ ? '$' : ''}type`]: getType(key), }; }); @@ -85,7 +85,7 @@ export function expandToken(token: Expandables, isShadow = false): SingleToken { expandedObj[key] = { ...copyMeta, - [`${uses$ ? '$' : ''}value`]: `${value}`, + [`${uses$ ? '$' : ''}value`]: value, [`${uses$ ? '$' : ''}type`]: getType(key), }; }); diff --git a/src/registerTransforms.ts b/src/registerTransforms.ts index 6eab375..9178ae4 100644 --- a/src/registerTransforms.ts +++ b/src/registerTransforms.ts @@ -1,5 +1,5 @@ -import type StyleDictionary from 'style-dictionary'; import type { DesignTokens } from 'style-dictionary/types'; +import StyleDictionary from 'style-dictionary'; import { transformDimension } from './transformDimension.js'; import { transformHEXRGBaForCSS } from './css/transformHEXRGBa.js'; import { transformShadowForCSS } from './css/transformShadow.js'; @@ -51,19 +51,11 @@ export async function registerTransforms( // expand composition tokens, typography, border, shadow (latter 3 conditionally, as opt-in) if (supportsPreprocessors) { sd.registerPreprocessor({ - name: 'sd-transforms-preprocessors', + name: 'tokens-studio', preprocessor: dictionary => { return parseTokens(dictionary, transformOpts) as DesignTokens; }, }); - } else { - sd.registerParser({ - pattern: /\.json$/, - parse: ({ filePath, contents }) => { - const tokens = JSON.parse(contents); - return parseTokens(tokens, transformOpts, filePath) as DesignTokens; - }, - }); } } @@ -71,14 +63,14 @@ export async function registerTransforms( name: 'ts/descriptionToComment', type: 'attribute', // in style-dictionary v4.0.0-prerelease.9, $description is converted to comments (createPropertyFormatter) - matcher: token => !token.$description && token.description, - transformer: token => mapDescriptionToComment(token), + filter: token => !token.$description && token.description, + transform: token => mapDescriptionToComment(token), }); sd.registerTransform({ name: 'ts/size/px', type: 'value', - matcher: token => { + filter: token => { const type = token.$type ?? token.type; return ( typeof type === 'string' && @@ -87,42 +79,42 @@ export async function registerTransforms( ) ); }, - transformer: token => transformDimension(token.$value ?? token.value), + transform: token => transformDimension(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/opacity', type: 'value', - matcher: token => (token.$type ?? token.type) === 'opacity', - transformer: token => transformOpacity(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'opacity', + transform: token => transformOpacity(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/size/css/letterspacing', type: 'value', - matcher: token => (token.$type ?? token.type) === 'letterSpacing', - transformer: token => transformLetterSpacingForCSS(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'letterSpacing', + transform: token => transformLetterSpacingForCSS(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/size/lineheight', type: 'value', - matcher: token => (token.$type ?? token.type) === 'lineHeights', - transformer: token => transformLineHeight(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'lineHeights', + transform: token => transformLineHeight(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/typography/fontWeight', type: 'value', - matcher: token => (token.$type ?? token.type) === 'fontWeights', - transformer: token => transformFontWeights(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'fontWeights', + transform: token => transformFontWeights(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/typography/css/fontFamily', type: 'value', - matcher: token => (token.$type ?? token.type) === 'fontFamilies', - transformer: token => processFontFamily(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'fontFamilies', + transform: token => processFontFamily(token.$value ?? token.value), }); /** @@ -140,45 +132,45 @@ export async function registerTransforms( name: 'ts/resolveMath', type: 'value', transitive: true, - matcher: token => typeof (token.$value ?? token.value) === 'string', - transformer: token => checkAndEvaluateMath(token.$value ?? token.value), + filter: token => typeof (token.$value ?? token.value) === 'string', + transform: token => checkAndEvaluateMath(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/typography/css/shorthand', type: 'value', transitive: true, - matcher: token => (token.$type ?? token.type) === 'typography', - transformer: token => transformTypographyForCSS(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'typography', + transform: token => transformTypographyForCSS(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/typography/compose/shorthand', type: 'value', transitive: true, - matcher: token => (token.$type ?? token.type) === 'typography', - transformer: token => transformTypographyForCompose(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'typography', + transform: token => transformTypographyForCompose(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/border/css/shorthand', type: 'value', transitive: true, - matcher: token => { + filter: token => { return (token.$type ?? token.type) === 'border'; }, - transformer: token => transformBorderForCSS(token.$value ?? token.value), + transform: token => transformBorderForCSS(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/shadow/css/shorthand', type: 'value', transitive: true, - matcher: token => { + filter: token => { const type = token.$type ?? token.type; return typeof type === 'string' && ['boxShadow'].includes(type); }, - transformer: token => { + transform: token => { const val = token.$value ?? token.value; return Array.isArray(val) ? val.map(single => transformShadowForCSS(single)).join(', ') @@ -190,19 +182,19 @@ export async function registerTransforms( name: 'ts/color/css/hexrgba', type: 'value', transitive: true, - matcher: token => (token.$type ?? token.type) === 'color', - transformer: token => transformHEXRGBaForCSS(token.$value ?? token.value), + filter: token => (token.$type ?? token.type) === 'color', + transform: token => transformHEXRGBaForCSS(token.$value ?? token.value), }); sd.registerTransform({ name: 'ts/color/modifiers', type: 'value', transitive: true, - matcher: token => + filter: token => (token.$type ?? token.type) === 'color' && token.$extensions && token.$extensions['studio.tokens']?.modify, - transformer: token => transformColorModifiers(token, transformOpts?.['ts/color/modifiers']), + transform: token => transformColorModifiers(token, transformOpts?.['ts/color/modifiers']), }); sd.registerTransformGroup({ diff --git a/test/integration/color-modifier-references.test.ts b/test/integration/color-modifier-references.test.ts index ea2319b..f95f72f 100644 --- a/test/integration/color-modifier-references.test.ts +++ b/test/integration/color-modifier-references.test.ts @@ -1,4 +1,4 @@ -import type StyleDictionary from 'style-dictionary'; +import StyleDictionary from 'style-dictionary'; import { expect } from '@esm-bundle/chai'; import { promises } from 'node:fs'; import path from 'node:path'; diff --git a/test/integration/custom-group.test.ts b/test/integration/custom-group.test.ts index 5add132..32a58e0 100644 --- a/test/integration/custom-group.test.ts +++ b/test/integration/custom-group.test.ts @@ -41,7 +41,7 @@ async function before() { async function after() { await cleanup(dict); - delete StyleDictionary.transformGroup['custom/tokens-studio']; + delete StyleDictionary.hooks.transformGroups['custom/tokens-studio']; } describe('custom transform group', () => { diff --git a/test/integration/swift-UI-color.test.ts b/test/integration/swift-UI-color.test.ts index c8c0163..ecee164 100644 --- a/test/integration/swift-UI-color.test.ts +++ b/test/integration/swift-UI-color.test.ts @@ -13,7 +13,7 @@ StyleDictionary.registerTransform({ name: 'transitive/color/UIColorSwift', type: 'value', transitive: true, - transformer: token => { + transform: token => { const { r, g, b, a } = Color(token.value).toRgb(); const rFixed = (r / 255.0).toFixed(3); const gFixed = (g / 255.0).toFixed(3); diff --git a/test/integration/utils.ts b/test/integration/utils.ts index d00f837..8be98fe 100644 --- a/test/integration/utils.ts +++ b/test/integration/utils.ts @@ -4,7 +4,10 @@ import { registerTransforms } from '../../src/registerTransforms.js'; export async function init(cfg: Config, transformOpts = {}) { registerTransforms(StyleDictionary, transformOpts); - const dict = new StyleDictionary(cfg); + const dict = new StyleDictionary({ + ...cfg, + preprocessors: ['tokens-studio', ...(cfg.preprocessors ?? [])], + }); await dict.buildAllPlatforms(); return dict; } @@ -16,11 +19,11 @@ export async function cleanup(dict?: StyleDictionary) { // @ts-expect-error polluting dictionary it on purpose dict.cleaned = true; } - StyleDictionary.parsers = []; - delete StyleDictionary.transformGroup['tokens-studio']; - Object.keys(StyleDictionary.transform).forEach(transform => { + StyleDictionary.hooks.parsers = {}; + delete StyleDictionary.hooks.transformGroups['tokens-studio']; + Object.keys(StyleDictionary.hooks.transforms).forEach(transform => { if (transform.startsWith('ts/')) { - delete StyleDictionary.transform[transform]; + delete StyleDictionary.hooks.transforms[transform]; } }); } diff --git a/test/suites/transform-suite.spec.ts b/test/suites/transform-suite.spec.ts index 27dbad4..47f0d62 100644 --- a/test/suites/transform-suite.spec.ts +++ b/test/suites/transform-suite.spec.ts @@ -1,14 +1,14 @@ import { expect } from '@esm-bundle/chai'; import { DesignToken } from 'style-dictionary/types'; -export function runTransformSuite(transformer: (value: unknown) => unknown, token?: DesignToken) { +export function runTransformSuite(transform: (value: unknown) => unknown, token?: DesignToken) { describe('Test Suite: Transforms', () => { it('returns undefined if a token value is undefined, which can happen when there are broken references in token values', () => { - // Most transformers only are passed the token value, but in some transformers, the full token object is passed + // Most transforms only are passed the token value, but in some transforms, the full token object is passed if (token) { - expect(transformer({ ...token, value: undefined })).to.equal(undefined); + expect(transform({ ...token, value: undefined })).to.equal(undefined); } else { - expect(transformer(undefined)).to.equal(undefined); + expect(transform(undefined)).to.equal(undefined); } }); });