@typestyles/cli 0.0.0-unstable.de79e3a17eb1 → 0.0.0-unstable.df708abe489f
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/README.md +1 -1
- package/dist/{chunk-HWFK4DEK.js → chunk-WKIJALJC.js} +64 -57
- package/dist/chunk-WKIJALJC.js.map +1 -0
- package/dist/cli.cjs +62 -57
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +62 -55
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-HWFK4DEK.js.map +0 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ pnpm add -D @typestyles/cli
|
|
|
12
12
|
|
|
13
13
|
### `typestyles snapshot`
|
|
14
14
|
|
|
15
|
-
Snapshot semantic class names from `styles.class
|
|
15
|
+
Snapshot semantic class names from `style()` / `recipe()` call sites (and legacy `styles.class` / `styles.component` on `createStyles()` instances).
|
|
16
16
|
Use with `@typestyles/no-removed-public-classname` to guard breaking renames in
|
|
17
17
|
publishable packages.
|
|
18
18
|
|
|
@@ -29,10 +29,14 @@ function semanticScopePrefix(scopeId) {
|
|
|
29
29
|
return `${sanitizeClassSegment(scopeId)}-`;
|
|
30
30
|
}
|
|
31
31
|
function semanticClassName(config, namespace, suffix) {
|
|
32
|
-
if (config.mode
|
|
32
|
+
if (config.mode === "hashed" || config.mode === "compact" || config.mode === "atomic" || config.mode === "template") {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
33
35
|
const prefix = semanticScopePrefix(config.scopeId);
|
|
34
|
-
if (suffix === void 0) return `${prefix}${namespace}`;
|
|
35
|
-
return `${prefix}${namespace}
|
|
36
|
+
if (suffix === void 0 || suffix === "base") return `${prefix}${namespace}`;
|
|
37
|
+
if (config.mode === "attribute") return `${prefix}${namespace}`;
|
|
38
|
+
if (config.mode === "bem") return `${prefix}${namespace}--${suffix}`;
|
|
39
|
+
return `${prefix}${namespace}--${suffix}`;
|
|
36
40
|
}
|
|
37
41
|
function getStaticObjectKey(name) {
|
|
38
42
|
if (ts.isIdentifier(name)) return name.text;
|
|
@@ -56,13 +60,15 @@ function objectExpressionFromConfigArg(arg) {
|
|
|
56
60
|
const expr = unwrapExpression(arg);
|
|
57
61
|
if (ts.isObjectLiteralExpression(expr)) return expr;
|
|
58
62
|
if (ts.isArrowFunction(expr)) {
|
|
59
|
-
if (ts.isObjectLiteralExpression(expr.body)) return expr.body;
|
|
60
63
|
if (ts.isBlock(expr.body)) {
|
|
61
64
|
for (const stmt of expr.body.statements) {
|
|
62
65
|
if (ts.isReturnStatement(stmt) && stmt.expression && ts.isObjectLiteralExpression(unwrapExpression(stmt.expression))) {
|
|
63
66
|
return unwrapExpression(stmt.expression);
|
|
64
67
|
}
|
|
65
68
|
}
|
|
69
|
+
} else {
|
|
70
|
+
const body = unwrapExpression(expr.body);
|
|
71
|
+
if (ts.isObjectLiteralExpression(body)) return body;
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
return null;
|
|
@@ -84,8 +90,8 @@ function hasObjectKey(obj, key) {
|
|
|
84
90
|
return getStaticObjectKey(prop.name) === key;
|
|
85
91
|
});
|
|
86
92
|
}
|
|
87
|
-
function
|
|
88
|
-
const
|
|
93
|
+
function collectClassNamePartsFromConfig(obj) {
|
|
94
|
+
const parts = [];
|
|
89
95
|
const hasVariants = hasObjectKey(obj, "variants");
|
|
90
96
|
const hasCompound = hasObjectKey(obj, "compoundVariants");
|
|
91
97
|
const hasDefaults = hasObjectKey(obj, "defaultVariants");
|
|
@@ -99,7 +105,7 @@ function collectSuffixesFromConfig(obj) {
|
|
|
99
105
|
for (const slotProp of baseObj.initializer.properties) {
|
|
100
106
|
if (!ts.isPropertyAssignment(slotProp)) continue;
|
|
101
107
|
const slot = getStaticObjectKey(slotProp.name);
|
|
102
|
-
if (slot)
|
|
108
|
+
if (slot) parts.push({ element: slot === "root" ? void 0 : slot });
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
111
|
const variantsProp = obj.properties.find((prop) => {
|
|
@@ -122,32 +128,18 @@ function collectSuffixesFromConfig(obj) {
|
|
|
122
128
|
for (const slotProp of optProp.initializer.properties) {
|
|
123
129
|
if (!ts.isPropertyAssignment(slotProp)) continue;
|
|
124
130
|
const slot = getStaticObjectKey(slotProp.name);
|
|
125
|
-
if (slot)
|
|
131
|
+
if (slot) {
|
|
132
|
+
parts.push({
|
|
133
|
+
element: slot === "root" ? void 0 : slot,
|
|
134
|
+
dimension,
|
|
135
|
+
modifier: option
|
|
136
|
+
});
|
|
137
|
+
}
|
|
126
138
|
}
|
|
127
139
|
}
|
|
128
140
|
}
|
|
129
141
|
}
|
|
130
|
-
|
|
131
|
-
if (!ts.isPropertyAssignment(prop)) return false;
|
|
132
|
-
return getStaticObjectKey(prop.name) === "compoundVariants";
|
|
133
|
-
});
|
|
134
|
-
if (compoundProp && ts.isPropertyAssignment(compoundProp) && ts.isArrayLiteralExpression(compoundProp.initializer)) {
|
|
135
|
-
compoundProp.initializer.elements.forEach((element, index) => {
|
|
136
|
-
if (!element || !ts.isObjectLiteralExpression(element)) return;
|
|
137
|
-
const styleProp = element.properties.find((prop) => {
|
|
138
|
-
if (!ts.isPropertyAssignment(prop)) return false;
|
|
139
|
-
return getStaticObjectKey(prop.name) === "style";
|
|
140
|
-
});
|
|
141
|
-
if (styleProp && ts.isPropertyAssignment(styleProp) && ts.isObjectLiteralExpression(styleProp.initializer)) {
|
|
142
|
-
for (const slotProp of styleProp.initializer.properties) {
|
|
143
|
-
if (!ts.isPropertyAssignment(slotProp)) continue;
|
|
144
|
-
const slot = getStaticObjectKey(slotProp.name);
|
|
145
|
-
if (slot) suffixes.push(`${slot}-compound-${index}`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
return suffixes;
|
|
142
|
+
return parts;
|
|
151
143
|
}
|
|
152
144
|
if (hasSlots && !hasVariants && !hasCompound && !hasDefaults) {
|
|
153
145
|
const slotsProp = obj.properties.find((prop) => {
|
|
@@ -157,7 +149,7 @@ function collectSuffixesFromConfig(obj) {
|
|
|
157
149
|
if (slotsProp && ts.isPropertyAssignment(slotsProp) && ts.isArrayLiteralExpression(slotsProp.initializer)) {
|
|
158
150
|
for (const element of slotsProp.initializer.elements) {
|
|
159
151
|
if (element && ts.isStringLiteral(element)) {
|
|
160
|
-
|
|
152
|
+
parts.push({ element: element.text === "root" ? void 0 : element.text });
|
|
161
153
|
}
|
|
162
154
|
}
|
|
163
155
|
}
|
|
@@ -165,12 +157,12 @@ function collectSuffixesFromConfig(obj) {
|
|
|
165
157
|
if (!ts.isPropertyAssignment(prop)) continue;
|
|
166
158
|
const key = getStaticObjectKey(prop.name);
|
|
167
159
|
if (!key || key === "slots") continue;
|
|
168
|
-
|
|
160
|
+
parts.push({ element: key === "root" ? void 0 : key });
|
|
169
161
|
}
|
|
170
|
-
return
|
|
162
|
+
return parts;
|
|
171
163
|
}
|
|
172
164
|
if (hasVariants || hasCompound || hasDefaults) {
|
|
173
|
-
|
|
165
|
+
parts.push({});
|
|
174
166
|
const variantsProp = obj.properties.find((prop) => {
|
|
175
167
|
if (!ts.isPropertyAssignment(prop)) return false;
|
|
176
168
|
return getStaticObjectKey(prop.name) === "variants";
|
|
@@ -185,28 +177,35 @@ function collectSuffixesFromConfig(obj) {
|
|
|
185
177
|
for (const optProp of dimProp.initializer.properties) {
|
|
186
178
|
if (!ts.isPropertyAssignment(optProp)) continue;
|
|
187
179
|
const option = getStaticObjectKey(optProp.name);
|
|
188
|
-
if (option)
|
|
180
|
+
if (option) parts.push({ dimension, modifier: option });
|
|
189
181
|
}
|
|
190
182
|
}
|
|
191
183
|
}
|
|
192
|
-
|
|
193
|
-
if (!ts.isPropertyAssignment(prop)) return false;
|
|
194
|
-
return getStaticObjectKey(prop.name) === "compoundVariants";
|
|
195
|
-
});
|
|
196
|
-
if (compoundProp && ts.isPropertyAssignment(compoundProp) && ts.isArrayLiteralExpression(compoundProp.initializer)) {
|
|
197
|
-
compoundProp.initializer.elements.forEach((_, index) => {
|
|
198
|
-
suffixes.push(`compound-${index}`);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
return suffixes;
|
|
184
|
+
return parts;
|
|
202
185
|
}
|
|
203
186
|
for (const prop of obj.properties) {
|
|
204
187
|
if (!ts.isPropertyAssignment(prop)) continue;
|
|
205
188
|
const key = getStaticObjectKey(prop.name);
|
|
206
|
-
if (!key
|
|
207
|
-
|
|
189
|
+
if (!key) continue;
|
|
190
|
+
if (key === "base") {
|
|
191
|
+
parts.push({});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (RESERVED_COMPONENT_KEYS.has(key)) continue;
|
|
195
|
+
parts.push({ modifier: key });
|
|
196
|
+
}
|
|
197
|
+
return parts;
|
|
198
|
+
}
|
|
199
|
+
function componentClassName(config, namespace, part) {
|
|
200
|
+
if (config.mode === "hashed" || config.mode === "compact" || config.mode === "atomic" || config.mode === "template") {
|
|
201
|
+
return null;
|
|
208
202
|
}
|
|
209
|
-
|
|
203
|
+
const prefix = semanticScopePrefix(config.scopeId);
|
|
204
|
+
const block = `${prefix}${namespace}${part.element ? `__${part.element}` : ""}`;
|
|
205
|
+
if (!part.modifier) return block;
|
|
206
|
+
if (config.mode === "attribute" && part.dimension) return block;
|
|
207
|
+
if (config.mode === "bem") return `${block}--${part.modifier}`;
|
|
208
|
+
return `${block}--${part.dimension ? `${part.dimension}-` : ""}${part.modifier}`;
|
|
210
209
|
}
|
|
211
210
|
function parseCreateStylesConfig(init) {
|
|
212
211
|
const config = { mode: "semantic", scopeId: "" };
|
|
@@ -218,7 +217,7 @@ function parseCreateStylesConfig(init) {
|
|
|
218
217
|
}
|
|
219
218
|
if (!ts.isObjectLiteralExpression(expr)) return config;
|
|
220
219
|
const mode = literalFromProperty(expr, "mode");
|
|
221
|
-
if (mode === "semantic" || mode === "hashed" || mode === "compact" || mode === "atomic") {
|
|
220
|
+
if (mode === "semantic" || mode === "hashed" || mode === "compact" || mode === "atomic" || mode === "attribute" || mode === "bem" || mode === "template") {
|
|
222
221
|
config.mode = mode;
|
|
223
222
|
}
|
|
224
223
|
const scopeId = literalFromProperty(expr, "scopeId");
|
|
@@ -260,9 +259,17 @@ function collectBindings(sourceFile) {
|
|
|
260
259
|
visit(sourceFile);
|
|
261
260
|
return bindings;
|
|
262
261
|
}
|
|
262
|
+
function normalizeCalleeMethod(name) {
|
|
263
|
+
if (name === "style" || name === "class") return "class";
|
|
264
|
+
if (name === "recipe" || name === "component") return "component";
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
263
267
|
function calleeMethodName(expr) {
|
|
268
|
+
if (ts.isIdentifier(expr)) {
|
|
269
|
+
return normalizeCalleeMethod(expr.text);
|
|
270
|
+
}
|
|
264
271
|
if (!ts.isPropertyAccessExpression(expr)) return null;
|
|
265
|
-
if (ts.isIdentifier(expr.name)) return expr.name.text;
|
|
272
|
+
if (ts.isIdentifier(expr.name)) return normalizeCalleeMethod(expr.name.text);
|
|
266
273
|
return null;
|
|
267
274
|
}
|
|
268
275
|
function lineOf(sourceFile, node) {
|
|
@@ -275,8 +282,8 @@ function stylesBindingFromCallee(expr, bindings, defaultConfig) {
|
|
|
275
282
|
if (binding) return binding;
|
|
276
283
|
if (expr.expression.text === "styles" && defaultConfig) return defaultConfig;
|
|
277
284
|
}
|
|
278
|
-
if (ts.isIdentifier(expr)
|
|
279
|
-
return bindings.get(
|
|
285
|
+
if (ts.isIdentifier(expr)) {
|
|
286
|
+
return bindings.get(expr.text) ?? defaultConfig ?? { mode: "semantic", scopeId: "" };
|
|
280
287
|
}
|
|
281
288
|
return defaultConfig ?? { mode: "semantic", scopeId: "" };
|
|
282
289
|
}
|
|
@@ -323,15 +330,15 @@ function collectCallsFromSourceFile(sourceFile, relativePath, bindings, defaultC
|
|
|
323
330
|
}
|
|
324
331
|
} else {
|
|
325
332
|
const configObj = objectExpressionFromConfigArg(node.arguments[1]);
|
|
326
|
-
const
|
|
327
|
-
for (const
|
|
328
|
-
const className =
|
|
333
|
+
const parts = configObj ? collectClassNamePartsFromConfig(configObj) : [{}];
|
|
334
|
+
for (const part of parts) {
|
|
335
|
+
const className = componentClassName(config, namespace, part);
|
|
329
336
|
if (className) {
|
|
330
337
|
entries.push({
|
|
331
338
|
className,
|
|
332
339
|
kind: "component",
|
|
333
340
|
namespace,
|
|
334
|
-
suffix,
|
|
341
|
+
suffix: part.modifier ? `${part.element ? `${part.element}-` : ""}${part.dimension ? `${part.dimension}-` : ""}${part.modifier}` : part.element ?? "base",
|
|
335
342
|
file: relativePath,
|
|
336
343
|
line
|
|
337
344
|
});
|
|
@@ -438,5 +445,5 @@ function diffRemovedPublicClassNames(snapshot, current) {
|
|
|
438
445
|
}
|
|
439
446
|
|
|
440
447
|
export { PUBLIC_CLASSNAMES_SNAPSHOT, buildSnapshot, collectPublicClassNames, collectPublicClassNamesFromFiles, collectPublicClassNamesSync, diffRemovedPublicClassNames, loadPublicClassNamesSnapshot, resolveProjectStylesBindings, semanticClassName, writePublicClassNamesSnapshot };
|
|
441
|
-
//# sourceMappingURL=chunk-
|
|
442
|
-
//# sourceMappingURL=chunk-
|
|
448
|
+
//# sourceMappingURL=chunk-WKIJALJC.js.map
|
|
449
|
+
//# sourceMappingURL=chunk-WKIJALJC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/snapshot-classnames.ts"],"names":[],"mappings":"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","file":"chunk-WKIJALJC.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport ts from 'typescript';\nimport fg from 'fast-glob';\n\n/** Mirrors `sanitizeClassSegment` in `typestyles` class naming. */\nfunction sanitizeClassSegment(label: string): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-');\n return normalized.replace(/-+/g, '-').replace(/^-|-$/g, '') || 'style';\n}\n\nconst RESERVED_COMPONENT_KEYS = new Set([\n 'base',\n 'variants',\n 'compoundVariants',\n 'defaultVariants',\n 'slots',\n]);\n\nexport const PUBLIC_CLASSNAMES_SNAPSHOT = '.typestyles-public-classnames.json';\n\nexport type PublicClassNameEntry = {\n className: string;\n kind: 'class' | 'component';\n namespace: string;\n suffix?: string;\n file: string;\n line: number;\n};\n\nexport type PublicClassNamesSnapshot = {\n version: 1;\n classNames: string[];\n entries: PublicClassNameEntry[];\n};\n\nexport type StylesBindingConfig = {\n mode: 'semantic' | 'hashed' | 'compact' | 'atomic' | 'attribute' | 'bem' | 'template';\n scopeId: string;\n};\n\nexport type CollectPublicClassNamesOptions = {\n /** Project root for resolving snapshot paths and globs */\n rootDir?: string;\n /** Glob patterns relative to rootDir */\n include?: string[];\n /** Glob patterns to exclude */\n exclude?: string[];\n};\n\nconst DEFAULT_INCLUDE = ['**/*.{ts,tsx}'];\nconst DEFAULT_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/*.d.ts',\n '**/*.test.{ts,tsx}',\n '**/*.spec.{ts,tsx}',\n];\n\nfunction semanticScopePrefix(scopeId: string): string {\n if (!scopeId.trim()) return '';\n return `${sanitizeClassSegment(scopeId)}-`;\n}\n\nexport function semanticClassName(\n config: StylesBindingConfig,\n namespace: string,\n suffix?: string,\n): string | null {\n if (\n config.mode === 'hashed' ||\n config.mode === 'compact' ||\n config.mode === 'atomic' ||\n config.mode === 'template'\n ) {\n return null;\n }\n const prefix = semanticScopePrefix(config.scopeId);\n if (suffix === undefined || suffix === 'base') return `${prefix}${namespace}`;\n // Dimensioned attribute variants are data-* only; the helper cannot tell flat\n // modifiers from option names — prefer `componentClassName` / collect for that.\n if (config.mode === 'attribute') return `${prefix}${namespace}`;\n if (config.mode === 'bem') return `${prefix}${namespace}--${suffix}`;\n return `${prefix}${namespace}--${suffix}`;\n}\n\nfunction getStaticObjectKey(name: ts.PropertyName): string | null {\n if (ts.isIdentifier(name)) return name.text;\n if (ts.isStringLiteral(name)) return name.text;\n return null;\n}\n\nfunction firstStringArg(args: ts.NodeArray<ts.Expression>): string | null {\n const first = args[0];\n if (!first || !ts.isStringLiteral(first)) return null;\n return first.text;\n}\n\nfunction unwrapExpression(expr: ts.Expression): ts.Expression {\n let current = expr;\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n return current;\n}\n\nfunction objectExpressionFromConfigArg(\n arg: ts.Expression | undefined,\n): ts.ObjectLiteralExpression | null {\n if (!arg) return null;\n const expr = unwrapExpression(arg);\n if (ts.isObjectLiteralExpression(expr)) return expr;\n if (ts.isArrowFunction(expr)) {\n if (ts.isBlock(expr.body)) {\n for (const stmt of expr.body.statements) {\n if (\n ts.isReturnStatement(stmt) &&\n stmt.expression &&\n ts.isObjectLiteralExpression(unwrapExpression(stmt.expression))\n ) {\n return unwrapExpression(stmt.expression) as ts.ObjectLiteralExpression;\n }\n }\n } else {\n // `() => ({ ... })` wraps the object in parentheses.\n const body = unwrapExpression(expr.body);\n if (ts.isObjectLiteralExpression(body)) return body;\n }\n }\n return null;\n}\n\nfunction literalFromProperty(obj: ts.ObjectLiteralExpression, key: string): string | null {\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const propKey = getStaticObjectKey(prop.name);\n if (propKey !== key) continue;\n const init = unwrapExpression(prop.initializer);\n if (ts.isStringLiteral(init)) return init.text;\n if (ts.isNoSubstitutionTemplateLiteral(init)) return init.text;\n }\n return null;\n}\n\nfunction hasObjectKey(obj: ts.ObjectLiteralExpression, key: string): boolean {\n return obj.properties.some((prop) => {\n if (!ts.isPropertyAssignment(prop)) return false;\n return getStaticObjectKey(prop.name) === key;\n });\n}\n\ntype ComponentClassNamePart = {\n suffix?: string;\n element?: string;\n dimension?: string;\n modifier?: string;\n};\n\nfunction collectClassNamePartsFromConfig(\n obj: ts.ObjectLiteralExpression,\n): ComponentClassNamePart[] {\n const parts: ComponentClassNamePart[] = [];\n\n const hasVariants = hasObjectKey(obj, 'variants');\n const hasCompound = hasObjectKey(obj, 'compoundVariants');\n const hasDefaults = hasObjectKey(obj, 'defaultVariants');\n const hasSlots = hasObjectKey(obj, 'slots');\n\n if (hasSlots && (hasVariants || hasCompound || hasDefaults)) {\n const baseObj = obj.properties.find((prop) => {\n if (!ts.isPropertyAssignment(prop)) return false;\n return getStaticObjectKey(prop.name) === 'base';\n });\n if (\n baseObj &&\n ts.isPropertyAssignment(baseObj) &&\n ts.isObjectLiteralExpression(baseObj.initializer)\n ) {\n for (const slotProp of baseObj.initializer.properties) {\n if (!ts.isPropertyAssignment(slotProp)) continue;\n const slot = getStaticObjectKey(slotProp.name);\n if (slot) parts.push({ element: slot === 'root' ? undefined : slot });\n }\n }\n\n const variantsProp = obj.properties.find((prop) => {\n if (!ts.isPropertyAssignment(prop)) return false;\n return getStaticObjectKey(prop.name) === 'variants';\n });\n if (\n variantsProp &&\n ts.isPropertyAssignment(variantsProp) &&\n ts.isObjectLiteralExpression(variantsProp.initializer)\n ) {\n for (const dimProp of variantsProp.initializer.properties) {\n if (\n !ts.isPropertyAssignment(dimProp) ||\n !ts.isObjectLiteralExpression(dimProp.initializer)\n ) {\n continue;\n }\n const dimension = getStaticObjectKey(dimProp.name);\n if (!dimension) continue;\n for (const optProp of dimProp.initializer.properties) {\n if (\n !ts.isPropertyAssignment(optProp) ||\n !ts.isObjectLiteralExpression(optProp.initializer)\n ) {\n continue;\n }\n const option = getStaticObjectKey(optProp.name);\n if (!option) continue;\n for (const slotProp of optProp.initializer.properties) {\n if (!ts.isPropertyAssignment(slotProp)) continue;\n const slot = getStaticObjectKey(slotProp.name);\n if (slot) {\n parts.push({\n element: slot === 'root' ? undefined : slot,\n dimension,\n modifier: option,\n });\n }\n }\n }\n }\n }\n\n return parts;\n }\n\n if (hasSlots && !hasVariants && !hasCompound && !hasDefaults) {\n const slotsProp = obj.properties.find((prop) => {\n if (!ts.isPropertyAssignment(prop)) return false;\n return getStaticObjectKey(prop.name) === 'slots';\n });\n if (\n slotsProp &&\n ts.isPropertyAssignment(slotsProp) &&\n ts.isArrayLiteralExpression(slotsProp.initializer)\n ) {\n for (const element of slotsProp.initializer.elements) {\n if (element && ts.isStringLiteral(element)) {\n parts.push({ element: element.text === 'root' ? undefined : element.text });\n }\n }\n }\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const key = getStaticObjectKey(prop.name);\n if (!key || key === 'slots') continue;\n parts.push({ element: key === 'root' ? undefined : key });\n }\n return parts;\n }\n\n if (hasVariants || hasCompound || hasDefaults) {\n parts.push({});\n\n const variantsProp = obj.properties.find((prop) => {\n if (!ts.isPropertyAssignment(prop)) return false;\n return getStaticObjectKey(prop.name) === 'variants';\n });\n if (\n variantsProp &&\n ts.isPropertyAssignment(variantsProp) &&\n ts.isObjectLiteralExpression(variantsProp.initializer)\n ) {\n for (const dimProp of variantsProp.initializer.properties) {\n if (\n !ts.isPropertyAssignment(dimProp) ||\n !ts.isObjectLiteralExpression(dimProp.initializer)\n ) {\n continue;\n }\n const dimension = getStaticObjectKey(dimProp.name);\n if (!dimension) continue;\n for (const optProp of dimProp.initializer.properties) {\n if (!ts.isPropertyAssignment(optProp)) continue;\n const option = getStaticObjectKey(optProp.name);\n if (option) parts.push({ dimension, modifier: option });\n }\n }\n }\n\n return parts;\n }\n\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const key = getStaticObjectKey(prop.name);\n if (!key) continue;\n if (key === 'base') {\n parts.push({});\n continue;\n }\n if (RESERVED_COMPONENT_KEYS.has(key)) continue;\n parts.push({ modifier: key });\n }\n\n return parts;\n}\n\nfunction componentClassName(\n config: StylesBindingConfig,\n namespace: string,\n part: ComponentClassNamePart,\n): string | null {\n if (\n config.mode === 'hashed' ||\n config.mode === 'compact' ||\n config.mode === 'atomic' ||\n config.mode === 'template'\n ) {\n return null;\n }\n\n const prefix = semanticScopePrefix(config.scopeId);\n const block = `${prefix}${namespace}${part.element ? `__${part.element}` : ''}`;\n if (!part.modifier) return block;\n // Dimensioned attribute variants compile to data-* attrs (no public class).\n // Flat attribute modifiers still emit `block--modifier` classes.\n if (config.mode === 'attribute' && part.dimension) return block;\n if (config.mode === 'bem') return `${block}--${part.modifier}`;\n return `${block}--${part.dimension ? `${part.dimension}-` : ''}${part.modifier}`;\n}\n\nfunction parseCreateStylesConfig(init: ts.Expression): StylesBindingConfig {\n const config: StylesBindingConfig = { mode: 'semantic', scopeId: '' };\n let expr = unwrapExpression(init);\n if (ts.isCallExpression(expr)) {\n const firstArg = expr.arguments[0];\n if (!firstArg) return config;\n expr = unwrapExpression(firstArg);\n }\n if (!ts.isObjectLiteralExpression(expr)) return config;\n\n const mode = literalFromProperty(expr, 'mode');\n if (\n mode === 'semantic' ||\n mode === 'hashed' ||\n mode === 'compact' ||\n mode === 'atomic' ||\n mode === 'attribute' ||\n mode === 'bem' ||\n mode === 'template'\n ) {\n config.mode = mode;\n }\n const scopeId = literalFromProperty(expr, 'scopeId');\n if (scopeId != null) config.scopeId = scopeId;\n return config;\n}\n\nfunction isCreateStylesCall(expr: ts.Expression): boolean {\n const unwrapped = unwrapExpression(expr);\n if (!ts.isCallExpression(unwrapped)) return false;\n const callee = unwrapped.expression;\n if (\n ts.isIdentifier(callee) &&\n (callee.text === 'createStyles' || callee.text === 'createTypeStyles')\n ) {\n return true;\n }\n if (\n ts.isPropertyAccessExpression(callee) &&\n ts.isIdentifier(callee.expression) &&\n callee.expression.text === 'typestyles' &&\n (callee.name.text === 'createStyles' || callee.name.text === 'createTypeStyles')\n ) {\n return true;\n }\n return false;\n}\n\nfunction registerBindingFromCreateCall(\n bindings: Map<string, StylesBindingConfig>,\n name: string,\n init: ts.Expression,\n): void {\n bindings.set(name, parseCreateStylesConfig(init));\n}\n\nfunction collectBindings(sourceFile: ts.SourceFile): Map<string, StylesBindingConfig> {\n const bindings = new Map<string, StylesBindingConfig>();\n\n const visit = (node: ts.Node): void => {\n if (\n ts.isVariableDeclaration(node) &&\n node.initializer &&\n isCreateStylesCall(node.initializer)\n ) {\n if (ts.isIdentifier(node.name)) {\n registerBindingFromCreateCall(bindings, node.name.text, node.initializer);\n } else if (ts.isObjectBindingPattern(node.name)) {\n const config = parseCreateStylesConfig(node.initializer);\n for (const element of node.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n bindings.set(element.name.text, config);\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return bindings;\n}\n\nfunction normalizeCalleeMethod(name: string): 'class' | 'component' | null {\n if (name === 'style' || name === 'class') return 'class';\n if (name === 'recipe' || name === 'component') return 'component';\n return null;\n}\n\nfunction calleeMethodName(expr: ts.Expression): 'class' | 'component' | null {\n // Flat API: `style(...)` / `recipe(...)` and `typestyles.style` / `typestyles.recipe`\n // Legacy: `styles.class` / `styles.component`\n if (ts.isIdentifier(expr)) {\n return normalizeCalleeMethod(expr.text);\n }\n if (!ts.isPropertyAccessExpression(expr)) return null;\n if (ts.isIdentifier(expr.name)) return normalizeCalleeMethod(expr.name.text);\n return null;\n}\n\nfunction lineOf(sourceFile: ts.SourceFile, node: ts.Node): number {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n return line + 1;\n}\n\nfunction stylesBindingFromCallee(\n expr: ts.Expression,\n bindings: Map<string, StylesBindingConfig>,\n defaultConfig?: StylesBindingConfig,\n): StylesBindingConfig {\n if (ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.expression)) {\n const binding = bindings.get(expr.expression.text);\n if (binding) return binding;\n if (expr.expression.text === 'styles' && defaultConfig) return defaultConfig;\n }\n if (ts.isIdentifier(expr)) {\n return bindings.get(expr.text) ?? defaultConfig ?? { mode: 'semantic', scopeId: '' };\n }\n return defaultConfig ?? { mode: 'semantic', scopeId: '' };\n}\n\nfunction mergeProjectBindings(sourceFiles: ts.SourceFile[]): {\n bindings: Map<string, StylesBindingConfig>;\n defaultConfig?: StylesBindingConfig;\n} {\n const bindings = new Map<string, StylesBindingConfig>();\n const configs: StylesBindingConfig[] = [];\n\n for (const sourceFile of sourceFiles) {\n const fileBindings = collectBindings(sourceFile);\n for (const [key, value] of fileBindings) {\n bindings.set(key, value);\n configs.push(value);\n }\n }\n\n const unique = new Map<string, StylesBindingConfig>();\n for (const config of configs) {\n unique.set(`${config.mode}:${config.scopeId}`, config);\n }\n\n const defaultConfig = unique.size === 1 ? [...unique.values()][0] : undefined;\n return { bindings, defaultConfig };\n}\n\nfunction collectCallsFromSourceFile(\n sourceFile: ts.SourceFile,\n relativePath: string,\n bindings: Map<string, StylesBindingConfig>,\n defaultConfig?: StylesBindingConfig,\n): PublicClassNameEntry[] {\n const entries: PublicClassNameEntry[] = [];\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const method = calleeMethodName(node.expression);\n if (method === 'class' || method === 'component') {\n const namespace = firstStringArg(node.arguments);\n if (!namespace) {\n ts.forEachChild(node, visit);\n return;\n }\n\n const config = stylesBindingFromCallee(node.expression, bindings, defaultConfig);\n const line = lineOf(sourceFile, node.arguments[0] ?? node);\n\n if (method === 'class') {\n const className = semanticClassName(config, namespace);\n if (className) {\n entries.push({\n className,\n kind: 'class',\n namespace,\n file: relativePath,\n line,\n });\n }\n } else {\n const configObj = objectExpressionFromConfigArg(node.arguments[1]);\n const parts = configObj ? collectClassNamePartsFromConfig(configObj) : [{}];\n for (const part of parts) {\n const className = componentClassName(config, namespace, part);\n if (className) {\n entries.push({\n className,\n kind: 'component',\n namespace,\n suffix: part.modifier\n ? `${part.element ? `${part.element}-` : ''}${part.dimension ? `${part.dimension}-` : ''}${part.modifier}`\n : (part.element ?? 'base'),\n file: relativePath,\n line,\n });\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return entries;\n}\n\nexport function collectPublicClassNamesFromFiles(\n filePaths: string[],\n rootDir: string,\n): PublicClassNameEntry[] {\n const parsed = filePaths.map((filePath) => {\n const sourceText = fs.readFileSync(filePath, 'utf8');\n const sourceFile = ts.createSourceFile(\n filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n return { filePath, sourceFile, relativePath: path.relative(rootDir, filePath) };\n });\n\n const { bindings, defaultConfig } = mergeProjectBindings(parsed.map((item) => item.sourceFile));\n const entries: PublicClassNameEntry[] = [];\n\n for (const { sourceFile, relativePath } of parsed) {\n entries.push(...collectCallsFromSourceFile(sourceFile, relativePath, bindings, defaultConfig));\n }\n\n return dedupeEntries(entries);\n}\n\nfunction dedupeEntries(entries: PublicClassNameEntry[]): PublicClassNameEntry[] {\n const byClass = new Map<string, PublicClassNameEntry>();\n for (const entry of entries) {\n if (!byClass.has(entry.className)) {\n byClass.set(entry.className, entry);\n }\n }\n return [...byClass.values()].sort((a, b) => a.className.localeCompare(b.className));\n}\n\nexport async function collectPublicClassNames(\n options: CollectPublicClassNamesOptions = {},\n): Promise<PublicClassNameEntry[]> {\n const rootDir = path.resolve(options.rootDir ?? process.cwd());\n const include = options.include ?? DEFAULT_INCLUDE;\n const exclude = options.exclude ?? DEFAULT_EXCLUDE;\n\n const files = await fg(include, {\n cwd: rootDir,\n absolute: true,\n ignore: exclude,\n });\n\n return collectPublicClassNamesFromFiles(files, rootDir);\n}\n\nexport function collectPublicClassNamesSync(\n options: CollectPublicClassNamesOptions = {},\n): PublicClassNameEntry[] {\n const rootDir = path.resolve(options.rootDir ?? process.cwd());\n const include = options.include ?? DEFAULT_INCLUDE;\n const exclude = options.exclude ?? DEFAULT_EXCLUDE;\n\n const files = fg.sync(include, {\n cwd: rootDir,\n absolute: true,\n ignore: exclude,\n });\n\n return collectPublicClassNamesFromFiles(files, rootDir);\n}\n\n/** @internal Resolve merged `createStyles` / `createTypeStyles` bindings for tests. */\nexport function resolveProjectStylesBindings(\n filePaths: string[],\n _rootDir: string,\n): Map<string, StylesBindingConfig> {\n const parsed = filePaths.map((filePath) => {\n const sourceText = fs.readFileSync(filePath, 'utf8');\n return ts.createSourceFile(\n filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n });\n return mergeProjectBindings(parsed).bindings;\n}\n\nexport function buildSnapshot(entries: PublicClassNameEntry[]): PublicClassNamesSnapshot {\n const sorted = dedupeEntries(entries);\n return {\n version: 1,\n classNames: sorted.map((entry) => entry.className),\n entries: sorted,\n };\n}\n\nexport function loadPublicClassNamesSnapshot(\n snapshotPath: string,\n): PublicClassNamesSnapshot | null {\n if (!fs.existsSync(snapshotPath)) return null;\n const raw = JSON.parse(fs.readFileSync(snapshotPath, 'utf8')) as PublicClassNamesSnapshot;\n if (!raw || raw.version !== 1 || !Array.isArray(raw.classNames)) {\n throw new Error(\n `[typestyles] Invalid public class name snapshot at ${snapshotPath}. Regenerate with \\`typestyles snapshot --write\\`.`,\n );\n }\n return raw;\n}\n\nexport function writePublicClassNamesSnapshot(\n snapshotPath: string,\n entries: PublicClassNameEntry[],\n): PublicClassNamesSnapshot {\n const snapshot = buildSnapshot(entries);\n fs.writeFileSync(snapshotPath, `${JSON.stringify(snapshot, null, 2)}\\n`, 'utf8');\n return snapshot;\n}\n\nexport function diffRemovedPublicClassNames(\n snapshot: PublicClassNamesSnapshot,\n current: PublicClassNameEntry[],\n): PublicClassNameEntry[] {\n const currentSet = new Set(current.map((entry) => entry.className));\n return snapshot.entries.filter((entry) => !currentSet.has(entry.className));\n}\n"]}
|
package/dist/cli.cjs
CHANGED
|
@@ -38,10 +38,11 @@ function semanticScopePrefix(scopeId) {
|
|
|
38
38
|
return `${sanitizeClassSegment(scopeId)}-`;
|
|
39
39
|
}
|
|
40
40
|
function semanticClassName(config, namespace, suffix) {
|
|
41
|
-
if (config.mode
|
|
41
|
+
if (config.mode === "hashed" || config.mode === "compact" || config.mode === "atomic" || config.mode === "template") {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
42
44
|
const prefix = semanticScopePrefix(config.scopeId);
|
|
43
|
-
|
|
44
|
-
return `${prefix}${namespace}-${suffix}`;
|
|
45
|
+
return `${prefix}${namespace}`;
|
|
45
46
|
}
|
|
46
47
|
function getStaticObjectKey(name) {
|
|
47
48
|
if (ts__default.default.isIdentifier(name)) return name.text;
|
|
@@ -65,13 +66,15 @@ function objectExpressionFromConfigArg(arg) {
|
|
|
65
66
|
const expr = unwrapExpression(arg);
|
|
66
67
|
if (ts__default.default.isObjectLiteralExpression(expr)) return expr;
|
|
67
68
|
if (ts__default.default.isArrowFunction(expr)) {
|
|
68
|
-
if (ts__default.default.isObjectLiteralExpression(expr.body)) return expr.body;
|
|
69
69
|
if (ts__default.default.isBlock(expr.body)) {
|
|
70
70
|
for (const stmt of expr.body.statements) {
|
|
71
71
|
if (ts__default.default.isReturnStatement(stmt) && stmt.expression && ts__default.default.isObjectLiteralExpression(unwrapExpression(stmt.expression))) {
|
|
72
72
|
return unwrapExpression(stmt.expression);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
+
} else {
|
|
76
|
+
const body = unwrapExpression(expr.body);
|
|
77
|
+
if (ts__default.default.isObjectLiteralExpression(body)) return body;
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
80
|
return null;
|
|
@@ -93,8 +96,8 @@ function hasObjectKey(obj, key) {
|
|
|
93
96
|
return getStaticObjectKey(prop.name) === key;
|
|
94
97
|
});
|
|
95
98
|
}
|
|
96
|
-
function
|
|
97
|
-
const
|
|
99
|
+
function collectClassNamePartsFromConfig(obj) {
|
|
100
|
+
const parts = [];
|
|
98
101
|
const hasVariants = hasObjectKey(obj, "variants");
|
|
99
102
|
const hasCompound = hasObjectKey(obj, "compoundVariants");
|
|
100
103
|
const hasDefaults = hasObjectKey(obj, "defaultVariants");
|
|
@@ -108,7 +111,7 @@ function collectSuffixesFromConfig(obj) {
|
|
|
108
111
|
for (const slotProp of baseObj.initializer.properties) {
|
|
109
112
|
if (!ts__default.default.isPropertyAssignment(slotProp)) continue;
|
|
110
113
|
const slot = getStaticObjectKey(slotProp.name);
|
|
111
|
-
if (slot)
|
|
114
|
+
if (slot) parts.push({ element: slot === "root" ? void 0 : slot });
|
|
112
115
|
}
|
|
113
116
|
}
|
|
114
117
|
const variantsProp = obj.properties.find((prop) => {
|
|
@@ -131,32 +134,18 @@ function collectSuffixesFromConfig(obj) {
|
|
|
131
134
|
for (const slotProp of optProp.initializer.properties) {
|
|
132
135
|
if (!ts__default.default.isPropertyAssignment(slotProp)) continue;
|
|
133
136
|
const slot = getStaticObjectKey(slotProp.name);
|
|
134
|
-
if (slot)
|
|
137
|
+
if (slot) {
|
|
138
|
+
parts.push({
|
|
139
|
+
element: slot === "root" ? void 0 : slot,
|
|
140
|
+
dimension,
|
|
141
|
+
modifier: option
|
|
142
|
+
});
|
|
143
|
+
}
|
|
135
144
|
}
|
|
136
145
|
}
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
|
-
|
|
140
|
-
if (!ts__default.default.isPropertyAssignment(prop)) return false;
|
|
141
|
-
return getStaticObjectKey(prop.name) === "compoundVariants";
|
|
142
|
-
});
|
|
143
|
-
if (compoundProp && ts__default.default.isPropertyAssignment(compoundProp) && ts__default.default.isArrayLiteralExpression(compoundProp.initializer)) {
|
|
144
|
-
compoundProp.initializer.elements.forEach((element, index) => {
|
|
145
|
-
if (!element || !ts__default.default.isObjectLiteralExpression(element)) return;
|
|
146
|
-
const styleProp = element.properties.find((prop) => {
|
|
147
|
-
if (!ts__default.default.isPropertyAssignment(prop)) return false;
|
|
148
|
-
return getStaticObjectKey(prop.name) === "style";
|
|
149
|
-
});
|
|
150
|
-
if (styleProp && ts__default.default.isPropertyAssignment(styleProp) && ts__default.default.isObjectLiteralExpression(styleProp.initializer)) {
|
|
151
|
-
for (const slotProp of styleProp.initializer.properties) {
|
|
152
|
-
if (!ts__default.default.isPropertyAssignment(slotProp)) continue;
|
|
153
|
-
const slot = getStaticObjectKey(slotProp.name);
|
|
154
|
-
if (slot) suffixes.push(`${slot}-compound-${index}`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
return suffixes;
|
|
148
|
+
return parts;
|
|
160
149
|
}
|
|
161
150
|
if (hasSlots && !hasVariants && !hasCompound && !hasDefaults) {
|
|
162
151
|
const slotsProp = obj.properties.find((prop) => {
|
|
@@ -166,7 +155,7 @@ function collectSuffixesFromConfig(obj) {
|
|
|
166
155
|
if (slotsProp && ts__default.default.isPropertyAssignment(slotsProp) && ts__default.default.isArrayLiteralExpression(slotsProp.initializer)) {
|
|
167
156
|
for (const element of slotsProp.initializer.elements) {
|
|
168
157
|
if (element && ts__default.default.isStringLiteral(element)) {
|
|
169
|
-
|
|
158
|
+
parts.push({ element: element.text === "root" ? void 0 : element.text });
|
|
170
159
|
}
|
|
171
160
|
}
|
|
172
161
|
}
|
|
@@ -174,12 +163,12 @@ function collectSuffixesFromConfig(obj) {
|
|
|
174
163
|
if (!ts__default.default.isPropertyAssignment(prop)) continue;
|
|
175
164
|
const key = getStaticObjectKey(prop.name);
|
|
176
165
|
if (!key || key === "slots") continue;
|
|
177
|
-
|
|
166
|
+
parts.push({ element: key === "root" ? void 0 : key });
|
|
178
167
|
}
|
|
179
|
-
return
|
|
168
|
+
return parts;
|
|
180
169
|
}
|
|
181
170
|
if (hasVariants || hasCompound || hasDefaults) {
|
|
182
|
-
|
|
171
|
+
parts.push({});
|
|
183
172
|
const variantsProp = obj.properties.find((prop) => {
|
|
184
173
|
if (!ts__default.default.isPropertyAssignment(prop)) return false;
|
|
185
174
|
return getStaticObjectKey(prop.name) === "variants";
|
|
@@ -194,28 +183,35 @@ function collectSuffixesFromConfig(obj) {
|
|
|
194
183
|
for (const optProp of dimProp.initializer.properties) {
|
|
195
184
|
if (!ts__default.default.isPropertyAssignment(optProp)) continue;
|
|
196
185
|
const option = getStaticObjectKey(optProp.name);
|
|
197
|
-
if (option)
|
|
186
|
+
if (option) parts.push({ dimension, modifier: option });
|
|
198
187
|
}
|
|
199
188
|
}
|
|
200
189
|
}
|
|
201
|
-
|
|
202
|
-
if (!ts__default.default.isPropertyAssignment(prop)) return false;
|
|
203
|
-
return getStaticObjectKey(prop.name) === "compoundVariants";
|
|
204
|
-
});
|
|
205
|
-
if (compoundProp && ts__default.default.isPropertyAssignment(compoundProp) && ts__default.default.isArrayLiteralExpression(compoundProp.initializer)) {
|
|
206
|
-
compoundProp.initializer.elements.forEach((_, index) => {
|
|
207
|
-
suffixes.push(`compound-${index}`);
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
return suffixes;
|
|
190
|
+
return parts;
|
|
211
191
|
}
|
|
212
192
|
for (const prop of obj.properties) {
|
|
213
193
|
if (!ts__default.default.isPropertyAssignment(prop)) continue;
|
|
214
194
|
const key = getStaticObjectKey(prop.name);
|
|
215
|
-
if (!key
|
|
216
|
-
|
|
195
|
+
if (!key) continue;
|
|
196
|
+
if (key === "base") {
|
|
197
|
+
parts.push({});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (RESERVED_COMPONENT_KEYS.has(key)) continue;
|
|
201
|
+
parts.push({ modifier: key });
|
|
202
|
+
}
|
|
203
|
+
return parts;
|
|
204
|
+
}
|
|
205
|
+
function componentClassName(config, namespace, part) {
|
|
206
|
+
if (config.mode === "hashed" || config.mode === "compact" || config.mode === "atomic" || config.mode === "template") {
|
|
207
|
+
return null;
|
|
217
208
|
}
|
|
218
|
-
|
|
209
|
+
const prefix = semanticScopePrefix(config.scopeId);
|
|
210
|
+
const block = `${prefix}${namespace}${part.element ? `__${part.element}` : ""}`;
|
|
211
|
+
if (!part.modifier) return block;
|
|
212
|
+
if (config.mode === "attribute" && part.dimension) return block;
|
|
213
|
+
if (config.mode === "bem") return `${block}--${part.modifier}`;
|
|
214
|
+
return `${block}--${part.dimension ? `${part.dimension}-` : ""}${part.modifier}`;
|
|
219
215
|
}
|
|
220
216
|
function parseCreateStylesConfig(init) {
|
|
221
217
|
const config = { mode: "semantic", scopeId: "" };
|
|
@@ -227,7 +223,7 @@ function parseCreateStylesConfig(init) {
|
|
|
227
223
|
}
|
|
228
224
|
if (!ts__default.default.isObjectLiteralExpression(expr)) return config;
|
|
229
225
|
const mode = literalFromProperty(expr, "mode");
|
|
230
|
-
if (mode === "semantic" || mode === "hashed" || mode === "compact" || mode === "atomic") {
|
|
226
|
+
if (mode === "semantic" || mode === "hashed" || mode === "compact" || mode === "atomic" || mode === "attribute" || mode === "bem" || mode === "template") {
|
|
231
227
|
config.mode = mode;
|
|
232
228
|
}
|
|
233
229
|
const scopeId = literalFromProperty(expr, "scopeId");
|
|
@@ -269,9 +265,17 @@ function collectBindings(sourceFile) {
|
|
|
269
265
|
visit(sourceFile);
|
|
270
266
|
return bindings;
|
|
271
267
|
}
|
|
268
|
+
function normalizeCalleeMethod(name) {
|
|
269
|
+
if (name === "style" || name === "class") return "class";
|
|
270
|
+
if (name === "recipe" || name === "component") return "component";
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
272
273
|
function calleeMethodName(expr) {
|
|
274
|
+
if (ts__default.default.isIdentifier(expr)) {
|
|
275
|
+
return normalizeCalleeMethod(expr.text);
|
|
276
|
+
}
|
|
273
277
|
if (!ts__default.default.isPropertyAccessExpression(expr)) return null;
|
|
274
|
-
if (ts__default.default.isIdentifier(expr.name)) return expr.name.text;
|
|
278
|
+
if (ts__default.default.isIdentifier(expr.name)) return normalizeCalleeMethod(expr.name.text);
|
|
275
279
|
return null;
|
|
276
280
|
}
|
|
277
281
|
function lineOf(sourceFile, node) {
|
|
@@ -284,8 +288,8 @@ function stylesBindingFromCallee(expr, bindings, defaultConfig) {
|
|
|
284
288
|
if (binding) return binding;
|
|
285
289
|
if (expr.expression.text === "styles" && defaultConfig) return defaultConfig;
|
|
286
290
|
}
|
|
287
|
-
if (ts__default.default.isIdentifier(expr)
|
|
288
|
-
return bindings.get(
|
|
291
|
+
if (ts__default.default.isIdentifier(expr)) {
|
|
292
|
+
return bindings.get(expr.text) ?? defaultConfig ?? { mode: "semantic", scopeId: "" };
|
|
289
293
|
}
|
|
290
294
|
return defaultConfig ?? { mode: "semantic", scopeId: "" };
|
|
291
295
|
}
|
|
@@ -332,15 +336,15 @@ function collectCallsFromSourceFile(sourceFile, relativePath, bindings, defaultC
|
|
|
332
336
|
}
|
|
333
337
|
} else {
|
|
334
338
|
const configObj = objectExpressionFromConfigArg(node.arguments[1]);
|
|
335
|
-
const
|
|
336
|
-
for (const
|
|
337
|
-
const className =
|
|
339
|
+
const parts = configObj ? collectClassNamePartsFromConfig(configObj) : [{}];
|
|
340
|
+
for (const part of parts) {
|
|
341
|
+
const className = componentClassName(config, namespace, part);
|
|
338
342
|
if (className) {
|
|
339
343
|
entries.push({
|
|
340
344
|
className,
|
|
341
345
|
kind: "component",
|
|
342
346
|
namespace,
|
|
343
|
-
suffix,
|
|
347
|
+
suffix: part.modifier ? `${part.element ? `${part.element}-` : ""}${part.dimension ? `${part.dimension}-` : ""}${part.modifier}` : part.element ?? "base",
|
|
344
348
|
file: relativePath,
|
|
345
349
|
line
|
|
346
350
|
});
|
|
@@ -411,8 +415,9 @@ function writePublicClassNamesSnapshot(snapshotPath, entries) {
|
|
|
411
415
|
// src/commands/snapshot.ts
|
|
412
416
|
var SNAPSHOT_HELP = `typestyles snapshot [options]
|
|
413
417
|
|
|
414
|
-
Scan TypeScript sources for semantic \`
|
|
415
|
-
and write or print the public API snapshot used by
|
|
418
|
+
Scan TypeScript sources for semantic \`style\` / \`recipe\` (and legacy \`styles.class\` /
|
|
419
|
+
\`styles.component\`) class names and write or print the public API snapshot used by
|
|
420
|
+
\`@typestyles/no-removed-public-classname\`.
|
|
416
421
|
|
|
417
422
|
Options:
|
|
418
423
|
--write Write ${PUBLIC_CLASSNAMES_SNAPSHOT} in the project root
|