designmaxxing 0.1.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/LICENSE +21 -0
- package/README.md +220 -0
- package/dist/cli/cleanup.d.ts +5 -0
- package/dist/cli/cleanup.d.ts.map +1 -0
- package/dist/cli/cleanup.js +8 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/extract.d.ts +3 -0
- package/dist/cli/extract.d.ts.map +1 -0
- package/dist/cli/extract.js +105 -0
- package/dist/cli/extract.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +44 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install-claude.d.ts +3 -0
- package/dist/cli/install-claude.d.ts.map +1 -0
- package/dist/cli/install-claude.js +39 -0
- package/dist/cli/install-claude.js.map +1 -0
- package/dist/cli/report.d.ts +3 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +115 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/tokens.d.ts +3 -0
- package/dist/cli/tokens.d.ts.map +1 -0
- package/dist/cli/tokens.js +111 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/verify.d.ts +3 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +95 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/extractors/animations.d.ts +6 -0
- package/dist/extractors/animations.d.ts.map +1 -0
- package/dist/extractors/animations.js +7 -0
- package/dist/extractors/animations.js.map +1 -0
- package/dist/extractors/assets.d.ts +6 -0
- package/dist/extractors/assets.d.ts.map +1 -0
- package/dist/extractors/assets.js +7 -0
- package/dist/extractors/assets.js.map +1 -0
- package/dist/extractors/base.d.ts +13 -0
- package/dist/extractors/base.d.ts.map +1 -0
- package/dist/extractors/base.js +27 -0
- package/dist/extractors/base.js.map +1 -0
- package/dist/extractors/behavior.d.ts +6 -0
- package/dist/extractors/behavior.d.ts.map +1 -0
- package/dist/extractors/behavior.js +7 -0
- package/dist/extractors/behavior.js.map +1 -0
- package/dist/extractors/components.d.ts +6 -0
- package/dist/extractors/components.d.ts.map +1 -0
- package/dist/extractors/components.js +7 -0
- package/dist/extractors/components.js.map +1 -0
- package/dist/extractors/framework.d.ts +6 -0
- package/dist/extractors/framework.d.ts.map +1 -0
- package/dist/extractors/framework.js +7 -0
- package/dist/extractors/framework.js.map +1 -0
- package/dist/extractors/layout.d.ts +6 -0
- package/dist/extractors/layout.d.ts.map +1 -0
- package/dist/extractors/layout.js +7 -0
- package/dist/extractors/layout.js.map +1 -0
- package/dist/extractors/network.d.ts +6 -0
- package/dist/extractors/network.d.ts.map +1 -0
- package/dist/extractors/network.js +7 -0
- package/dist/extractors/network.js.map +1 -0
- package/dist/extractors/orchestrator.d.ts +4 -0
- package/dist/extractors/orchestrator.d.ts.map +1 -0
- package/dist/extractors/orchestrator.js +96 -0
- package/dist/extractors/orchestrator.js.map +1 -0
- package/dist/extractors/typography.d.ts +6 -0
- package/dist/extractors/typography.d.ts.map +1 -0
- package/dist/extractors/typography.js +7 -0
- package/dist/extractors/typography.js.map +1 -0
- package/dist/extractors/visual.d.ts +6 -0
- package/dist/extractors/visual.d.ts.map +1 -0
- package/dist/extractors/visual.js +7 -0
- package/dist/extractors/visual.js.map +1 -0
- package/dist/generators/component-inventory.d.ts +4 -0
- package/dist/generators/component-inventory.d.ts.map +1 -0
- package/dist/generators/component-inventory.js +218 -0
- package/dist/generators/component-inventory.js.map +1 -0
- package/dist/generators/design-tokens.d.ts +5 -0
- package/dist/generators/design-tokens.d.ts.map +1 -0
- package/dist/generators/design-tokens.js +384 -0
- package/dist/generators/design-tokens.js.map +1 -0
- package/dist/generators/layout-blueprint.d.ts +4 -0
- package/dist/generators/layout-blueprint.d.ts.map +1 -0
- package/dist/generators/layout-blueprint.js +86 -0
- package/dist/generators/layout-blueprint.js.map +1 -0
- package/dist/generators/report.d.ts +3 -0
- package/dist/generators/report.d.ts.map +1 -0
- package/dist/generators/report.js +215 -0
- package/dist/generators/report.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/detect-framework.d.ts +2 -0
- package/dist/scripts/detect-framework.d.ts.map +1 -0
- package/dist/scripts/detect-framework.js +2 -0
- package/dist/scripts/detect-framework.js.map +1 -0
- package/dist/scripts/extract-components.d.ts +2 -0
- package/dist/scripts/extract-components.d.ts.map +1 -0
- package/dist/scripts/extract-components.js +2 -0
- package/dist/scripts/extract-components.js.map +1 -0
- package/dist/scripts/extract-layout.d.ts +2 -0
- package/dist/scripts/extract-layout.d.ts.map +1 -0
- package/dist/scripts/extract-layout.js +2 -0
- package/dist/scripts/extract-layout.js.map +1 -0
- package/dist/scripts/extract-styles.d.ts +2 -0
- package/dist/scripts/extract-styles.d.ts.map +1 -0
- package/dist/scripts/extract-styles.js +2 -0
- package/dist/scripts/extract-styles.js.map +1 -0
- package/dist/scripts/extract-typography.d.ts +2 -0
- package/dist/scripts/extract-typography.d.ts.map +1 -0
- package/dist/scripts/extract-typography.js +2 -0
- package/dist/scripts/extract-typography.js.map +1 -0
- package/dist/types/config.d.ts +80 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +37 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/extraction.d.ts +204 -0
- package/dist/types/extraction.d.ts.map +1 -0
- package/dist/types/extraction.js +2 -0
- package/dist/types/extraction.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/report.d.ts +18 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/tokens.d.ts +62 -0
- package/dist/types/tokens.d.ts.map +1 -0
- package/dist/types/tokens.js +2 -0
- package/dist/types/tokens.js.map +1 -0
- package/dist/utils/color.d.ts +21 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +107 -0
- package/dist/utils/color.js.map +1 -0
- package/dist/utils/css-parser.d.ts +31 -0
- package/dist/utils/css-parser.d.ts.map +1 -0
- package/dist/utils/css-parser.js +77 -0
- package/dist/utils/css-parser.js.map +1 -0
- package/dist/utils/dedup.d.ts +12 -0
- package/dist/utils/dedup.d.ts.map +1 -0
- package/dist/utils/dedup.js +44 -0
- package/dist/utils/dedup.js.map +1 -0
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +17 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/screenshot-diff.d.ts +7 -0
- package/dist/utils/screenshot-diff.d.ts.map +1 -0
- package/dist/utils/screenshot-diff.js +43 -0
- package/dist/utils/screenshot-diff.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function deduplicateValues(values) {
|
|
2
|
+
const counts = new Map();
|
|
3
|
+
for (const v of values) {
|
|
4
|
+
counts.set(v, (counts.get(v) || 0) + 1);
|
|
5
|
+
}
|
|
6
|
+
return Array.from(counts.entries())
|
|
7
|
+
.map(([value, count]) => ({ value, count }))
|
|
8
|
+
.sort((a, b) => b.count - a.count);
|
|
9
|
+
}
|
|
10
|
+
export function detectScale(values) {
|
|
11
|
+
if (values.length < 3)
|
|
12
|
+
return null;
|
|
13
|
+
const sorted = [...new Set(values)].sort((a, b) => a - b).filter(v => v > 0);
|
|
14
|
+
if (sorted.length < 3)
|
|
15
|
+
return null;
|
|
16
|
+
// Try common bases: 2, 4, 8
|
|
17
|
+
for (const base of [4, 8, 2]) {
|
|
18
|
+
const multipliers = sorted.map(v => v / base);
|
|
19
|
+
const allIntegers = multipliers.every(m => Math.abs(m - Math.round(m)) < 0.01);
|
|
20
|
+
if (allIntegers) {
|
|
21
|
+
return { base, multipliers: multipliers.map(m => Math.round(m)) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Try using the smallest value as base
|
|
25
|
+
const base = sorted[0];
|
|
26
|
+
const multipliers = sorted.map(v => v / base);
|
|
27
|
+
const allClean = multipliers.every(m => Math.abs(m - Math.round(m * 2) / 2) < 0.01);
|
|
28
|
+
if (allClean) {
|
|
29
|
+
return { base, multipliers: multipliers.map(m => Math.round(m * 2) / 2) };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
export function suggestTokenName(value, scale) {
|
|
34
|
+
const index = scale.indexOf(value);
|
|
35
|
+
if (index === -1)
|
|
36
|
+
return value;
|
|
37
|
+
// Use t-shirt sizing for small scales, numeric for larger
|
|
38
|
+
if (scale.length <= 7) {
|
|
39
|
+
const names = ['xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'];
|
|
40
|
+
return names[index] || `${index + 1}`;
|
|
41
|
+
}
|
|
42
|
+
return `${index + 1}`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/utils/dedup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ExtractionConfig } from '../types/config.js';
|
|
2
|
+
export declare function ensureDir(dir: string): Promise<void>;
|
|
3
|
+
export declare function writeJson(path: string, data: unknown): Promise<void>;
|
|
4
|
+
export declare function readJson<T>(path: string): Promise<T>;
|
|
5
|
+
export declare function resolveOutputPath(config: ExtractionConfig, filename: string): string;
|
|
6
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpF"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { mkdir, writeFile, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
export async function ensureDir(dir) {
|
|
4
|
+
await mkdir(dir, { recursive: true });
|
|
5
|
+
}
|
|
6
|
+
export async function writeJson(path, data) {
|
|
7
|
+
await ensureDir(dirname(path));
|
|
8
|
+
await writeFile(path, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
9
|
+
}
|
|
10
|
+
export async function readJson(path) {
|
|
11
|
+
const content = await readFile(path, 'utf-8');
|
|
12
|
+
return JSON.parse(content);
|
|
13
|
+
}
|
|
14
|
+
export function resolveOutputPath(config, filename) {
|
|
15
|
+
return join(config.output, filename);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAa;IACzD,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9B,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAwB,EAAE,QAAgB;IAC1E,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface DiffResult {
|
|
2
|
+
readonly diffPixels: number;
|
|
3
|
+
readonly totalPixels: number;
|
|
4
|
+
readonly diffPercent: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function compareScreenshots(img1Path: string, img2Path: string, diffPath: string, threshold: number): Promise<DiffResult>;
|
|
7
|
+
//# sourceMappingURL=screenshot-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-diff.d.ts","sourceRoot":"","sources":["../../src/utils/screenshot-diff.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import pixelmatch from 'pixelmatch';
|
|
3
|
+
import { PNG } from 'pngjs';
|
|
4
|
+
/**
|
|
5
|
+
* Crops raw RGBA pixel data from srcWidth-wide image to a width×height region.
|
|
6
|
+
* Needed because pixelmatch requires buffers of exactly width*height*4 bytes.
|
|
7
|
+
*/
|
|
8
|
+
function cropImageData(src, srcWidth, width, height) {
|
|
9
|
+
if (srcWidth === width) {
|
|
10
|
+
// No cropping needed in width — just slice the required rows
|
|
11
|
+
return src.subarray(0, width * height * 4);
|
|
12
|
+
}
|
|
13
|
+
const dest = Buffer.alloc(width * height * 4);
|
|
14
|
+
for (let y = 0; y < height; y++) {
|
|
15
|
+
src.copy(dest, y * width * 4, y * srcWidth * 4, y * srcWidth * 4 + width * 4);
|
|
16
|
+
}
|
|
17
|
+
return dest;
|
|
18
|
+
}
|
|
19
|
+
export async function compareScreenshots(img1Path, img2Path, diffPath, threshold) {
|
|
20
|
+
const [buf1, buf2] = await Promise.all([readFile(img1Path), readFile(img2Path)]);
|
|
21
|
+
const img1 = PNG.sync.read(buf1);
|
|
22
|
+
const img2 = PNG.sync.read(buf2);
|
|
23
|
+
// Handle size mismatches — crop pixel data to min dimensions
|
|
24
|
+
const width = Math.min(img1.width, img2.width);
|
|
25
|
+
const height = Math.min(img1.height, img2.height);
|
|
26
|
+
const diff = new PNG({ width, height });
|
|
27
|
+
// pixelmatch requires buffers of exactly width*height*4 bytes.
|
|
28
|
+
// If images differ in size, crop each buffer to the target region.
|
|
29
|
+
const data1 = cropImageData(img1.data, img1.width, width, height);
|
|
30
|
+
const data2 = cropImageData(img2.data, img2.width, width, height);
|
|
31
|
+
const diffPixels = pixelmatch(data1, data2, diff.data, width, height, {
|
|
32
|
+
threshold,
|
|
33
|
+
includeAA: false,
|
|
34
|
+
});
|
|
35
|
+
await writeFile(diffPath, PNG.sync.write(diff));
|
|
36
|
+
const totalPixels = width * height;
|
|
37
|
+
return {
|
|
38
|
+
diffPixels,
|
|
39
|
+
totalPixels,
|
|
40
|
+
diffPercent: diffPixels / totalPixels,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=screenshot-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-diff.js","sourceRoot":"","sources":["../../src/utils/screenshot-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,UAAU,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAE3B;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,QAAgB,EAAE,KAAa,EAAE,MAAc;IACjF,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,6DAA6D;QAC7D,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEhF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEhC,6DAA6D;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAEjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvC,+DAA+D;IAC/D,mEAAmE;IACnE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAEjE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QACpE,SAAS;QACT,SAAS,EAAE,KAAK;KACjB,CAAC,CAAA;IAEF,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAE/C,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAA;IAClC,OAAO;QACL,UAAU;QACV,WAAW;QACX,WAAW,EAAE,UAAU,GAAG,WAAW;KACtC,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "designmaxxing",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pixel-perfect UI reverse engineering toolkit — extract design tokens, components, and layout from any web app",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"designmaxxing": "dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "rm -rf dist && tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"lint": "tsc --noEmit",
|
|
17
|
+
"prepublishOnly": "npm run build && npm run test"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"reverse-engineering",
|
|
21
|
+
"design-tokens",
|
|
22
|
+
"ui",
|
|
23
|
+
"css",
|
|
24
|
+
"playwright",
|
|
25
|
+
"extraction"
|
|
26
|
+
],
|
|
27
|
+
"author": "mercuriumgroup",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/mercuriumgroup/UI-maxxing.git"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"!dist/**/*.test.js",
|
|
39
|
+
"!dist/**/*.test.js.map",
|
|
40
|
+
"!dist/**/*.test.d.ts",
|
|
41
|
+
"!dist/**/*.test.d.ts.map",
|
|
42
|
+
"README.md"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"chalk": "^5.3.0",
|
|
46
|
+
"commander": "^12.0.0",
|
|
47
|
+
"fast-glob": "^3.3.0",
|
|
48
|
+
"ora": "^8.0.0",
|
|
49
|
+
"pixelmatch": "^7.1.0",
|
|
50
|
+
"playwright": "^1.48.0",
|
|
51
|
+
"pngjs": "^7.0.0",
|
|
52
|
+
"zod": "^3.23.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^20.0.0",
|
|
56
|
+
"@types/pngjs": "^6.0.5",
|
|
57
|
+
"typescript": "^5.5.0",
|
|
58
|
+
"vitest": "^2.0.0"
|
|
59
|
+
}
|
|
60
|
+
}
|