@proappstore/cli 2.6.54 → 2.6.56
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/brand.d.ts +26 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +59 -0
- package/dist/brand.js.map +1 -0
- package/dist/brand.test.d.ts +2 -0
- package/dist/brand.test.d.ts.map +1 -0
- package/dist/brand.test.js +52 -0
- package/dist/brand.test.js.map +1 -0
- package/dist/create.test.js +15 -0
- package/dist/create.test.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lettermark.d.ts +11 -8
- package/dist/lettermark.d.ts.map +1 -1
- package/dist/lettermark.js +18 -46
- package/dist/lettermark.js.map +1 -1
- package/dist/lettermark.test.js +18 -37
- package/dist/lettermark.test.js.map +1 -1
- package/dist/migrate-tailwind-tokens.d.ts +32 -0
- package/dist/migrate-tailwind-tokens.d.ts.map +1 -0
- package/dist/migrate-tailwind-tokens.js +412 -0
- package/dist/migrate-tailwind-tokens.js.map +1 -0
- package/dist/migrate-tailwind-tokens.test.d.ts +2 -0
- package/dist/migrate-tailwind-tokens.test.d.ts.map +1 -0
- package/dist/migrate-tailwind-tokens.test.js +137 -0
- package/dist/migrate-tailwind-tokens.test.js.map +1 -0
- package/package.json +2 -2
package/dist/brand.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface BrandIconsResult {
|
|
3
|
+
appName: string;
|
|
4
|
+
write: boolean;
|
|
5
|
+
/** Template-default icons replaced (or that would be). */
|
|
6
|
+
rewritten: string[];
|
|
7
|
+
/** Icons left alone, with why. */
|
|
8
|
+
skipped: {
|
|
9
|
+
path: string;
|
|
10
|
+
reason: string;
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* `pas brand icons` (#505): give an existing app the lettermark of its name in place of the
|
|
15
|
+
* template's icon. Only icons byte-identical to the ones the template shipped are rewritten;
|
|
16
|
+
* custom and absent icons are never touched. icon-192 also serves as the favicon and
|
|
17
|
+
* apple-touch icon, and the template's default og-image is artwork, not the old F, so the
|
|
18
|
+
* set stays consistent. Dry-run unless `write`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function brandIcons(opts: {
|
|
21
|
+
dir: string;
|
|
22
|
+
write: boolean;
|
|
23
|
+
name?: string | undefined;
|
|
24
|
+
}): Promise<BrandIconsResult>;
|
|
25
|
+
export declare const brandCommand: Command;
|
|
26
|
+
//# sourceMappingURL=brand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa5H;AAED,eAAO,MAAM,YAAY,SAA4F,CAAC"}
|
package/dist/brand.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { planIcons, renderLettermarkPng } from './lettermark.js';
|
|
5
|
+
/** The app's display name: the manifest `name`, else package.json `name`, else the directory name. */
|
|
6
|
+
async function appNameFor(dir) {
|
|
7
|
+
for (const file of ['pas.json', 'mcp.json', 'package.json']) {
|
|
8
|
+
try {
|
|
9
|
+
const name = JSON.parse(await readFile(join(dir, file), 'utf8')).name;
|
|
10
|
+
if (typeof name === 'string' && name.trim() && name !== 'APPNAME')
|
|
11
|
+
return name.trim();
|
|
12
|
+
}
|
|
13
|
+
catch { /* try the next file */ }
|
|
14
|
+
}
|
|
15
|
+
return resolve(dir).split(/[\\/]/).pop() ?? 'App';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* `pas brand icons` (#505): give an existing app the lettermark of its name in place of the
|
|
19
|
+
* template's icon. Only icons byte-identical to the ones the template shipped are rewritten;
|
|
20
|
+
* custom and absent icons are never touched. icon-192 also serves as the favicon and
|
|
21
|
+
* apple-touch icon, and the template's default og-image is artwork, not the old F, so the
|
|
22
|
+
* set stays consistent. Dry-run unless `write`.
|
|
23
|
+
*/
|
|
24
|
+
export async function brandIcons(opts) {
|
|
25
|
+
const dir = resolve(opts.dir);
|
|
26
|
+
const appName = opts.name ?? (await appNameFor(dir));
|
|
27
|
+
const result = { appName, write: opts.write, rewritten: [], skipped: [] };
|
|
28
|
+
for (const { path, size, state } of await planIcons(dir)) {
|
|
29
|
+
if (state !== 'template-default') {
|
|
30
|
+
result.skipped.push({ path, reason: state === 'custom' ? 'custom icon, left as is' : 'not present, left as is' });
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (opts.write)
|
|
34
|
+
await writeFile(path, renderLettermarkPng(appName, size));
|
|
35
|
+
result.rewritten.push(path);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
export const brandCommand = new Command('brand').description('Default branding for an app that has not set its own.');
|
|
40
|
+
brandCommand
|
|
41
|
+
.command('icons')
|
|
42
|
+
.description("Replace the template's default icons with the app's lettermark. Dry-run unless --write; custom icons are never touched.")
|
|
43
|
+
.option('--dir <path>', 'app repo root', '.')
|
|
44
|
+
.option('--name <name>', "app name to derive the lettermark from (default: the app's manifest or package.json name)")
|
|
45
|
+
.option('--write', 'apply the changes (default: report what would change)')
|
|
46
|
+
.action(async (opts) => {
|
|
47
|
+
const r = await brandIcons({ dir: opts.dir, write: !!opts.write, name: opts.name });
|
|
48
|
+
const out = process.stdout;
|
|
49
|
+
out.write(`Lettermark source name: ${r.appName}\n`);
|
|
50
|
+
for (const p of r.rewritten)
|
|
51
|
+
out.write(`${r.write ? 'wrote' : 'would write'} ${p}\n`);
|
|
52
|
+
for (const s of r.skipped)
|
|
53
|
+
out.write(`skipped ${s.path}: ${s.reason}\n`);
|
|
54
|
+
if (!r.rewritten.length)
|
|
55
|
+
out.write('No template-default icons to replace.\n');
|
|
56
|
+
else if (!r.write)
|
|
57
|
+
out.write('\nDry run. Re-run with --write to apply.\n');
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.test.d.ts","sourceRoot":"","sources":["../src/brand.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { brandIcons } from './brand.js';
|
|
6
|
+
import { renderLettermarkPng } from './lettermark.js';
|
|
7
|
+
// #505: `pas brand icons` rewrites only template-default icons, and only with --write.
|
|
8
|
+
const FIXTURES = join(__dirname, '..', '..', 'compliance', 'src', '__fixtures__', 'template-icons');
|
|
9
|
+
async function app(icons, name = 'Door Drop') {
|
|
10
|
+
const dir = await mkdtemp(join(tmpdir(), 'brand-'));
|
|
11
|
+
await mkdir(join(dir, 'web', 'public'), { recursive: true });
|
|
12
|
+
await writeFile(join(dir, 'package.json'), JSON.stringify({ name }));
|
|
13
|
+
for (const [f, b] of Object.entries(icons))
|
|
14
|
+
await writeFile(join(dir, 'web', 'public', f), b);
|
|
15
|
+
return dir;
|
|
16
|
+
}
|
|
17
|
+
const png = (dir, f) => readFile(join(dir, 'web', 'public', f));
|
|
18
|
+
describe('pas brand icons (#505)', () => {
|
|
19
|
+
it('is a dry run by default: reports the template-default icons and writes nothing', async () => {
|
|
20
|
+
const f192 = await readFile(join(FIXTURES, 'f-192.png'));
|
|
21
|
+
const dir = await app({ 'icon-192.png': f192, 'icon-512.png': await readFile(join(FIXTURES, 'f-512.png')) });
|
|
22
|
+
const r = await brandIcons({ dir, write: false });
|
|
23
|
+
expect(r.rewritten).toHaveLength(2);
|
|
24
|
+
expect((await png(dir, 'icon-192.png')).equals(f192)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('--write replaces a template-default fixture with the lettermark of the app name, both sizes consistently', async () => {
|
|
27
|
+
const dir = await app({ 'icon-192.png': await readFile(join(FIXTURES, 'f-192.png')), 'icon-512.png': await readFile(join(FIXTURES, 'placeholder-512.png')) });
|
|
28
|
+
const r = await brandIcons({ dir, write: true });
|
|
29
|
+
expect(r.appName).toBe('Door Drop');
|
|
30
|
+
expect((await png(dir, 'icon-192.png')).equals(renderLettermarkPng('Door Drop', 192))).toBe(true);
|
|
31
|
+
expect((await png(dir, 'icon-512.png')).equals(renderLettermarkPng('Door Drop', 512))).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('never touches a custom icon, written or not, and does not create absent ones', async () => {
|
|
34
|
+
const custom = Buffer.from('owner-logo');
|
|
35
|
+
const dir = await app({ 'icon-192.png': custom });
|
|
36
|
+
const r = await brandIcons({ dir, write: true });
|
|
37
|
+
expect(r.rewritten).toEqual([]);
|
|
38
|
+
expect(r.skipped.map((s) => s.reason)).toEqual(['custom icon, left as is', 'not present, left as is']);
|
|
39
|
+
expect((await png(dir, 'icon-192.png')).equals(custom)).toBe(true);
|
|
40
|
+
await expect(png(dir, 'icon-512.png')).rejects.toThrow();
|
|
41
|
+
});
|
|
42
|
+
it('is idempotent: a second --write changes nothing', async () => {
|
|
43
|
+
const dir = await app({ 'icon-192.png': await readFile(join(FIXTURES, 'f-192.png')), 'icon-512.png': await readFile(join(FIXTURES, 'f-512.png')) });
|
|
44
|
+
await brandIcons({ dir, write: true });
|
|
45
|
+
expect((await brandIcons({ dir, write: true })).rewritten).toEqual([]);
|
|
46
|
+
});
|
|
47
|
+
it('takes the name from --name over the manifest', async () => {
|
|
48
|
+
const dir = await app({ 'icon-192.png': await readFile(join(FIXTURES, 'f-192.png')) });
|
|
49
|
+
expect((await brandIcons({ dir, write: false, name: 'Hiring' })).appName).toBe('Hiring');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=brand.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.test.js","sourceRoot":"","sources":["../src/brand.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,uFAAuF;AAEvF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAEpG,KAAK,UAAU,GAAG,CAAC,KAAsC,EAAE,IAAI,GAAG,WAAW;IAC3E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC;AACD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;QACxH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9J,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;QACpJ,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,CAAC,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/create.test.js
CHANGED
|
@@ -10,6 +10,7 @@ vi.mock('node:child_process', () => childProcess);
|
|
|
10
10
|
vi.mock('./og-image.js', () => ({ writeOgImage: vi.fn() }));
|
|
11
11
|
vi.mock('./lettermark.js', () => ({ writeDefaultIcons: vi.fn() }));
|
|
12
12
|
const { createApp } = await import('./create.js');
|
|
13
|
+
const { writeDefaultIcons } = await import('./lettermark.js');
|
|
13
14
|
let cwd;
|
|
14
15
|
let dir;
|
|
15
16
|
beforeEach(() => {
|
|
@@ -61,6 +62,20 @@ describe('pas create provisioning', () => {
|
|
|
61
62
|
description: 'My App',
|
|
62
63
|
});
|
|
63
64
|
});
|
|
65
|
+
it('writes the lettermark icons for the new app on `pas create` (#505)', async () => {
|
|
66
|
+
vi.stubGlobal('fetch', vi.fn(async (url) => {
|
|
67
|
+
if (url.endsWith('/catalogue.json')) {
|
|
68
|
+
return Response.json({ templates: [{
|
|
69
|
+
id: 'template-app', repo: 'proappstore-online/template-app', ref: 'main', status: 'approved', default: true, deprecation: null,
|
|
70
|
+
}] });
|
|
71
|
+
}
|
|
72
|
+
if (url.endsWith('/v1/provision'))
|
|
73
|
+
return Response.json({ appId: 'door-drop', steps: [] });
|
|
74
|
+
throw new Error(`unexpected fetch ${url}`);
|
|
75
|
+
}));
|
|
76
|
+
await createApp('door-drop', { skipInstall: true, skipGit: true, token: 'synthetic-token' });
|
|
77
|
+
expect(writeDefaultIcons).toHaveBeenCalledWith(expect.stringContaining('door-drop'), 'Door Drop');
|
|
78
|
+
});
|
|
64
79
|
it('scaffolds worker/ and registers it in the workspace only with --with-worker (#261)', async () => {
|
|
65
80
|
const catalogue = vi.fn(async (url) => {
|
|
66
81
|
if (url.endsWith('/catalogue.json')) {
|
package/dist/create.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.test.js","sourceRoot":"","sources":["../src/create.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;AAClD,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"create.test.js","sourceRoot":"","sources":["../src/create.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,8 @@ 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 { brandCommand } from './brand.js';
|
|
24
|
+
import { migrateCommand } from './migrate-tailwind-tokens.js';
|
|
23
25
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
24
26
|
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
|
|
25
27
|
const program = new Command();
|
|
@@ -68,6 +70,8 @@ program.addCommand(mcpAuthCommand);
|
|
|
68
70
|
program.addCommand(sourcemapsCommand);
|
|
69
71
|
program.addCommand(marketingCommand);
|
|
70
72
|
program.addCommand(permissionsCommand);
|
|
73
|
+
program.addCommand(migrateCommand);
|
|
74
|
+
program.addCommand(brandCommand);
|
|
71
75
|
program.parseAsync().catch((err) => {
|
|
72
76
|
const msg = err instanceof Error ? err.message : String(err);
|
|
73
77
|
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":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lettermark.d.ts
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
* Deterministic lettermark: one letter for a single word, the first two
|
|
3
|
-
* initials for several (Hiring -> H, DoorDrop / Door Drop / door-drop -> DD).
|
|
4
|
-
*/
|
|
5
|
-
export declare function deriveLettermark(appName: string): string;
|
|
6
|
-
/** Accessible name for the icon: the full app name, never just the initials. */
|
|
7
|
-
export declare function lettermarkLabel(appName: string): string;
|
|
1
|
+
import { ICON_SIZES } from '@proappstore/compliance';
|
|
8
2
|
/** Square full-bleed icon (safe for maskable use): gradient tile, centred lettermark. */
|
|
9
|
-
export declare function renderLettermarkPng(appName: string, size: number): Buffer;
|
|
3
|
+
export declare function renderLettermarkPng(appName: string, size: number, letters?: string): Buffer;
|
|
4
|
+
type IconState = 'missing' | 'template-default' | 'custom';
|
|
5
|
+
export interface IconPlan {
|
|
6
|
+
path: string;
|
|
7
|
+
size: (typeof ICON_SIZES)[number];
|
|
8
|
+
state: IconState;
|
|
9
|
+
}
|
|
10
|
+
/** What each icon in `<dir>/web/public` is: absent, byte-identical to the template's, or the owner's. */
|
|
11
|
+
export declare function planIcons(dir: string): Promise<IconPlan[]>;
|
|
10
12
|
/**
|
|
11
13
|
* Write the derived icons into `<dir>/web/public`. A file is replaced only when
|
|
12
14
|
* absent or byte-identical to the template default, so owner-supplied icons
|
|
13
15
|
* survive. Returns the files written.
|
|
14
16
|
*/
|
|
15
17
|
export declare function writeDefaultIcons(dir: string, appName: string): Promise<string[]>;
|
|
18
|
+
export {};
|
|
16
19
|
//# sourceMappingURL=lettermark.d.ts.map
|
package/dist/lettermark.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lettermark.d.ts","sourceRoot":"","sources":["../src/lettermark.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lettermark.d.ts","sourceRoot":"","sources":["../src/lettermark.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,UAAU,EAAyB,MAAM,yBAAyB,CAAC;AAM9F,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAA4B,GAAG,MAAM,CAkC9G;AAED,KAAK,SAAS,GAAG,SAAS,GAAG,kBAAkB,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,yGAAyG;AACzG,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAShE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASvF"}
|
package/dist/lettermark.js
CHANGED
|
@@ -1,42 +1,11 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
1
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
2
|
import { join } from 'node:path';
|
|
3
|
+
import { deriveLettermark, ICON_SIZES, isTemplateDefaultIcon } from '@proappstore/compliance';
|
|
4
4
|
import { FONT, encodePng } from './og-image.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
192: '068ce0b22606087c2bf67ee3125a7b18522f2ec95a762f5fe2be104fcacc5384',
|
|
8
|
-
512: 'ebe6d029764e050f2d2229d5516dec4d5b7f488ff18961db0c757687247c10a6',
|
|
9
|
-
};
|
|
10
|
-
const ICON_SIZES = [192, 512];
|
|
11
|
-
const STOP_WORDS = new Set(['a', 'an', 'and', 'for', 'in', 'of', 'on', 'the', 'to']);
|
|
12
|
-
/**
|
|
13
|
-
* Deterministic lettermark: one letter for a single word, the first two
|
|
14
|
-
* initials for several (Hiring -> H, DoorDrop / Door Drop / door-drop -> DD).
|
|
15
|
-
*/
|
|
16
|
-
export function deriveLettermark(appName) {
|
|
17
|
-
const ascii = appName.normalize('NFKD').replace(/[̀-ͯ]/g, '');
|
|
18
|
-
const words = ascii
|
|
19
|
-
.replace(/['\u2019]/g, '')
|
|
20
|
-
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
21
|
-
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
22
|
-
.split(/[^A-Za-z0-9]+/)
|
|
23
|
-
.filter(Boolean);
|
|
24
|
-
const meaningful = words.filter((w) => !STOP_WORDS.has(w.toLowerCase()));
|
|
25
|
-
const picked = meaningful.length > 0 ? meaningful : words;
|
|
26
|
-
if (picked.length === 0)
|
|
27
|
-
return 'A';
|
|
28
|
-
return picked
|
|
29
|
-
.slice(0, 2)
|
|
30
|
-
.map((w) => w[0].toUpperCase())
|
|
31
|
-
.join('');
|
|
32
|
-
}
|
|
33
|
-
/** Accessible name for the icon: the full app name, never just the initials. */
|
|
34
|
-
export function lettermarkLabel(appName) {
|
|
35
|
-
return `${appName.trim() || 'App'} app icon`;
|
|
36
|
-
}
|
|
5
|
+
// The letters come from @proappstore/compliance (shared with the admin Worker and the Agent Teams
|
|
6
|
+
// seed); this file renders them to PNG and writes them into an app on disk.
|
|
37
7
|
/** Square full-bleed icon (safe for maskable use): gradient tile, centred lettermark. */
|
|
38
|
-
export function renderLettermarkPng(appName, size) {
|
|
39
|
-
const letters = deriveLettermark(appName);
|
|
8
|
+
export function renderLettermarkPng(appName, size, letters = deriveLettermark(appName)) {
|
|
40
9
|
const pixels = Buffer.alloc(size * size * 4);
|
|
41
10
|
for (let y = 0; y < size; y++) {
|
|
42
11
|
for (let x = 0; x < size; x++) {
|
|
@@ -72,8 +41,16 @@ export function renderLettermarkPng(appName, size) {
|
|
|
72
41
|
}
|
|
73
42
|
return encodePng(size, size, pixels);
|
|
74
43
|
}
|
|
75
|
-
|
|
76
|
-
|
|
44
|
+
/** What each icon in `<dir>/web/public` is: absent, byte-identical to the template's, or the owner's. */
|
|
45
|
+
export async function planIcons(dir) {
|
|
46
|
+
const plans = [];
|
|
47
|
+
for (const size of ICON_SIZES) {
|
|
48
|
+
const path = join(dir, 'web', 'public', `icon-${size}.png`);
|
|
49
|
+
const current = await readFile(path).catch(() => null);
|
|
50
|
+
const state = !current ? 'missing' : isTemplateDefaultIcon(size, current) ? 'template-default' : 'custom';
|
|
51
|
+
plans.push({ path, size, state });
|
|
52
|
+
}
|
|
53
|
+
return plans;
|
|
77
54
|
}
|
|
78
55
|
/**
|
|
79
56
|
* Write the derived icons into `<dir>/web/public`. A file is replaced only when
|
|
@@ -81,16 +58,11 @@ function sha256(buf) {
|
|
|
81
58
|
* survive. Returns the files written.
|
|
82
59
|
*/
|
|
83
60
|
export async function writeDefaultIcons(dir, appName) {
|
|
84
|
-
|
|
85
|
-
await mkdir(publicDir, { recursive: true });
|
|
61
|
+
await mkdir(join(dir, 'web', 'public'), { recursive: true });
|
|
86
62
|
const written = [];
|
|
87
|
-
for (const size of
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (current && sha256(current) !== DEFAULT_ICON_SHA256[size]) {
|
|
91
|
-
// Re-running for the same name is a no-op; anything else is custom branding.
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
63
|
+
for (const { path, size, state } of await planIcons(dir)) {
|
|
64
|
+
if (state === 'custom')
|
|
65
|
+
continue; // re-running for the same name is a no-op; anything else is custom branding
|
|
94
66
|
await writeFile(path, renderLettermarkPng(appName, size));
|
|
95
67
|
written.push(path);
|
|
96
68
|
}
|
package/dist/lettermark.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lettermark.js","sourceRoot":"","sources":["../src/lettermark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lettermark.js","sourceRoot":"","sources":["../src/lettermark.ts"],"names":[],"mappings":"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"}
|
package/dist/lettermark.test.js
CHANGED
|
@@ -2,36 +2,7 @@ import { describe, expect, it } from 'vitest';
|
|
|
2
2
|
import { mkdtemp, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import {
|
|
6
|
-
describe('deriveLettermark', () => {
|
|
7
|
-
it.each([
|
|
8
|
-
['Hiring', 'H'],
|
|
9
|
-
['hiring', 'H'],
|
|
10
|
-
['DoorDrop', 'DD'],
|
|
11
|
-
['doorDrop', 'DD'],
|
|
12
|
-
['Door Drop', 'DD'],
|
|
13
|
-
['door-drop', 'DD'],
|
|
14
|
-
['door_drop', 'DD'],
|
|
15
|
-
[' door drop ', 'DD'],
|
|
16
|
-
['Door.Drop!', 'DD'],
|
|
17
|
-
["Joe's Chess", 'JC'],
|
|
18
|
-
['Pro App Store', 'PA'],
|
|
19
|
-
['The Book of Hours', 'BH'],
|
|
20
|
-
['HTTPServer', 'HS'],
|
|
21
|
-
['Élan', 'E'],
|
|
22
|
-
['2fast', '2'],
|
|
23
|
-
['!!!', 'A'],
|
|
24
|
-
['', 'A'],
|
|
25
|
-
])('%s -> %s', (name, expected) => {
|
|
26
|
-
expect(deriveLettermark(name)).toBe(expected);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
describe('lettermarkLabel', () => {
|
|
30
|
-
it('exposes the full app name', () => {
|
|
31
|
-
expect(lettermarkLabel('Door Drop')).toBe('Door Drop app icon');
|
|
32
|
-
expect(lettermarkLabel('')).toBe('App app icon');
|
|
33
|
-
});
|
|
34
|
-
});
|
|
5
|
+
import { planIcons, renderLettermarkPng, writeDefaultIcons } from './lettermark.js';
|
|
35
6
|
describe('renderLettermarkPng', () => {
|
|
36
7
|
it('is a deterministic square PNG that differs per lettermark', () => {
|
|
37
8
|
const a = renderLettermarkPng('Hiring', 192);
|
|
@@ -43,7 +14,7 @@ describe('renderLettermarkPng', () => {
|
|
|
43
14
|
});
|
|
44
15
|
});
|
|
45
16
|
describe('writeDefaultIcons', () => {
|
|
46
|
-
const
|
|
17
|
+
const FIXTURES = join(__dirname, '..', '..', 'compliance', 'src', '__fixtures__', 'template-icons');
|
|
47
18
|
async function appDir() {
|
|
48
19
|
const dir = await mkdtemp(join(tmpdir(), 'lettermark-'));
|
|
49
20
|
await mkdir(join(dir, 'web', 'public'), { recursive: true });
|
|
@@ -55,13 +26,12 @@ describe('writeDefaultIcons', () => {
|
|
|
55
26
|
const png = await readFile(join(dir, 'web', 'public', 'icon-512.png'));
|
|
56
27
|
expect(png.equals(renderLettermarkPng('Hiring', 512))).toBe(true);
|
|
57
28
|
});
|
|
58
|
-
it(
|
|
29
|
+
it("replaces the template's F and placeholder icons", async () => {
|
|
59
30
|
const dir = await appDir();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
await
|
|
64
|
-
expect(await writeDefaultIcons(dir, 'Hiring')).toContain(join(dir, 'web', 'public', 'icon-192.png'));
|
|
31
|
+
await writeFile(join(dir, 'web', 'public', 'icon-192.png'), await readFile(join(FIXTURES, 'f-192.png')));
|
|
32
|
+
await writeFile(join(dir, 'web', 'public', 'icon-512.png'), await readFile(join(FIXTURES, 'placeholder-512.png')));
|
|
33
|
+
expect(await writeDefaultIcons(dir, 'Hiring')).toHaveLength(2);
|
|
34
|
+
expect((await readFile(join(dir, 'web', 'public', 'icon-192.png'))).equals(renderLettermarkPng('Hiring', 192))).toBe(true);
|
|
65
35
|
});
|
|
66
36
|
it('leaves owner-supplied icons unchanged', async () => {
|
|
67
37
|
const dir = await appDir();
|
|
@@ -72,4 +42,15 @@ describe('writeDefaultIcons', () => {
|
|
|
72
42
|
expect((await readFile(join(dir, 'web', 'public', 'icon-192.png'))).equals(custom)).toBe(true);
|
|
73
43
|
});
|
|
74
44
|
});
|
|
45
|
+
describe('planIcons', () => {
|
|
46
|
+
it('classifies each icon as missing, template-default or custom', async () => {
|
|
47
|
+
const dir = await mkdtemp(join(tmpdir(), 'lettermark-plan-'));
|
|
48
|
+
await mkdir(join(dir, 'web', 'public'), { recursive: true });
|
|
49
|
+
const fixtures = join(__dirname, '..', '..', 'compliance', 'src', '__fixtures__', 'template-icons');
|
|
50
|
+
await writeFile(join(dir, 'web', 'public', 'icon-192.png'), await readFile(join(fixtures, 'f-192.png')));
|
|
51
|
+
expect((await planIcons(dir)).map((p) => p.state)).toEqual(['template-default', 'missing']);
|
|
52
|
+
await writeFile(join(dir, 'web', 'public', 'icon-512.png'), 'mine');
|
|
53
|
+
expect((await planIcons(dir)).map((p) => p.state)).toEqual(['template-default', 'custom']);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
75
56
|
//# sourceMappingURL=lettermark.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lettermark.test.js","sourceRoot":"","sources":["../src/lettermark.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lettermark.test.js","sourceRoot":"","sources":["../src/lettermark.test.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 @@
|
|
|
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.
|
|
3
|
+
"version": "2.6.56",
|
|
4
4
|
"description": "pas — CLI for publishing paid apps to proappstore.online",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"commander": "^12.1.0",
|
|
25
|
-
"@proappstore/compliance": "0.2.
|
|
25
|
+
"@proappstore/compliance": "0.2.25"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.0.0",
|