@proappstore/cli 2.6.54 → 2.6.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ import { mcpAuthCommand } from './mcp-auth.js';
20
20
  import { sourcemapsCommand } from './sourcemaps.js';
21
21
  import { marketingCommand } from './marketing.js';
22
22
  import { permissionsCommand } from './permissions.js';
23
+ import { migrateCommand } from './migrate-tailwind-tokens.js';
23
24
  const __dirname = dirname(fileURLToPath(import.meta.url));
24
25
  const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
25
26
  const program = new Command();
@@ -68,6 +69,7 @@ program.addCommand(mcpAuthCommand);
68
69
  program.addCommand(sourcemapsCommand);
69
70
  program.addCommand(marketingCommand);
70
71
  program.addCommand(permissionsCommand);
72
+ program.addCommand(migrateCommand);
71
73
  program.parseAsync().catch((err) => {
72
74
  const msg = err instanceof Error ? err.message : String(err);
73
75
  process.stderr.write(`pas: ${msg}\n`);
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;AA2BpC,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;AA4LD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAuFzG;AAED,eAAO,MAAM,cAAc,SAAkG,CAAC"}
@@ -0,0 +1,412 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, relative, resolve } from 'node:path';
3
+ import { Command } from 'commander';
4
+ /**
5
+ * `pas migrate tailwind-tokens` (#494, epic #496): rewrite long-hand
6
+ * `text-[var(--muted)]` utilities to the token utilities the `@theme inline`
7
+ * block maps (`text-muted`), and inline each banned alias (`--bg`, `--surface`,
8
+ * `--border`, `--error`) by the app's OWN definition of it. Dry-run unless
9
+ * `write` is set.
10
+ */
11
+ // The #492 token → Tailwind mapping. Colours become `--color-<token>`; the radius
12
+ // and shadow tokens get the `pas` names so they cannot collide with Tailwind's.
13
+ const COLOR_TOKENS = ['paper', 'paper-deep', 'ink', 'ink-strong', 'muted', 'line', 'line-strong', 'panel', 'panel-strong', 'panel-quiet', 'accent', 'accent-soft', 'accent-deep', 'success', 'warning', 'danger', 'danger-soft'];
14
+ const RADIUS_MAP = { radius: 'pas', 'radius-sm': 'pas-sm' };
15
+ const SHADOW_MAP = { shadow: 'pas' };
16
+ const BANNED_ALIASES = ['bg', 'surface', 'border', 'error'];
17
+ // Longest first so `border-t` wins over `border`.
18
+ const PREFIXES = ['border-t', 'border-r', 'border-b', 'border-l', 'text', 'bg', 'border', 'ring', 'outline', 'fill', 'stroke', 'divide', 'from', 'via', 'to', 'shadow', 'rounded'];
19
+ // A whole class token: (variants:)* prefix-[var(--token)] (/opacity)?. The lookbehind and
20
+ // lookahead keep it from matching inside a longer token, so a bare '[var(--ink)]' or CSS-in-JS
21
+ // `color: var(--ink)` is never touched.
22
+ const LONG_HAND = new RegExp(`(?<![\\w\\[\\]&>*.#=:/-])((?:[\\w\\[\\]&>*.#=-]+:)*)(${PREFIXES.join('|')})-\\[var\\(--([a-z][\\w-]*)\\)\\](\\/(?:\\d+|\\[[\\w.%]+\\]))?(?![\\w\\[\\]-])`, 'g');
23
+ /** A small CSS reader: declarations and rules with their enclosing selectors; comments blanked. */
24
+ function parseCss(css) {
25
+ const text = css.replace(/\/\*[\s\S]*?\*\//g, (m) => m.replace(/[^\n]/g, ' '));
26
+ const decls = [];
27
+ const rules = [];
28
+ const stack = [];
29
+ let seg = 0;
30
+ let paren = 0;
31
+ let quote = '';
32
+ const statement = (end, stop) => {
33
+ const raw = text.slice(seg, stop);
34
+ const trimmed = raw.trim();
35
+ if (!trimmed || trimmed.startsWith('@'))
36
+ return;
37
+ const colon = trimmed.indexOf(':');
38
+ if (colon < 0)
39
+ return;
40
+ const start = seg + raw.indexOf(trimmed);
41
+ decls.push({ name: trimmed.slice(0, colon).trim(), value: trimmed.slice(colon + 1).trim(), start, end, selectors: [...stack] });
42
+ };
43
+ for (let i = 0; i < text.length; i++) {
44
+ const c = text[i];
45
+ if (quote) {
46
+ if (c === '\\')
47
+ i++;
48
+ else if (c === quote)
49
+ quote = '';
50
+ continue;
51
+ }
52
+ if (c === '"' || c === "'") {
53
+ quote = c;
54
+ continue;
55
+ }
56
+ if (c === '(') {
57
+ paren++;
58
+ continue;
59
+ }
60
+ if (c === ')') {
61
+ paren--;
62
+ continue;
63
+ }
64
+ if (paren > 0)
65
+ continue;
66
+ if (c === '{') {
67
+ const selector = text.slice(seg, i).trim();
68
+ stack.push(selector);
69
+ rules.push({ selector, ancestors: [...stack] });
70
+ seg = i + 1;
71
+ }
72
+ else if (c === ';') {
73
+ statement(i + 1, i);
74
+ seg = i + 1;
75
+ }
76
+ else if (c === '}') {
77
+ statement(i, i);
78
+ stack.pop();
79
+ seg = i + 1;
80
+ }
81
+ }
82
+ return { decls, rules };
83
+ }
84
+ const isDark = (selectors) => selectors.some((s) => /dark/.test(s));
85
+ const isTokenSelector = (sel) => !!sel && sel.split(',').every((p) => /^(:root|html|body)?(\[data-theme[^\]]*\]|\.dark)?$/.test(p.trim()) && p.trim() !== '');
86
+ function listFiles(root) {
87
+ return readdirSync(root, { recursive: true })
88
+ .map((f) => f.replace(/\\/g, '/'))
89
+ .filter((f) => !f.split('/').includes('node_modules') && /\.(css|tsx|jsx|ts)$/.test(f))
90
+ .sort();
91
+ }
92
+ /** The alias → target each banned alias resolves to in this app's own CSS, or why not. */
93
+ function resolveAliases(css) {
94
+ const { decls } = parseCss(css);
95
+ const inline = new Map();
96
+ const skipped = [];
97
+ const single = (alias) => {
98
+ const mine = decls.filter((d) => d.name === `--${alias}`);
99
+ if (!mine.length)
100
+ return null;
101
+ const bad = mine.find((d) => !/^var\(--[\w-]+\)$/.test(d.value));
102
+ if (bad)
103
+ return `resolves to \`${bad.value}\`, not a single token`;
104
+ const targets = (dark) => [...new Set(mine.filter((d) => isDark(d.selectors) === dark).map((d) => d.value.slice(6, -1)))];
105
+ const light = targets(false);
106
+ const dark = targets(true);
107
+ if (!light.length)
108
+ return 'defined only in the dark block';
109
+ if (light.length > 1)
110
+ return `resolves to different tokens in the light rules (${light.map((t) => `--${t}`).join(', ')})`;
111
+ if (dark.length > 1)
112
+ return `resolves to different tokens in the dark rules (${dark.map((t) => `--${t}`).join(', ')})`;
113
+ if (dark.length && dark[0] !== light[0])
114
+ return `resolves to --${light[0]} in light but --${dark[0]} in dark`;
115
+ inline.set(alias, light[0]);
116
+ return null;
117
+ };
118
+ for (const alias of BANNED_ALIASES) {
119
+ const why = single(alias);
120
+ if (why)
121
+ skipped.push({ alias: `--${alias}`, reason: why });
122
+ }
123
+ // An alias may point at another alias; follow it, and drop it if that one was skipped.
124
+ for (const [alias, target] of [...inline]) {
125
+ let t = target;
126
+ for (let n = 0; n < 5 && BANNED_ALIASES.includes(t); n++) {
127
+ const next = inline.get(t);
128
+ if (!next) {
129
+ inline.delete(alias);
130
+ skipped.push({ alias: `--${alias}`, reason: `points at --${t}, which was skipped` });
131
+ t = '';
132
+ break;
133
+ }
134
+ t = next;
135
+ }
136
+ if (t && inline.has(alias))
137
+ inline.set(alias, t);
138
+ }
139
+ return { inline, skipped };
140
+ }
141
+ /** Delete the declarations of the given custom properties, and the line if it is left blank. */
142
+ function deleteDecls(css, names) {
143
+ const doomed = parseCss(css).decls.filter((d) => names.has(d.name)).sort((a, b) => b.start - a.start);
144
+ let out = css;
145
+ for (const d of doomed) {
146
+ let from = d.start;
147
+ let to = d.end;
148
+ const lineStart = out.lastIndexOf('\n', from - 1) + 1;
149
+ const lineEnd = out.indexOf('\n', to);
150
+ const lineTail = out.slice(to, lineEnd < 0 ? out.length : lineEnd);
151
+ if (!out.slice(lineStart, from).trim() && !lineTail.trim()) {
152
+ from = lineStart;
153
+ to = lineEnd < 0 ? out.length : lineEnd + 1;
154
+ }
155
+ out = out.slice(0, from) + out.slice(to);
156
+ }
157
+ return out;
158
+ }
159
+ function themeBlock(defined) {
160
+ const lines = [];
161
+ for (const t of COLOR_TOKENS)
162
+ if (defined.has(t))
163
+ lines.push(` --color-${t}: var(--${t});`);
164
+ for (const [t, n] of Object.entries(RADIUS_MAP))
165
+ if (defined.has(t))
166
+ lines.push(` --radius-${n}: var(--${t});`);
167
+ for (const [t, n] of Object.entries(SHADOW_MAP))
168
+ if (defined.has(t))
169
+ lines.push(` --shadow-${n}: var(--${t});`);
170
+ return lines.length ? `@theme inline {\n${lines.join('\n')}\n}\n` : '';
171
+ }
172
+ function insertTheme(css, block) {
173
+ const lines = css.split('\n');
174
+ let at = -1;
175
+ lines.forEach((l, i) => { if (/^\s*@source\b/.test(l))
176
+ at = i; });
177
+ if (at < 0)
178
+ lines.forEach((l, i) => { if (at < 0 && /^\s*@import\s+["']tailwindcss["']/.test(l))
179
+ at = i; });
180
+ if (at < 0)
181
+ return null;
182
+ lines.splice(at + 1, 0, '', ...block.trimEnd().split('\n'));
183
+ return lines.join('\n');
184
+ }
185
+ /** Unified diff; edits here are sparse, so a greedy resync is enough. */
186
+ function unifiedDiff(file, a, b) {
187
+ const x = a.split('\n');
188
+ const y = b.split('\n');
189
+ const ops = [];
190
+ let i = 0;
191
+ let j = 0;
192
+ while (i < x.length || j < y.length) {
193
+ if (i < x.length && j < y.length && x[i] === y[j]) {
194
+ ops.push({ t: ' ', s: x[i] });
195
+ i++;
196
+ j++;
197
+ continue;
198
+ }
199
+ let del = -1;
200
+ let ins = -1;
201
+ for (let k = 1; k <= 60 && (del < 0 || ins < 0); k++) {
202
+ if (del < 0 && j < y.length && x[i + k] === y[j])
203
+ del = k;
204
+ if (ins < 0 && i < x.length && y[j + k] === x[i])
205
+ ins = k;
206
+ }
207
+ if (del > 0 && (ins < 0 || del <= ins)) {
208
+ for (let k = 0; k < del; k++)
209
+ ops.push({ t: '-', s: x[i++] });
210
+ }
211
+ else if (ins > 0) {
212
+ for (let k = 0; k < ins; k++)
213
+ ops.push({ t: '+', s: y[j++] });
214
+ }
215
+ else {
216
+ if (i < x.length)
217
+ ops.push({ t: '-', s: x[i++] });
218
+ if (j < y.length)
219
+ ops.push({ t: '+', s: y[j++] });
220
+ }
221
+ }
222
+ const out = [`--- a/${file}`, `+++ b/${file}`];
223
+ const keep = new Array(ops.length).fill(false);
224
+ ops.forEach((o, n) => { if (o.t !== ' ')
225
+ for (let k = Math.max(0, n - 3); k <= Math.min(ops.length - 1, n + 3); k++)
226
+ keep[k] = true; });
227
+ let n = 0;
228
+ let ai = 1;
229
+ let bi = 1;
230
+ while (n < ops.length) {
231
+ if (!keep[n]) {
232
+ if (ops[n].t !== '+')
233
+ ai++;
234
+ if (ops[n].t !== '-')
235
+ bi++;
236
+ n++;
237
+ continue;
238
+ }
239
+ const hunk = [];
240
+ const sa = ai;
241
+ const sb = bi;
242
+ let ca = 0;
243
+ let cb = 0;
244
+ for (; n < ops.length && keep[n]; n++) {
245
+ const o = ops[n];
246
+ hunk.push(o.t + o.s);
247
+ if (o.t !== '+') {
248
+ ca++;
249
+ ai++;
250
+ }
251
+ if (o.t !== '-') {
252
+ cb++;
253
+ bi++;
254
+ }
255
+ }
256
+ out.push(`@@ -${sa},${ca} +${sb},${cb} @@`, ...hunk);
257
+ }
258
+ return out.join('\n') + '\n';
259
+ }
260
+ /** What the codemod cannot fix in the app's CSS: unlayered rules, hex outside tokens, per-screen dark overrides. */
261
+ function detectCssIssues(file, css) {
262
+ const { decls, rules } = parseCss(css);
263
+ const unlayered = rules.filter((r) => {
264
+ if (r.ancestors.some((a) => /^@(layer|theme|font-face|keyframes|property)\b/.test(a)))
265
+ return false;
266
+ if (/^@/.test(r.selector))
267
+ return false;
268
+ return !isTokenSelector(r.selector);
269
+ });
270
+ const darkOverrides = rules.filter((r) => !r.ancestors.some((a) => /^@layer\b/.test(a)) && !/^@/.test(r.selector) && /dark/.test(r.ancestors.join(' ')) && !isTokenSelector(r.selector));
271
+ const hex = decls.filter((d) => /#[0-9a-f]{3,8}\b/i.test(d.value) && !d.selectors.some((s) => isTokenSelector(s) || /^@(theme|font-face)\b/.test(s)));
272
+ const out = [];
273
+ if (unlayered.length)
274
+ out.push(`${file}: ${unlayered.length} unlayered rule(s) outside @layer (e.g. \`${unlayered[0].selector}\`); move to a component or @layer base`);
275
+ if (hex.length)
276
+ 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`);
277
+ if (darkOverrides.length)
278
+ out.push(`${file}: ${darkOverrides.length} per-screen dark override(s) (e.g. \`${darkOverrides[0].selector}\`); define the token for dark instead`);
279
+ return out;
280
+ }
281
+ export async function migrateTailwindTokens(opts) {
282
+ const root = resolve(opts.dir);
283
+ const src = join(root, 'web', 'src');
284
+ if (!existsSync(src))
285
+ throw new Error(`No web/src under ${root}; pass --dir <app repo root>.`);
286
+ const names = listFiles(src);
287
+ const original = new Map(names.map((f) => [f, readFileSync(join(src, f), 'utf8')]));
288
+ const work = new Map(original);
289
+ const counts = new Map();
290
+ const bump = (f, n) => counts.set(f, (counts.get(f) ?? 0) + n);
291
+ const report = [];
292
+ const indexCss = 'index.css';
293
+ // 1. Banned aliases, by this app's own definition.
294
+ const hasIndex = work.has(indexCss);
295
+ const { inline, skipped } = hasIndex ? resolveAliases(work.get(indexCss)) : { inline: new Map(), skipped: [] };
296
+ if (inline.size) {
297
+ work.set(indexCss, deleteDecls(work.get(indexCss), new Set([...inline.keys()].map((a) => `--${a}`))));
298
+ for (const [f, text] of work) {
299
+ let next = text;
300
+ for (const [alias, target] of inline) {
301
+ const re = new RegExp(`var\\(--${alias}(?=[\\s,)])`, 'g');
302
+ next = next.replace(re, () => { bump(f, 1); return `var(--${target}`; });
303
+ }
304
+ work.set(f, next);
305
+ }
306
+ // A deleted definition counts as a change to index.css even with no other use.
307
+ bump(indexCss, inline.size);
308
+ }
309
+ for (const alias of BANNED_ALIASES) {
310
+ if (inline.has(alias) || skipped.some((s) => s.alias === `--${alias}`))
311
+ continue;
312
+ const uses = [...work.values()].reduce((n, t) => n + (t.match(new RegExp(`var\\(--${alias}(?=[\\s,)])`, 'g'))?.length ?? 0), 0);
313
+ if (uses)
314
+ report.push(`var(--${alias}) is used ${uses} time(s) but index.css does not define it; left as is`);
315
+ }
316
+ // 2. Long-hand utilities → token utilities, for tokens this app defines.
317
+ const defined = new Set();
318
+ for (const [f, text] of work)
319
+ if (f.endsWith('.css'))
320
+ for (const d of parseCss(text).decls)
321
+ if (d.name.startsWith('--'))
322
+ defined.add(d.name.slice(2));
323
+ const unknown = {};
324
+ if (!hasIndex)
325
+ report.push('web/src/index.css not found; no utilities rewritten');
326
+ for (const [f, text] of work) {
327
+ if (!hasIndex || f.endsWith('.css'))
328
+ continue;
329
+ work.set(f, text.replace(LONG_HAND, (m, variants, prefix, token, opacity) => {
330
+ let name;
331
+ if (prefix === 'rounded')
332
+ name = RADIUS_MAP[token] && defined.has(token) ? `rounded-${RADIUS_MAP[token]}` : undefined;
333
+ else if (prefix === 'shadow' && SHADOW_MAP[token])
334
+ name = defined.has(token) ? `shadow-${SHADOW_MAP[token]}` : undefined;
335
+ else if (COLOR_TOKENS.includes(token) && defined.has(token))
336
+ name = `${prefix}-${token}`;
337
+ if (!name) {
338
+ unknown[`--${token}`] = (unknown[`--${token}`] ?? 0) + 1;
339
+ return m;
340
+ }
341
+ bump(f, 1);
342
+ return `${variants}${name}${opacity ?? ''}`;
343
+ }));
344
+ }
345
+ // 3. The @theme inline block that makes those utilities exist.
346
+ let themeInserted = false;
347
+ if (hasIndex) {
348
+ const css = work.get(indexCss);
349
+ if (!/@theme\s+inline\s*\{/.test(css)) {
350
+ const block = themeBlock(defined);
351
+ const next = block ? insertTheme(css, block) : null;
352
+ if (next) {
353
+ work.set(indexCss, next);
354
+ themeInserted = true;
355
+ bump(indexCss, 1);
356
+ }
357
+ else
358
+ report.push(block ? 'index.css has no @source or @import "tailwindcss" line to insert @theme inline after' : 'no PAS tokens defined in the app CSS; @theme inline not added');
359
+ }
360
+ }
361
+ // 4. What is left for an agent.
362
+ for (const [f, text] of work)
363
+ if (f.endsWith('.css'))
364
+ report.push(...detectCssIssues(f, text));
365
+ for (const [token, n] of Object.entries(unknown))
366
+ report.push(`${token}: ${n} long-hand use(s) not rewritten (not in the token mapping or not defined by the app)`);
367
+ for (const s of skipped)
368
+ report.push(`${s.alias} left in place: ${s.reason}`);
369
+ const changes = [];
370
+ for (const [f, text] of work) {
371
+ const before = original.get(f);
372
+ if (text === before)
373
+ continue;
374
+ changes.push({ file: relative(root, join(src, f)).replace(/\\/g, '/'), replacements: counts.get(f) ?? 0, diff: unifiedDiff(relative(root, join(src, f)).replace(/\\/g, '/'), before, text) });
375
+ if (opts.write)
376
+ writeFileSync(join(src, f), text);
377
+ }
378
+ return {
379
+ dir: root,
380
+ write: opts.write,
381
+ changes,
382
+ replacements: changes.reduce((n, c) => n + c.replacements, 0),
383
+ unknownTokens: unknown,
384
+ inlinedAliases: [...inline].map(([alias, target]) => ({ alias: `--${alias}`, target: `--${target}` })),
385
+ skippedAliases: skipped,
386
+ themeInserted,
387
+ report,
388
+ };
389
+ }
390
+ export const migrateCommand = new Command('migrate').description('Codemods that move an app onto the current PAS standards.');
391
+ migrateCommand
392
+ .command('tailwind-tokens')
393
+ .description('Rewrite long-hand Tailwind CSS-variable utilities (text-[var(--muted)]) to token utilities (text-muted) and inline banned aliases. Dry-run unless --write.')
394
+ .option('--dir <path>', 'app repo root', '.')
395
+ .option('--write', 'apply the changes (default: print the diff and change nothing)')
396
+ .action(async (opts) => {
397
+ const r = await migrateTailwindTokens({ dir: opts.dir, write: !!opts.write });
398
+ const out = process.stdout;
399
+ if (!r.write)
400
+ for (const c of r.changes)
401
+ out.write(c.diff);
402
+ for (const c of r.changes)
403
+ out.write(`${c.file}: ${c.replacements} change(s)\n`);
404
+ for (const a of r.inlinedAliases)
405
+ out.write(`alias ${a.alias} → var(${a.target}), definition removed\n`);
406
+ if (r.themeInserted)
407
+ out.write('inserted @theme inline into web/src/index.css\n');
408
+ for (const line of r.report)
409
+ out.write(`left for follow-up: ${line}\n`);
410
+ out.write(r.write ? `\nWrote ${r.changes.length} file(s), ${r.replacements} change(s).\n` : `\nDry run: ${r.changes.length} file(s), ${r.replacements} change(s) would be made. Re-run with --write to apply.\n`);
411
+ });
412
+ //# 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,137 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { migrateTailwindTokens } from './migrate-tailwind-tokens.js';
8
+ // #494: the codemod rewrites long-hand token utilities and resolves banned aliases by the
9
+ // app's own definition. Dry-run by default; idempotent.
10
+ const TOKENS = ` --paper: #fafafa;
11
+ --ink: #111;
12
+ --muted: #666;
13
+ --line: #ddd;
14
+ --radius: 8px;
15
+ `;
16
+ const INDEX = `@import "tailwindcss";
17
+ @source "../node_modules/@proappstore/sdk/dist";
18
+
19
+ :root {
20
+ ${TOKENS}}
21
+ `;
22
+ function app(files) {
23
+ const dir = mkdtempSync(join(tmpdir(), 'pas-migrate-'));
24
+ mkdirSync(join(dir, 'web/src'), { recursive: true });
25
+ for (const [f, c] of Object.entries(files)) {
26
+ mkdirSync(dirname(join(dir, 'web/src', f)), { recursive: true });
27
+ writeFileSync(join(dir, 'web/src', f), c);
28
+ }
29
+ return dir;
30
+ }
31
+ const read = (dir, f) => readFileSync(join(dir, 'web/src', f), 'utf8');
32
+ describe('pas migrate tailwind-tokens (#494)', () => {
33
+ it('rewrites long-hand utilities, keeping variants and opacity, and inserts @theme inline', async () => {
34
+ const dir = app({
35
+ 'index.css': INDEX,
36
+ 'A.tsx': `export const A = () => <div className="hover:text-[var(--muted)] md:border-[var(--line)]/50 rounded-[var(--radius)] bg-[var(--paper)]" />;`,
37
+ });
38
+ const r = await migrateTailwindTokens({ dir, write: true });
39
+ expect(read(dir, 'A.tsx')).toContain('className="hover:text-muted md:border-line/50 rounded-pas bg-paper"');
40
+ expect(r.themeInserted).toBe(true);
41
+ const css = read(dir, 'index.css');
42
+ expect(css).toMatch(/@source [^\n]+\n\n@theme inline \{\n --color-paper: var\(--paper\);/);
43
+ expect(css).toContain('--radius-pas: var(--radius);');
44
+ expect(css).not.toContain('--color-danger');
45
+ });
46
+ it('leaves an unknown token unchanged and reports it', async () => {
47
+ const dir = app({ 'index.css': INDEX, 'A.tsx': `const c = "text-[var(--unknown)] text-[var(--ink)]";` });
48
+ const r = await migrateTailwindTokens({ dir, write: true });
49
+ expect(read(dir, 'A.tsx')).toBe(`const c = "text-[var(--unknown)] text-ink";`);
50
+ expect(r.unknownTokens).toEqual({ '--unknown': 1 });
51
+ expect(r.report.join('\n')).toContain('--unknown');
52
+ });
53
+ it('does not touch a bare arbitrary value or CSS-in-JS', async () => {
54
+ const src = `const a = '[var(--ink)]'; const s = { color: 'var(--ink)' }; const t = 'x-text-[var(--ink)]';`;
55
+ const dir = app({ 'index.css': INDEX, 'A.tsx': src });
56
+ await migrateTailwindTokens({ dir, write: true });
57
+ expect(read(dir, 'A.tsx')).toBe(src);
58
+ });
59
+ it("inlines a banned alias by the app's own definition and deletes it", async () => {
60
+ const dir = app({
61
+ 'index.css': INDEX.replace('}\n', ' --surface: var(--paper);\n}\n') + '.x { background: var(--surface); }\n',
62
+ 'A.tsx': `const c = "bg-[var(--surface)]";`,
63
+ });
64
+ const r = await migrateTailwindTokens({ dir, write: true });
65
+ const css = read(dir, 'index.css');
66
+ expect(css).not.toContain('--surface');
67
+ expect(css).toContain('background: var(--paper);');
68
+ expect(read(dir, 'A.tsx')).toBe(`const c = "bg-paper";`);
69
+ expect(r.inlinedAliases).toEqual([{ alias: '--surface', target: '--paper' }]);
70
+ });
71
+ it('reports and skips an alias that resolves differently in light and dark', async () => {
72
+ const css = INDEX.replace('}\n', ' --surface: var(--paper);\n}\n') + ":root[data-theme='dark'] {\n --paper: #000;\n --surface: var(--ink);\n}\n";
73
+ const dir = app({ 'index.css': css, 'A.tsx': `const c = "bg-[var(--surface)]";` });
74
+ const r = await migrateTailwindTokens({ dir, write: true });
75
+ expect(read(dir, 'index.css')).toContain('--surface: var(--paper);');
76
+ expect(read(dir, 'A.tsx')).toBe(`const c = "bg-[var(--surface)]";`);
77
+ expect(r.skippedAliases).toEqual([{ alias: '--surface', reason: 'resolves to --paper in light but --ink in dark' }]);
78
+ });
79
+ it('is a dry run by default and idempotent when written', async () => {
80
+ const files = { 'index.css': INDEX, 'A.tsx': `const c = "text-[var(--muted)]";` };
81
+ const dir = app(files);
82
+ const dry = await migrateTailwindTokens({ dir, write: false });
83
+ expect(dry.replacements).toBeGreaterThan(0);
84
+ expect(dry.changes.find((c) => c.file === 'web/src/A.tsx').diff).toContain('+const c = "text-muted";');
85
+ expect(read(dir, 'A.tsx')).toBe(files['A.tsx']);
86
+ expect(read(dir, 'index.css')).toBe(INDEX);
87
+ await migrateTailwindTokens({ dir, write: true });
88
+ const again = await migrateTailwindTokens({ dir, write: true });
89
+ expect(again.changes).toEqual([]);
90
+ });
91
+ it('reports unlayered rules, hex and dark overrides it cannot fix', async () => {
92
+ const css = INDEX + `.card { color: #abc; }\n@layer base { body { margin: 0; } }\n:root[data-theme='dark'] .card { color: red; }\n`;
93
+ const dir = app({ 'index.css': css });
94
+ const r = await migrateTailwindTokens({ dir, write: false });
95
+ const text = r.report.join('\n');
96
+ expect(text).toMatch(/unlayered rule/);
97
+ expect(text).toMatch(/hex value/);
98
+ expect(text).toMatch(/dark override/);
99
+ });
100
+ it('errors without web/src', async () => {
101
+ await expect(migrateTailwindTokens({ dir: mkdtempSync(join(tmpdir(), 'pas-migrate-')), write: false })).rejects.toThrow(/web\/src/);
102
+ });
103
+ // bookkeeper origin/main: 1,690 long-hand uses. Skipped where the sibling clone is absent.
104
+ const clone = join(dirname(fileURLToPath(import.meta.url)), '../../../../apps/bookkeeper');
105
+ const archive = () => {
106
+ try {
107
+ if (!existsSync(join(clone, '.git')))
108
+ return null;
109
+ const dir = mkdtempSync(join(tmpdir(), 'pas-bk-'));
110
+ const tar = execFileSync('git', ['-C', clone, 'archive', 'origin/main', 'web/src'], { maxBuffer: 1 << 28 });
111
+ execFileSync('tar', ['-x', '-C', dir], { input: tar });
112
+ return dir;
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ };
118
+ const bk = archive();
119
+ it.skipIf(!bk)('migrates a copy of bookkeeper web/src: long-hand gone, mapped tokens only, idempotent', async () => {
120
+ const countLong = () => execFileSync('sh', ['-c', `grep -rhoE '[a-z-]+-\\[var\\(--[a-z-]+\\)\\]' web/src | wc -l`], { cwd: bk }).toString().trim();
121
+ const before = Number(countLong());
122
+ expect(before).toBeGreaterThan(1000);
123
+ const dry = await migrateTailwindTokens({ dir: bk, write: false });
124
+ expect(dry.replacements).toBeGreaterThan(1000);
125
+ expect(Number(countLong())).toBe(before);
126
+ const r = await migrateTailwindTokens({ dir: bk, write: true });
127
+ expect(r.themeInserted).toBe(true);
128
+ // What stays is exactly what the #492 mapping has no entry for: four bookkeeper-only
129
+ // tokens, reported; and `accent-[var(--accent)]` (the form-control utility, not a colour prefix).
130
+ expect(Object.keys(r.unknownTokens).sort()).toEqual(['--accent-hover', '--panel-hover', '--success-soft', '--warning-soft']);
131
+ const rest = execFileSync('sh', ['-c', `grep -rhoE '[a-z-]+-\\[var\\(--[a-z-]+\\)\\]' web/src | sed -E 's/-\\[.*//' | sort | uniq -c`], { cwd: bk }).toString();
132
+ expect(Number(countLong())).toBe(Object.values(r.unknownTokens).reduce((a, b) => a + b, 0) + Number(/(\d+) accent$/m.exec(rest)?.[1] ?? 0));
133
+ expect(r.report.join('\n')).toContain('--panel-hover');
134
+ expect((await migrateTailwindTokens({ dir: bk, write: true })).changes).toEqual([]);
135
+ });
136
+ });
137
+ //# 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": "@proappstore/cli",
3
- "version": "2.6.54",
3
+ "version": "2.6.55",
4
4
  "description": "pas — CLI for publishing paid apps to proappstore.online",
5
5
  "license": "MIT",
6
6
  "type": "module",