@freeappstore/cli 0.4.45 → 0.4.46

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 CHANGED
@@ -317,3 +317,9 @@ Or read the full platform guide: [freeappstore.online/skills.md](https://freeapp
317
317
  ## License
318
318
 
319
319
  MIT.
320
+
321
+ ### Migrate an existing app to token utilities
322
+
323
+ Run `fas migrate tailwind-tokens --dir <app-repo>` to preview a unified diff and per-file counts. Add `--write` to apply it. The command scans `web/src`, adds missing Tailwind theme mappings for defined FAS tokens, and rewrites class attributes and `cn`/`clsx`/`classnames` calls while preserving variants and opacity. Radius and shadow mappings use `rounded-fas`, `rounded-fas-sm`, and `shadow-fas`.
324
+
325
+ Banned aliases are resolved from the app's own CSS; conflicting light/dark definitions, cycles, and unknown tokens are left in place and reported. Review the remaining CSS rules, hex colours, dark overrides, and inline-style counts in the report. Run the app build after applying the migration. Re-running the command is a no-op once migrated. This command does not convert static inline styles or add SDK `@source` directives.
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ import { screencheckCommand } from './commands/screencheck.js';
18
18
  import { secretCommand } from './commands/secret.js';
19
19
  import { whoamiCommand } from './commands/whoami.js';
20
20
  import { backgroundVersionCheck } from './lib/version-check.js';
21
+ import { migrateCommand } from './migrate-tailwind-tokens.js';
21
22
  // Read version from the package's own package.json so `fas --version` always
22
23
  // matches the installed package. dist/index.js sits one level under the
23
24
  // package root (where package.json lives).
@@ -44,6 +45,7 @@ program.addCommand(secretCommand);
44
45
  program.addCommand(proxyCommand);
45
46
  program.addCommand(qualityCommand);
46
47
  program.addCommand(adminCommand);
48
+ program.addCommand(migrateCommand);
47
49
  // `fas` with no subcommand → launch the TUI when stdout is a TTY.
48
50
  // Subcommands keep their normal one-shot behavior, scriptable for CI / agents.
49
51
  async function main() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Command } from 'commander';
