diff --git a/.gitignore b/.gitignore index 9e6b702..332678d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ node_modules dist .rslib pnpm-lock.yaml -packages/component/index.ts \ No newline at end of file +packages/components/index.ts +packages/components/config-provider/src/*.type.ts +packages/components/config-provider/src/config-provider.type.ts diff --git a/doc/rspress.config.ts b/doc/rspress.config.ts index 4b8cb52..d656c2e 100644 --- a/doc/rspress.config.ts +++ b/doc/rspress.config.ts @@ -28,7 +28,8 @@ export default defineConfig({ alias: { '@qwqui/core': path.join(__dirname, '../packages/components'), '@qwqui/theme': path.join(__dirname, '../packages/theme/index.scss'), - '@qwqui/tools': path.join(__dirname, '../packages/tools') + '@qwqui/tools': path.join(__dirname, '../packages/tools'), + '@qwqui/config-provider': path.join(__dirname, '../packages/components/config-provider') }, }, }, diff --git a/internal/create-config-provider-type.ts b/internal/create-config-provider-type.ts new file mode 100644 index 0000000..fdf9113 --- /dev/null +++ b/internal/create-config-provider-type.ts @@ -0,0 +1,199 @@ +import fg from 'fast-glob'; +import { resolve } from 'path'; +import { compile } from 'sass'; +import { CssNode, parse, walk } from 'css-tree'; +import { Project, PropertySignatureStructure, SourceFile } from 'ts-morph'; +import camelcase from 'camelcase'; +import { existsSync, writeFileSync } from 'fs-extra'; + +const getComponentStyles = ()=>{ + const componentStyles = fg.sync('packages/components/**/*.scss', {ignore: ['**/node_modules', 'packages/components/theme']}) + .map((path) => { + const pathArray = path.split('/'); + const componentName = pathArray[2]; + return [componentName, resolve(pathArray.join('/'))] + }) + const componentStylesObject:Record = {} + for (const [name, path] of componentStyles){ + if (componentStylesObject[name]) { + componentStylesObject[name].push(path) + }else{ + componentStylesObject[name] = [path]; + } + } + return componentStylesObject; +} + +const getThemeVars = () => { + const themePaths = fg.sync('packages/theme/**/*.scss', {ignore: ['**/node_modules']}) + .map((path) => { + return resolve(path) + }) + const properties = []; + for (const path of themePaths){ + const {css} = compile(path, {silenceDeprecations: ['import']}); + const ast = parse(css); + walk(ast, function(node){ + if (node.type === 'Declaration'){ + if (!properties.includes(node.property)){ + properties.push(node.property); + } + } + }) + } + return properties; +} + +/** + * + * @param componentName + * @param vars Standardized variable names + */ +const createStyleConfig = (sourceFile: SourceFile, componentName: string, vars: string[]) => { + const properties = vars.map((varName) => { + return { + name: `'${varName}'?`, + type: 'string', + } as PropertySignatureStructure + }) + sourceFile.insertInterface(0, { + name: `${camelcase(componentName,{pascalCase: true})}CSSVar`, + properties, + }); +} + +const template = +`type Seq = { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; +} +type Tokens = { + 'zen'?: Partial; + 'gray'?: Partial; + 'red'?: Partial; + 'danger'?: Partial; + 'pink'?: Partial; + 'grape'?: Partial; + 'violet'?: Partial; + 'indigo'?: Partial; + 'blue'?: Partial; + 'primary'?: Partial; + 'cyan'?: Partial; + 'teal'?: Partial; + 'green'?: Partial; + 'success'?: Partial; + 'lime'?: Partial; + 'yellow'?: Partial; + 'orange'?: Partial; + 'warning'?: Partial; + 'radius'?: { + xs?: string + sm?: string + md?: string + lg?: string + xl?: string + full?: string + }; + 'breakpoint'?: { + xs?: string + sm?: string + md?: string + lg?: string + xl?: string + xxl?: string + }; +} + +export type ConfigProviderProps = { + direction?: 'ltr' | 'rtl', + tokens?: Partial, + component?: Partial +} +` + +const app = () => { + const componentStyles = getComponentStyles(); + const commonVar = getThemeVars(); + const astMap = new Map(); + for (const [key, paths] of Object.entries(componentStyles)){ + for (const path of paths) { + const {css} = compile(path, {silenceDeprecations: ['import'] }) + const ast = parse(css,{ parseAtrulePrelude: true, parseCustomProperty: true, parseRulePrelude: true, parseValue: true }); + if (astMap.has(key)) { + astMap.get(key).push(ast) + } else { + astMap.set(key,[ast]) + } + } + } + const components = Object.keys(componentStyles); + const cssVars = new Map(); + for (const comp of components) { + const asts = astMap.get(comp); + const names:string[] = []; + for (const ast of asts) { + walk(ast,function(node){ + if (node.type === 'Identifier' && node.name.startsWith('--')){ + if (commonVar.includes(node.name)){ + return; + } + names.push(node.name); + } + }) + if(!names.length){ + continue; + } + } + const normalizationCSSVar = names.map((name) => { + return name.replace(/^--/, '') + }); + cssVars.set(comp, normalizationCSSVar); + } + + const componentTokenTypeFilePath = resolve('packages/components/config-provider/src/config-provider-component-token.type.ts'); + if (!existsSync(componentTokenTypeFilePath)) { + writeFileSync(componentTokenTypeFilePath, ''); + } + const componentFilePath = resolve('packages/components/config-provider/src/config-provider.type.ts'); + + const proj = new Project(); + const tokenSf = proj.createSourceFile(componentTokenTypeFilePath, '', {overwrite: true}); + const compsf= proj.createSourceFile(componentFilePath, template,{overwrite: true}) + + const componentVarsInterface = tokenSf.getInterface('ComponentVars'); + if (componentVarsInterface){ + componentVarsInterface.remove(); + } + tokenSf.insertInterface(0, { + name: 'ComponentVars', + properties: components.filter((compName) => cssVars.get(compName).length).map((comp) => ({ + name: comp, + type: `${camelcase(comp, {pascalCase: true})}CSSVar`, + })), + isExported: true + }) + + for (const [compName, vars] of Array.from(cssVars.entries())){ + if (!vars.length) { + continue; + } + createStyleConfig(tokenSf, compName, vars); + } + + tokenSf.saveSync(); + compsf.addImportDeclaration({ + namedImports: ['ComponentVars'], + moduleSpecifier: './config-provider-component-token.type.ts' + }) + compsf.saveSync(); +} + +app(); \ No newline at end of file diff --git a/internal/package.json b/internal/package.json index 64b5186..8c8103d 100644 --- a/internal/package.json +++ b/internal/package.json @@ -12,12 +12,16 @@ "dependencies": { "@types/inquirer": "^9.0.7", "camelcase": "^8.0.0", + "css-tree": "^3.0.1", "dashify": "^2.0.0", "esbuild-sass-plugin": "^3.3.1", "fast-glob": "^3.3.2", - "inquirer": "^11.0.2" + "inquirer": "^11.0.2", + "sass": "^1.81.0", + "ts-morph": "^24.0.0" }, "devDependencies": { + "@types/css-tree": "^2.3.9", "@types/dashify": "^1.0.3", "@types/fs-extra": "^11.0.4", "@types/node": "^22.7.2", diff --git a/package.json b/package.json index 69c5f2b..a95e581 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,9 @@ "typescript": "^5.6.2" }, "scripts": { - "prebuild": "esno internal/create-core-entry.ts && pnpm --filter @qwqui/* clean:dist", - "predev": "esno internal/create-core-entry.ts && pnpm --filter @qwqui/* clean:dist", + "postinstall": "esno internal/create-core-entry.ts && esno internal/create-config-provider-type.ts", + "prebuild": "esno internal/create-core-entry.ts && esno internal/create-config-provider-type.ts && pnpm --filter @qwqui/* clean:dist", + "predev": "esno internal/create-core-entry.ts && esno internal/create-config-provider-type.ts && pnpm --filter @qwqui/* clean:dist", "test:type": "tsc --noEmit", "test": "jest", "build": "pnpm --filter !@qwqui/core build && pnpm --filter @qwqui/core build", @@ -46,7 +47,8 @@ "create:comp": "esno internal/create-component.ts", "dev": "pnpm -C doc dev", "build:site": "pnpm prebuild && pnpm --filter @qwqui/doc build", - "lint": "eslint ." + "lint": "eslint .", + "esno": "esno" }, "devDependencies": { "@changesets/changelog-github": "^0.5.0", diff --git a/packages/components/config-provider/README.md b/packages/components/config-provider/README.md new file mode 100644 index 0000000..8a6850d --- /dev/null +++ b/packages/components/config-provider/README.md @@ -0,0 +1,13 @@ +# @qwqui/config-provider + + + +## Install + +```bash +pnpm add @qwqui/config-provider +``` + +## License + +MIT diff --git a/packages/components/config-provider/index.ts b/packages/components/config-provider/index.ts new file mode 100644 index 0000000..5926b96 --- /dev/null +++ b/packages/components/config-provider/index.ts @@ -0,0 +1 @@ +export * from './src/config-provider' \ No newline at end of file diff --git a/packages/components/config-provider/package.json b/packages/components/config-provider/package.json new file mode 100644 index 0000000..aeb62b4 --- /dev/null +++ b/packages/components/config-provider/package.json @@ -0,0 +1,29 @@ +{ + "name": "@qwqui/config-provider", + "version": "1.0.0", + "description": "", + "scripts": { + "build": "rslib build", + "clean:dist": "rimraf dist .rslib", + "clean:deps": "rimraf node_modules" + }, + "keywords": [], + "author": "", + "license": "MIT", + "types": "./dist/index.d.mts", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js", + "types": "./dist/index.d.mts" + } + }, + "files": [ + "dist" + ], + "peerDependencies": { + "react": "18.3.1" + } +} \ No newline at end of file diff --git a/packages/components/config-provider/rslib.config.ts b/packages/components/config-provider/rslib.config.ts new file mode 100644 index 0000000..29296fc --- /dev/null +++ b/packages/components/config-provider/rslib.config.ts @@ -0,0 +1,2 @@ +import { defineBuild } from '@qwqui/build'; +export default defineBuild(); \ No newline at end of file diff --git a/packages/components/config-provider/src/config-context.ts b/packages/components/config-provider/src/config-context.ts new file mode 100644 index 0000000..27a11d1 --- /dev/null +++ b/packages/components/config-provider/src/config-context.ts @@ -0,0 +1,6 @@ +import { createContext } from "react"; +import { ConfigProviderProps } from "./config-provider.type"; + +export const ConfigContext = createContext>({}); + +export const {Consumer} = ConfigContext; \ No newline at end of file diff --git a/packages/components/config-provider/src/config-provider.tsx b/packages/components/config-provider/src/config-provider.tsx new file mode 100644 index 0000000..c3d3c7e --- /dev/null +++ b/packages/components/config-provider/src/config-provider.tsx @@ -0,0 +1,54 @@ +import { useEffect } from "react"; +import { ConfigProviderProps } from "./config-provider.type"; +import { ConfigContext } from "./config-context"; + +const overwriteComponentToken = (element:HTMLElement,token: ConfigProviderProps['component']) => { + if (JSON.stringify(token) === '{}') { + return; + } + if (!element){ + return; + } + for (const [, overwriteToken] of Object.entries(token)) { + // TODO: 后续会重构为 --comp--key: value + for (const [key, value] of Object.entries(overwriteToken)){ + element.style.setProperty(`--${key}`, value); + console.log(element.style.getPropertyValue(`--${key}`)); + } + } +} + +const overwriteToken = (element:HTMLElement, token: ConfigProviderProps['tokens']) => { + if (JSON.stringify(token) === '{}') { + return; + } + if (!element){ + return; + } + for (const [color, steps] of Object.entries(token)) { + for (const [step, value] of Object.entries(steps)) { + element.style.setProperty(`--${color}-${step}`,value); + } + } +} + +export const ConfigProvider = (props: Partial & {children: React.ReactNode}) => { + const { + direction='ltr', + tokens={}, + component={} + } = props; + useEffect(()=>{ + const root = document.querySelector(':root') as HTMLElement; + overwriteToken(root, tokens) + overwriteComponentToken(root, component) + root.style.direction = direction; + }, [tokens, direction, component]); + return ( + + {props.children} + + ) +} + +ConfigProvider.ConfigContext = ConfigContext; \ No newline at end of file diff --git a/packages/components/config-provider/tsconfig.json b/packages/components/config-provider/tsconfig.json new file mode 100644 index 0000000..d7507e0 --- /dev/null +++ b/packages/components/config-provider/tsconfig.json @@ -0,0 +1,10 @@ +{ + "include": [ + "index.ts", + "src" + ], + "exclude": [ + "node_modules" + ], + "extends": "../../../tsconfig.json" +} diff --git a/packages/components/index.ts b/packages/components/index.ts index 7932d64..c29210b 100644 --- a/packages/components/index.ts +++ b/packages/components/index.ts @@ -10,6 +10,7 @@ import './code/src/styles/header.module.scss' export * from './button/index.ts' export * from './center/index.ts' export * from './code/index.ts' +export * from './config-provider/index.ts' export * from './flex/index.ts' export * from './group/index.ts' export * from './ripple/index.ts' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffd9c07..d846351 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,7 +111,7 @@ importers: version: 1.79.3 sass-loader: specifier: ^16.0.2 - version: 16.0.3(@rspack/core@1.0.14(@swc/helpers@0.5.13))(sass-embedded@1.79.3)(sass@1.80.6)(webpack@5.96.1(@swc/core@1.7.28(@swc/helpers@0.5.13))(esbuild@0.23.1)) + version: 16.0.3(@rspack/core@1.0.14(@swc/helpers@0.5.13))(sass-embedded@1.79.3)(sass@1.81.0)(webpack@5.96.1(@swc/core@1.7.28(@swc/helpers@0.5.13))(esbuild@0.23.1)) internal: dependencies: @@ -121,6 +121,9 @@ importers: camelcase: specifier: ^8.0.0 version: 8.0.0 + css-tree: + specifier: ^3.0.1 + version: 3.0.1 dashify: specifier: ^2.0.0 version: 2.0.0 @@ -133,7 +136,16 @@ importers: inquirer: specifier: ^11.0.2 version: 11.0.2 + sass: + specifier: ^1.81.0 + version: 1.81.0 + ts-morph: + specifier: ^24.0.0 + version: 24.0.0 devDependencies: + '@types/css-tree': + specifier: ^2.3.9 + version: 2.3.9 '@types/dashify': specifier: ^1.0.3 version: 1.0.3 @@ -212,6 +224,12 @@ importers: specifier: workspace:^ version: link:../../tools + packages/components/config-provider: + dependencies: + react: + specifier: 18.3.1 + version: 18.3.1 + packages/components/flex: dependencies: react: @@ -1551,6 +1569,9 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@ts-morph/common@0.25.0': + resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -1575,6 +1596,9 @@ packages: '@types/css-modules@1.0.5': resolution: {integrity: sha512-oeKafs/df9lwOvtfiXVliZsocFVOexK9PZtLQWuPeuVCFR7jwiqlg60lu80JTe5NFNtH3tnV6Fs/ySR8BUPHAw==} + '@types/css-tree@2.3.9': + resolution: {integrity: sha512-g1FE6xkPDP4tsccmTd6jIugjKZdxIDqAf9h2pc+4LsGgYbOyfa9phNjBHYbm6FtwIlNfT1NBx3f2zSeqO7aRAw==} + '@types/dashify@1.0.3': resolution: {integrity: sha512-5tFbcvWDPO1Il1Ck6Rtb4GJvD9m7HXzex50Z9wm2+YrUqN1Da3NDJnaipqtr2WlmtvOY2O/ftUrPECMKu+Bc+Q==} @@ -2144,6 +2168,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -2206,6 +2233,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-tree@3.0.1: + resolution: {integrity: sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -2632,6 +2663,14 @@ packages: picomatch: optional: true + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -2964,6 +3003,9 @@ packages: immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3633,6 +3675,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.12.1: + resolution: {integrity: sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==} + medium-zoom@1.1.0: resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} @@ -4028,6 +4073,9 @@ packages: parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4674,8 +4722,8 @@ packages: webpack: optional: true - sass@1.80.6: - resolution: {integrity: sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==} + sass@1.81.0: + resolution: {integrity: sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==} engines: {node: '>=14.0.0'} hasBin: true @@ -4963,6 +5011,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.6: resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} engines: {node: '>=12.0.0'} @@ -5042,6 +5094,9 @@ packages: esbuild: optional: true + ts-morph@24.0.0: + resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} + tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} @@ -7035,6 +7090,12 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@ts-morph/common@0.25.0': + dependencies: + minimatch: 9.0.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.10 + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.6 @@ -7066,6 +7127,8 @@ snapshots: '@types/css-modules@1.0.5': {} + '@types/css-tree@2.3.9': {} + '@types/dashify@1.0.3': {} '@types/debug@4.1.12': @@ -7727,6 +7790,8 @@ snapshots: co@4.6.0: {} + code-block-writer@13.0.3: {} + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: @@ -7790,6 +7855,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@3.0.1: + dependencies: + mdn-data: 2.12.1 + source-map-js: 1.2.1 + css.escape@1.5.1: {} cssom@0.3.8: {} @@ -8073,7 +8143,7 @@ snapshots: esbuild: 0.23.1 resolve: 1.22.8 safe-identifier: 0.4.2 - sass: 1.80.6 + sass: 1.81.0 sass-embedded: 1.80.6 esbuild@0.23.1: @@ -8322,6 +8392,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -8790,6 +8864,8 @@ snapshots: immutable@4.3.7: {} + immutable@5.0.3: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -9808,6 +9884,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.12.1: {} + medium-zoom@1.1.0: {} merge-stream@2.0.0: {} @@ -10424,6 +10502,8 @@ snapshots: leac: 0.6.0 peberminta: 0.9.0 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -11022,19 +11102,19 @@ snapshots: sass-embedded-win32-ia32: 1.80.6 sass-embedded-win32-x64: 1.80.6 - sass-loader@16.0.3(@rspack/core@1.0.14(@swc/helpers@0.5.13))(sass-embedded@1.79.3)(sass@1.80.6)(webpack@5.96.1(@swc/core@1.7.28(@swc/helpers@0.5.13))(esbuild@0.23.1)): + sass-loader@16.0.3(@rspack/core@1.0.14(@swc/helpers@0.5.13))(sass-embedded@1.79.3)(sass@1.81.0)(webpack@5.96.1(@swc/core@1.7.28(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.0.14(@swc/helpers@0.5.13) - sass: 1.80.6 + sass: 1.81.0 sass-embedded: 1.79.3 webpack: 5.96.1(@swc/core@1.7.28(@swc/helpers@0.5.13))(esbuild@0.23.1) - sass@1.80.6: + sass@1.81.0: dependencies: chokidar: 4.0.1 - immutable: 4.3.7 + immutable: 5.0.3 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.4.1 @@ -11344,6 +11424,11 @@ snapshots: dependencies: any-promise: 1.3.0 + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + tinyglobby@0.2.6: dependencies: fdir: 6.3.0(picomatch@4.0.2) @@ -11412,6 +11497,11 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.0) esbuild: 0.23.1 + ts-morph@24.0.0: + dependencies: + '@ts-morph/common': 0.25.0 + code-block-writer: 13.0.3 + tslib@2.7.0: {} tsup@8.3.0(@microsoft/api-extractor@7.47.11(@types/node@22.7.2))(@swc/core@1.7.28(@swc/helpers@0.5.13))(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.2): diff --git a/tsconfig.json b/tsconfig.json index 067a63f..8e0fbfb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,7 @@ "allowImportingTsExtensions": true, "noEmit": true, "emitDeclarationOnly": false, - "lib": ["ES2015.Promise", "ES2015", "DOM"] + "lib": ["ES2017", "DOM"] }, "exclude": [ "node_modules",