@zeroheight/adoption-cli 3.0.2 → 3.1.1-rc.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/cli.d.ts +8 -5
  3. package/dist/cli.js +12924 -35
  4. package/package.json +11 -6
  5. package/dist/ast/analyze.d.ts +0 -50
  6. package/dist/ast/analyze.js +0 -247
  7. package/dist/ast/parser.d.ts +0 -13
  8. package/dist/ast/parser.js +0 -14
  9. package/dist/commands/analyze.d.ts +0 -16
  10. package/dist/commands/analyze.js +0 -53
  11. package/dist/commands/analyze.utils.d.ts +0 -27
  12. package/dist/commands/analyze.utils.js +0 -204
  13. package/dist/commands/auth.d.ts +0 -9
  14. package/dist/commands/auth.js +0 -28
  15. package/dist/commands/monitor-repo.d.ts +0 -10
  16. package/dist/commands/monitor-repo.js +0 -42
  17. package/dist/commands/monitor-repo.utils.d.ts +0 -31
  18. package/dist/commands/monitor-repo.utils.js +0 -81
  19. package/dist/commands/track-package.d.ts +0 -9
  20. package/dist/commands/track-package.js +0 -41
  21. package/dist/commands/track-package.utils.d.ts +0 -25
  22. package/dist/commands/track-package.utils.js +0 -82
  23. package/dist/common/api.d.ts +0 -113
  24. package/dist/common/api.js +0 -174
  25. package/dist/common/config.d.ts +0 -14
  26. package/dist/common/config.js +0 -41
  27. package/dist/common/errors.d.ts +0 -15
  28. package/dist/common/errors.js +0 -26
  29. package/dist/common/logging.d.ts +0 -4
  30. package/dist/common/logging.js +0 -26
  31. package/dist/common/types/package-file.d.ts +0 -13
  32. package/dist/common/types/package-file.js +0 -1
  33. package/dist/components/analyze/analyze.d.ts +0 -14
  34. package/dist/components/analyze/analyze.js +0 -428
  35. package/dist/components/analyze/non-interactive-analyze.d.ts +0 -16
  36. package/dist/components/analyze/non-interactive-analyze.js +0 -164
  37. package/dist/components/auth/auth.d.ts +0 -7
  38. package/dist/components/auth/auth.js +0 -119
  39. package/dist/components/auth/credentials-already-exists.d.ts +0 -13
  40. package/dist/components/auth/credentials-already-exists.js +0 -16
  41. package/dist/components/auth/credentials-preview.d.ts +0 -10
  42. package/dist/components/auth/credentials-preview.js +0 -20
  43. package/dist/components/auth/no-credentials-onboarding.d.ts +0 -8
  44. package/dist/components/auth/no-credentials-onboarding.js +0 -62
  45. package/dist/components/color-usage-table.d.ts +0 -7
  46. package/dist/components/color-usage-table.js +0 -38
  47. package/dist/components/help-info.d.ts +0 -5
  48. package/dist/components/help-info.js +0 -24
  49. package/dist/components/latest-version-info.d.ts +0 -9
  50. package/dist/components/latest-version-info.js +0 -27
  51. package/dist/components/monitor-repo/monitor-repo.d.ts +0 -2
  52. package/dist/components/monitor-repo/monitor-repo.js +0 -9
  53. package/dist/components/monitor-repo/non-interactive-monitor-repo.d.ts +0 -7
  54. package/dist/components/monitor-repo/non-interactive-monitor-repo.js +0 -127
  55. package/dist/components/repo-name-prompt.d.ts +0 -8
  56. package/dist/components/repo-name-prompt.js +0 -97
  57. package/dist/components/track-package/non-interactive-track-package.d.ts +0 -5
  58. package/dist/components/track-package/non-interactive-track-package.js +0 -117
  59. package/dist/components/track-package/track-package.d.ts +0 -2
  60. package/dist/components/track-package/track-package.js +0 -206
  61. package/dist/components/ui/confirm-input.d.ts +0 -10
  62. package/dist/components/ui/confirm-input.js +0 -10
  63. package/dist/components/ui/continue-prompt.d.ts +0 -6
  64. package/dist/components/ui/continue-prompt.js +0 -16
  65. package/dist/components/usage-table.d.ts +0 -7
  66. package/dist/components/usage-table.js +0 -14
  67. package/dist/lockfile-parsers/lock-parser.d.ts +0 -9
  68. package/dist/lockfile-parsers/lock-parser.js +0 -5
  69. package/dist/lockfile-parsers/npm-lock-parser.d.ts +0 -6
  70. package/dist/lockfile-parsers/npm-lock-parser.js +0 -54
  71. package/dist/lockfile-parsers/pnpm-lock-parser.d.ts +0 -6
  72. package/dist/lockfile-parsers/pnpm-lock-parser.js +0 -51
  73. package/dist/lockfile-parsers/yarn-lock-parser.d.ts +0 -6
  74. package/dist/lockfile-parsers/yarn-lock-parser.js +0 -70
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeroheight/adoption-cli",
3
- "version": "3.0.2",
3
+ "version": "3.1.1-rc.1",
4
4
  "license": "ISC",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -15,8 +15,8 @@
