@bamboocss/eslint-plugin 1.12.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,13 +1,13 @@
1
- const require_utils = require('./utils-BQiAeXE_.cjs');
2
- let _bamboocss_shared = require("@bamboocss/shared");
1
+ const require_utils = require('./utils-BbqZf2ZV.cjs');
3
2
  let _typescript_eslint_utils = require("@typescript-eslint/utils");
4
3
  let _typescript_eslint_utils_ast_utils = require("@typescript-eslint/utils/ast-utils");
5
4
  let _typescript_eslint_scope_manager = require("@typescript-eslint/scope-manager");
6
5
  require("@typescript-eslint/utils/ts-eslint");
6
+ let _bamboocss_shared = require("@bamboocss/shared");
7
7
 
8
8
  //#region package.json
9
9
  var name = "@bamboocss/eslint-plugin";
10
- var version = "1.12.0";
10
+ var version = "1.12.1";
11
11
 
12
12
  //#endregion
13
13
  //#region src/utils/nodes.ts
package/dist/index.mjs CHANGED
@@ -1,13 +1,13 @@
1
- import { c as __commonJSMin, l as __esmMin, n as init_utils, r as syncAction, t as createRule } from "./utils-CwjhPHe9.mjs";
2
- import { getArbitraryValue } from "@bamboocss/shared";
1
+ import { c as __commonJSMin, l as __esmMin, n as init_utils, r as syncAction, t as createRule } from "./utils--KVHU2cv.mjs";
3
2
  import { AST_NODE_TYPES } from "@typescript-eslint/utils";
4
3
  import { isNodeOfType, isNodeOfTypes } from "@typescript-eslint/utils/ast-utils";
5
4
  import { analyze } from "@typescript-eslint/scope-manager";
6
5
  import "@typescript-eslint/utils/ts-eslint";
6
+ import { getArbitraryValue } from "@bamboocss/shared";
7
7
 
8
8
  //#region package.json
9
9
  var name = "@bamboocss/eslint-plugin";
10
- var version = "1.12.0";
10
+ var version = "1.12.1";
11
11
 
12
12
  //#endregion
13
13
  //#region src/utils/nodes.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_utils = require('../utils-BQiAeXE_.cjs');
2
+ const require_utils = require('../utils-BbqZf2ZV.cjs');
3
3
 
4
4
  exports.getContext = require_utils.getContext;
5
5
  exports.run = require_utils.run;
@@ -1,4 +1,4 @@
1
- import { a as init_worker, i as getContext, o as run, s as runAsync } from "../utils-CwjhPHe9.mjs";
1
+ import { a as init_worker, i as getContext, o as run, s as runAsync } from "../utils--KVHU2cv.mjs";
2
2
 
3
3
  init_worker();
4
4
  export { getContext, run, runAsync };
@@ -0,0 +1,164 @@
1
+ import { findConfig, loadConfig } from "@bamboocss/config";
2
+ import { resolveTsPathPattern } from "@bamboocss/config/ts-path";
3
+ import { Generator } from "@bamboocss/generator";
4
+ import micromatch from "micromatch";
5
+ import path from "path";
6
+ import { createSyncFn, runAsWorker } from "synckit";
7
+ import { ESLintUtils } from "@typescript-eslint/utils";
8
+ import { join } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+
11
+ //#region \0rolldown/runtime.js
12
+ var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
14
+
15
+ //#endregion
16
+ //#region src/utils/worker.ts
17
+ async function getContext(options) {
18
+ if (process.env.NODE_ENV === "test") {
19
+ const { createGeneratorContext } = await import("../tests/fixtures/create-context");
20
+ return createGeneratorContext({
21
+ exclude: ["**/Invalid.tsx", "**/bamboo.config.ts"],
22
+ importMap: "./bamboo",
23
+ include: ["**/*"],
24
+ jsxFactory: "styled"
25
+ });
26
+ } else {
27
+ const configPath = findConfig({ cwd: options.configPath ?? options.currentFile });
28
+ if (!contextCache[configPath]) contextCache[configPath] = _getContext(configPath);
29
+ return contextCache[configPath];
30
+ }
31
+ }
32
+ async function _getContext(configPath) {
33
+ if (!configPath) throw new Error("Invalid config path");
34
+ return new Generator(await loadConfig({
35
+ cwd: path.dirname(configPath),
36
+ file: configPath
37
+ }));
38
+ }
39
+ function run(action, options, ...args) {
40
+ return runAsync(action, options, ...args);
41
+ }
42
+ async function runAsync(action, options, ...args) {
43
+ const context = await getContext(options);
44
+ switch (action) {
45
+ case "filterDeprecatedTokens": return filterDeprecatedTokens(context, ...args);
46
+ case "filterImports": return filterImports(context, ...args);
47
+ case "filterInvalidTokens": return filterInvalidTokens(context, ...args);
48
+ case "getJsxFactory": return getJsxFactory(context);
49
+ case "getPropCategory": return getPropertyCategory(context, ...args);
50
+ case "isColorAttribute": return isColorAttribute(context, ...args);
51
+ case "isColorToken": return isColorToken(context, ...args);
52
+ case "isValidFile": return isValidFile(context, options.currentFile);
53
+ case "isValidProperty": return isValidProperty(context, ...args);
54
+ case "matchFile": return matchFile(context, ...args);
55
+ case "matchImports": return matchImports(context, ...args);
56
+ case "resolveLongHand": return resolveLongHand(context, ...args);
57
+ case "resolveShorthands": return resolveShorthands(context, ...args);
58
+ }
59
+ }
60
+ var contextCache, filterDeprecatedTokens, filterInvalidTokens, getPropertyCategory, isColorAttribute, isColorToken, isValidFile, isValidProperty, matchFile, matchImports, filterImports, reverseShorthandsMapCache, getReverseShorthandsMap, resolveLongHand, resolveShorthands, getJsxFactory;
61
+ var init_worker = __esmMin((() => {
62
+ contextCache = {};
63
+ filterDeprecatedTokens = (context, tokens) => {
64
+ return tokens.filter((token) => {
65
+ const value = typeof token === "string" ? token : token.category + "." + token.value;
66
+ return context.utility.tokens.isDeprecated(value);
67
+ });
68
+ };
69
+ filterInvalidTokens = (context, paths) => {
70
+ return paths.filter((path) => !context.utility.tokens.view.get(path));
71
+ };
72
+ getPropertyCategory = (context, _attribute) => {
73
+ const attribute = resolveLongHand(context, _attribute) || _attribute;
74
+ const attributeConfig = context.utility.config[attribute];
75
+ return typeof attributeConfig?.values === "string" ? attributeConfig.values : void 0;
76
+ };
77
+ isColorAttribute = (context, _attribute) => {
78
+ return getPropertyCategory(context, _attribute) === "colors";
79
+ };
80
+ isColorToken = (context, value) => {
81
+ return Boolean(context.utility.tokens.view.categoryMap.get("colors")?.get(value));
82
+ };
83
+ isValidFile = (context, fileName) => {
84
+ const { exclude, include } = context.config;
85
+ const cwd = context.config.cwd || process.cwd();
86
+ const relativePath = path.isAbsolute(fileName) ? path.relative(cwd, fileName) : fileName;
87
+ return micromatch.isMatch(relativePath, include, {
88
+ dot: true,
89
+ ignore: exclude
90
+ });
91
+ };
92
+ isValidProperty = (context, name, patternName) => {
93
+ if (context.isValidProperty(name)) return true;
94
+ if (!patternName) return false;
95
+ if (patternName === context.config.jsxFactory) return false;
96
+ const pattern = context.patterns.details.find((p) => p.baseName === patternName || p.jsx.includes(patternName))?.config.properties;
97
+ if (!pattern) return false;
98
+ return Object.keys(pattern).includes(name);
99
+ };
100
+ matchFile = (context, name, imports) => {
101
+ return context.imports.file(imports).match(name);
102
+ };
103
+ matchImports = (context, result) => {
104
+ return context.imports.match(result, (module_) => {
105
+ const { tsOptions } = context.parserOptions;
106
+ if (!tsOptions?.pathMappings) return;
107
+ return resolveTsPathPattern(tsOptions.pathMappings, module_);
108
+ });
109
+ };
110
+ filterImports = (context, imports) => {
111
+ return imports.filter((imp) => context.imports.match(imp, (module_) => {
112
+ const { tsOptions } = context.parserOptions;
113
+ if (!tsOptions?.pathMappings) return;
114
+ return resolveTsPathPattern(tsOptions.pathMappings, module_);
115
+ }));
116
+ };
117
+ reverseShorthandsMapCache = /* @__PURE__ */ new WeakMap();
118
+ getReverseShorthandsMap = (context) => {
119
+ let reverseMap = reverseShorthandsMapCache.get(context);
120
+ if (!reverseMap) {
121
+ reverseMap = /* @__PURE__ */ new Map();
122
+ const shorthands = context.utility.getPropShorthandsMap();
123
+ for (const [key, values] of shorthands) for (const value of values) reverseMap.set(value, key);
124
+ reverseShorthandsMapCache.set(context, reverseMap);
125
+ }
126
+ return reverseMap;
127
+ };
128
+ resolveLongHand = (context, name) => {
129
+ return getReverseShorthandsMap(context).get(name);
130
+ };
131
+ resolveShorthands = (context, name) => {
132
+ return context.utility.getPropShorthandsMap().get(name);
133
+ };
134
+ getJsxFactory = (context) => {
135
+ return context.config.jsxFactory;
136
+ };
137
+ runAsWorker(run);
138
+ }));
139
+
140
+ //#endregion
141
+ //#region src/utils/index.ts
142
+ var createRule, isBase, _syncAction, cache, syncAction;
143
+ var init_utils = __esmMin((() => {
144
+ createRule = ESLintUtils.RuleCreator((name) => `https://github.com/bamboocss/bamboo/blob/main/packages/eslint-plugin/docs/rules/${name}.md`);
145
+ isBase = process.env.NODE_ENV !== "test" || import.meta.url.endsWith("dist/index.js");
146
+ _syncAction = createSyncFn(join(fileURLToPath(new URL(isBase ? "./" : "../../dist", import.meta.url)), "utils/worker.mjs"));
147
+ cache = /* @__PURE__ */ new Map();
148
+ syncAction = ((...args) => {
149
+ const cacheKey = JSON.stringify(args);
150
+ if (cache.has(cacheKey)) return cache.get(cacheKey);
151
+ try {
152
+ const result = _syncAction(...args);
153
+ cache.set(cacheKey, result);
154
+ return result;
155
+ } catch (error) {
156
+ console.error("syncAction error:", error);
157
+ return;
158
+ }
159
+ });
160
+ }));
161
+
162
+ //#endregion
163
+ export { init_worker as a, __commonJSMin as c, getContext as i, __esmMin as l, init_utils as n, run as o, syncAction as r, runAsync as s, createRule as t };
164
+ //# sourceMappingURL=utils--KVHU2cv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils--KVHU2cv.mjs","names":[],"sources":["../src/utils/worker.ts","../src/utils/index.ts"],"sourcesContent":["import { type ImportResult } from '.';\nimport { findConfig, loadConfig } from '@bamboocss/config';\nimport { resolveTsPathPattern } from '@bamboocss/config/ts-path';\nimport { Generator } from '@bamboocss/generator';\nimport micromatch from 'micromatch';\nimport path from 'path';\nimport { runAsWorker } from 'synckit';\n\ntype Options = {\n configPath?: string;\n currentFile: string;\n};\n\nconst contextCache: { [configPath: string]: Promise<Generator> } = {};\n\nexport type DeprecatedToken =\n | string\n | {\n category: string;\n value: string;\n };\n\nexport async function getContext(options: Options) {\n if (process.env.NODE_ENV === 'test') {\n const { createGeneratorContext } = await import(\n '../../tests/fixtures/create-context'\n );\n const context = createGeneratorContext({\n exclude: ['**/Invalid.tsx', '**/bamboo.config.ts'],\n importMap: './bamboo',\n include: ['**/*'],\n jsxFactory: 'styled',\n });\n return context;\n } else {\n const configPath = findConfig({\n cwd: options.configPath ?? options.currentFile,\n });\n\n // The context cache ensures we don't reload the same config multiple times\n if (!contextCache[configPath]) {\n contextCache[configPath] = _getContext(configPath);\n }\n\n return contextCache[configPath];\n }\n}\n\nasync function _getContext(configPath: string | undefined) {\n if (!configPath) {\n throw new Error('Invalid config path');\n }\n\n const cwd = path.dirname(configPath);\n\n const conf = await loadConfig({ cwd, file: configPath });\n const context = new Generator(conf);\n\n return context;\n}\n\n// Refactored to arrow function, removed async\nconst filterDeprecatedTokens = (\n context: Generator,\n tokens: DeprecatedToken[],\n): DeprecatedToken[] => {\n return tokens.filter((token) => {\n const value =\n typeof token === 'string' ? token : token.category + '.' + token.value;\n return context.utility.tokens.isDeprecated(value);\n });\n};\n\n// Refactored to arrow function, removed async\nconst filterInvalidTokens = (context: Generator, paths: string[]): string[] => {\n return paths.filter((path) => !context.utility.tokens.view.get(path));\n};\n\n// Refactored to arrow function, removed async\nconst getPropertyCategory = (context: Generator, _attribute: string) => {\n const longhand = resolveLongHand(context, _attribute);\n const attribute = longhand || _attribute;\n const attributeConfig = context.utility.config[attribute];\n return typeof attributeConfig?.values === 'string'\n ? attributeConfig.values\n : undefined;\n};\n\n// Refactored to arrow function, removed async\nconst isColorAttribute = (context: Generator, _attribute: string): boolean => {\n const category = getPropertyCategory(context, _attribute);\n return category === 'colors';\n};\n\n// Refactored to arrow function, removed async\nconst isColorToken = (context: Generator, value: string): boolean => {\n return Boolean(\n context.utility.tokens.view.categoryMap.get('colors')?.get(value),\n );\n};\n\ntype MatchImportResult = {\n alias: string;\n mod: string;\n name: string;\n};\n\nexport function run(\n action: 'filterInvalidTokens',\n options: Options,\n paths: string[],\n): string[];\n\nexport function run(\n action: 'isColorToken',\n options: Options,\n value: string,\n): boolean;\n\nexport function run(\n action: 'isColorAttribute',\n options: Options,\n attribute: string,\n): boolean;\n\nexport function run(action: 'isValidFile', options: Options): boolean;\n\nexport function run(\n action: 'resolveShorthands',\n options: Options,\n name: string,\n): string[] | undefined;\nexport function run(\n action: 'resolveLongHand',\n options: Options,\n name: string,\n): string | undefined;\n\nexport function run(\n action: 'isValidProperty',\n options: Options,\n name: string,\n patternName?: string,\n): boolean;\nexport function run(\n action: 'matchFile',\n options: Options,\n name: string,\n imports: ImportResult[],\n): boolean;\nexport function run(\n action: 'matchImports',\n options: Options,\n result: MatchImportResult,\n): boolean;\nexport function run(\n action: 'filterImports',\n options: Options,\n imports: MatchImportResult[],\n): MatchImportResult[];\nexport function run(\n action: 'getPropCategory',\n options: Options,\n property: string,\n): string;\nexport function run(\n action: 'filterDeprecatedTokens',\n options: Options,\n tokens: DeprecatedToken[],\n): DeprecatedToken[];\nexport function run(\n action: 'getJsxFactory',\n options: Options,\n): string | undefined;\nexport function run(action: string, options: Options, ...args: any[]): any {\n // @ts-expect-error cast\n return runAsync(action, options, ...args);\n}\n\nexport function runAsync(\n action: 'filterInvalidTokens',\n options: Options,\n paths: string[],\n): Promise<string[]>;\nexport function runAsync(\n action: 'isColorToken',\n options: Options,\n value: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'isColorAttribute',\n options: Options,\n attribute: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'isValidFile',\n options: Options,\n fileName: string,\n): Promise<string>;\nexport function runAsync(\n action: 'resolveShorthands',\n options: Options,\n name: string,\n): Promise<string[] | undefined>;\nexport function runAsync(\n action: 'resolveLongHand',\n options: Options,\n name: string,\n): Promise<string | undefined>;\n\nexport function runAsync(\n action: 'isValidProperty',\n options: Options,\n name: string,\n patternName?: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'matchFile',\n options: Options,\n name: string,\n imports: ImportResult[],\n): Promise<boolean>;\nexport function runAsync(\n action: 'matchImports',\n options: Options,\n result: MatchImportResult,\n): Promise<boolean>;\nexport function runAsync(\n action: 'filterImports',\n options: Options,\n imports: MatchImportResult[],\n): Promise<MatchImportResult[]>;\nexport function runAsync(\n action: 'getPropCategory',\n options: Options,\n property: string,\n): Promise<string>;\nexport function runAsync(\n action: 'filterDeprecatedTokens',\n options: Options,\n tokens: DeprecatedToken[],\n): Promise<DeprecatedToken[]>;\nexport function runAsync(\n action: 'getJsxFactory',\n options: Options,\n): Promise<string | undefined>;\nexport async function runAsync(\n action: string,\n options: Options,\n ...args: any\n): Promise<any> {\n const context = await getContext(options);\n\n switch (action) {\n case 'filterDeprecatedTokens':\n // @ts-expect-error cast\n return filterDeprecatedTokens(context, ...args);\n case 'filterImports':\n // @ts-expect-error cast\n return filterImports(context, ...args);\n case 'filterInvalidTokens':\n // @ts-expect-error cast\n return filterInvalidTokens(context, ...args);\n case 'getJsxFactory':\n return getJsxFactory(context);\n case 'getPropCategory':\n // @ts-expect-error cast\n return getPropertyCategory(context, ...args);\n case 'isColorAttribute':\n // @ts-expect-error cast\n return isColorAttribute(context, ...args);\n case 'isColorToken':\n // @ts-expect-error cast\n return isColorToken(context, ...args);\n case 'isValidFile':\n return isValidFile(context, options.currentFile);\n case 'isValidProperty':\n // @ts-expect-error cast\n return isValidProperty(context, ...args);\n case 'matchFile':\n // @ts-expect-error cast\n return matchFile(context, ...args);\n case 'matchImports':\n // @ts-expect-error cast\n return matchImports(context, ...args);\n case 'resolveLongHand':\n // @ts-expect-error cast\n return resolveLongHand(context, ...args);\n case 'resolveShorthands':\n // @ts-expect-error cast\n return resolveShorthands(context, ...args);\n }\n}\n\n// Refactored to use micromatch instead of getFiles() for O(1) performance\nconst isValidFile = (context: Generator, fileName: string): boolean => {\n const { exclude, include } = context.config;\n const cwd = context.config.cwd || process.cwd();\n\n const relativePath = path.isAbsolute(fileName)\n ? path.relative(cwd, fileName)\n : fileName;\n\n return micromatch.isMatch(relativePath, include, {\n dot: true,\n ignore: exclude,\n });\n};\n\n// Refactored to arrow function, removed async\nconst isValidProperty = (\n context: Generator,\n name: string,\n patternName?: string,\n) => {\n if (context.isValidProperty(name)) {\n return true;\n }\n\n if (!patternName) {\n return false;\n }\n\n // If the pattern name is the jsxFactory (e.g., 'styled'), we should accept\n // any property that is valid according to the global property check\n // Since styled components are generic wrappers, we don't need pattern-specific checks\n if (patternName === context.config.jsxFactory) {\n // Already checked globally above, so return false if we got here\n return false;\n }\n\n const pattern = context.patterns.details.find(\n (p) => p.baseName === patternName || p.jsx.includes(patternName),\n )?.config.properties;\n if (!pattern) {\n return false;\n }\n\n return Object.keys(pattern).includes(name);\n};\n\n// Refactored to arrow function, removed async\nconst matchFile = (\n context: Generator,\n name: string,\n imports: ImportResult[],\n) => {\n const file = context.imports.file(imports);\n return file.match(name);\n};\n\n// Refactored to arrow function, removed async\nconst matchImports = (context: Generator, result: MatchImportResult) => {\n return context.imports.match(result, (module_) => {\n const { tsOptions } = context.parserOptions;\n if (!tsOptions?.pathMappings) {\n return;\n }\n\n return resolveTsPathPattern(tsOptions.pathMappings, module_);\n });\n};\n\n// Batch filter imports to reduce worker thread crossings\nconst filterImports = (\n context: Generator,\n imports: MatchImportResult[],\n): MatchImportResult[] => {\n return imports.filter((imp) =>\n context.imports.match(imp, (module_) => {\n const { tsOptions } = context.parserOptions;\n if (!tsOptions?.pathMappings) {\n return;\n }\n\n return resolveTsPathPattern(tsOptions.pathMappings, module_);\n }),\n );\n};\n\n// Cache reverse shorthand map per context to avoid O(N) rebuild on every call\nconst reverseShorthandsMapCache = new WeakMap<Generator, Map<string, string>>();\n\nconst getReverseShorthandsMap = (context: Generator): Map<string, string> => {\n let reverseMap = reverseShorthandsMapCache.get(context);\n if (!reverseMap) {\n reverseMap = new Map();\n const shorthands = context.utility.getPropShorthandsMap();\n for (const [key, values] of shorthands) {\n for (const value of values) {\n reverseMap.set(value, key);\n }\n }\n\n reverseShorthandsMapCache.set(context, reverseMap);\n }\n\n return reverseMap;\n};\n\n// Refactored to use cached reverse shorthand map\nconst resolveLongHand = (\n context: Generator,\n name: string,\n): string | undefined => {\n return getReverseShorthandsMap(context).get(name);\n};\n\n// Refactored to arrow function, removed async\nconst resolveShorthands = (\n context: Generator,\n name: string,\n): string[] | undefined => {\n return context.utility.getPropShorthandsMap().get(name);\n};\n\nconst getJsxFactory = (context: Generator): string | undefined => {\n return context.config.jsxFactory;\n};\n\nrunAsWorker(run as any);\n","import { type run } from './worker';\nimport { ESLintUtils } from '@typescript-eslint/utils';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createSyncFn } from 'synckit';\n\n// Rule creator\nexport const createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/bamboocss/bamboo/blob/main/packages/eslint-plugin/docs/rules/${name}.md`,\n);\n\n// Determine the distribution directory\nconst isBase =\n process.env.NODE_ENV !== 'test' || import.meta.url.endsWith('dist/index.js');\n\nconst distDir = fileURLToPath(\n new URL(isBase ? './' : '../../dist', import.meta.url),\n);\n\n// Create synchronous function using synckit\nconst _syncAction = createSyncFn(join(distDir, 'utils/worker.mjs'));\n\n// Define syncAction with proper typing and error handling\nconst cache = new Map<string, any>();\n\nexport const syncAction = ((...args: Parameters<typeof run>) => {\n // Generate cache key from arguments\n const cacheKey = JSON.stringify(args);\n\n // Return cached result if exists\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const result = _syncAction(...args);\n // Store result in cache\n cache.set(cacheKey, result);\n return result;\n } catch (error) {\n console.error('syncAction error:', error);\n return undefined;\n }\n}) as typeof run;\n\nexport type ImportResult = {\n alias: string;\n importMapValue?: string;\n mod: string;\n name: string;\n};\n"],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) {
13
+ __defProp(to, key, {
14
+ get: ((k) => from[k]).bind(null, key),
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ }
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
25
+ }) : target, mod));
26
+
27
+ //#endregion
28
+ let _bamboocss_config = require("@bamboocss/config");
29
+ let _bamboocss_config_ts_path = require("@bamboocss/config/ts-path");
30
+ let _bamboocss_generator = require("@bamboocss/generator");
31
+ let micromatch = require("micromatch");
32
+ micromatch = __toESM(micromatch);
33
+ let path = require("path");
34
+ path = __toESM(path);
35
+ let synckit = require("synckit");
36
+ let _typescript_eslint_utils = require("@typescript-eslint/utils");
37
+ let node_path = require("node:path");
38
+ let node_url = require("node:url");
39
+
40
+ //#region src/utils/worker.ts
41
+ const contextCache = {};
42
+ async function getContext(options) {
43
+ if (process.env.NODE_ENV === "test") {
44
+ const { createGeneratorContext } = await import("../tests/fixtures/create-context");
45
+ return createGeneratorContext({
46
+ exclude: ["**/Invalid.tsx", "**/bamboo.config.ts"],
47
+ importMap: "./bamboo",
48
+ include: ["**/*"],
49
+ jsxFactory: "styled"
50
+ });
51
+ } else {
52
+ const configPath = (0, _bamboocss_config.findConfig)({ cwd: options.configPath ?? options.currentFile });
53
+ if (!contextCache[configPath]) contextCache[configPath] = _getContext(configPath);
54
+ return contextCache[configPath];
55
+ }
56
+ }
57
+ async function _getContext(configPath) {
58
+ if (!configPath) throw new Error("Invalid config path");
59
+ return new _bamboocss_generator.Generator(await (0, _bamboocss_config.loadConfig)({
60
+ cwd: path.default.dirname(configPath),
61
+ file: configPath
62
+ }));
63
+ }
64
+ const filterDeprecatedTokens = (context, tokens) => {
65
+ return tokens.filter((token) => {
66
+ const value = typeof token === "string" ? token : token.category + "." + token.value;
67
+ return context.utility.tokens.isDeprecated(value);
68
+ });
69
+ };
70
+ const filterInvalidTokens = (context, paths) => {
71
+ return paths.filter((path$2) => !context.utility.tokens.view.get(path$2));
72
+ };
73
+ const getPropertyCategory = (context, _attribute) => {
74
+ const attribute = resolveLongHand(context, _attribute) || _attribute;
75
+ const attributeConfig = context.utility.config[attribute];
76
+ return typeof attributeConfig?.values === "string" ? attributeConfig.values : void 0;
77
+ };
78
+ const isColorAttribute = (context, _attribute) => {
79
+ return getPropertyCategory(context, _attribute) === "colors";
80
+ };
81
+ const isColorToken = (context, value) => {
82
+ return Boolean(context.utility.tokens.view.categoryMap.get("colors")?.get(value));
83
+ };
84
+ function run(action, options, ...args) {
85
+ return runAsync(action, options, ...args);
86
+ }
87
+ async function runAsync(action, options, ...args) {
88
+ const context = await getContext(options);
89
+ switch (action) {
90
+ case "filterDeprecatedTokens": return filterDeprecatedTokens(context, ...args);
91
+ case "filterImports": return filterImports(context, ...args);
92
+ case "filterInvalidTokens": return filterInvalidTokens(context, ...args);
93
+ case "getJsxFactory": return getJsxFactory(context);
94
+ case "getPropCategory": return getPropertyCategory(context, ...args);
95
+ case "isColorAttribute": return isColorAttribute(context, ...args);
96
+ case "isColorToken": return isColorToken(context, ...args);
97
+ case "isValidFile": return isValidFile(context, options.currentFile);
98
+ case "isValidProperty": return isValidProperty(context, ...args);
99
+ case "matchFile": return matchFile(context, ...args);
100
+ case "matchImports": return matchImports(context, ...args);
101
+ case "resolveLongHand": return resolveLongHand(context, ...args);
102
+ case "resolveShorthands": return resolveShorthands(context, ...args);
103
+ }
104
+ }
105
+ const isValidFile = (context, fileName) => {
106
+ const { exclude, include } = context.config;
107
+ const cwd = context.config.cwd || process.cwd();
108
+ const relativePath = path.default.isAbsolute(fileName) ? path.default.relative(cwd, fileName) : fileName;
109
+ return micromatch.default.isMatch(relativePath, include, {
110
+ dot: true,
111
+ ignore: exclude
112
+ });
113
+ };
114
+ const isValidProperty = (context, name, patternName) => {
115
+ if (context.isValidProperty(name)) return true;
116
+ if (!patternName) return false;
117
+ if (patternName === context.config.jsxFactory) return false;
118
+ const pattern = context.patterns.details.find((p) => p.baseName === patternName || p.jsx.includes(patternName))?.config.properties;
119
+ if (!pattern) return false;
120
+ return Object.keys(pattern).includes(name);
121
+ };
122
+ const matchFile = (context, name, imports) => {
123
+ return context.imports.file(imports).match(name);
124
+ };
125
+ const matchImports = (context, result) => {
126
+ return context.imports.match(result, (module_) => {
127
+ const { tsOptions } = context.parserOptions;
128
+ if (!tsOptions?.pathMappings) return;
129
+ return (0, _bamboocss_config_ts_path.resolveTsPathPattern)(tsOptions.pathMappings, module_);
130
+ });
131
+ };
132
+ const filterImports = (context, imports) => {
133
+ return imports.filter((imp) => context.imports.match(imp, (module_) => {
134
+ const { tsOptions } = context.parserOptions;
135
+ if (!tsOptions?.pathMappings) return;
136
+ return (0, _bamboocss_config_ts_path.resolveTsPathPattern)(tsOptions.pathMappings, module_);
137
+ }));
138
+ };
139
+ const reverseShorthandsMapCache = /* @__PURE__ */ new WeakMap();
140
+ const getReverseShorthandsMap = (context) => {
141
+ let reverseMap = reverseShorthandsMapCache.get(context);
142
+ if (!reverseMap) {
143
+ reverseMap = /* @__PURE__ */ new Map();
144
+ const shorthands = context.utility.getPropShorthandsMap();
145
+ for (const [key, values] of shorthands) for (const value of values) reverseMap.set(value, key);
146
+ reverseShorthandsMapCache.set(context, reverseMap);
147
+ }
148
+ return reverseMap;
149
+ };
150
+ const resolveLongHand = (context, name) => {
151
+ return getReverseShorthandsMap(context).get(name);
152
+ };
153
+ const resolveShorthands = (context, name) => {
154
+ return context.utility.getPropShorthandsMap().get(name);
155
+ };
156
+ const getJsxFactory = (context) => {
157
+ return context.config.jsxFactory;
158
+ };
159
+ (0, synckit.runAsWorker)(run);
160
+
161
+ //#endregion
162
+ //#region src/utils/index.ts
163
+ const createRule = _typescript_eslint_utils.ESLintUtils.RuleCreator((name) => `https://github.com/bamboocss/bamboo/blob/main/packages/eslint-plugin/docs/rules/${name}.md`);
164
+ const isBase = process.env.NODE_ENV !== "test" || require("url").pathToFileURL(__filename).href.endsWith("dist/index.js");
165
+ const _syncAction = (0, synckit.createSyncFn)((0, node_path.join)((0, node_url.fileURLToPath)(new URL(isBase ? "./" : "../../dist", require("url").pathToFileURL(__filename).href)), "utils/worker.mjs"));
166
+ const cache = /* @__PURE__ */ new Map();
167
+ const syncAction = ((...args) => {
168
+ const cacheKey = JSON.stringify(args);
169
+ if (cache.has(cacheKey)) return cache.get(cacheKey);
170
+ try {
171
+ const result = _syncAction(...args);
172
+ cache.set(cacheKey, result);
173
+ return result;
174
+ } catch (error) {
175
+ console.error("syncAction error:", error);
176
+ return;
177
+ }
178
+ });
179
+
180
+ //#endregion
181
+ Object.defineProperty(exports, '__toESM', {
182
+ enumerable: true,
183
+ get: function () {
184
+ return __toESM;
185
+ }
186
+ });
187
+ Object.defineProperty(exports, 'createRule', {
188
+ enumerable: true,
189
+ get: function () {
190
+ return createRule;
191
+ }
192
+ });
193
+ Object.defineProperty(exports, 'getContext', {
194
+ enumerable: true,
195
+ get: function () {
196
+ return getContext;
197
+ }
198
+ });
199
+ Object.defineProperty(exports, 'run', {
200
+ enumerable: true,
201
+ get: function () {
202
+ return run;
203
+ }
204
+ });
205
+ Object.defineProperty(exports, 'runAsync', {
206
+ enumerable: true,
207
+ get: function () {
208
+ return runAsync;
209
+ }
210
+ });
211
+ Object.defineProperty(exports, 'syncAction', {
212
+ enumerable: true,
213
+ get: function () {
214
+ return syncAction;
215
+ }
216
+ });
217
+ //# sourceMappingURL=utils-BbqZf2ZV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-BbqZf2ZV.cjs","names":["Generator","path","ESLintUtils"],"sources":["../src/utils/worker.ts","../src/utils/index.ts"],"sourcesContent":["import { type ImportResult } from '.';\nimport { findConfig, loadConfig } from '@bamboocss/config';\nimport { resolveTsPathPattern } from '@bamboocss/config/ts-path';\nimport { Generator } from '@bamboocss/generator';\nimport micromatch from 'micromatch';\nimport path from 'path';\nimport { runAsWorker } from 'synckit';\n\ntype Options = {\n configPath?: string;\n currentFile: string;\n};\n\nconst contextCache: { [configPath: string]: Promise<Generator> } = {};\n\nexport type DeprecatedToken =\n | string\n | {\n category: string;\n value: string;\n };\n\nexport async function getContext(options: Options) {\n if (process.env.NODE_ENV === 'test') {\n const { createGeneratorContext } = await import(\n '../../tests/fixtures/create-context'\n );\n const context = createGeneratorContext({\n exclude: ['**/Invalid.tsx', '**/bamboo.config.ts'],\n importMap: './bamboo',\n include: ['**/*'],\n jsxFactory: 'styled',\n });\n return context;\n } else {\n const configPath = findConfig({\n cwd: options.configPath ?? options.currentFile,\n });\n\n // The context cache ensures we don't reload the same config multiple times\n if (!contextCache[configPath]) {\n contextCache[configPath] = _getContext(configPath);\n }\n\n return contextCache[configPath];\n }\n}\n\nasync function _getContext(configPath: string | undefined) {\n if (!configPath) {\n throw new Error('Invalid config path');\n }\n\n const cwd = path.dirname(configPath);\n\n const conf = await loadConfig({ cwd, file: configPath });\n const context = new Generator(conf);\n\n return context;\n}\n\n// Refactored to arrow function, removed async\nconst filterDeprecatedTokens = (\n context: Generator,\n tokens: DeprecatedToken[],\n): DeprecatedToken[] => {\n return tokens.filter((token) => {\n const value =\n typeof token === 'string' ? token : token.category + '.' + token.value;\n return context.utility.tokens.isDeprecated(value);\n });\n};\n\n// Refactored to arrow function, removed async\nconst filterInvalidTokens = (context: Generator, paths: string[]): string[] => {\n return paths.filter((path) => !context.utility.tokens.view.get(path));\n};\n\n// Refactored to arrow function, removed async\nconst getPropertyCategory = (context: Generator, _attribute: string) => {\n const longhand = resolveLongHand(context, _attribute);\n const attribute = longhand || _attribute;\n const attributeConfig = context.utility.config[attribute];\n return typeof attributeConfig?.values === 'string'\n ? attributeConfig.values\n : undefined;\n};\n\n// Refactored to arrow function, removed async\nconst isColorAttribute = (context: Generator, _attribute: string): boolean => {\n const category = getPropertyCategory(context, _attribute);\n return category === 'colors';\n};\n\n// Refactored to arrow function, removed async\nconst isColorToken = (context: Generator, value: string): boolean => {\n return Boolean(\n context.utility.tokens.view.categoryMap.get('colors')?.get(value),\n );\n};\n\ntype MatchImportResult = {\n alias: string;\n mod: string;\n name: string;\n};\n\nexport function run(\n action: 'filterInvalidTokens',\n options: Options,\n paths: string[],\n): string[];\n\nexport function run(\n action: 'isColorToken',\n options: Options,\n value: string,\n): boolean;\n\nexport function run(\n action: 'isColorAttribute',\n options: Options,\n attribute: string,\n): boolean;\n\nexport function run(action: 'isValidFile', options: Options): boolean;\n\nexport function run(\n action: 'resolveShorthands',\n options: Options,\n name: string,\n): string[] | undefined;\nexport function run(\n action: 'resolveLongHand',\n options: Options,\n name: string,\n): string | undefined;\n\nexport function run(\n action: 'isValidProperty',\n options: Options,\n name: string,\n patternName?: string,\n): boolean;\nexport function run(\n action: 'matchFile',\n options: Options,\n name: string,\n imports: ImportResult[],\n): boolean;\nexport function run(\n action: 'matchImports',\n options: Options,\n result: MatchImportResult,\n): boolean;\nexport function run(\n action: 'filterImports',\n options: Options,\n imports: MatchImportResult[],\n): MatchImportResult[];\nexport function run(\n action: 'getPropCategory',\n options: Options,\n property: string,\n): string;\nexport function run(\n action: 'filterDeprecatedTokens',\n options: Options,\n tokens: DeprecatedToken[],\n): DeprecatedToken[];\nexport function run(\n action: 'getJsxFactory',\n options: Options,\n): string | undefined;\nexport function run(action: string, options: Options, ...args: any[]): any {\n // @ts-expect-error cast\n return runAsync(action, options, ...args);\n}\n\nexport function runAsync(\n action: 'filterInvalidTokens',\n options: Options,\n paths: string[],\n): Promise<string[]>;\nexport function runAsync(\n action: 'isColorToken',\n options: Options,\n value: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'isColorAttribute',\n options: Options,\n attribute: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'isValidFile',\n options: Options,\n fileName: string,\n): Promise<string>;\nexport function runAsync(\n action: 'resolveShorthands',\n options: Options,\n name: string,\n): Promise<string[] | undefined>;\nexport function runAsync(\n action: 'resolveLongHand',\n options: Options,\n name: string,\n): Promise<string | undefined>;\n\nexport function runAsync(\n action: 'isValidProperty',\n options: Options,\n name: string,\n patternName?: string,\n): Promise<boolean>;\nexport function runAsync(\n action: 'matchFile',\n options: Options,\n name: string,\n imports: ImportResult[],\n): Promise<boolean>;\nexport function runAsync(\n action: 'matchImports',\n options: Options,\n result: MatchImportResult,\n): Promise<boolean>;\nexport function runAsync(\n action: 'filterImports',\n options: Options,\n imports: MatchImportResult[],\n): Promise<MatchImportResult[]>;\nexport function runAsync(\n action: 'getPropCategory',\n options: Options,\n property: string,\n): Promise<string>;\nexport function runAsync(\n action: 'filterDeprecatedTokens',\n options: Options,\n tokens: DeprecatedToken[],\n): Promise<DeprecatedToken[]>;\nexport function runAsync(\n action: 'getJsxFactory',\n options: Options,\n): Promise<string | undefined>;\nexport async function runAsync(\n action: string,\n options: Options,\n ...args: any\n): Promise<any> {\n const context = await getContext(options);\n\n switch (action) {\n case 'filterDeprecatedTokens':\n // @ts-expect-error cast\n return filterDeprecatedTokens(context, ...args);\n case 'filterImports':\n // @ts-expect-error cast\n return filterImports(context, ...args);\n case 'filterInvalidTokens':\n // @ts-expect-error cast\n return filterInvalidTokens(context, ...args);\n case 'getJsxFactory':\n return getJsxFactory(context);\n case 'getPropCategory':\n // @ts-expect-error cast\n return getPropertyCategory(context, ...args);\n case 'isColorAttribute':\n // @ts-expect-error cast\n return isColorAttribute(context, ...args);\n case 'isColorToken':\n // @ts-expect-error cast\n return isColorToken(context, ...args);\n case 'isValidFile':\n return isValidFile(context, options.currentFile);\n case 'isValidProperty':\n // @ts-expect-error cast\n return isValidProperty(context, ...args);\n case 'matchFile':\n // @ts-expect-error cast\n return matchFile(context, ...args);\n case 'matchImports':\n // @ts-expect-error cast\n return matchImports(context, ...args);\n case 'resolveLongHand':\n // @ts-expect-error cast\n return resolveLongHand(context, ...args);\n case 'resolveShorthands':\n // @ts-expect-error cast\n return resolveShorthands(context, ...args);\n }\n}\n\n// Refactored to use micromatch instead of getFiles() for O(1) performance\nconst isValidFile = (context: Generator, fileName: string): boolean => {\n const { exclude, include } = context.config;\n const cwd = context.config.cwd || process.cwd();\n\n const relativePath = path.isAbsolute(fileName)\n ? path.relative(cwd, fileName)\n : fileName;\n\n return micromatch.isMatch(relativePath, include, {\n dot: true,\n ignore: exclude,\n });\n};\n\n// Refactored to arrow function, removed async\nconst isValidProperty = (\n context: Generator,\n name: string,\n patternName?: string,\n) => {\n if (context.isValidProperty(name)) {\n return true;\n }\n\n if (!patternName) {\n return false;\n }\n\n // If the pattern name is the jsxFactory (e.g., 'styled'), we should accept\n // any property that is valid according to the global property check\n // Since styled components are generic wrappers, we don't need pattern-specific checks\n if (patternName === context.config.jsxFactory) {\n // Already checked globally above, so return false if we got here\n return false;\n }\n\n const pattern = context.patterns.details.find(\n (p) => p.baseName === patternName || p.jsx.includes(patternName),\n )?.config.properties;\n if (!pattern) {\n return false;\n }\n\n return Object.keys(pattern).includes(name);\n};\n\n// Refactored to arrow function, removed async\nconst matchFile = (\n context: Generator,\n name: string,\n imports: ImportResult[],\n) => {\n const file = context.imports.file(imports);\n return file.match(name);\n};\n\n// Refactored to arrow function, removed async\nconst matchImports = (context: Generator, result: MatchImportResult) => {\n return context.imports.match(result, (module_) => {\n const { tsOptions } = context.parserOptions;\n if (!tsOptions?.pathMappings) {\n return;\n }\n\n return resolveTsPathPattern(tsOptions.pathMappings, module_);\n });\n};\n\n// Batch filter imports to reduce worker thread crossings\nconst filterImports = (\n context: Generator,\n imports: MatchImportResult[],\n): MatchImportResult[] => {\n return imports.filter((imp) =>\n context.imports.match(imp, (module_) => {\n const { tsOptions } = context.parserOptions;\n if (!tsOptions?.pathMappings) {\n return;\n }\n\n return resolveTsPathPattern(tsOptions.pathMappings, module_);\n }),\n );\n};\n\n// Cache reverse shorthand map per context to avoid O(N) rebuild on every call\nconst reverseShorthandsMapCache = new WeakMap<Generator, Map<string, string>>();\n\nconst getReverseShorthandsMap = (context: Generator): Map<string, string> => {\n let reverseMap = reverseShorthandsMapCache.get(context);\n if (!reverseMap) {\n reverseMap = new Map();\n const shorthands = context.utility.getPropShorthandsMap();\n for (const [key, values] of shorthands) {\n for (const value of values) {\n reverseMap.set(value, key);\n }\n }\n\n reverseShorthandsMapCache.set(context, reverseMap);\n }\n\n return reverseMap;\n};\n\n// Refactored to use cached reverse shorthand map\nconst resolveLongHand = (\n context: Generator,\n name: string,\n): string | undefined => {\n return getReverseShorthandsMap(context).get(name);\n};\n\n// Refactored to arrow function, removed async\nconst resolveShorthands = (\n context: Generator,\n name: string,\n): string[] | undefined => {\n return context.utility.getPropShorthandsMap().get(name);\n};\n\nconst getJsxFactory = (context: Generator): string | undefined => {\n return context.config.jsxFactory;\n};\n\nrunAsWorker(run as any);\n","import { type run } from './worker';\nimport { ESLintUtils } from '@typescript-eslint/utils';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createSyncFn } from 'synckit';\n\n// Rule creator\nexport const createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/bamboocss/bamboo/blob/main/packages/eslint-plugin/docs/rules/${name}.md`,\n);\n\n// Determine the distribution directory\nconst isBase =\n process.env.NODE_ENV !== 'test' || import.meta.url.endsWith('dist/index.js');\n\nconst distDir = fileURLToPath(\n new URL(isBase ? './' : '../../dist', import.meta.url),\n);\n\n// Create synchronous function using synckit\nconst _syncAction = createSyncFn(join(distDir, 'utils/worker.mjs'));\n\n// Define syncAction with proper typing and error handling\nconst cache = new Map<string, any>();\n\nexport const syncAction = ((...args: Parameters<typeof run>) => {\n // Generate cache key from arguments\n const cacheKey = JSON.stringify(args);\n\n // Return cached result if exists\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const result = _syncAction(...args);\n // Store result in cache\n cache.set(cacheKey, result);\n return result;\n } catch (error) {\n console.error('syncAction error:', error);\n return undefined;\n }\n}) as typeof run;\n\nexport type ImportResult = {\n alias: string;\n importMapValue?: string;\n mod: string;\n name: string;\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bamboocss/eslint-plugin",
3
- "version": "1.12.0",
3
+ "version": "1.12.1",
4
4
  "description": "ESLint plugin for Bamboo CSS",
