@specship/specship-linux-arm64 0.28.0 → 0.29.0
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/lib/dist/bin/specship.js +37 -0
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/spec.md +7 -1
- package/lib/dist/design-md/check.d.ts +51 -0
- package/lib/dist/design-md/check.d.ts.map +1 -0
- package/lib/dist/design-md/check.js +335 -0
- package/lib/dist/design-md/check.js.map +1 -0
- package/lib/dist/design-md/css.d.ts +40 -0
- package/lib/dist/design-md/css.d.ts.map +1 -0
- package/lib/dist/design-md/css.js +224 -0
- package/lib/dist/design-md/css.js.map +1 -0
- package/lib/dist/design-md/extract.d.ts +84 -0
- package/lib/dist/design-md/extract.d.ts.map +1 -0
- package/lib/dist/design-md/extract.js +595 -0
- package/lib/dist/design-md/extract.js.map +1 -0
- package/lib/dist/design-md/maintain.d.ts +45 -0
- package/lib/dist/design-md/maintain.d.ts.map +1 -0
- package/lib/dist/design-md/maintain.js +127 -0
- package/lib/dist/design-md/maintain.js.map +1 -0
- package/lib/dist/design-md/render.d.ts +28 -0
- package/lib/dist/design-md/render.d.ts.map +1 -0
- package/lib/dist/design-md/render.js +178 -0
- package/lib/dist/design-md/render.js.map +1 -0
- package/lib/dist/design-md/upkeep.d.ts +48 -0
- package/lib/dist/design-md/upkeep.d.ts.map +1 -0
- package/lib/dist/design-md/upkeep.js +169 -0
- package/lib/dist/design-md/upkeep.js.map +1 -0
- package/lib/dist/design-md/verify.d.ts +65 -0
- package/lib/dist/design-md/verify.d.ts.map +1 -0
- package/lib/dist/design-md/verify.js +311 -0
- package/lib/dist/design-md/verify.js.map +1 -0
- package/lib/dist/installer/gemini-commands.d.ts.map +1 -1
- package/lib/dist/installer/gemini-commands.js +7 -0
- package/lib/dist/installer/gemini-commands.js.map +1 -1
- package/lib/dist/installer/targets/claude.d.ts +1 -1
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +7 -2
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/skills/design-md/SKILL.md +172 -0
- package/lib/dist/skills/design-md/references/authored-sections.md +90 -0
- package/lib/dist/skills/design-md/references/sources.md +71 -0
- package/lib/dist/spec-quality/postcheck.d.ts +7 -1
- package/lib/dist/spec-quality/postcheck.d.ts.map +1 -1
- package/lib/dist/spec-quality/postcheck.js +31 -0
- package/lib/dist/spec-quality/postcheck.js.map +1 -1
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +34 -5
- package/lib/dist/workflows/defaults/spec-implement.yaml +16 -0
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic design-value extraction for design.md (DESIGNMD-DOC,
|
|
4
|
+
* REQ-DESIGNMD-001).
|
|
5
|
+
*
|
|
6
|
+
* A low-end model asked to read a 2,000-line design snapshot rounds values,
|
|
7
|
+
* invents near-miss colors and misses state rules. This module does that
|
|
8
|
+
* reading in code instead: every custom property, every rule, every literal
|
|
9
|
+
* value, counted and attributed to the selectors that use it. Nothing here
|
|
10
|
+
* interprets the design — it records what is written.
|
|
11
|
+
*
|
|
12
|
+
* Sources: Claude Design snapshots (`.html` + the local stylesheets they
|
|
13
|
+
* link), plain `.css`, Figma code exports (`.tsx` / `.jsx`), and Figma
|
|
14
|
+
* variables exports (`.json`).
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.splitTopLevel = exports.OUTLINE_LIMIT = exports.DesignSourceError = exports.INVENTORY_KINDS = void 0;
|
|
51
|
+
exports.colorLiterals = colorLiterals;
|
|
52
|
+
exports.extractDesign = extractDesign;
|
|
53
|
+
const crypto = __importStar(require("crypto"));
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const css_1 = require("./css");
|
|
57
|
+
Object.defineProperty(exports, "splitTopLevel", { enumerable: true, get: function () { return css_1.splitTopLevel; } });
|
|
58
|
+
exports.INVENTORY_KINDS = [
|
|
59
|
+
'Colors',
|
|
60
|
+
'Font families',
|
|
61
|
+
'Font sizes',
|
|
62
|
+
'Font weights',
|
|
63
|
+
'Line heights',
|
|
64
|
+
'Letter spacing',
|
|
65
|
+
'Spacing',
|
|
66
|
+
'Sizes',
|
|
67
|
+
'Radii',
|
|
68
|
+
'Borders',
|
|
69
|
+
'Shadows',
|
|
70
|
+
'Motion',
|
|
71
|
+
'Opacity',
|
|
72
|
+
'Z-index',
|
|
73
|
+
'Breakpoints',
|
|
74
|
+
];
|
|
75
|
+
class DesignSourceError extends Error {
|
|
76
|
+
}
|
|
77
|
+
exports.DesignSourceError = DesignSourceError;
|
|
78
|
+
/** Max outline lines — the verbatim snapshot carries the rest. */
|
|
79
|
+
exports.OUTLINE_LIMIT = 3000;
|
|
80
|
+
const COLOR_RE = /#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{4}|[0-9a-fA-F]{3})\b|\b(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color)\([^()]*(?:\([^()]*\)[^()]*)*\)/g;
|
|
81
|
+
/** Every color literal written in a value, in order. */
|
|
82
|
+
function colorLiterals(value) {
|
|
83
|
+
return (value.match(COLOR_RE) ?? []).map((c) => (0, css_1.collapse)(c));
|
|
84
|
+
}
|
|
85
|
+
function sha256(buf) {
|
|
86
|
+
return crypto.createHash('sha256').update(buf).digest('hex');
|
|
87
|
+
}
|
|
88
|
+
function toProjectPath(abs, projectRoot) {
|
|
89
|
+
const rel = path.relative(projectRoot, abs);
|
|
90
|
+
return (rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel : abs).split(path.sep).join('/');
|
|
91
|
+
}
|
|
92
|
+
function kindOf(file) {
|
|
93
|
+
const ext = path.extname(file).toLowerCase();
|
|
94
|
+
if (ext === '.html' || ext === '.htm')
|
|
95
|
+
return 'html';
|
|
96
|
+
if (ext === '.css')
|
|
97
|
+
return 'css';
|
|
98
|
+
if (ext === '.json')
|
|
99
|
+
return 'variables';
|
|
100
|
+
return 'code';
|
|
101
|
+
}
|
|
102
|
+
/** Property → inventory, for the properties whose whole value is the token. */
|
|
103
|
+
function inventoryFor(property) {
|
|
104
|
+
if (property === 'font-family')
|
|
105
|
+
return 'Font families';
|
|
106
|
+
if (property === 'font-size')
|
|
107
|
+
return 'Font sizes';
|
|
108
|
+
if (property === 'font-weight')
|
|
109
|
+
return 'Font weights';
|
|
110
|
+
if (property === 'line-height')
|
|
111
|
+
return 'Line heights';
|
|
112
|
+
if (property === 'letter-spacing')
|
|
113
|
+
return 'Letter spacing';
|
|
114
|
+
if (/^(margin|padding|gap|row-gap|column-gap|inset|top|right|bottom|left)(-|$)/.test(property))
|
|
115
|
+
return 'Spacing';
|
|
116
|
+
if (/^(width|height|min-width|max-width|min-height|max-height|flex-basis|inline-size|block-size)$/.test(property))
|
|
117
|
+
return 'Sizes';
|
|
118
|
+
if (/^border(-[a-z]+)*-radius$/.test(property))
|
|
119
|
+
return 'Radii';
|
|
120
|
+
if (/^(border|outline)(-(top|right|bottom|left|width|style))?$/.test(property))
|
|
121
|
+
return 'Borders';
|
|
122
|
+
if (property === 'box-shadow' || property === 'text-shadow')
|
|
123
|
+
return 'Shadows';
|
|
124
|
+
if (/^(transition|animation)(-|$)/.test(property))
|
|
125
|
+
return 'Motion';
|
|
126
|
+
if (property === 'opacity')
|
|
127
|
+
return 'Opacity';
|
|
128
|
+
if (property === 'z-index')
|
|
129
|
+
return 'Z-index';
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
class Inventory {
|
|
133
|
+
entries = new Map();
|
|
134
|
+
add(value, by) {
|
|
135
|
+
const e = this.entries.get(value) ?? { count: 0, usedBy: new Set() };
|
|
136
|
+
e.count++;
|
|
137
|
+
e.usedBy.add(by);
|
|
138
|
+
this.entries.set(value, e);
|
|
139
|
+
}
|
|
140
|
+
list() {
|
|
141
|
+
return [...this.entries.entries()]
|
|
142
|
+
.map(([value, e]) => ({ value, count: e.count, usedBy: [...e.usedBy].sort() }))
|
|
143
|
+
.sort((a, b) => b.count - a.count || (a.value < b.value ? -1 : a.value > b.value ? 1 : 0));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
class Collector {
|
|
147
|
+
projectRoot;
|
|
148
|
+
sources = [];
|
|
149
|
+
customProperties = [];
|
|
150
|
+
variables = [];
|
|
151
|
+
rules = [];
|
|
152
|
+
keyframes = [];
|
|
153
|
+
fontFaces = [];
|
|
154
|
+
fontLinks = new Set();
|
|
155
|
+
inventories = new Map(exports.INVENTORY_KINDS.map((k) => [k, new Inventory()]));
|
|
156
|
+
utilities = new Inventory();
|
|
157
|
+
assets = new Inventory();
|
|
158
|
+
outline = [];
|
|
159
|
+
outlineTruncated = false;
|
|
160
|
+
missingLinks = new Set();
|
|
161
|
+
seen = new Set();
|
|
162
|
+
constructor(projectRoot) {
|
|
163
|
+
this.projectRoot = projectRoot;
|
|
164
|
+
}
|
|
165
|
+
inv(kind) {
|
|
166
|
+
return this.inventories.get(kind);
|
|
167
|
+
}
|
|
168
|
+
/** Register a source file once; returns its text, or null when already read. */
|
|
169
|
+
read(abs, kind) {
|
|
170
|
+
const key = path.resolve(abs);
|
|
171
|
+
if (this.seen.has(key))
|
|
172
|
+
return null;
|
|
173
|
+
let buf;
|
|
174
|
+
try {
|
|
175
|
+
buf = fs.readFileSync(key);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
throw new DesignSourceError(`cannot read design source ${toProjectPath(key, this.projectRoot)}: ${err instanceof Error ? err.message : String(err)}`);
|
|
179
|
+
}
|
|
180
|
+
this.seen.add(key);
|
|
181
|
+
this.sources.push({ path: toProjectPath(key, this.projectRoot), sha256: sha256(buf), kind });
|
|
182
|
+
return buf.toString('utf-8');
|
|
183
|
+
}
|
|
184
|
+
declaration(decl, by, media) {
|
|
185
|
+
for (const c of colorLiterals(decl.value))
|
|
186
|
+
this.inv('Colors').add(c, by);
|
|
187
|
+
const kind = inventoryFor(decl.property);
|
|
188
|
+
if (kind)
|
|
189
|
+
this.inv(kind).add(decl.value, by);
|
|
190
|
+
for (const m of decl.value.matchAll(/url\(\s*(['"]?)([^'")]+)\1\s*\)/g)) {
|
|
191
|
+
if (!m[2].startsWith('data:'))
|
|
192
|
+
this.assets.add(m[2], by);
|
|
193
|
+
}
|
|
194
|
+
if (decl.property.startsWith('--')) {
|
|
195
|
+
this.customProperties.push({ selector: by, name: decl.property, value: decl.value, ...(media ? { media } : {}) });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
css(text, origin) {
|
|
199
|
+
const parsed = (0, css_1.parseCss)(text);
|
|
200
|
+
for (const rule of parsed.rules) {
|
|
201
|
+
this.rules.push(rule);
|
|
202
|
+
for (const decl of rule.declarations)
|
|
203
|
+
this.declaration(decl, rule.selector, rule.media);
|
|
204
|
+
if (rule.media)
|
|
205
|
+
this.breakpoints(rule.media);
|
|
206
|
+
}
|
|
207
|
+
for (const kf of parsed.keyframes) {
|
|
208
|
+
this.keyframes.push(kf);
|
|
209
|
+
for (const c of colorLiterals(kf.body))
|
|
210
|
+
this.inv('Colors').add(c, `@keyframes ${kf.name}`);
|
|
211
|
+
}
|
|
212
|
+
for (const face of parsed.fontFaces) {
|
|
213
|
+
this.fontFaces.push(face);
|
|
214
|
+
for (const d of face) {
|
|
215
|
+
for (const m of d.value.matchAll(/url\(\s*(['"]?)([^'")]+)\1\s*\)/g)) {
|
|
216
|
+
if (!m[2].startsWith('data:'))
|
|
217
|
+
this.assets.add(m[2], '@font-face');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
for (const imp of parsed.imports) {
|
|
222
|
+
const url = /url\(\s*(['"]?)([^'")]+)\1\s*\)|(['"])([^'"]+)\3/.exec(imp);
|
|
223
|
+
const target = url?.[2] ?? url?.[4];
|
|
224
|
+
if (target && /^https?:/.test(target))
|
|
225
|
+
this.fontLinks.add(target);
|
|
226
|
+
else if (target && origin)
|
|
227
|
+
this.linked(path.resolve(path.dirname(origin), target));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
breakpoints(media) {
|
|
231
|
+
for (const m of media.matchAll(/\(\s*((?:min|max)-(?:width|height)|width|height)\s*(?::|[<>]=?)\s*([^)]+)\)/g)) {
|
|
232
|
+
this.inv('Breakpoints').add((0, css_1.collapse)(m[0]), media);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** A stylesheet referenced by another source: record it as missing instead of failing. */
|
|
236
|
+
linked(abs) {
|
|
237
|
+
if (!fs.existsSync(abs)) {
|
|
238
|
+
this.missingLinks.add(toProjectPath(abs, this.projectRoot));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
this.file(abs);
|
|
242
|
+
}
|
|
243
|
+
file(abs) {
|
|
244
|
+
const kind = kindOf(abs);
|
|
245
|
+
const text = this.read(abs, kind);
|
|
246
|
+
if (text === null)
|
|
247
|
+
return;
|
|
248
|
+
if (kind === 'html')
|
|
249
|
+
this.html(text, abs);
|
|
250
|
+
else if (kind === 'css')
|
|
251
|
+
this.css(text, abs);
|
|
252
|
+
else if (kind === 'variables')
|
|
253
|
+
this.variablesJson(text, abs);
|
|
254
|
+
else
|
|
255
|
+
this.code(text, toProjectPath(abs, this.projectRoot));
|
|
256
|
+
}
|
|
257
|
+
html(text, abs) {
|
|
258
|
+
for (const m of text.matchAll(/<style\b[^>]*>([\s\S]*?)<\/style>/gi))
|
|
259
|
+
this.css(m[1], abs);
|
|
260
|
+
for (const m of text.matchAll(/<link\b[^>]*>/gi)) {
|
|
261
|
+
const tag = m[0];
|
|
262
|
+
const href = attr(tag, 'href');
|
|
263
|
+
if (!href)
|
|
264
|
+
continue;
|
|
265
|
+
const rel = (attr(tag, 'rel') ?? '').toLowerCase();
|
|
266
|
+
if (/^(https?:)?\/\//.test(href)) {
|
|
267
|
+
if (rel.includes('stylesheet') || /fonts\.(googleapis|gstatic)|typekit|fonts\./.test(href))
|
|
268
|
+
this.fontLinks.add(href);
|
|
269
|
+
}
|
|
270
|
+
else if (rel.includes('stylesheet')) {
|
|
271
|
+
this.linked(path.resolve(path.dirname(abs), href.split(/[?#]/)[0]));
|
|
272
|
+
}
|
|
273
|
+
else if (rel.includes('icon')) {
|
|
274
|
+
this.assets.add(href, '<link rel=icon>');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
this.markup(text);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Inline styles, image references, inline SVG and the element outline.
|
|
281
|
+
*
|
|
282
|
+
* Each outline line is one element with its own inline declarations in
|
|
283
|
+
* braces, so a design whose styling lives in `style=""` attributes (every
|
|
284
|
+
* React-rendered Claude Design export) keeps each value next to the element
|
|
285
|
+
* it belongs to. Text nodes are their own quoted lines, in document order.
|
|
286
|
+
* Inline SVG is written verbatim on its own outline line: an id-and-lookup
|
|
287
|
+
* scheme let a small model paste the wrong icon (design-md pixel eval).
|
|
288
|
+
*/
|
|
289
|
+
markup(text) {
|
|
290
|
+
const body = text.replace(/<(script|style|template|head|title)\b[\s\S]*?<\/\1>/gi, '').replace(/<!--[\s\S]*?-->/g, '').replace(/<![^>]*>/g, '');
|
|
291
|
+
const VOID = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source', 'track', 'wbr']);
|
|
292
|
+
// <html> stays: a theme class on it (`html.dark`) changes every color.
|
|
293
|
+
const SKIP = new Set(['head', 'meta', 'link', 'title', 'base']);
|
|
294
|
+
let depth = 0;
|
|
295
|
+
let svgUntil = -1;
|
|
296
|
+
const push = (line) => {
|
|
297
|
+
if (this.outline.length < exports.OUTLINE_LIMIT)
|
|
298
|
+
this.outline.push(line);
|
|
299
|
+
else
|
|
300
|
+
this.outlineTruncated = true;
|
|
301
|
+
};
|
|
302
|
+
const tagRe = /<(\/?)([a-zA-Z][\w:-]*)((?:[^>"']|"[^"]*"|'[^']*')*)>|([^<]+)/g;
|
|
303
|
+
for (const m of body.matchAll(tagRe)) {
|
|
304
|
+
if (m.index < svgUntil)
|
|
305
|
+
continue;
|
|
306
|
+
if (m[4] !== undefined) {
|
|
307
|
+
// Collapse runs but keep one edge space: in inline text it renders
|
|
308
|
+
// ("account? " + <a>Sign up</a> — trimming it glued the words).
|
|
309
|
+
const t = decodeEntities(m[4]).replace(/\s+/g, ' ');
|
|
310
|
+
// A whitespace-only node with no newline is a real space between
|
|
311
|
+
// inline siblings (`</span> <span>` in serialized live DOM) and it
|
|
312
|
+
// renders; newline-indented whitespace is source pretty-printing.
|
|
313
|
+
if (t.trim() || (t === ' ' && !/\n/.test(m[4])))
|
|
314
|
+
push(`${' '.repeat(depth)}"${t}"`);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const closing = m[1] === '/';
|
|
318
|
+
const tag = m[2].toLowerCase();
|
|
319
|
+
const attrs = m[3] ?? '';
|
|
320
|
+
if (closing) {
|
|
321
|
+
if (!VOID.has(tag) && !SKIP.has(tag))
|
|
322
|
+
depth = Math.max(0, depth - 1);
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
const selfClosing = /\/\s*$/.test(attrs);
|
|
326
|
+
const label = elementLabel(tag, attrs);
|
|
327
|
+
// Decode before parsing: live DOM serializes quotes as `"`, whose
|
|
328
|
+
// `;` would otherwise end the declaration (`font-family: "`).
|
|
329
|
+
const rawStyle = attr(attrs, 'style');
|
|
330
|
+
const style = rawStyle === null ? null : decodeEntities(rawStyle);
|
|
331
|
+
const decls = style ? (0, css_1.parseDeclarationList)(style) : [];
|
|
332
|
+
if (decls.length > 0) {
|
|
333
|
+
for (const decl of decls)
|
|
334
|
+
this.declaration(decl, `inline ${label}`);
|
|
335
|
+
this.rules.push({ selector: `inline ${label}`, declarations: decls });
|
|
336
|
+
}
|
|
337
|
+
for (const name of ['src', 'srcset', 'poster']) {
|
|
338
|
+
const v = attr(attrs, name);
|
|
339
|
+
if (v && !v.startsWith('data:'))
|
|
340
|
+
for (const part of v.split(','))
|
|
341
|
+
this.assets.add(part.trim().split(/\s+/)[0], label);
|
|
342
|
+
}
|
|
343
|
+
if (SKIP.has(tag))
|
|
344
|
+
continue;
|
|
345
|
+
const styleText = decls.length > 0 ? ` { ${decls.map((d) => `${d.property}: ${d.value};`).join(' ')} }` : '';
|
|
346
|
+
if (tag === 'svg' && !selfClosing) {
|
|
347
|
+
const end = matchingClose(body, m.index, 'svg');
|
|
348
|
+
const markup = (0, css_1.collapse)(body.slice(m.index, end));
|
|
349
|
+
const id = this.svg(markup, label);
|
|
350
|
+
for (const c of colorLiterals(markup))
|
|
351
|
+
this.inv('Colors').add(c, id);
|
|
352
|
+
push(`${' '.repeat(depth)}${label}${styleText} = ${markup}`);
|
|
353
|
+
svgUntil = end;
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
push(`${' '.repeat(depth)}${label}${styleText}`);
|
|
357
|
+
if (!VOID.has(tag) && !selfClosing)
|
|
358
|
+
depth++;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
svgIds = new Map();
|
|
362
|
+
svg(markup, by) {
|
|
363
|
+
const known = this.svgIds.get(markup);
|
|
364
|
+
if (known) {
|
|
365
|
+
known.count++;
|
|
366
|
+
known.usedBy.add(by);
|
|
367
|
+
return known.id;
|
|
368
|
+
}
|
|
369
|
+
const id = `svg-${this.svgIds.size + 1}`;
|
|
370
|
+
this.svgIds.set(markup, { id, usedBy: new Set([by]), count: 1 });
|
|
371
|
+
return id;
|
|
372
|
+
}
|
|
373
|
+
svgList() {
|
|
374
|
+
return [...this.svgIds.entries()].map(([markup, e]) => ({ id: e.id, markup, count: e.count }));
|
|
375
|
+
}
|
|
376
|
+
variablesJson(text, abs) {
|
|
377
|
+
let data;
|
|
378
|
+
try {
|
|
379
|
+
data = JSON.parse(text);
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
throw new DesignSourceError(`design variables ${toProjectPath(abs, this.projectRoot)} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
383
|
+
}
|
|
384
|
+
const visit = (node, prefix) => {
|
|
385
|
+
if (node === null || node === undefined)
|
|
386
|
+
return;
|
|
387
|
+
if (typeof node !== 'object') {
|
|
388
|
+
this.variable(prefix, String(node));
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const obj = node;
|
|
392
|
+
const leaf = obj['$value'] ?? obj['value'];
|
|
393
|
+
if (leaf !== undefined && (typeof leaf !== 'object' || leaf === null)) {
|
|
394
|
+
this.variable(prefix, String(leaf));
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
for (const key of Object.keys(obj)) {
|
|
398
|
+
if (key.startsWith('$'))
|
|
399
|
+
continue;
|
|
400
|
+
visit(obj[key], prefix ? `${prefix}/${key}` : key);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
visit(data, '');
|
|
404
|
+
}
|
|
405
|
+
variable(name, value) {
|
|
406
|
+
if (!name)
|
|
407
|
+
return;
|
|
408
|
+
this.variables.push({ name, value });
|
|
409
|
+
const by = `variable ${name}`;
|
|
410
|
+
for (const c of colorLiterals(value))
|
|
411
|
+
this.inv('Colors').add(c, by);
|
|
412
|
+
const lower = name.toLowerCase();
|
|
413
|
+
const guess = /font.?family|typeface/.test(lower) ? 'Font families'
|
|
414
|
+
: /font.?size|text.?size/.test(lower) ? 'Font sizes'
|
|
415
|
+
: /weight/.test(lower) ? 'Font weights'
|
|
416
|
+
: /line.?height|leading/.test(lower) ? 'Line heights'
|
|
417
|
+
: /letter|tracking/.test(lower) ? 'Letter spacing'
|
|
418
|
+
: /radius|rounded|corner/.test(lower) ? 'Radii'
|
|
419
|
+
: /shadow|elevation/.test(lower) ? 'Shadows'
|
|
420
|
+
: /space|spacing|gap|padding|margin/.test(lower) ? 'Spacing'
|
|
421
|
+
: null;
|
|
422
|
+
if (guess)
|
|
423
|
+
this.inv(guess).add(value, by);
|
|
424
|
+
}
|
|
425
|
+
/** Figma / React code exports: Tailwind arbitrary values, style objects, literals. */
|
|
426
|
+
code(text, file) {
|
|
427
|
+
const lines = text.split('\n');
|
|
428
|
+
lines.forEach((line, idx) => {
|
|
429
|
+
const by = `${file}:${idx + 1}`;
|
|
430
|
+
let rest = line;
|
|
431
|
+
for (const m of line.matchAll(/style=\{\{([^}]*)\}\}/g)) {
|
|
432
|
+
for (const p of m[1].matchAll(/([A-Za-z]+)\s*:\s*(?:'([^']*)'|"([^"]*)"|(-?\d+(?:\.\d+)?))/g)) {
|
|
433
|
+
const property = p[1].replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
|
|
434
|
+
const raw = p[2] ?? p[3] ?? p[4];
|
|
435
|
+
const unitless = /^(opacity|z-index|font-weight|line-height|flex|order)$/.test(property);
|
|
436
|
+
const value = p[4] !== undefined && !unitless && p[4] !== '0' ? `${raw}px` : raw;
|
|
437
|
+
this.declaration({ property, value }, by);
|
|
438
|
+
}
|
|
439
|
+
rest = rest.replace(m[0], ' ');
|
|
440
|
+
}
|
|
441
|
+
for (const cls of classTokens(line)) {
|
|
442
|
+
const arb = /^((?:[a-z]+:)*)(-?[a-z][a-z-]*)-\[([^\]]+)\]$/.exec(cls);
|
|
443
|
+
if (arb) {
|
|
444
|
+
const value = arb[3].replace(/_/g, ' ');
|
|
445
|
+
const kind = tailwindKind(arb[2], value);
|
|
446
|
+
if (kind === 'Colors')
|
|
447
|
+
this.inv('Colors').add(value, by);
|
|
448
|
+
else {
|
|
449
|
+
for (const c of colorLiterals(value))
|
|
450
|
+
this.inv('Colors').add(c, by);
|
|
451
|
+
if (kind)
|
|
452
|
+
this.inv(kind).add(value, by);
|
|
453
|
+
}
|
|
454
|
+
rest = rest.replace(cls, ' ');
|
|
455
|
+
}
|
|
456
|
+
else if (/^[a-z!-][\w:/.!-]*$/.test(cls) && /[-:]/.test(cls)) {
|
|
457
|
+
this.utilities.add(cls, by);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
for (const c of colorLiterals(rest))
|
|
461
|
+
this.inv('Colors').add(c, by);
|
|
462
|
+
for (const m of rest.matchAll(/\b(?:src|href)=["']([^"']+\.(?:png|jpe?g|gif|svg|webp|avif|ico))["']/gi)) {
|
|
463
|
+
this.assets.add(m[1], by);
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/** Index just past the `</tag>` that closes the element opening at `start`. */
|
|
469
|
+
function matchingClose(text, start, tag) {
|
|
470
|
+
const re = new RegExp(`<(/?)${tag}\\b[^>]*?(/?)>`, 'gi');
|
|
471
|
+
re.lastIndex = start;
|
|
472
|
+
let depth = 0;
|
|
473
|
+
for (let m = re.exec(text); m; m = re.exec(text)) {
|
|
474
|
+
if (m[1] === '/')
|
|
475
|
+
depth--;
|
|
476
|
+
else if (m[2] !== '/')
|
|
477
|
+
depth++;
|
|
478
|
+
if (depth === 0)
|
|
479
|
+
return m.index + m[0].length;
|
|
480
|
+
}
|
|
481
|
+
return text.length;
|
|
482
|
+
}
|
|
483
|
+
function decodeEntities(text) {
|
|
484
|
+
return text
|
|
485
|
+
.replace(/ /g, ' ')
|
|
486
|
+
.replace(/</g, '<')
|
|
487
|
+
.replace(/>/g, '>')
|
|
488
|
+
.replace(/"/g, '"')
|
|
489
|
+
.replace(/'|'/g, "'")
|
|
490
|
+
.replace(/&#(\d+);/g, (_, n) => String.fromCodePoint(Number(n)))
|
|
491
|
+
.replace(/&#x([0-9a-f]+);/gi, (_, n) => String.fromCodePoint(parseInt(n, 16)))
|
|
492
|
+
.replace(/&/g, '&');
|
|
493
|
+
}
|
|
494
|
+
function attr(tag, name) {
|
|
495
|
+
const m = new RegExp(`\\s${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`, 'i').exec(` ${tag}`);
|
|
496
|
+
return m ? (m[1] ?? m[2] ?? m[3] ?? '') : null;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* An element as one outline token: tag, id, EVERY class (on a utility-class
|
|
500
|
+
* design each class is a style — truncating them lost `bg-gray-950` and made a
|
|
501
|
+
* small model guess), then the attributes that change what renders.
|
|
502
|
+
*/
|
|
503
|
+
function elementLabel(tag, attrs) {
|
|
504
|
+
const id = attr(attrs, 'id');
|
|
505
|
+
const cls = (attr(attrs, 'class') ?? '').split(/\s+/).filter(Boolean);
|
|
506
|
+
let label = tag;
|
|
507
|
+
if (id)
|
|
508
|
+
label += `#${id}`;
|
|
509
|
+
if (cls.length)
|
|
510
|
+
label += `.${cls.join('.')}`;
|
|
511
|
+
for (const a of ['role', 'aria-label', 'type', 'placeholder', 'value', 'alt', 'aria-selected', 'aria-current', 'aria-expanded']) {
|
|
512
|
+
const v = attr(attrs, a);
|
|
513
|
+
if (v)
|
|
514
|
+
label += `[${a}=${JSON.stringify(decodeEntities(v))}]`;
|
|
515
|
+
}
|
|
516
|
+
// Boolean attributes, tested with quoted values removed so a class named
|
|
517
|
+
// "disabled" doesn't count.
|
|
518
|
+
const bare = ` ${attrs.replace(/"[^"]*"|'[^']*'/g, '""')}`;
|
|
519
|
+
for (const flag of ['disabled', 'checked', 'selected', 'readonly']) {
|
|
520
|
+
if (new RegExp(`\\s${flag}(\\s|=|/|$)`, 'i').test(bare))
|
|
521
|
+
label += `[${flag}]`;
|
|
522
|
+
}
|
|
523
|
+
return label;
|
|
524
|
+
}
|
|
525
|
+
/** Class-like tokens from `className="…"` / `class="…"` and template strings. */
|
|
526
|
+
function classTokens(line) {
|
|
527
|
+
const out = [];
|
|
528
|
+
for (const m of line.matchAll(/class(?:Name)?\s*=\s*(?:\{\s*)?(?:"([^"]*)"|'([^']*)'|`([^`]*)`)/g)) {
|
|
529
|
+
out.push(...(m[1] ?? m[2] ?? m[3] ?? '').split(/\s+/).filter(Boolean));
|
|
530
|
+
}
|
|
531
|
+
return out;
|
|
532
|
+
}
|
|
533
|
+
function tailwindKind(prefix, value) {
|
|
534
|
+
const isColor = colorLiterals(value).length > 0 && colorLiterals(value)[0] === value;
|
|
535
|
+
const p = prefix.replace(/^-/, '');
|
|
536
|
+
if (/^(bg|from|via|to|fill|stroke|ring|outline|accent|caret|decoration|divide|placeholder)$/.test(p))
|
|
537
|
+
return isColor ? 'Colors' : null;
|
|
538
|
+
if (p === 'text')
|
|
539
|
+
return isColor ? 'Colors' : 'Font sizes';
|
|
540
|
+
if (p === 'border' || /^border-[trblxy]$/.test(p))
|
|
541
|
+
return isColor ? 'Colors' : 'Borders';
|
|
542
|
+
if (/^(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|space-x|space-y|top|right|bottom|left|inset|inset-x|inset-y)$/.test(p))
|
|
543
|
+
return 'Spacing';
|
|
544
|
+
if (/^(w|h|min-w|max-w|min-h|max-h|size|basis)$/.test(p))
|
|
545
|
+
return 'Sizes';
|
|
546
|
+
if (/^rounded(-[a-z]+)?$/.test(p))
|
|
547
|
+
return 'Radii';
|
|
548
|
+
if (p === 'shadow')
|
|
549
|
+
return isColor ? 'Colors' : 'Shadows';
|
|
550
|
+
if (p === 'leading')
|
|
551
|
+
return 'Line heights';
|
|
552
|
+
if (p === 'tracking')
|
|
553
|
+
return 'Letter spacing';
|
|
554
|
+
if (p === 'font')
|
|
555
|
+
return /^\d+$/.test(value) ? 'Font weights' : 'Font families';
|
|
556
|
+
if (/^(duration|delay|ease|transition|animate)$/.test(p))
|
|
557
|
+
return 'Motion';
|
|
558
|
+
if (p === 'opacity')
|
|
559
|
+
return 'Opacity';
|
|
560
|
+
if (p === 'z')
|
|
561
|
+
return 'Z-index';
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Extract every literal visual value from the given sources. Paths resolve
|
|
566
|
+
* against `projectRoot`. Throws `DesignSourceError` when a source is missing
|
|
567
|
+
* or unreadable — the caller writes nothing in that case (REQ-DESIGNMD-001.A6).
|
|
568
|
+
*/
|
|
569
|
+
function extractDesign(paths, opts) {
|
|
570
|
+
if (paths.length === 0)
|
|
571
|
+
throw new DesignSourceError('no design source given');
|
|
572
|
+
const c = new Collector(opts.projectRoot);
|
|
573
|
+
for (const p of paths)
|
|
574
|
+
c.file(path.resolve(opts.projectRoot, p));
|
|
575
|
+
const inventories = {};
|
|
576
|
+
for (const k of exports.INVENTORY_KINDS)
|
|
577
|
+
inventories[k] = c.inv(k).list();
|
|
578
|
+
return {
|
|
579
|
+
sources: c.sources,
|
|
580
|
+
customProperties: c.customProperties,
|
|
581
|
+
variables: c.variables,
|
|
582
|
+
rules: c.rules,
|
|
583
|
+
keyframes: c.keyframes,
|
|
584
|
+
fontFaces: c.fontFaces,
|
|
585
|
+
fontLinks: [...c.fontLinks].sort(),
|
|
586
|
+
inventories,
|
|
587
|
+
utilityClasses: c.utilities.list(),
|
|
588
|
+
assets: c.assets.list(),
|
|
589
|
+
outline: c.outline,
|
|
590
|
+
svgs: c.svgList(),
|
|
591
|
+
outlineTruncated: c.outlineTruncated,
|
|
592
|
+
missingLinks: [...c.missingLinks].sort(),
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/design-md/extract.ts"],"names":[],"mappings":"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"}
|