15
15
  "setup": "npm run build && npm i -g",
16
16
  "start": "node dist/cli.js",
17
17
  "start-dev": "export NODE_ENV=dev && node dist/cli.js",
18
- "build": "tsc",
19
- "dev": "tsc --watch",
18
+ "build": "rsbuild build",
19
+ "dev": "rsbuild build --watch",
20
20
  "lint": "prettier --write .",
21
21
  "test": "vitest"
22
22
  },
@@ -25,8 +25,6 @@
25
25
  "CHANGELOG.md"
26
26
  ],
27
27
  "dependencies": {
28
- "acorn": "^8.11.3",
29
- "acorn-walk": "^8.3.2",
30
28
  "chalk": "^5.2.0",
31
29
  "commander": "^12.0.0",
32
30
  "glob": "^10.3.15",
@@ -46,18 +44,22 @@
46
44
  "yn": "^5.0.0"
47
45
  },
48
46
  "devDependencies": {
47
+ "@microsoft/api-extractor": "^7.52.7",
48
+ "@rsbuild/core": "^1.3.19",
49
49
  "@sindresorhus/tsconfig": "^3.0.1",
50
50
  "@types/react": "^18.0.32",
51
51
  "@typescript-eslint/eslint-plugin": "^7.7.1",
52
52
  "@typescript-eslint/parser": "^7.7.1",
53
53
  "@vdemedes/prettier-config": "^2.0.1",
54
54
  "@vitest/coverage-v8": "^2.1.2",
55
+ "@zeroheight/adoption-common": "^1.0.3",
55
56
  "eslint-plugin-react": "^7.32.2",
56
57
  "eslint-plugin-react-hooks": "^4.6.0",
57
58
  "ink-testing-library": "^4.0.0",
58
59
  "memfs": "^4.9.2",
59
60
  "mock-stdin": "^1.0.0",
60
61
  "prettier": "^2.8.8",
62
+ "rsbuild-plugin-dts": "^0.6.9",
61
63
  "ts-node": "^10.9.1",
62
64
  "typescript": "^5.4.5",
63
65
  "vitest": "^2.1.2"
@@ -68,5 +70,8 @@
68
70
  "bugs": {
69
71
  "email": "support@zeroheight.com"
70
72
  },
71
- "homepage": "https://zeroheight.com"
73
+ "homepage": "https://zeroheight.com",
74
+ "publishConfig": {
75
+ "registry": "https://registry.npmjs.org/"
76
+ }
72
77
  }