5
5
  "homepage": "https://bamboo-css.com",
6
6
  "license": "MIT",
@@ -36,9 +36,9 @@
36
36
  "@typescript-eslint/utils": "^8.21.0",
37
37
  "micromatch": "^4.0.8",
38
38
  "synckit": "^0.9.0",
39
- "@bamboocss/config": "1.12.0",
40
- "@bamboocss/generator": "1.12.0",
41
- "@bamboocss/shared": "1.12.0"
39
+ "@bamboocss/config": "1.12.1",
40
+ "@bamboocss/generator": "1.12.1",
41
+ "@bamboocss/shared": "1.12.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/micromatch": "^4.0.10",
@@ -46,10 +46,10 @@
46
46
  "eslint": "^9.35.0",
47
47
  "multiline-ts": "^4.0.1",
48
48
  "typescript": "^5.7.2",
49
- "@bamboocss/dev": "1.12.0",
50
- "@bamboocss/preset-base": "1.12.0",
51
- "@bamboocss/preset-bamboo": "1.12.0",
52
- "@bamboocss/types": "1.12.0"
49
+ "@bamboocss/dev": "1.12.1",
50
+ "@bamboocss/preset-base": "1.12.1",
51
+ "@bamboocss/types": "1.12.1",
52
+ "@bamboocss/preset-bamboo": "1.12.1"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "eslint": "*"
package/dist/index.d.cts DELETED
@@ -1 +0,0 @@
1
- export { };
package/dist/index.d.mts DELETED
@@ -1 +0,0 @@
1
- export { };
@@ -1,54 +0,0 @@
1
- import { Generator } from "@bamboocss/generator";
2
-
3
- //#region src/utils/index.d.ts
4
- type ImportResult = {
5
- alias: string;
6
- importMapValue?: string;
7
- mod: string;
8
- name: string;
9
- };
10
- //#endregion
11
- //#region src/utils/worker.d.ts
12
- type Options = {
13
- configPath?: string;
14
- currentFile: string;
15
- };
16
- type DeprecatedToken = string | {
17
- category: string;
18
- value: string;
19
- };
20
- declare function getContext(options: Options): Promise<Generator>;
21
- type MatchImportResult = {
22
- alias: string;
23
- mod: string;
24
- name: string;
25
- };
26
- declare function run(action: 'filterInvalidTokens', options: Options, paths: string[]): string[];
27
- declare function run(action: 'isColorToken', options: Options, value: string): boolean;
28
- declare function run(action: 'isColorAttribute', options: Options, attribute: string): boolean;
29
- declare function run(action: 'isValidFile', options: Options): boolean;
30
- declare function run(action: 'resolveShorthands', options: Options, name: string): string[] | undefined;
31
- declare function run(action: 'resolveLongHand', options: Options, name: string): string | undefined;
32
- declare function run(action: 'isValidProperty', options: Options, name: string, patternName?: string): boolean;
33
- declare function run(action: 'matchFile', options: Options, name: string, imports: ImportResult[]): boolean;
34
- declare function run(action: 'matchImports', options: Options, result: MatchImportResult): boolean;
35
- declare function run(action: 'filterImports', options: Options, imports: MatchImportResult[]): MatchImportResult[];
36
- declare function run(action: 'getPropCategory', options: Options, property: string): string;
37
- declare function run(action: 'filterDeprecatedTokens', options: Options, tokens: DeprecatedToken[]): DeprecatedToken[];
38
- declare function run(action: 'getJsxFactory', options: Options): string | undefined;
39
- declare function runAsync(action: 'filterInvalidTokens', options: Options, paths: string[]): Promise<string[]>;
40
- declare function runAsync(action: 'isColorToken', options: Options, value: string): Promise<boolean>;
41
- declare function runAsync(action: 'isColorAttribute', options: Options, attribute: string): Promise<boolean>;
42
- declare function runAsync(action: 'isValidFile', options: Options, fileName: string): Promise<string>;
43
- declare function runAsync(action: 'resolveShorthands', options: Options, name: string): Promise<string[] | undefined>;
44
- declare function runAsync(action: 'resolveLongHand', options: Options, name: string): Promise<string | undefined>;
45
- declare function runAsync(action: 'isValidProperty', options: Options, name: string, patternName?: string): Promise<boolean>;
46
- declare function runAsync(action: 'matchFile', options: Options, name: string, imports: ImportResult[]): Promise<boolean>;
47
- declare function runAsync(action: 'matchImports', options: Options, result: MatchImportResult): Promise<boolean>;
48
- declare function runAsync(action: 'filterImports', options: Options, imports: MatchImportResult[]): Promise<MatchImportResult[]>;
49
- declare function runAsync(action: 'getPropCategory', options: Options, property: string): Promise<string>;
50
- declare function runAsync(action: 'filterDeprecatedTokens', options: Options, tokens: DeprecatedToken[]): Promise<DeprecatedToken[]>;
51
- declare function runAsync(action: 'getJsxFactory', options: Options): Promise<string | undefined>;
52
- //#endregion
53
- export { DeprecatedToken, getContext, run, runAsync };
54
- //# sourceMappingURL=worker.d.cts.map