From 8dddd8d83e1f911b5f9ed315004b78c0846f7f8c Mon Sep 17 00:00:00 2001 From: Alexey Plutalov Date: Tue, 11 Jul 2023 15:31:32 +0300 Subject: [PATCH] feat: add support of package imports for Sass (#4) * test: add support of `node_modules` mocks * chore: run prettier in Idea * feat(sass): resolve `~` to the `sass` field in the `package.json` * test: add tests for resolving `~` urls in Sass files * chore: add changeset * docs: add section about Sass imports * build: update dependencies * chore: add new changeset and update an existing one * chore: enable ESlint in Idea * style: fix ESLint problems --- .changeset/blue-terms-fly.md | 5 + .changeset/silent-lobsters-invent.md | 31 ++ .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/prettier.xml | 7 + README.md | 20 + package.json | 10 +- pnpm-lock.yaml | 438 +++++++++++------- src/plugins/stylesPlugin/renderStyle.ts | 46 +- tests/browser.test.ts | 12 + .../__node_modules__/my-module/package.json | 5 + .../__node_modules__/my-module/vars.scss | 1 + .../browser-scss-node-modules/package.json | 14 + .../src/index.module.scss | 5 + .../browser-scss-node-modules/src/index.scss | 5 + .../browser-scss-node-modules/src/index.ts | 5 + .../tsconfig.forge.json | 5 + tests/setup.ts | 27 +- tests/snapshots/browser.test.ts.md | 16 + tests/snapshots/browser.test.ts.snap | Bin 3841 -> 3877 bytes 19 files changed, 472 insertions(+), 186 deletions(-) create mode 100644 .changeset/blue-terms-fly.md create mode 100644 .changeset/silent-lobsters-invent.md create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/prettier.xml create mode 100644 tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/package.json create mode 100644 tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/vars.scss create mode 100644 tests/fixtures/browser-scss-node-modules/package.json create mode 100644 tests/fixtures/browser-scss-node-modules/src/index.module.scss create mode 100644 tests/fixtures/browser-scss-node-modules/src/index.scss create mode 100644 tests/fixtures/browser-scss-node-modules/src/index.ts create mode 100644 tests/fixtures/browser-scss-node-modules/tsconfig.forge.json diff --git a/.changeset/blue-terms-fly.md b/.changeset/blue-terms-fly.md new file mode 100644 index 0000000..bf0399c --- /dev/null +++ b/.changeset/blue-terms-fly.md @@ -0,0 +1,5 @@ +--- +'@tabula/forge': patch +--- + +update dependencies diff --git a/.changeset/silent-lobsters-invent.md b/.changeset/silent-lobsters-invent.md new file mode 100644 index 0000000..48bce65 --- /dev/null +++ b/.changeset/silent-lobsters-invent.md @@ -0,0 +1,31 @@ +--- +'@tabula/forge': minor +--- + +adds support of packages resolve in the Sass + +The `forge` resolves external packages through `~` urls. + +Example: + +```scss +@use `~@tabula/ui-theme` as theme; + +.root { + background-color: theme.$color--primary; +} +``` + +It will search `` in dependencies through Node.js `require`, and try to read `sass` field in the `package.json` +of the founded package. + +Example: + +```json +{ + "name": "@tabula/ui-theme", + "sass": "./sass/index.scss" +} +``` + +will be resolved to the `/@tabula/ui-theme/sass/index.scss`. diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..0c83ac4 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 2a5d1ab..c622673 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,26 @@ The `forge` supports usage of the [PostCSS](https://postcss.org/) and You should use `*.pcss` extension for PostCSS and `*.scss` for the Sass. +#### Sass Imports + +We support imports in format of `~`. It's similar to the Webpack, but +has own restrictions. + +The `forge` doesn't support paths inside of the package. It does searce +the `package.json` of the given package, and try to read `sass` field inside +of it. + +Example: + +```json +{ + "name": "@tabula/ui-theme", + "sass": "./sass/index.scss" +} +``` + +will be resolved to the `/@tabula/ui-theme/sass/index.scss`. + ### vanilla-extract We support the [vanilla-extract](https://vanilla-extract.style/). diff --git a/package.json b/package.json index 928a3da..eb71b48 100644 --- a/package.json +++ b/package.json @@ -54,17 +54,17 @@ "@tabula/prettier-config": "^0.0.0", "@tabula/typescript-config": "^0.0.0", "@types/convert-source-map": "^2.0.0", - "@types/node": "^20.3.3", + "@types/node": "^20.4.1", "@types/react": "^18.2.14", "ava": "^5.3.1", "eslint": "^8.44.0", - "lefthook": "^1.4.3", + "lefthook": "^1.4.4", "prettier": "^2.8.8", "tsx": "^3.12.7", "typescript": "^5.1.6" }, "dependencies": { - "@babel/core": "^7.22.5", + "@babel/core": "^7.22.8", "@svgr/core": "^8.0.0", "@svgr/plugin-jsx": "^8.0.1", "@vanilla-extract/esbuild-plugin": "^2.2.2", @@ -73,12 +73,12 @@ "convert-source-map": "^2.0.0", "esbuild": "^0.18.11", "find-up": "^6.3.0", - "postcss": "^8.4.24", + "postcss": "^8.4.25", "postcss-load-config": "^4.0.1", "postcss-modules": "^6.0.0", "react-docgen": "^6.0.1", "react-docgen-typescript": "^2.2.2", - "read-pkg-up": "^9.1.0", + "read-pkg-up": "^10.0.0", "sass": "^1.63.6", "source-map": "^0.7.4", "svgo": "^3.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af7d82c..db91597 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@babel/core': - specifier: ^7.22.5 - version: 7.22.5 + specifier: ^7.22.8 + version: 7.22.8 '@svgr/core': specifier: ^8.0.0 version: 8.0.0 @@ -16,10 +16,10 @@ dependencies: version: 8.0.1(@svgr/core@8.0.0) '@vanilla-extract/esbuild-plugin': specifier: ^2.2.2 - version: 2.2.2(@types/node@20.3.3)(sass@1.63.6) + version: 2.2.2(@types/node@20.4.1)(sass@1.63.6) autoprefixer: specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.24) + version: 10.4.14(postcss@8.4.25) clipanion: specifier: ^3.2.1 version: 3.2.1(typanion@3.13.0) @@ -33,14 +33,14 @@ dependencies: specifier: ^6.3.0 version: 6.3.0 postcss: - specifier: ^8.4.24 - version: 8.4.24 + specifier: ^8.4.25 + version: 8.4.25 postcss-load-config: specifier: ^4.0.1 - version: 4.0.1(postcss@8.4.24)(ts-node@10.9.1) + version: 4.0.1(postcss@8.4.25)(ts-node@10.9.1) postcss-modules: specifier: ^6.0.0 - version: 6.0.0(postcss@8.4.24) + version: 6.0.0(postcss@8.4.25) react-docgen: specifier: ^6.0.1 version: 6.0.1 @@ -48,8 +48,8 @@ dependencies: specifier: ^2.2.2 version: 2.2.2(typescript@5.1.6) read-pkg-up: - specifier: ^9.1.0 - version: 9.1.0 + specifier: ^10.0.0 + version: 10.0.0 sass: specifier: ^1.63.6 version: 1.63.6 @@ -89,8 +89,8 @@ devDependencies: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ^20.3.3 - version: 20.3.3 + specifier: ^20.4.1 + version: 20.4.1 '@types/react': specifier: ^18.2.14 version: 18.2.14 @@ -101,8 +101,8 @@ devDependencies: specifier: ^8.44.0 version: 8.44.0 lefthook: - specifier: ^1.4.3 - version: 1.4.3 + specifier: ^1.4.4 + version: 1.4.4 prettier: specifier: ^2.8.8 version: 2.8.8 @@ -138,30 +138,30 @@ packages: dependencies: '@babel/highlight': 7.22.5 - /@babel/compat-data@7.22.5: - resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} + /@babel/compat-data@7.22.6: + resolution: {integrity: sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==} engines: {node: '>=6.9.0'} dev: false - /@babel/core@7.22.5: - resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} + /@babel/core@7.22.8: + resolution: {integrity: sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/generator': 7.22.7 + '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.8) '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 + '@babel/traverse': 7.22.8 '@babel/types': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false @@ -175,8 +175,8 @@ packages: source-map: 0.5.7 dev: true - /@babel/generator@7.22.5: - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} + /@babel/generator@7.22.7: + resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 @@ -185,18 +185,18 @@ packages: jsesc: 2.5.2 dev: false - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} + /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8): + resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 + '@babel/compat-data': 7.22.6 + '@babel/core': 7.22.8 '@babel/helper-validator-option': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 browserslist: 4.21.9 lru-cache: 5.1.1 - semver: 6.3.0 dev: false /@babel/helper-environment-visitor@7.22.5: @@ -233,7 +233,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 + '@babel/traverse': 7.22.8 '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color @@ -257,6 +257,13 @@ packages: dependencies: '@babel/types': 7.22.5 + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: false + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -270,12 +277,12 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helpers@7.22.5: - resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} + /@babel/helpers@7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 + '@babel/traverse': 7.22.8 '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color @@ -295,14 +302,22 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.5 + dev: true + + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.8): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -317,7 +332,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@babel/types': 7.22.5 /@babel/traverse@7.17.3: @@ -343,12 +358,30 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 + '@babel/generator': 7.22.7 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/traverse@7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 '@babel/types': 7.22.5 debug: 4.3.4 globals: 11.12.0 @@ -661,15 +694,15 @@ packages: '@commitlint/execute-rule': 17.4.0 '@commitlint/resolve-extends': 17.4.4 '@commitlint/types': 17.4.4 - '@types/node': 20.3.3 + '@types/node': 20.4.1 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@20.3.3)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig-typescript-loader: 4.3.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.3.3)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@20.4.1)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@swc/core' @@ -1466,6 +1499,11 @@ packages: read-yaml-file: 1.1.0 dev: true + /@nicolo-ribaudo/semver-v6@6.3.3: + resolution: {integrity: sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==} + hasBin: true + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1499,101 +1537,101 @@ packages: tslib: 2.6.0 dev: true - /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.22.5): + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 dev: false - /@svgr/babel-preset@8.0.0(@babel/core@7.22.5): + /@svgr/babel-preset@8.0.0(@babel/core@7.22.8): resolution: {integrity: sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.22.5) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.22.5) + '@babel/core': 7.22.8 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.22.8) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.22.8) dev: false /@svgr/core@8.0.0: resolution: {integrity: sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.22.5 - '@svgr/babel-preset': 8.0.0(@babel/core@7.22.5) + '@babel/core': 7.22.8 + '@svgr/babel-preset': 8.0.0(@babel/core@7.22.8) camelcase: 6.3.0 cosmiconfig: 8.2.0 snake-case: 3.0.4 @@ -1615,8 +1653,8 @@ packages: peerDependencies: '@svgr/core': '*' dependencies: - '@babel/core': 7.22.5 - '@svgr/babel-preset': 8.0.0(@babel/core@7.22.5) + '@babel/core': 7.22.8 + '@svgr/babel-preset': 8.0.0(@babel/core@7.22.8) '@svgr/core': 8.0.0 '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 @@ -1714,7 +1752,7 @@ packages: /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@babel/types': 7.22.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 @@ -1730,7 +1768,7 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@babel/types': 7.22.5 dev: false @@ -1770,8 +1808,8 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@20.3.3: - resolution: {integrity: sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==} + /@types/node@20.4.1: + resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1779,13 +1817,13 @@ packages: /@types/postcss-modules-local-by-default@4.0.0: resolution: {integrity: sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg==} dependencies: - postcss: 8.4.24 + postcss: 8.4.25 dev: true /@types/postcss-modules-scope@3.0.1: resolution: {integrity: sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg==} dependencies: - postcss: 8.4.24 + postcss: 8.4.25 dev: true /@types/prop-types@15.7.5: @@ -1945,7 +1983,7 @@ packages: /@vanilla-extract/babel-plugin-debug-ids@1.0.3: resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 transitivePeerDependencies: - supports-color dev: false @@ -1966,10 +2004,10 @@ packages: outdent: 0.8.0 dev: false - /@vanilla-extract/esbuild-plugin@2.2.2(@types/node@20.3.3)(sass@1.63.6): + /@vanilla-extract/esbuild-plugin@2.2.2(@types/node@20.4.1)(sass@1.63.6): resolution: {integrity: sha512-P2tlhBpAnoA4fx0xaYm8mcKBzorcyLC0O/c7ZpJL3aIKh6kdxdjDhOoWEXC2NuGJepEFsv0dXGJ99l424NvTKA==} dependencies: - '@vanilla-extract/integration': 6.2.1(@types/node@20.3.3)(sass@1.63.6) + '@vanilla-extract/integration': 6.2.1(@types/node@20.4.1)(sass@1.63.6) transitivePeerDependencies: - '@types/node' - less @@ -1980,11 +2018,11 @@ packages: - terser dev: false - /@vanilla-extract/integration@6.2.1(@types/node@20.3.3)(sass@1.63.6): + /@vanilla-extract/integration@6.2.1(@types/node@20.4.1)(sass@1.63.6): resolution: {integrity: sha512-+xYJz07G7TFAMZGrOqArOsURG+xcYvqctujEkANjw2McCBvGEK505RxQqOuNiA9Mi9hgGdNp2JedSa94f3eoLg==} dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.8 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.8) '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 '@vanilla-extract/css': 1.12.0 esbuild: 0.17.6 @@ -1994,8 +2032,8 @@ packages: lodash: 4.17.21 mlly: 1.4.0 outdent: 0.8.0 - vite: 4.3.9(@types/node@20.3.3)(sass@1.63.6) - vite-node: 0.28.5(@types/node@20.3.3)(sass@1.63.6) + vite: 4.3.9(@types/node@20.4.1)(sass@1.63.6) + vite-node: 0.28.5(@types/node@20.4.1)(sass@1.63.6) transitivePeerDependencies: - '@types/node' - less @@ -2203,7 +2241,7 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true - /autoprefixer@10.4.14(postcss@8.4.24): + /autoprefixer@10.4.14(postcss@8.4.25): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -2215,7 +2253,7 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.24 + postcss: 8.4.25 postcss-value-parser: 4.2.0 dev: false @@ -2638,7 +2676,7 @@ packages: is-what: 3.14.1 dev: true - /cosmiconfig-typescript-loader@4.3.0(@types/node@20.3.3)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + /cosmiconfig-typescript-loader@4.3.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -2647,9 +2685,9 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 20.3.3 + '@types/node': 20.4.1 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@20.3.3)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@20.4.1)(typescript@5.1.6) typescript: 5.1.6 dev: true @@ -3903,6 +3941,14 @@ packages: engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + dev: false /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -3933,13 +3979,13 @@ packages: dev: true optional: true - /icss-utils@5.1.0(postcss@8.4.24): + /icss-utils@5.1.0(postcss@8.4.25): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.25 /ignore-by-default@2.1.0: resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} @@ -4302,6 +4348,11 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -4379,83 +4430,83 @@ packages: language-subtag-registry: 0.3.22 dev: true - /lefthook-darwin-arm64@1.4.3: - resolution: {integrity: sha512-ZFsgIzN+Z0c4RpMMHU/M4J43XFyXYGZI8r0GG4jqVMX+prDBIb/6vpgMdZxK5IozRUmnfLGQPXcVokE9WBHSOg==} + /lefthook-darwin-arm64@1.4.4: + resolution: {integrity: sha512-bVLyKmtp/vqHzBXMgVPDnM8nZHc+3i4BIZh0EYjHCO3pIFN3GOhhZ33umuzxVIQpU7kmXZOo/t9F6S/ddntzGQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /lefthook-darwin-x64@1.4.3: - resolution: {integrity: sha512-O6ZesdJ9MStI38gNfJh0ShExIf0KyHG1lR32F9FUFklFwhcquRM+uIDyDqVCxU3UWqmKwcbTk9AJWMjQZGPLxQ==} + /lefthook-darwin-x64@1.4.4: + resolution: {integrity: sha512-IF0rOxWOs0ES08iwOi10T0P5TiayikRcoRre4WcLlMRMN5A11nh07eg9PyztrLVrl65AjE1aGHiVH5xe39hc2Q==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /lefthook-freebsd-arm64@1.4.3: - resolution: {integrity: sha512-6swb+98Qs6P9V9Rcd2lHWH2LunFEk+kfIPpf6oiPrOHnw3OkfFhQLmawX425Ari7Y9qy9gfDoNe/0/IR7YGmGw==} + /lefthook-freebsd-arm64@1.4.4: + resolution: {integrity: sha512-QjrARNkh8Q4G19OCmyst/e2BfbTNPfDNlmnWZqtw6LXPfcOi1n5roTdmnzZowMchnf+KkGzwU3rdwzbfHfQAdQ==} cpu: [arm64] os: [freebsd] requiresBuild: true dev: true optional: true - /lefthook-freebsd-x64@1.4.3: - resolution: {integrity: sha512-+58NARATypmIj0kDutd29ozywr6IeA0lVBxsVzq7C5ycYrd31iNak3lnaEvNJvdj5fGVNEL9X7XRojylthZlAg==} + /lefthook-freebsd-x64@1.4.4: + resolution: {integrity: sha512-aZ6usgtK+xB6n9LsGomAT4vI30E91BxIkioEwrKOFVE/tHTCCgajaGeSxS2f+xaeTh2Yy5OYcwp17m34yp+YdA==} cpu: [x64] os: [freebsd] requiresBuild: true dev: true optional: true - /lefthook-linux-arm64@1.4.3: - resolution: {integrity: sha512-gAWJQEhgheOfPu579fhlcNNm3KoJbNkT11AATKHlFu+esyiCxI8xZVpGwDQVMphO7s43FKbkQJSvIM4tElb6FQ==} + /lefthook-linux-arm64@1.4.4: + resolution: {integrity: sha512-A32/MpzNOu5e6pQn+v5C5Nc5NOMm2HkTHjv3LAAG1C0+Y23JC82LRQCBUi99DoUI0vwhHk3DHCm9ANvRQT5CYA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /lefthook-linux-x64@1.4.3: - resolution: {integrity: sha512-mVv/amRqX81nQcizhRRx/X6KKNIkMUG4HdDItWkDazwLAviZ2zv8TRcSaEYBOpriP/dBZm8gt6EhzPpfoWtcJw==} + /lefthook-linux-x64@1.4.4: + resolution: {integrity: sha512-97CwcHY0wmCkN9yKTzEx5NxbEXr5bnhHEgpJbL67R2dL75oV3AZhRdB/NsjrewreJjGbQl2YhmxUFMbGI/Qysw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /lefthook-windows-arm64@1.4.3: - resolution: {integrity: sha512-ccClPTC7AvhcbyT6pLzdV8K8e/P0T7p/THGRtcyjkKIU0IS89k95VazDlt22QPzUTc8UMNCQyZ1XY4UDx295jw==} + /lefthook-windows-arm64@1.4.4: + resolution: {integrity: sha512-LGEfpe+Q3VeOIkE6S+8GyM1EARi0mbeIZpKsoCfl2t6Teh10hNSWqkpHaLphP52HnXOizFnNQjjY2pmiYatf8w==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /lefthook-windows-x64@1.4.3: - resolution: {integrity: sha512-q1K5kycfqTYLm5/pOCiAFa+hoSFt/29QjHVZAWRmk/nKDIf8MvTWX0tdaEx7/VJuG3cgQT1jM+xiTwSmNUXTKg==} + /lefthook-windows-x64@1.4.4: + resolution: {integrity: sha512-9BAHo97ES9+NULpdWcvgICczGY7wA/N2BoyQoZfHsF/0Ib6hLbvn4tv3+NdtJILlrnAvwgIrKCxOtcc3urS5DQ==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /lefthook@1.4.3: - resolution: {integrity: sha512-zvhAJ9wDQW7F27XYWRfx72L6LuPLu49be+sRUF+DKku1IGT+x3eHjQ9k70pt65lnEq1X8Xl/Xygm3Kwi/piOYg==} + /lefthook@1.4.4: + resolution: {integrity: sha512-g5bDSeyeLCuV//vGpZQsRNWuLAzJRrDbtWEvvUAZQcN+Mf1hWPXAPZvI5hdOj/ONC5OiqQbrWg1mPqP1i+IKYQ==} hasBin: true requiresBuild: true optionalDependencies: - lefthook-darwin-arm64: 1.4.3 - lefthook-darwin-x64: 1.4.3 - lefthook-freebsd-arm64: 1.4.3 - lefthook-freebsd-x64: 1.4.3 - lefthook-linux-arm64: 1.4.3 - lefthook-linux-x64: 1.4.3 - lefthook-windows-arm64: 1.4.3 - lefthook-windows-x64: 1.4.3 + lefthook-darwin-arm64: 1.4.4 + lefthook-darwin-x64: 1.4.4 + lefthook-freebsd-arm64: 1.4.4 + lefthook-freebsd-x64: 1.4.4 + lefthook-linux-arm64: 1.4.4 + lefthook-linux-x64: 1.4.4 + lefthook-windows-arm64: 1.4.4 + lefthook-windows-x64: 1.4.4 dev: true /less@4.1.3: @@ -4493,6 +4544,11 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /load-json-file@7.0.1: resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4606,6 +4662,11 @@ packages: dependencies: yallist: 4.0.0 + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -4857,6 +4918,17 @@ packages: is-core-module: 2.12.1 semver: 7.5.3 validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.12.1 + semver: 7.5.3 + validate-npm-package-license: 3.0.4 + dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -5094,6 +5166,17 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + /parse-json@7.0.0: + resolution: {integrity: sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==} + engines: {node: '>=16'} + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.0 + lines-and-columns: 2.0.3 + type-fest: 3.13.0 + dev: false + /parse-ms@3.0.0: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} @@ -5185,7 +5268,7 @@ packages: engines: {node: '>=4'} dev: true - /postcss-load-config@3.1.4(postcss@8.4.24)(ts-node@10.9.1): + /postcss-load-config@3.1.4(postcss@8.4.25)(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -5198,12 +5281,12 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.24 - ts-node: 10.9.1(@types/node@20.3.3)(typescript@5.1.6) + postcss: 8.4.25 + ts-node: 10.9.1(@types/node@20.4.1)(typescript@5.1.6) yaml: 1.10.2 dev: true - /postcss-load-config@4.0.1(postcss@8.4.24)(ts-node@10.9.1): + /postcss-load-config@4.0.1(postcss@8.4.25)(ts-node@10.9.1): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -5216,62 +5299,62 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.24 - ts-node: 10.9.1(@types/node@20.3.3)(typescript@5.1.6) + postcss: 8.4.25 + ts-node: 10.9.1(@types/node@20.4.1)(typescript@5.1.6) yaml: 2.3.1 dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.24): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.25): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.25 - /postcss-modules-local-by-default@4.0.3(postcss@8.4.24): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.25): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.24) - postcss: 8.4.24 + icss-utils: 5.1.0(postcss@8.4.25) + postcss: 8.4.25 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.0.0(postcss@8.4.24): + /postcss-modules-scope@3.0.0(postcss@8.4.25): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.25 postcss-selector-parser: 6.0.13 - /postcss-modules-values@4.0.0(postcss@8.4.24): + /postcss-modules-values@4.0.0(postcss@8.4.25): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.24) - postcss: 8.4.24 + icss-utils: 5.1.0(postcss@8.4.25) + postcss: 8.4.25 dev: false - /postcss-modules@6.0.0(postcss@8.4.24): + /postcss-modules@6.0.0(postcss@8.4.25): resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} peerDependencies: postcss: ^8.0.0 dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.24) + icss-utils: 5.1.0(postcss@8.4.25) lodash.camelcase: 4.3.0 - postcss: 8.4.24 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.24) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.24) - postcss-modules-scope: 3.0.0(postcss@8.4.24) - postcss-modules-values: 4.0.0(postcss@8.4.24) + postcss: 8.4.25 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.25) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.25) + postcss-modules-scope: 3.0.0(postcss@8.4.25) + postcss-modules-values: 4.0.0(postcss@8.4.25) string-hash: 1.1.3 dev: false @@ -5285,8 +5368,8 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss@8.4.24: - resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -5369,7 +5452,7 @@ packages: resolution: {integrity: sha512-K+EHJrADKJYpmojACrebABRb5e6RvW8cSeJ/0950Km5YnrSglebHeMm/uGSv/DpBvsZOsMGVQoYb8XjCA3r0NQ==} engines: {node: '>=14.18.0'} dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 '@babel/traverse': 7.22.5 '@babel/types': 7.22.5 '@types/babel__core': 7.20.1 @@ -5387,6 +5470,15 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true + /read-pkg-up@10.0.0: + resolution: {integrity: sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==} + engines: {node: '>=16'} + dependencies: + find-up: 6.3.0 + read-pkg: 8.0.0 + type-fest: 3.13.0 + dev: false + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -5396,15 +5488,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg-up@9.1.0: - resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - find-up: 6.3.0 - read-pkg: 7.1.0 - type-fest: 2.19.0 - dev: false - /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -5415,14 +5498,14 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg@7.1.0: - resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} - engines: {node: '>=12.20'} + /read-pkg@8.0.0: + resolution: {integrity: sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==} + engines: {node: '>=16'} dependencies: '@types/normalize-package-data': 2.4.1 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 2.19.0 + normalize-package-data: 5.0.0 + parse-json: 7.0.0 + type-fest: 3.13.0 dev: false /read-yaml-file@1.1.0: @@ -5624,6 +5707,7 @@ packages: /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true + dev: true /semver@7.5.2: resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} @@ -6049,7 +6133,7 @@ packages: engines: {node: '>=8'} dev: true - /ts-node@10.9.1(@types/node@20.3.3)(typescript@5.1.6): + /ts-node@10.9.1(@types/node@20.4.1)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -6068,7 +6152,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.3.3 + '@types/node': 20.4.1 acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -6175,9 +6259,9 @@ packages: engines: {node: '>=8'} dev: true - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + /type-fest@3.13.0: + resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} + engines: {node: '>=14.16'} dev: false /typed-array-length@1.0.4: @@ -6196,14 +6280,14 @@ packages: '@types/postcss-modules-local-by-default': 4.0.0 '@types/postcss-modules-scope': 3.0.1 dotenv: 16.3.1 - icss-utils: 5.1.0(postcss@8.4.24) + icss-utils: 5.1.0(postcss@8.4.25) less: 4.1.3 lodash.camelcase: 4.3.0 - postcss: 8.4.24 - postcss-load-config: 3.1.4(postcss@8.4.24)(ts-node@10.9.1) - postcss-modules-extract-imports: 3.0.0(postcss@8.4.24) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.24) - postcss-modules-scope: 3.0.0(postcss@8.4.24) + postcss: 8.4.25 + postcss-load-config: 3.1.4(postcss@8.4.25)(ts-node@10.9.1) + postcss-modules-extract-imports: 3.0.0(postcss@8.4.25) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.25) + postcss-modules-scope: 3.0.0(postcss@8.4.25) reserved-words: 0.1.2 sass: 1.63.6 source-map-js: 1.0.2 @@ -6277,7 +6361,7 @@ packages: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /vite-node@0.28.5(@types/node@20.3.3)(sass@1.63.6): + /vite-node@0.28.5(@types/node@20.4.1)(sass@1.63.6): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} hasBin: true @@ -6289,7 +6373,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.3.9(@types/node@20.3.3)(sass@1.63.6) + vite: 4.3.9(@types/node@20.4.1)(sass@1.63.6) transitivePeerDependencies: - '@types/node' - less @@ -6300,7 +6384,7 @@ packages: - terser dev: false - /vite@4.3.9(@types/node@20.3.3)(sass@1.63.6): + /vite@4.3.9(@types/node@20.4.1)(sass@1.63.6): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -6325,9 +6409,9 @@ packages: terser: optional: true dependencies: - '@types/node': 20.3.3 + '@types/node': 20.4.1 esbuild: 0.17.19 - postcss: 8.4.24 + postcss: 8.4.25 rollup: 3.26.0 sass: 1.63.6 optionalDependencies: diff --git a/src/plugins/stylesPlugin/renderStyle.ts b/src/plugins/stylesPlugin/renderStyle.ts index 2172de6..d4f4f51 100644 --- a/src/plugins/stylesPlugin/renderStyle.ts +++ b/src/plugins/stylesPlugin/renderStyle.ts @@ -1,9 +1,10 @@ import { readFile } from 'node:fs/promises'; -import { extname } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { createRequire } from 'node:module'; +import { dirname, extname, join } from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import * as sass from 'sass'; import { fromObject } from 'convert-source-map'; -import sass from 'sass'; type Options = { path: string; @@ -22,8 +23,47 @@ async function renderCss({ path }: Options): Promise { return { css }; } +function isValidURL(url: string) { + const parts = url.split('/'); + + return parts[0].startsWith('@') ? parts.length === 2 : parts.length === 1; +} + +function createImporter(path: string): sass.FileImporter<'sync'> { + return { + findFileUrl(pkgUrl: string) { + if (!pkgUrl.startsWith('~')) { + return null; + } + + const url = pkgUrl.slice(1); + + if (!isValidURL(url)) { + throw new Error(`Wrong package name: "${url}"`); + } + + const localRequire = createRequire(path); + + const packageJsonPath = localRequire.resolve(`${url}/package.json`); + const packageJsonDir = dirname(packageJsonPath); + const packageJson = localRequire(packageJsonPath) as { sass?: string }; + + if (packageJson.sass != null) { + const importPath = join(packageJsonDir, packageJson.sass); + + return pathToFileURL(importPath); + } + + throw new Error(`Package "${url}" has no "sass" field`); + }, + }; +} + function renderScss({ path, sourcemap, sourcesContent }: Options): Result { + const importer = createImporter(path); + const result = sass.compile(path, { + importers: [importer], sourceMap: sourcemap, sourceMapIncludeSources: sourcesContent, }); diff --git a/tests/browser.test.ts b/tests/browser.test.ts index c393cb2..275cb7b 100644 --- a/tests/browser.test.ts +++ b/tests/browser.test.ts @@ -389,6 +389,18 @@ it( }, ); +it( + 'resolves paths in SCSS', + { + name: 'browser-scss-node-modules', + platform: 'browser', + production: false, + }, + async (t, c) => { + t.snapshot(await c.read('lib/index.css')); + }, +); + it( 'supports PostCSS preprocessor', { diff --git a/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/package.json b/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/package.json new file mode 100644 index 0000000..b81ddb7 --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "my-module", + "version": "1.0.0", + "sass": "./vars.scss" +} diff --git a/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/vars.scss b/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/vars.scss new file mode 100644 index 0000000..df54edd --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/__node_modules__/my-module/vars.scss @@ -0,0 +1 @@ +$background-color: red; diff --git a/tests/fixtures/browser-scss-node-modules/package.json b/tests/fixtures/browser-scss-node-modules/package.json new file mode 100644 index 0000000..2c04bdf --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/package.json @@ -0,0 +1,14 @@ +{ + "name": "browser-scss", + "version": "1.0.0", + "type": "module", + "module": "lib/index.js", + "exports": { + ".": { + "import": "./lib/index.js" + } + }, + "files": [ + "lib" + ] +} diff --git a/tests/fixtures/browser-scss-node-modules/src/index.module.scss b/tests/fixtures/browser-scss-node-modules/src/index.module.scss new file mode 100644 index 0000000..eca559b --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/src/index.module.scss @@ -0,0 +1,5 @@ +@use '~my-module' as module; + +.scssModule ul { + background-color: module.$background-color; +} diff --git a/tests/fixtures/browser-scss-node-modules/src/index.scss b/tests/fixtures/browser-scss-node-modules/src/index.scss new file mode 100644 index 0000000..ccc40ea --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/src/index.scss @@ -0,0 +1,5 @@ +@use '~my-module' as module; + +.scssRoot ul { + background: module.$background-color; +} diff --git a/tests/fixtures/browser-scss-node-modules/src/index.ts b/tests/fixtures/browser-scss-node-modules/src/index.ts new file mode 100644 index 0000000..1c1e487 --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/src/index.ts @@ -0,0 +1,5 @@ +import scssStyles from './index.module.scss'; + +import './index.scss'; + +document.body.classList.add(scssStyles.scssModule); diff --git a/tests/fixtures/browser-scss-node-modules/tsconfig.forge.json b/tests/fixtures/browser-scss-node-modules/tsconfig.forge.json new file mode 100644 index 0000000..820c793 --- /dev/null +++ b/tests/fixtures/browser-scss-node-modules/tsconfig.forge.json @@ -0,0 +1,5 @@ +{ + "extends": "@tabula/typescript-config/tsconfig.browser.json", + + "include": ["src"] +} diff --git a/tests/setup.ts b/tests/setup.ts index 6cc1da7..36963a8 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -1,5 +1,5 @@ import { spawn } from 'node:child_process'; -import { cp, mkdir, readFile, rm, stat } from 'node:fs/promises'; +import { cp, mkdir, readFile, readdir, rename, rm, stat } from 'node:fs/promises'; import { dirname, join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -82,6 +82,29 @@ async function prepareWorkingDir(id: string, name: string): Promise { return workingDir; } +async function prepareMockedModules(workingDir: string): Promise { + let entries: string[] = []; + + try { + entries = await readdir(join(workingDir, '__node_modules__')); + } catch (error) { + if (error instanceof Error && 'code' in error && error.code === 'ENOENT') { + return; + } + + throw error; + } + + await mkdir(join(workingDir, 'node_modules'), { recursive: true }); + + for (const entry of entries) { + await rename( + join(workingDir, '__node_modules__', entry), + join(workingDir, 'node_modules', entry), + ); + } +} + async function prepare( id: string, { check, dependencies, name, platform, production, storybook, typings }: SuiteOptions, @@ -92,6 +115,8 @@ async function prepare( await run('/usr/bin/env', ['pnpm', 'install', '--no-lockfile', ...dependencies], workingDir); } + await prepareMockedModules(workingDir); + const args = ['build', platform]; if (production != null) { diff --git a/tests/snapshots/browser.test.ts.md b/tests/snapshots/browser.test.ts.md index a95e7b3..c0cc452 100644 --- a/tests/snapshots/browser.test.ts.md +++ b/tests/snapshots/browser.test.ts.md @@ -256,6 +256,22 @@ Generated by [AVA](https://avajs.dev). /*# sourceMappingURL=index.css.map */␊ ` +## resolves paths in SCSS + +> Snapshot 1 + + `/* src/index.module.scss?css-module */␊ + .browser-scss--src-index-module__scssModule ul {␊ + background-color: red;␊ + }␊ + ␊ + /* src/index.scss */␊ + .scssRoot ul {␊ + background: red;␊ + }␊ + /*# sourceMappingURL=index.css.map */␊ + ` + ## supports PostCSS preprocessor > Snapshot 1 diff --git a/tests/snapshots/browser.test.ts.snap b/tests/snapshots/browser.test.ts.snap index b90ddf520222a2bac0f92a8fe533312d2fafa2d4..39946130d9391c61d6512b1cefdd3f43b34b69f1 100644 GIT binary patch delta 3773 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 D%2YTm