@@ -1,50 +0,0 @@
1
- import type { Node, Program, Identifier } from "acorn";
2
- type AttrValueType = "JSXExpressionContainer" | "NumericLiteral" | "StringLiteral" | "BooleanLiteral" | "Identifier" | "TemplateLiteral" | "ArrowFunctionExpression" | "StaticMemberExpression" | "CallExpression" | "TSAsExpression" | "ObjectExpression" | "ArrayExpression" | "BinaryExpression" | undefined;
3
- export interface PlainIdentifier extends Node {
4
- type: "Identifier";
5
- local: Identifier;
6
- }
7
- export interface Props {
8
- name: string;
9
- type?: AttrValueType[];
10
- values: [string | number | typeof RUNTIME_VALUE | null | undefined];
11
- }
12
- export type VisitorState = {
13
- components: Map<string, number>;
14
- props: Map<string, Props[]>;
15
- imports: Map<string, {
16
- package: string;
17
- name: string;
18
- }>;
19
- };
20
- type PropValues = string | number | null | undefined;
21
- export type ComponentProps = {
22
- [propName: string]: {
23
- type?: AttrValueType[];
24
- count?: number;
25
- values: PropValues[];
26
- };
27
- };
28
- export type RawUsage = {
29
- name: string;
30
- count: number;
31
- package: string;
32
- props: ComponentProps;
33
- };
34
- export type RawColorUsage = {
35
- hex: string[];
36
- rgb: string[];
37
- hsla: string[];
38
- oklab: string[];
39
- hwb: string[];
40
- lab: string[];
41
- lch: string[];
42
- colorSpace: string[];
43
- totalCount: number;
44
- };
45
- declare const RUNTIME_VALUE = "zh-runtime-value";
46
- export declare const ARRAY_VALUE = "zh-array-value";
47
- export declare const BINARY_VALUE = "zh-binary-value";
48
- export declare const OBJECT_VALUE = "zh-object-value";
49
- export declare function analyze(ast: Program): RawUsage[];
50
- export {};
@@ -1,247 +0,0 @@
1
- import * as walk from "acorn-walk";
2
- import logger from "../common/logging.js";
3
- const DYNAMIC_EXPRESSIONS = [
4
- "Identifier",
5
- "TemplateLiteral",
6
- "ArrowFunctionExpression",
7
- "StaticMemberExpression",
8
- "CallExpression",
9
- "TSAsExpression",
10
- ];
11
- const RUNTIME_VALUE = "zh-runtime-value";
12
- export const ARRAY_VALUE = "zh-array-value";
13
- export const BINARY_VALUE = "zh-binary-value";
14
- export const OBJECT_VALUE = "zh-object-value";
15
- function transformVisitorStateToRawUsage(visitorState) {
16
- const transformedUsageMap = new Map();
17
- for (const [name, count] of visitorState.components) {
18
- const importInfo = visitorState.imports.get(name);
19
- const actualName = importInfo?.name ?? name;
20
- const packageName = importInfo?.package ?? "";
21
- const key = `package:${packageName} name:${actualName}`;
22
- const currentValue = transformedUsageMap.get(key) ?? {
23
- name: actualName,
24
- count: 0,
25
- package: importInfo?.package ?? "",
26
- props: {},
27
- };
28
- transformedUsageMap.set(key, {
29
- ...currentValue,
30
- count: currentValue.count + count,
31
- props: {},
32
- });
33
- }
34
- for (const [name, props] of visitorState.props) {
35
- const importInfo = visitorState.imports.get(name);
36
- const actualName = importInfo?.name ?? name;
37
- const packageName = importInfo?.package ?? "";
38
- const key = `package:${packageName} name:${actualName}`;
39
- const currentValue = transformedUsageMap.get(key);
40
- const componentProps = currentValue.props;
41
- props.forEach((prop) => {
42
- componentProps[prop.name] = {
43
- type: Array.from(new Set([
44
- ...(componentProps[prop.name]?.type ?? []),
45
- ...(prop.type ?? []),
46
- ])),
47
- values: [...(componentProps[prop.name]?.values ?? []), ...prop.values],
48
- };
49
- });
50
- transformedUsageMap.set(key, {
51
- ...currentValue,
52
- props: componentProps,
53
- });
54
- }
55
- return Array.from(transformedUsageMap.values());
56
- }
57
- export function analyze(ast) {
58
- const visitorState = {
59
- components: new Map(),
60
- props: new Map(),
61
- imports: new Map(),
62
- };
63
- const visitorFunctions = {
64
- CatchClause() { },
65
- CatchParameter() { },
66
- ComputedMemberExpression() { },
67
- JSXText() { },
68
- NullLiteral() { },
69
- NumericLiteral() { },
70
- BooleanLiteral() { },
71
- ObjectExpression() { },
72
- ObjectProperty() { },
73
- StringLiteral() { },
74
- TSAsExpression() { },
75
- TSEnumDeclaration() { },
76
- TSInterfaceDeclaration() { },
77
- TSTypeAliasDeclaration() { },
78
- TSModuleDeclaration() { },
79
- TSSatisfiesExpression() { },
80
- StaticMemberExpression() { },
81
- RegExpLiteral() { },
82
- TSNonNullExpression() { },
83
- JSXEmptyExpression() { },
84
- JSXFragment(node, state) {
85
- node.children.forEach((child) => walk.recursive(child, state, visitorFunctions, walk.base));
86
- },
87
- IfStatement(node, state) {
88
- walk.recursive(node.consequent, state, visitorFunctions, walk.base);
89
- if (node.alternate) {
90
- walk.recursive(node.alternate, state, visitorFunctions, walk.base);
91
- }
92
- },
93
- VariableDeclaration(node, state) {
94
- node.declarations.forEach((child) => {
95
- walk.recursive(child, state, visitorFunctions, walk.base);
96
- });
97
- },
98
- ArrowFunctionExpression(node, state) {
99
- if (node.body.type === "FunctionBody") {
100
- walk.recursive(node.body, state, visitorFunctions, walk.base);
101
- }
102
- },
103
- ParenthesizedExpression(node, state) {
104
- walk.recursive(node.expression, state, visitorFunctions, walk.base);
105
- },
106
- ReturnStatement(node, state) {
107
- if (node.argument) {
108
- walk.recursive(node.argument, state, visitorFunctions, walk.base);
109
- }
110
- },
111
- FunctionBody(node, state) {
112
- node.statements.forEach((child) => walk.recursive(child, state, visitorFunctions, walk.base));
113
- },
114
- Program(node, state) {
115
- node.body.forEach((child) => {
116
- walk.recursive(child, state, visitorFunctions, walk.base);
117
- });
118
- },
119
- JSXElement(node, state) {
120
- const el = node.openingElement;
121
- const elName = el.name.name;
122
- // Ignore html tags e.g. div, h1, span
123
- if (elName?.[0] !== elName?.[0]?.toLocaleLowerCase()) {
124
- if (el.attributes.length > 0) {
125
- const attrProps = [];
126
- el.attributes.forEach((attr) => {
127
- // We won't have a name if it is a JSXSpreadAttribute
128
- if (attr.name) {
129
- if (attr.value?.type === "JSXExpressionContainer") {
130
- const expressionType = attr.value.expression.type;
131
- // These are props determined at runtime so we cannot parse them
132
- if (expressionType &&
133
- DYNAMIC_EXPRESSIONS.includes(expressionType)) {
134
- attrProps.push({
135
- name: attr.name.name,
136
- type: [expressionType],
137
- values: [RUNTIME_VALUE],
138
- });
139
- }
140
- else if (expressionType &&
141
- expressionType === "ObjectExpression") {
142
- attrProps.push({
143
- name: attr.name.name,
144
- type: [expressionType],
145
- values: [OBJECT_VALUE],
146
- });
147
- }
148
- else if (expressionType &&
149
- expressionType === "ArrayExpression") {
150
- attrProps.push({
151
- name: attr.name.name,
152
- type: [expressionType],
153
- values: [ARRAY_VALUE],
154
- });
155
- }
156
- else if (expressionType &&
157
- expressionType === "BinaryExpression") {
158
- attrProps.push({
159
- name: attr.name.name,
160
- type: [expressionType],
161
- values: [BINARY_VALUE],
162
- });
163
- }
164
- else {
165
- attrProps.push({
166
- name: attr.name.name,
167
- type: [expressionType],
168
- values: [
169
- attr.value.expression.value || attr.value.expression.name,
170
- ],
171
- });
172
- }
173
- }
174
- else {
175
- attrProps.push({
176
- name: attr.name.name,
177
- type: [attr.value?.type],
178
- values: [attr.value?.value],
179
- });
180
- }
181
- }
182
- });
183
- const existingProps = state.props.get(elName) ?? [];
184
- state.props.set(elName, [...attrProps, ...existingProps]);
185
- }
186
- state.components.set(elName, (state.components.get(elName) ?? 0) + 1);
187
- }
188
- node.children.forEach((child) => {
189
- walk.recursive(child, state, visitorFunctions, walk.base);
190
- });
191
- },
192
- CallExpression(node, state) {
193
- node.arguments.forEach((child) => walk.recursive(child, state, visitorFunctions, walk.base));
194
- },
195
- ExportDefaultDeclaration(node, state) {
196
- if (node.declaration.type === "FunctionDeclaration") {
197
- const { statements } = node.declaration.body;
198
- statements.forEach((child) => {
199
- walk.recursive(child, state, visitorFunctions, walk.base);
200
- });
201
- }
202
- },
203
- JSXExpressionContainer(node, state) {
204
- walk.recursive(node.expression, state, visitorFunctions, walk.base);
205
- },
206
- ImportDeclaration(node, state) {
207
- const packageName = node.source.value?.toString() ?? "";
208
- node.specifiers?.forEach((specifier) => {
209
- // not handling namespace imports as we can't determine the actual name
210
- // e.g. import * as MyIconLibrary from 'my-icon-library'
211
- if (specifier.type === "ImportNamespaceSpecifier") {
212
- return;
213
- }
214
- let name = specifier.local.name;
215
- if (specifier.type === "ImportDefaultSpecifier" ||
216
- specifier.type === "Identifier") {
217
- // handles the following cases:
218
- // import Icon from 'my-icon-library'
219
- name = specifier.local.name;
220
- }
221
- else if (specifier.type === "ImportSpecifier") {
222
- // handles the following cases:
223
- // import { Icon } from 'my-icon-library'
224
- // import { Icon as MyIcon } from 'my-icon-library'
225
- name =
226
- specifier.imported.type === "Literal"
227
- ? specifier.imported.value
228
- : specifier.imported.name;
229
- }
230
- state.imports.set(specifier.local.name, {
231
- package: packageName,
232
- name,
233
- });
234
- });
235
- },
236
- // FIXME: Not the best typing but there are additional types not in acorn
237
- };
238
- try {
239
- walk.recursive(ast, visitorState, visitorFunctions, walk.base);
240
- }
241
- catch (e) {
242
- logger.error({ error: e, ast }, "Error analyzing file");
243
- }
244
- finally {
245
- return transformVisitorStateToRawUsage(visitorState);
246
- }
247
- }
@@ -1,13 +0,0 @@
1
- /**
2
- * Parse code and return AST
3
- *
4
- * This extends the acorn parser with support for TypeScript and JSX
5
- *
6
- * @param code The string containing JS?X/TS?X
7
- * @param sourceFilename a filename to help with inference
8
- * @returns Parsed AST
9
- */
10
- export declare function parse(code: string, sourceFilename?: string): {
11
- ast: any;
12
- errors: string[];
13
- };
@@ -1,14 +0,0 @@
1
- import oxc from "oxc-parser";
2
- /**
3
- * Parse code and return AST
4
- *
5
- * This extends the acorn parser with support for TypeScript and JSX
6
- *
7
- * @param code The string containing JS?X/TS?X
8
- * @param sourceFilename a filename to help with inference
9
- * @returns Parsed AST
10
- */
11
- export function parse(code, sourceFilename) {
12
- const result = oxc.parseSync(code, { sourceFilename, sourceType: "module" });
13
- return { ast: JSON.parse(result.program), errors: result.errors };
14
- }
@@ -1,16 +0,0 @@
1
- import { RenderOptions } from "ink";
2
- import { Command } from "commander";
3
- import { RawColorUsage, RawUsage } from "../ast/analyze.js";
4
- interface AnalyzeOptions {
5
- extensions: string;
6
- ignore: string[];
7
- repoName?: string;
8
- interactive: boolean;
9
- componentUsage: boolean;
10
- colorUsage: boolean;
11
- }
12
- export type RawComponentUsageMap = Map<string, RawUsage[]>;
13
- export type RawColorUsageMap = Map<string, RawColorUsage>;
14
- export declare function analyzeAction(options: AnalyzeOptions, renderOptions?: RenderOptions): Promise<void>;
15
- export declare function analyzeCommand(): Command;
16
- export {};
@@ -1,53 +0,0 @@
1
- import * as React from "react";
2
- import { render } from "ink";
3
- import { Command, Option } from "commander";
4
- import yn from "yn";
5
- import { analyzeFiles, analyzeRawColorUsage, parseGlobList, } from "./analyze.utils.js";
6
- import Analyze from "../components/analyze/analyze.js";
7
- import NonInteractiveAnalyze from "../components/analyze/non-interactive-analyze.js";
8
- import logger, { setStdErrStream } from "../common/logging.js";
9
- export async function analyzeAction(options, renderOptions) {
10
- if (options.interactive) {
11
- render(React.createElement(Analyze, { onAnalyzeFiles: () => analyzeFiles(options.extensions, options.ignore), onAnalyzeColorUsage: () => analyzeRawColorUsage(options.extensions, options.ignore), repoName: options.repoName }), renderOptions);
12
- }
13
- else {
14
- render(React.createElement(NonInteractiveAnalyze, { repoName: options.repoName, onAnalyzeFiles: () => analyzeFiles(options.extensions, options.ignore), onAnalyzeColorUsage: () => analyzeRawColorUsage(options.extensions, options.ignore), shouldAnalyzeComponentUsage: options.componentUsage, shouldAnalyzeTokenUsage: options.colorUsage }));
15
- }
16
- }
17
- export function analyzeCommand() {
18
- const command = new Command();
19
- return command
20
- .command("analyze")
21
- .description("Analyze your codebase to determine component usage metrics")
22
- .configureHelp({
23
- showGlobalOptions: true,
24
- })
25
- .addOption(new Option("-e, --extensions [ext]", "file extensions to include when searching for components").default("**/*.{js,jsx,ts,tsx}", "glob pattern to determine file extensions"))
26
- .addOption(new Option("-i, --ignore [patterns]", "files to ignore when searching for components, use multiple times to add more than one glob pattern")
27
- .default(["**/*.{test,spec}.*", "**/*.d.ts"], "*.test.*, *.spec.* and *.d.ts files")
28
- .argParser(parseGlobList))
29
- .addOption(new Option("-r, --repo-name <string>", "name of the repository"))
30
- .addOption(new Option("-in, --interactive [boolean]", "disable to skip input (useful when running in CI)")
31
- .default(true)
32
- .argParser((value) => yn(value)))
33
- .addOption(new Option("-cu, --component-usage [boolean]", "gather data about component and prop usage")
34
- .default(true)
35
- .argParser((value) => yn(value)))
36
- .addOption(new Option("-cou, --color-usage [boolean]", "gather data about color usage")
37
- .default(true)
38
- .argParser((value) => yn(value)))
39
- .action(async (options) => {
40
- if (!options.interactive) {
41
- setStdErrStream();
42
- }
43
- // If no option is passed in aka `true`, use empty list of ignore patterns
44
- const ignorePattern = typeof options.ignore === "boolean" ? [] : options.ignore;
45
- try {
46
- await analyzeAction({ ...options, ignore: ignorePattern });
47
- }
48
- catch (e) {
49
- logger.error({ error: e }, "Unhandled exception running analyze command");
50
- process.exitCode = 1;
51
- }
52
- });
53
- }
@@ -1,27 +0,0 @@
1
- import type { Option } from "commander";
2
- import { RawColorUsageMap, RawComponentUsageMap } from "./analyze.js";
3
- import { RawColorUsage } from "../ast/analyze.js";
4
- /**
5
- * Get a list of files matching extensions, skips hidden files and node_modules
6
- * @param base starting directory
7
- * @param extensions glob syntax of files to look for, e.g. **\/*.{js,jsx,ts,tsx}
8
- * @param ignorePattern glob syntax of files to ignore, e.g. **\/*.{test,spec}.*
9
- * @param gitIgnore contents of .gitignore file
10
- * @returns list of file paths
11
- */
12
- export declare function findFiles(base: string, extensions: string, ignorePattern: string[]): Promise<string[]>;
13
- export declare function analyzeFiles(extensions: string, ignorePattern: string[]): Promise<{
14
- errorFile: string | null;
15
- usage: RawComponentUsageMap;
16
- }>;
17
- export declare function calculateNumberOfComponents(usageResult: RawComponentUsageMap): number;
18
- export declare function calculateNumberOfColors(usageResult: RawColorUsageMap): number;
19
- export declare function countColorOccurrences(fileContent: string): RawColorUsage;
20
- export declare function analyzeRawColorUsage(extensions: string, ignorePattern: string[]): Promise<{
21
- errorFile: string | null;
22
- usage: RawColorUsageMap;
23
- }>;
24
- /**
25
- * Parse the ignore array and format correctly
26
- */
27
- export declare function parseGlobList(this: Option, value: string, previous: unknown): any[];