2
+ interface FileChange {
3
+ file: string;
4
+ replacements: number;
5
+ diff: string;
6
+ }
7
+ export interface MigrateResult {
8
+ dir: string;
9
+ write: boolean;
10
+ changes: FileChange[];
11
+ replacements: number;
12
+ /** Tokens left alone (not mapped, or not defined by the app), with use counts. */
13
+ unknownTokens: Record<string, number>;
14
+ inlinedAliases: {
15
+ alias: string;
16
+ target: string;
17
+ }[];
18
+ skippedAliases: {
19
+ alias: string;
20
+ reason: string;
21
+ }[];
22
+ themeInserted: boolean;
23
+ /** What the codemod cannot fix, for an agent to follow up. */
24
+ report: string[];
25
+ }
26
+ export declare function migrateTailwindTokens(opts: {
27
+ dir: string;
28
+ write: boolean;
29
+ }): Promise<MigrateResult>;
30
+ export declare const migrateCommand: Command;
31
+ export {};
32
+ //# sourceMappingURL=migrate-tailwind-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-tailwind-tokens.d.ts","sourceRoot":"","sources":["../src/migrate-tailwind-tokens.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+GpC,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,aAAa,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiTD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsLzB;AAED,eAAO,MAAM,cAAc,SAE1B,CAAC"}
@@ -0,0 +1,561 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, relative, resolve } from 'node:path';
3
+ import { Command } from 'commander';
4
+ import ts from 'typescript';
5
+ /**
6
+ * `fas migrate tailwind-tokens` (#325, port of PAS #494): rewrite long-hand
7
+ * `text-[var(--muted)]` utilities to the token utilities the `@theme inline`
8
+ * block maps (`text-muted`), and inline each banned alias (`--bg`, `--surface`,
9
+ * `--border`, `--error`) by the app's OWN definition of it. Dry-run unless
10
+ * `write` is set.
11
+ */
12
+ // The #492 token → Tailwind mapping. Colours become `--color-<token>`; the radius
13
+ // and shadow tokens get the `fas` names so they cannot collide with Tailwind's.
14
+ const COLOR_TOKENS = [
15
+ 'paper',
16
+ 'paper-deep',
17
+ 'ink',
18
+ 'ink-strong',
19
+ 'muted',
20
+ 'line',
21
+ 'line-strong',
22
+ 'panel',
23
+ 'panel-strong',
24
+ 'panel-quiet',
25
+ 'accent',
26
+ 'accent-soft',
27
+ 'accent-deep',
28
+ 'success',
29
+ 'warning',
30
+ 'danger',
31
+ 'danger-soft',
32
+ 'panel-glass',
33
+ 'popover',
34
+ 'accent-hover',
35
+ 'sky',
36
+ 'sky-soft',
37
+ 'sky-deep',
38
+ 'mint',
39
+ 'mint-soft',
40
+ 'mint-deep',
41
+ 'success-soft',
42
+ 'warning-soft',
43
+ 'scrim',
44
+ ];
45
+ const RADIUS_MAP = { radius: 'fas', 'radius-sm': 'fas-sm' };
46
+ const SHADOW_MAP = { shadow: 'fas' };
47
+ const BANNED_ALIASES = ['bg', 'surface', 'border', 'glass', 'dock', 'error'];
48
+ // Longest first so `border-t` wins over `border`.
49
+ const PREFIXES = [
50
+ 'border-t',
51
+ 'border-r',
52
+ 'border-b',
53
+ 'border-l',
54
+ 'text',
55
+ 'bg',
56
+ 'border',
57
+ 'ring',
58
+ 'outline',
59
+ 'fill',
60
+ 'stroke',
61
+ 'divide',
62
+ 'from',
63
+ 'via',
64
+ 'to',
65
+ 'shadow',
66
+ 'rounded',
67
+ ];
68
+ // A whole class token: (variants:)* prefix-[var(--token)] (/opacity)?. The lookbehind and
69
+ // lookahead keep it from matching inside a longer token, so a bare '[var(--ink)]' or CSS-in-JS
70
+ // `color: var(--ink)` is never touched.
71
+ const LONG_HAND = new RegExp(`(?<![\\w\\[\\]&>*.#=:/-])((?:[\\w\\[\\]&>*.#=-]+:)*)(${PREFIXES.join('|')})-\\[var\\(--([a-z][\\w-]*)\\)\\](\\/(?:\\d+|\\[[\\w.%]+\\]))?(?![\\w\\[\\]-])`, 'g');
72
+ function rewriteClasses(file, text, replace) {
73
+ const ast = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, file.endsWith('.ts') ? ts.ScriptKind.TS : ts.ScriptKind.TSX);
74
+ const edits = [];
75
+ const visit = (node, active = false) => {
76
+ const enabled = active ||
77
+ (ts.isJsxAttribute(node) && /^(className|class)$/.test(node.name.getText(ast))) ||
78
+ (ts.isCallExpression(node) && /^(cn|clsx|classnames)$/.test(node.expression.getText(ast)));
79
+ if (enabled &&
80
+ (ts.isStringLiteral(node) ||
81
+ ts.isNoSubstitutionTemplateLiteral(node) ||
82
+ ts.isTemplateHead(node) ||
83
+ ts.isTemplateMiddle(node) ||
84
+ ts.isTemplateTail(node))) {
85
+ const start = node.getStart(ast), end = node.getEnd();
86
+ edits.push({ start, end, value: replace(text.slice(start, end)) });
87
+ return;
88
+ }
89
+ ts.forEachChild(node, (child) => visit(child, enabled));
90
+ };
91
+ visit(ast);
92
+ for (const edit of edits.sort((a, b) => b.start - a.start))
93
+ text = text.slice(0, edit.start) + edit.value + text.slice(edit.end);
94
+ return text;
95
+ }
96
+ /** A small CSS reader: declarations and rules with their enclosing selectors; comments blanked. */
97
+ function parseCss(css) {
98
+ const text = css.replace(/\/\*[\s\S]*?\*\//g, (m) => m.replace(/[^\n]/g, ' '));
99
+ const decls = [];
100
+ const rules = [];
101
+ const stack = [];
102
+ let seg = 0;
103
+ let paren = 0;
104
+ let quote = '';
105
+ const statement = (end, stop) => {
106
+ const raw = text.slice(seg, stop);
107
+ const trimmed = raw.trim();
108
+ if (!trimmed || trimmed.startsWith('@'))
109
+ return;
110
+ const colon = trimmed.indexOf(':');
111
+ if (colon < 0)
112
+ return;
113
+ const start = seg + raw.indexOf(trimmed);
114
+ decls.push({
115
+ name: trimmed.slice(0, colon).trim(),
116
+ value: trimmed.slice(colon + 1).trim(),
117
+ start,
118
+ end,
119
+ selectors: [...stack],
120
+ });
121
+ };
122
+ for (let i = 0; i < text.length; i++) {
123
+ const c = text[i];
124
+ if (quote) {
125
+ if (c === '\\')
126
+ i++;
127
+ else if (c === quote)
128
+ quote = '';
129
+ continue;
130
+ }
131
+ if (c === '"' || c === "'") {
132
+ quote = c;
133
+ continue;
134
+ }
135
+ if (c === '(') {
136
+ paren++;
137
+ continue;
138
+ }
139
+ if (c === ')') {
140
+ paren--;
141
+ continue;
142
+ }
143
+ if (paren > 0)
144
+ continue;
145
+ if (c === '{') {
146
+ const selector = text.slice(seg, i).trim();
147
+ stack.push(selector);
148
+ rules.push({ selector, ancestors: [...stack] });
149
+ seg = i + 1;
150
+ }
151
+ else if (c === ';') {
152
+ statement(i + 1, i);
153
+ seg = i + 1;
154
+ }
155
+ else if (c === '}') {
156
+ statement(i, i);
157
+ stack.pop();
158
+ seg = i + 1;
159
+ }
160
+ }
161
+ return { decls, rules };
162
+ }
163
+ const isDark = (selectors) => selectors.some((s) => /dark/.test(s));
164
+ const isTokenSelector = (sel) => !!sel &&
165
+ sel
166
+ .split(',')
167
+ .every((p) => /^(:root|html|body)?(\[data-theme[^\]]*\]|\.dark)?$/.test(p.trim()) && p.trim() !== '');
168
+ function listFiles(root) {
169
+ return readdirSync(root, { recursive: true })
170
+ .map((f) => f.replace(/\\/g, '/'))
171
+ .filter((f) => !f.split('/').includes('node_modules') && /\.(css|tsx|jsx|ts)$/.test(f))
172
+ .sort();
173
+ }
174
+ /** The alias → target each banned alias resolves to in this app's own CSS, or why not. */
175
+ function resolveAliases(css) {
176
+ const { decls } = parseCss(css);
177
+ const inline = new Map();
178
+ const skipped = [];
179
+ const single = (alias) => {
180
+ const mine = decls.filter((d) => d.name === `--${alias}`);
181
+ if (!mine.length)
182
+ return null;
183
+ const bad = mine.find((d) => !/^var\(--[\w-]+\)$/.test(d.value));
184
+ if (bad)
185
+ return `resolves to \`${bad.value}\`, not a single token`;
186
+ const targets = (dark) => [
187
+ ...new Set(mine.filter((d) => isDark(d.selectors) === dark).map((d) => d.value.slice(6, -1))),
188
+ ];
189
+ const light = targets(false);
190
+ const dark = targets(true);
191
+ if (!light.length)
192
+ return 'defined only in the dark block';
193
+ if (light.length > 1)
194
+ return `resolves to different tokens in the light rules (${light.map((t) => `--${t}`).join(', ')})`;
195
+ if (dark.length > 1)
196
+ return `resolves to different tokens in the dark rules (${dark.map((t) => `--${t}`).join(', ')})`;
197
+ if (dark.length && dark[0] !== light[0])
198
+ return `resolves to --${light[0]} in light but --${dark[0]} in dark`;
199
+ inline.set(alias, light[0]);
200
+ return null;
201
+ };
202
+ for (const alias of BANNED_ALIASES) {
203
+ const why = single(alias);
204
+ if (why)
205
+ skipped.push({ alias: `--${alias}`, reason: why });
206
+ }
207
+ // An alias may point at another alias; follow it, and drop it if that one was skipped.
208
+ for (const [alias, target] of [...inline]) {
209
+ let t = target;
210
+ const seen = new Set([alias]);
211
+ while (BANNED_ALIASES.includes(t)) {
212
+ if (seen.has(t)) {
213
+ inline.delete(alias);
214
+ skipped.push({ alias: `--${alias}`, reason: 'cyclic alias definition' });
215
+ t = '';
216
+ break;
217
+ }
218
+ seen.add(t);
219
+ const next = inline.get(t);
220
+ if (!next) {
221
+ inline.delete(alias);
222
+ skipped.push({ alias: `--${alias}`, reason: `points at --${t}, which was skipped` });
223
+ t = '';
224
+ break;
225
+ }
226
+ t = next;
227
+ }
228
+ if (t && inline.has(alias))
229
+ inline.set(alias, t);
230
+ }
231
+ return { inline, skipped };
232
+ }
233
+ /** Delete the declarations of the given custom properties, and the line if it is left blank. */
234
+ function deleteDecls(css, names) {
235
+ const doomed = parseCss(css)
236
+ .decls.filter((d) => names.has(d.name))
237
+ .sort((a, b) => b.start - a.start);
238
+ let out = css;
239
+ for (const d of doomed) {
240
+ let from = d.start;
241
+ let to = d.end;
242
+ const lineStart = out.lastIndexOf('\n', from - 1) + 1;
243
+ const lineEnd = out.indexOf('\n', to);
244
+ const lineTail = out.slice(to, lineEnd < 0 ? out.length : lineEnd);
245
+ if (!out.slice(lineStart, from).trim() && !lineTail.trim()) {
246
+ from = lineStart;
247
+ to = lineEnd < 0 ? out.length : lineEnd + 1;
248
+ }
249
+ out = out.slice(0, from) + out.slice(to);
250
+ }
251
+ return out;
252
+ }
253
+ function themeBlock(defined) {
254
+ const lines = [];
255
+ for (const t of COLOR_TOKENS)
256
+ if (defined.has(t))
257
+ lines.push(` --color-${t}: var(--${t});`);
258
+ for (const [t, n] of Object.entries(RADIUS_MAP))
259
+ if (defined.has(t))
260
+ lines.push(` --radius-${n}: var(--${t});`);
261
+ for (const [t, n] of Object.entries(SHADOW_MAP))
262
+ if (defined.has(t))
263
+ lines.push(` --shadow-${n}: var(--${t});`);
264
+ return lines.length ? `@theme inline {\n${lines.join('\n')}\n}\n` : '';
265
+ }
266
+ function insertTheme(css, block) {
267
+ const lines = css.split('\n');
268
+ let at = -1;
269
+ lines.forEach((l, i) => {
270
+ if (/^\s*@source\b/.test(l))
271
+ at = i;
272
+ });
273
+ if (at < 0)
274
+ lines.forEach((l, i) => {
275
+ if (at < 0 && /^\s*@import\s+["']tailwindcss["']/.test(l))
276
+ at = i;
277
+ });
278
+ if (at < 0)
279
+ return null;
280
+ lines.splice(at + 1, 0, '', ...block.trimEnd().split('\n'));
281
+ return lines.join('\n');
282
+ }
283
+ /** Unified diff; edits here are sparse, so a greedy resync is enough. */
284
+ function unifiedDiff(file, a, b) {
285
+ const x = a.split('\n');
286
+ const y = b.split('\n');
287
+ const ops = [];
288
+ let i = 0;
289
+ let j = 0;
290
+ while (i < x.length || j < y.length) {
291
+ if (i < x.length && j < y.length && x[i] === y[j]) {
292
+ ops.push({ t: ' ', s: x[i] });
293
+ i++;
294
+ j++;
295
+ continue;
296
+ }
297
+ let del = -1;
298
+ let ins = -1;
299
+ for (let k = 1; k <= 60 && (del < 0 || ins < 0); k++) {
300
+ if (del < 0 && j < y.length && x[i + k] === y[j])
301
+ del = k;
302
+ if (ins < 0 && i < x.length && y[j + k] === x[i])
303
+ ins = k;
304
+ }
305
+ if (del > 0 && (ins < 0 || del <= ins)) {
306
+ for (let k = 0; k < del; k++)
307
+ ops.push({ t: '-', s: x[i++] });
308
+ }
309
+ else if (ins > 0) {
310
+ for (let k = 0; k < ins; k++)
311
+ ops.push({ t: '+', s: y[j++] });
312
+ }
313
+ else {
314
+ if (i < x.length)
315
+ ops.push({ t: '-', s: x[i++] });
316
+ if (j < y.length)
317
+ ops.push({ t: '+', s: y[j++] });
318
+ }
319
+ }
320
+ const out = [`--- a/${file}`, `+++ b/${file}`];
321
+ const keep = new Array(ops.length).fill(false);
322
+ ops.forEach((o, n) => {
323
+ if (o.t !== ' ')
324
+ for (let k = Math.max(0, n - 3); k <= Math.min(ops.length - 1, n + 3); k++)
325
+ keep[k] = true;
326
+ });
327
+ let n = 0;
328
+ let ai = 1;
329
+ let bi = 1;
330
+ while (n < ops.length) {
331
+ if (!keep[n]) {
332
+ if (ops[n].t !== '+')
333
+ ai++;
334
+ if (ops[n].t !== '-')
335
+ bi++;
336
+ n++;
337
+ continue;
338
+ }
339
+ const hunk = [];
340
+ const sa = ai;
341
+ const sb = bi;
342
+ let ca = 0;
343
+ let cb = 0;
344
+ for (; n < ops.length && keep[n]; n++) {
345
+ const o = ops[n];
346
+ hunk.push(o.t + o.s);
347
+ if (o.t !== '+') {
348
+ ca++;
349
+ ai++;
350
+ }
351
+ if (o.t !== '-') {
352
+ cb++;
353
+ bi++;
354
+ }
355
+ }
356
+ out.push(`@@ -${sa},${ca} +${sb},${cb} @@`, ...hunk);
357
+ }
358
+ return `${out.join('\n')}\n`;
359
+ }
360
+ /** What the codemod cannot fix in the app's CSS: unlayered rules, hex outside tokens, per-screen dark overrides. */
361
+ function detectCssIssues(file, css) {
362
+ const { decls, rules } = parseCss(css);
363
+ const unlayered = rules.filter((r) => {
364
+ if (r.ancestors.some((a) => /^@(layer|theme|font-face|(?:-webkit-)?keyframes|property)\b/.test(a) ||
365
+ /^@media\s+print\b/.test(a)))
366
+ return false;
367
+ if (/^@/.test(r.selector))
368
+ return false;
369
+ return !isTokenSelector(r.selector);
370
+ });
371
+ const darkOverrides = rules.filter((r) => !r.ancestors.some((a) => /^@layer\b/.test(a)) &&
372
+ !/^@/.test(r.selector) &&
373
+ /dark/.test(r.ancestors.join(' ')) &&
374
+ !isTokenSelector(r.selector));
375
+ const hex = decls.filter((d) => /#[0-9a-f]{3,8}\b/i.test(d.value) &&
376
+ !d.selectors.some((s) => isTokenSelector(s) || /^@(theme|font-face)\b/.test(s)));
377
+ const out = [];
378
+ if (unlayered.length)
379
+ out.push(`${file}: ${unlayered.length} unlayered rule(s) outside @layer (e.g. \`${unlayered[0].selector}\`); move to a component or @layer base`);
380
+ if (hex.length)
381
+ out.push(`${file}: ${hex.length} hard-coded hex value(s) outside the token blocks (e.g. \`${hex[0].name}: ${hex[0].value}\`); use a token`);
382
+ if (darkOverrides.length)
383
+ out.push(`${file}: ${darkOverrides.length} per-screen dark override(s) (e.g. \`${darkOverrides[0].selector}\`); define the token for dark instead`);
384
+ return out;
385
+ }
386
+ export async function migrateTailwindTokens(opts) {
387
+ const root = resolve(opts.dir);
388
+ const src = join(root, 'web', 'src');
389
+ if (!existsSync(src))
390
+ throw new Error(`No web/src under ${root}; fass --dir <app repo root>.`);
391
+ const names = listFiles(src);
392
+ const original = new Map(names.map((f) => [f, readFileSync(join(src, f), 'utf8')]));
393
+ const work = new Map(original);
394
+ const counts = new Map();
395
+ const bump = (f, n) => counts.set(f, (counts.get(f) ?? 0) + n);
396
+ const report = [];
397
+ const indexCss = 'index.css';
398
+ // 1. Banned aliases, by this app's own definition.
399
+ const hasIndex = work.has(indexCss) && /@(?:source|import)\b/.test(work.get(indexCss));
400
+ const { inline, skipped } = hasIndex
401
+ ? resolveAliases([...work]
402
+ .filter(([f]) => f.endsWith('.css'))
403
+ .map(([, text]) => text)
404
+ .join('\n'))
405
+ : { inline: new Map(), skipped: [] };
406
+ if (inline.size) {
407
+ work.set(indexCss, deleteDecls(work.get(indexCss), new Set([...inline.keys()].map((a) => `--${a}`))));
408
+ for (const [f, text] of work) {
409
+ let next = f.endsWith('.css')
410
+ ? deleteDecls(text, new Set([...inline.keys()].map((a) => `--${a}`)))
411
+ : text;
412
+ for (const [alias, target] of inline) {
413
+ const re = new RegExp(`var\\(--${alias}(?=[\\s,)])`, 'g');
414
+ next = next.replace(re, () => {
415
+ bump(f, 1);
416
+ return `var(--${target}`;
417
+ });
418
+ }
419
+ work.set(f, next);
420
+ }
421
+ // A deleted definition counts as a change to index.css even with no other use.
422
+ bump(indexCss, inline.size);
423
+ }
424
+ for (const alias of BANNED_ALIASES) {
425
+ if (inline.has(alias) || skipped.some((s) => s.alias === `--${alias}`))
426
+ continue;
427
+ const uses = [...work.values()].reduce((n, t) => n + (t.match(new RegExp(`var\\(--${alias}(?=[\\s,)])`, 'g'))?.length ?? 0), 0);
428
+ if (uses)
429
+ report.push(`var(--${alias}) is used ${uses} time(s) but index.css does not define it; left as is`);
430
+ }
431
+ // 2. Long-hand utilities → token utilities, for tokens this app defines.
432
+ const defined = new Set();
433
+ for (const [f, text] of work)
434
+ if (f.endsWith('.css'))
435
+ for (const d of parseCss(text).decls)
436
+ if (d.name.startsWith('--') &&
437
+ isTokenSelector(d.selectors.at(-1)) &&
438
+ d.selectors.slice(0, -1).every((s) => /^@layer\b/.test(s)))
439
+ defined.add(d.name.slice(2));
440
+ // 3. The @theme inline block that makes those utilities exist.
441
+ let themeInserted = false;
442
+ if (hasIndex) {
443
+ const css = work.get(indexCss);
444
+ {
445
+ const existing = new Set(parseCss(css)
446
+ .decls.filter((d) => d.selectors.some((s) => /^@theme\s+inline/.test(s)))
447
+ .map((d) => d.name));
448
+ const block = themeBlock(defined).replace(/^ {2}(--[\w-]+):[^\n]*\n/gm, (line, name) => (existing.has(name) ? '' : line));
449
+ if (/ {2}--/.test(block)) {
450
+ const next = block ? insertTheme(css, block) : null;
451
+ if (next) {
452
+ work.set(indexCss, next);
453
+ themeInserted = true;
454
+ bump(indexCss, 1);
455
+ }
456
+ else
457
+ report.push(block
458
+ ? 'index.css has no @source or @import "tailwindcss" line to insert @theme inline after'
459
+ : 'no FAS tokens defined in the app CSS; @theme inline not added');
460
+ }
461
+ }
462
+ }
463
+ const mappings = new Map(parseCss(work.get(indexCss) ?? '')
464
+ .decls.filter((d) => d.selectors.some((s) => /^@theme\s+inline/.test(s)))
465
+ .map((d) => [d.name, d.value]));
466
+ const unknown = {};
467
+ if (!hasIndex)
468
+ report.push('web/src/index.css missing a Tailwind import/source anchor; no utilities rewritten');
469
+ for (const [f, text] of work) {
470
+ if (!hasIndex || f.endsWith('.css'))
471
+ continue;
472
+ work.set(f, rewriteClasses(f, text, (value) => value.replace(LONG_HAND, (m, variants, prefix, token, opacity) => {
473
+ let name;
474
+ if (prefix === 'rounded')
475
+ name =
476
+ RADIUS_MAP[token] && defined.has(token)
477
+ ? `rounded-${RADIUS_MAP[token]}`
478
+ : undefined;
479
+ else if (prefix === 'shadow' && SHADOW_MAP[token])
480
+ name = defined.has(token) ? `shadow-${SHADOW_MAP[token]}` : undefined;
481
+ else if (COLOR_TOKENS.includes(token) && defined.has(token))
482
+ name = `${prefix}-${token}`;
483
+ const property = prefix === 'rounded'
484
+ ? `--radius-${RADIUS_MAP[token]}`
485
+ : prefix === 'shadow' && SHADOW_MAP[token]
486
+ ? `--shadow-${SHADOW_MAP[token]}`
487
+ : `--color-${token}`;
488
+ if (mappings.get(property) !== `var(--${token})`)
489
+ name = undefined;
490
+ if (!name) {
491
+ unknown[`--${token}`] = (unknown[`--${token}`] ?? 0) + 1;
492
+ return m;
493
+ }
494
+ bump(f, 1);
495
+ return `${variants}${name}${opacity ?? ''}`;
496
+ })));
497
+ }
498
+ // 4. What is left for an agent.
499
+ for (const [f, text] of work) {
500
+ if (f.endsWith('.css'))
501
+ report.push(...detectCssIssues(f, text));
502
+ else
503
+ report.push(`${f}: ${(text.match(/\bstyle\s*=\s*\{/g) ?? []).length} inline-style attribute(s)`);
504
+ }
505
+ for (const [token, n] of Object.entries(unknown))
506
+ report.push(`${token}: ${n} long-hand use(s) not rewritten (not in the token mapping or not defined by the app)`);
507
+ for (const s of skipped)
508
+ report.push(`${s.alias} left in place: ${s.reason}`);
509
+ const changes = [];
510
+ for (const [f, text] of work) {
511
+ const before = original.get(f);
512
+ if (text === before)
513
+ continue;
514
+ changes.push({
515
+ file: relative(root, join(src, f)).replace(/\\/g, '/'),
516
+ replacements: counts.get(f) ?? 0,
517
+ diff: unifiedDiff(relative(root, join(src, f)).replace(/\\/g, '/'), before, text),
518
+ });
519
+ if (opts.write)
520
+ writeFileSync(join(src, f), text);
521
+ }
522
+ return {
523
+ dir: root,
524
+ write: opts.write,
525
+ changes,
526
+ replacements: changes.reduce((n, c) => n + c.replacements, 0),
527
+ unknownTokens: unknown,
528
+ inlinedAliases: [...inline].map(([alias, target]) => ({
529
+ alias: `--${alias}`,
530
+ target: `--${target}`,
531
+ })),
532
+ skippedAliases: skipped,
533
+ themeInserted,
534
+ report,
535
+ };
536
+ }
537
+ export const migrateCommand = new Command('migrate').description('Codemods that move an app onto the current FAS standards.');
538
+ migrateCommand
539
+ .command('tailwind-tokens')
540
+ .description('Rewrite long-hand Tailwind CSS-variable utilities (text-[var(--muted)]) to token utilities (text-muted) and inline banned aliases. Dry-run unless --write.')
541
+ .option('--dir <path>', 'app repo root', '.')
542
+ .option('--write', 'apply the changes (default: print the diff and change nothing)')
543
+ .action(async (opts) => {
544
+ const r = await migrateTailwindTokens({ dir: opts.dir, write: !!opts.write });
545
+ const out = process.stdout;
546
+ if (!r.write)
547
+ for (const c of r.changes)
548
+ out.write(c.diff);
549
+ for (const c of r.changes)
550
+ out.write(`${c.file}: ${c.replacements} change(s)\n`);
551
+ for (const a of r.inlinedAliases)
552
+ out.write(`alias ${a.alias} → var(${a.target}), definition removed\n`);
553
+ if (r.themeInserted)
554
+ out.write('inserted @theme inline into web/src/index.css\n');
555
+ for (const line of r.report)
556
+ out.write(`left for follow-up: ${line}\n`);
557
+ out.write(r.write
558
+ ? `\nWrote ${r.changes.length} file(s), ${r.replacements} change(s).\n`
559
+ : `\nDry run: ${r.changes.length} file(s), ${r.replacements} change(s) would be made. Re-run with --write to apply.\n`);
560
+ });
561
+ //# sourceMappingURL=migrate-tailwind-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-tailwind-tokens.js","sourceRoot":"","sources":["../src/migrate-tailwind-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=migrate-tailwind-tokens.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-tailwind-tokens.test.d.ts","sourceRoot":"","sources":["../src/migrate-tailwind-tokens.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,148 @@
1
+ import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { migrateTailwindTokens } from './migrate-tailwind-tokens.js';
6
+ // #325: the codemod rewrites long-hand token utilities and resolves banned aliases by the
7
+ // app's own definition. Dry-run by default; idempotent.
8
+ const TOKENS = ` --paper: #fafafa;
9
+ --ink: #111;
10
+ --muted: #666;
11
+ --line: #ddd;
12
+ --radius: 8px;
13
+ `;
14
+ const INDEX = `@import "tailwindcss";
15
+ @source "../node_modules/@freeappstore/sdk/dist";
16
+
17
+ :root {
18
+ ${TOKENS}}
19
+ `;
20
+ function app(files) {
21
+ const dir = mkdtempSync(join(tmpdir(), 'fas-migrate-'));
22
+ mkdirSync(join(dir, 'web/src'), { recursive: true });
23
+ for (const [f, c] of Object.entries(files)) {
24
+ mkdirSync(dirname(join(dir, 'web/src', f)), { recursive: true });
25
+ writeFileSync(join(dir, 'web/src', f), c);
26
+ }
27
+ return dir;
28
+ }
29
+ const read = (dir, f) => readFileSync(join(dir, 'web/src', f), 'utf8');
30
+ describe('fas migrate tailwind-tokens (#494)', () => {
31
+ it('rewrites long-hand utilities, keeping variants and opacity, and inserts @theme inline', async () => {
32
+ const dir = app({
33
+ 'index.css': `${INDEX.replace(':root {', '@layer base { :root {')}}`,
34
+ 'A.tsx': `export const A = () => <div className="hover:text-[var(--muted)] md:border-[var(--line)]/50 rounded-[var(--radius)] bg-[var(--paper)]" />;`,
35
+ });
36
+ const r = await migrateTailwindTokens({ dir, write: true });
37
+ expect(read(dir, 'A.tsx')).toContain('className="hover:text-muted md:border-line/50 rounded-fas bg-paper"');
38
+ expect(r.themeInserted).toBe(true);
39
+ const css = read(dir, 'index.css');
40
+ expect(css).toMatch(/@source [^\n]+\n\n@theme inline \{\n {2}--color-paper: var\(--paper\);/);
41
+ expect(css).toContain('--radius-fas: var(--radius);');
42
+ expect(css).not.toContain('--color-danger');
43
+ });
44
+ it('leaves an unknown token unchanged and reports it', async () => {
45
+ const dir = app({
46
+ 'index.css': INDEX,
47
+ 'A.tsx': `const c = cn("text-[var(--unknown)] text-[var(--ink)]");`,
48
+ });
49
+ const r = await migrateTailwindTokens({ dir, write: true });
50
+ expect(read(dir, 'A.tsx')).toBe(`const c = cn("text-[var(--unknown)] text-ink");`);
51
+ expect(r.unknownTokens).toEqual({ '--unknown': 1 });
52
+ expect(r.report.join('\n')).toContain('--unknown');
53
+ });
54
+ it('does not touch a bare arbitrary value or CSS-in-JS', async () => {
55
+ const src = `const a = '[var(--ink)]'; const s = { color: 'var(--ink)' }; const t = 'x-text-[var(--ink)]';`;
56
+ const dir = app({ 'index.css': INDEX, 'A.tsx': src });
57
+ await migrateTailwindTokens({ dir, write: true });
58
+ expect(read(dir, 'A.tsx')).toBe(src);
59
+ });
60
+ it("inlines a banned alias by the app's own definition and deletes it", async () => {
61
+ const dir = app({
62
+ 'index.css': INDEX.replace('}\n', ' --surface: var(--paper);\n}\n') +
63
+ '.x { background: var(--surface); }\n',
64
+ 'A.tsx': `const c = cn("bg-[var(--surface)]");`,
65
+ });
66
+ const r = await migrateTailwindTokens({ dir, write: true });
67
+ const css = read(dir, 'index.css');
68
+ expect(css).not.toContain('--surface');
69
+ expect(css).toContain('background: var(--paper);');
70
+ expect(read(dir, 'A.tsx')).toBe(`const c = cn("bg-paper");`);
71
+ expect(r.inlinedAliases).toEqual([{ alias: '--surface', target: '--paper' }]);
72
+ });
73
+ it('reports and skips an alias that resolves differently in light and dark', async () => {
74
+ const css = INDEX.replace('}\n', ' --surface: var(--paper);\n}\n') +
75
+ ":root[data-theme='dark'] {\n --paper: #000;\n --surface: var(--ink);\n}\n";
76
+ const dir = app({ 'index.css': css, 'A.tsx': `const c = cn("bg-[var(--surface)]");` });
77
+ const r = await migrateTailwindTokens({ dir, write: true });
78
+ expect(read(dir, 'index.css')).toContain('--surface: var(--paper);');
79
+ expect(read(dir, 'A.tsx')).toBe(`const c = cn("bg-[var(--surface)]");`);
80
+ expect(r.skippedAliases).toEqual([
81
+ { alias: '--surface', reason: 'resolves to --paper in light but --ink in dark' },
82
+ ]);
83
+ });
84
+ it('is a dry run by default and idempotent when written', async () => {
85
+ const files = { 'index.css': INDEX, 'A.tsx': `const c = cn("text-[var(--muted)]");` };
86
+ const dir = app(files);
87
+ const dry = await migrateTailwindTokens({ dir, write: false });
88
+ expect(dry.replacements).toBeGreaterThan(0);
89
+ expect(dry.changes.find((c) => c.file === 'web/src/A.tsx').diff).toContain('+const c = cn("text-muted");');
90
+ expect(read(dir, 'A.tsx')).toBe(files['A.tsx']);
91
+ expect(read(dir, 'index.css')).toBe(INDEX);
92
+ await migrateTailwindTokens({ dir, write: true });
93
+ const again = await migrateTailwindTokens({ dir, write: true });
94
+ expect(again.changes).toEqual([]);
95
+ });
96
+ it('reports unlayered rules, hex and dark overrides it cannot fix', async () => {
97
+ const css = INDEX +
98
+ `.card { color: #abc; }\n@layer base { body { margin: 0; } }\n:root[data-theme='dark'] .card { color: red; }\n`;
99
+ const dir = app({ 'index.css': css });
100
+ const r = await migrateTailwindTokens({ dir, write: false });
101
+ const text = r.report.join('\n');
102
+ expect(text).toMatch(/unlayered rule/);
103
+ expect(text).toMatch(/hex value/);
104
+ expect(text).toMatch(/dark override/);
105
+ });
106
+ it('errors without web/src', async () => {
107
+ await expect(migrateTailwindTokens({ dir: mkdtempSync(join(tmpdir(), 'fas-migrate-')), write: false })).rejects.toThrow(/web\/src/);
108
+ });
109
+ it('leaves unrelated strings and comments unchanged, but rewrites class templates', async () => {
110
+ const source =
111
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: source fixture contains a template literal
112
+ 'const raw = "text-[var(--ink)]"; // text-[var(--ink)]\nconst A = <div className={cn(`hover:text-[var(--ink)] ${ok ? "bg-[var(--paper)]" : ""}`)} style={{color: "var(--ink)"}} />;';
113
+ const dir = app({ 'index.css': INDEX, 'A.tsx': source });
114
+ const r = await migrateTailwindTokens({ dir, write: true });
115
+ expect(read(dir, 'A.tsx')).toContain('const raw = "text-[var(--ink)]"; // text-[var(--ink)]');
116
+ expect(read(dir, 'A.tsx')).toContain('hover:text-ink');
117
+ expect(read(dir, 'A.tsx')).toContain('bg-paper');
118
+ expect(r.report.join(' ')).toContain('1 inline-style');
119
+ });
120
+ it('handles glass/dock aliases and reports cycles without deleting them', async () => {
121
+ const dir = app({
122
+ 'index.css': `${INDEX}:root { --glass: var(--paper); --dock: var(--glass); --bg: var(--surface); --surface: var(--bg); }`,
123
+ 'A.tsx': 'const A = <div className="bg-[var(--dock)]" />;',
124
+ });
125
+ const r = await migrateTailwindTokens({ dir, write: true });
126
+ expect(read(dir, 'A.tsx')).toContain('bg-paper');
127
+ expect(read(dir, 'index.css')).toContain('--bg: var(--surface)');
128
+ expect(r.skippedAliases).toHaveLength(2);
129
+ });
130
+ it('fills a partial theme and preserves conflicting mappings', async () => {
131
+ const dir = app({
132
+ 'index.css': `${INDEX}@theme inline { --color-ink: var(--paper); }`,
133
+ 'A.tsx': '<div className="text-[var(--ink)] text-[var(--muted)]" />',
134
+ });
135
+ await migrateTailwindTokens({ dir, write: true });
136
+ expect(read(dir, 'A.tsx')).toContain('text-[var(--ink)] text-muted');
137
+ expect((await migrateTailwindTokens({ dir, write: true })).changes).toEqual([]);
138
+ });
139
+ it('does not rewrite utilities without a Tailwind import or source anchor', async () => {
140
+ const dir = app({
141
+ 'index.css': ':root { --ink: #111; }',
142
+ 'A.tsx': '<div className="text-[var(--ink)]" />',
143
+ });
144
+ await migrateTailwindTokens({ dir, write: true });
145
+ expect(read(dir, 'A.tsx')).toContain('text-[var(--ink)]');
146
+ });
147
+ });
148
+ //# sourceMappingURL=migrate-tailwind-tokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-tailwind-tokens.test.js","sourceRoot":"","sources":["../src/migrate-tailwind-tokens.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freeappstore/cli",
3
- "version": "0.4.45",
3
+ "version": "0.4.46",
4
4
  "description": "fas — CLI for publishing free apps to freeappstore.online",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,14 +37,14 @@
37
37
  "ink-spinner": "^5.0.0",
38
38
  "prompts": "^2.4.2",
39
39
  "react": "^19.3.0",
40
+ "typescript": "^5.9.3",
40
41
  "@freeappstore/compliance": "0.7.20",
41
42
  "@freeappstore/quality": "0.1.5"
42
43
  },
43
44
  "devDependencies": {
44
45
  "@types/node": "^22.20.2",
45
46
  "@types/prompts": "^2.4.9",
46
- "@types/react": "^19.3.0",
47
- "typescript": "^5.9.3"
47
+ "@types/react": "^19.3.0"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsc",