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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -0
  3. package/dist/cli/cleanup.d.ts +5 -0
  4. package/dist/cli/cleanup.d.ts.map +1 -0
  5. package/dist/cli/cleanup.js +8 -0
  6. package/dist/cli/cleanup.js.map +1 -0
  7. package/dist/cli/extract.d.ts +3 -0
  8. package/dist/cli/extract.d.ts.map +1 -0
  9. package/dist/cli/extract.js +105 -0
  10. package/dist/cli/extract.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +44 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/install-claude.d.ts +3 -0
  16. package/dist/cli/install-claude.d.ts.map +1 -0
  17. package/dist/cli/install-claude.js +39 -0
  18. package/dist/cli/install-claude.js.map +1 -0
  19. package/dist/cli/report.d.ts +3 -0
  20. package/dist/cli/report.d.ts.map +1 -0
  21. package/dist/cli/report.js +115 -0
  22. package/dist/cli/report.js.map +1 -0
  23. package/dist/cli/tokens.d.ts +3 -0
  24. package/dist/cli/tokens.d.ts.map +1 -0
  25. package/dist/cli/tokens.js +111 -0
  26. package/dist/cli/tokens.js.map +1 -0
  27. package/dist/cli/verify.d.ts +3 -0
  28. package/dist/cli/verify.d.ts.map +1 -0
  29. package/dist/cli/verify.js +95 -0
  30. package/dist/cli/verify.js.map +1 -0
  31. package/dist/extractors/animations.d.ts +6 -0
  32. package/dist/extractors/animations.d.ts.map +1 -0
  33. package/dist/extractors/animations.js +7 -0
  34. package/dist/extractors/animations.js.map +1 -0
  35. package/dist/extractors/assets.d.ts +6 -0
  36. package/dist/extractors/assets.d.ts.map +1 -0
  37. package/dist/extractors/assets.js +7 -0
  38. package/dist/extractors/assets.js.map +1 -0
  39. package/dist/extractors/base.d.ts +13 -0
  40. package/dist/extractors/base.d.ts.map +1 -0
  41. package/dist/extractors/base.js +27 -0
  42. package/dist/extractors/base.js.map +1 -0
  43. package/dist/extractors/behavior.d.ts +6 -0
  44. package/dist/extractors/behavior.d.ts.map +1 -0
  45. package/dist/extractors/behavior.js +7 -0
  46. package/dist/extractors/behavior.js.map +1 -0
  47. package/dist/extractors/components.d.ts +6 -0
  48. package/dist/extractors/components.d.ts.map +1 -0
  49. package/dist/extractors/components.js +7 -0
  50. package/dist/extractors/components.js.map +1 -0
  51. package/dist/extractors/framework.d.ts +6 -0
  52. package/dist/extractors/framework.d.ts.map +1 -0
  53. package/dist/extractors/framework.js +7 -0
  54. package/dist/extractors/framework.js.map +1 -0
  55. package/dist/extractors/layout.d.ts +6 -0
  56. package/dist/extractors/layout.d.ts.map +1 -0
  57. package/dist/extractors/layout.js +7 -0
  58. package/dist/extractors/layout.js.map +1 -0
  59. package/dist/extractors/network.d.ts +6 -0
  60. package/dist/extractors/network.d.ts.map +1 -0
  61. package/dist/extractors/network.js +7 -0
  62. package/dist/extractors/network.js.map +1 -0
  63. package/dist/extractors/orchestrator.d.ts +4 -0
  64. package/dist/extractors/orchestrator.d.ts.map +1 -0
  65. package/dist/extractors/orchestrator.js +96 -0
  66. package/dist/extractors/orchestrator.js.map +1 -0
  67. package/dist/extractors/typography.d.ts +6 -0
  68. package/dist/extractors/typography.d.ts.map +1 -0
  69. package/dist/extractors/typography.js +7 -0
  70. package/dist/extractors/typography.js.map +1 -0
  71. package/dist/extractors/visual.d.ts +6 -0
  72. package/dist/extractors/visual.d.ts.map +1 -0
  73. package/dist/extractors/visual.js +7 -0
  74. package/dist/extractors/visual.js.map +1 -0
  75. package/dist/generators/component-inventory.d.ts +4 -0
  76. package/dist/generators/component-inventory.d.ts.map +1 -0
  77. package/dist/generators/component-inventory.js +218 -0
  78. package/dist/generators/component-inventory.js.map +1 -0
  79. package/dist/generators/design-tokens.d.ts +5 -0
  80. package/dist/generators/design-tokens.d.ts.map +1 -0
  81. package/dist/generators/design-tokens.js +384 -0
  82. package/dist/generators/design-tokens.js.map +1 -0
  83. package/dist/generators/layout-blueprint.d.ts +4 -0
  84. package/dist/generators/layout-blueprint.d.ts.map +1 -0
  85. package/dist/generators/layout-blueprint.js +86 -0
  86. package/dist/generators/layout-blueprint.js.map +1 -0
  87. package/dist/generators/report.d.ts +3 -0
  88. package/dist/generators/report.d.ts.map +1 -0
  89. package/dist/generators/report.js +215 -0
  90. package/dist/generators/report.js.map +1 -0
  91. package/dist/index.d.ts +4 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +3 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/scripts/detect-framework.d.ts +2 -0
  96. package/dist/scripts/detect-framework.d.ts.map +1 -0
  97. package/dist/scripts/detect-framework.js +2 -0
  98. package/dist/scripts/detect-framework.js.map +1 -0
  99. package/dist/scripts/extract-components.d.ts +2 -0
  100. package/dist/scripts/extract-components.d.ts.map +1 -0
  101. package/dist/scripts/extract-components.js +2 -0
  102. package/dist/scripts/extract-components.js.map +1 -0
  103. package/dist/scripts/extract-layout.d.ts +2 -0
  104. package/dist/scripts/extract-layout.d.ts.map +1 -0
  105. package/dist/scripts/extract-layout.js +2 -0
  106. package/dist/scripts/extract-layout.js.map +1 -0
  107. package/dist/scripts/extract-styles.d.ts +2 -0
  108. package/dist/scripts/extract-styles.d.ts.map +1 -0
  109. package/dist/scripts/extract-styles.js +2 -0
  110. package/dist/scripts/extract-styles.js.map +1 -0
  111. package/dist/scripts/extract-typography.d.ts +2 -0
  112. package/dist/scripts/extract-typography.d.ts.map +1 -0
  113. package/dist/scripts/extract-typography.js +2 -0
  114. package/dist/scripts/extract-typography.js.map +1 -0
  115. package/dist/types/config.d.ts +80 -0
  116. package/dist/types/config.d.ts.map +1 -0
  117. package/dist/types/config.js +37 -0
  118. package/dist/types/config.js.map +1 -0
  119. package/dist/types/extraction.d.ts +204 -0
  120. package/dist/types/extraction.d.ts.map +1 -0
  121. package/dist/types/extraction.js +2 -0
  122. package/dist/types/extraction.js.map +1 -0
  123. package/dist/types/index.d.ts +5 -0
  124. package/dist/types/index.d.ts.map +1 -0
  125. package/dist/types/index.js +5 -0
  126. package/dist/types/index.js.map +1 -0
  127. package/dist/types/report.d.ts +18 -0
  128. package/dist/types/report.d.ts.map +1 -0
  129. package/dist/types/report.js +2 -0
  130. package/dist/types/report.js.map +1 -0
  131. package/dist/types/tokens.d.ts +62 -0
  132. package/dist/types/tokens.d.ts.map +1 -0
  133. package/dist/types/tokens.js +2 -0
  134. package/dist/types/tokens.js.map +1 -0
  135. package/dist/utils/color.d.ts +21 -0
  136. package/dist/utils/color.d.ts.map +1 -0
  137. package/dist/utils/color.js +107 -0
  138. package/dist/utils/color.js.map +1 -0
  139. package/dist/utils/css-parser.d.ts +31 -0
  140. package/dist/utils/css-parser.d.ts.map +1 -0
  141. package/dist/utils/css-parser.js +77 -0
  142. package/dist/utils/css-parser.js.map +1 -0
  143. package/dist/utils/dedup.d.ts +12 -0
  144. package/dist/utils/dedup.d.ts.map +1 -0
  145. package/dist/utils/dedup.js +44 -0
  146. package/dist/utils/dedup.js.map +1 -0
  147. package/dist/utils/fs.d.ts +6 -0
  148. package/dist/utils/fs.d.ts.map +1 -0
  149. package/dist/utils/fs.js +17 -0
  150. package/dist/utils/fs.js.map +1 -0
  151. package/dist/utils/screenshot-diff.d.ts +7 -0
  152. package/dist/utils/screenshot-diff.d.ts.map +1 -0
  153. package/dist/utils/screenshot-diff.js +43 -0
  154. package/dist/utils/screenshot-diff.js.map +1 -0
  155. package/package.json +60 -0
@@ -0,0 +1,111 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readFile, writeFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { generateDesignTokens, formatTokens } from '../generators/design-tokens.js';
6
+ const ALL_FORMATS = ['json', 'css', 'tailwind', 'scss'];
7
+ const FORMAT_EXTENSIONS = {
8
+ json: 'tokens.json',
9
+ css: 'tokens.css',
10
+ tailwind: 'tokens.tailwind.ts',
11
+ scss: 'tokens.scss',
12
+ };
13
+ export function createTokensCommand() {
14
+ return new Command('tokens')
15
+ .description('Generate design tokens from extraction data')
16
+ .argument('<dir>', 'Path to extraction output directory')
17
+ .option('--format <type>', 'Output format: json, css, tailwind, scss, all', 'all')
18
+ .option('-o, --output <dir>', 'Output directory (default: same as extraction dir)')
19
+ .action(async (dir, options) => {
20
+ // 1. Read manifest.json
21
+ const manifestPath = join(dir, 'manifest.json');
22
+ let manifest;
23
+ try {
24
+ const raw = await readFile(manifestPath, 'utf-8');
25
+ manifest = JSON.parse(raw);
26
+ }
27
+ catch {
28
+ console.error(chalk.red(`No extraction data found in ${dir}. Run \`designmaxxing extract <url>\` first.`));
29
+ process.exit(1);
30
+ }
31
+ // 2. Resolve file paths from manifest results
32
+ const outputDir = options.output ?? dir;
33
+ function resolveResultPath(key) {
34
+ const filename = manifest.results[key];
35
+ if (!filename)
36
+ return null;
37
+ return join(manifest.outputDir, filename);
38
+ }
39
+ const visualPath = resolveResultPath('visual');
40
+ const typographyPath = resolveResultPath('typography');
41
+ const missing = [];
42
+ if (!visualPath)
43
+ missing.push('visual.json');
44
+ if (!typographyPath)
45
+ missing.push('typography.json');
46
+ if (missing.length > 0) {
47
+ console.error(chalk.red(`Missing required extraction files: ${missing.join(', ')}`));
48
+ console.error(chalk.gray(`Re-run: designmaxxing extract <url> --modules visual,typography`));
49
+ process.exit(1);
50
+ }
51
+ // 3. Read required files
52
+ let visual;
53
+ let typography;
54
+ try {
55
+ visual = JSON.parse(await readFile(visualPath, 'utf-8'));
56
+ }
57
+ catch {
58
+ console.error(chalk.red(`Could not read visual extraction data from: ${visualPath}`));
59
+ process.exit(1);
60
+ }
61
+ try {
62
+ typography = JSON.parse(await readFile(typographyPath, 'utf-8'));
63
+ }
64
+ catch {
65
+ console.error(chalk.red(`Could not read typography extraction data from: ${typographyPath}`));
66
+ process.exit(1);
67
+ }
68
+ // 4. Optionally read layout
69
+ let layout;
70
+ const layoutPath = resolveResultPath('layout');
71
+ if (layoutPath) {
72
+ try {
73
+ layout = JSON.parse(await readFile(layoutPath, 'utf-8'));
74
+ }
75
+ catch {
76
+ // Layout is optional — skip silently
77
+ }
78
+ }
79
+ // 5. Generate tokens
80
+ const tokens = generateDesignTokens(visual, typography, layout);
81
+ // 6. Determine formats to write
82
+ const formatOption = options.format;
83
+ const formats = formatOption === 'all'
84
+ ? ALL_FORMATS
85
+ : formatOption.split(',').map(f => f.trim());
86
+ // 7. Write output files
87
+ const written = [];
88
+ for (const fmt of formats) {
89
+ const content = formatTokens(tokens, fmt);
90
+ const filename = FORMAT_EXTENSIONS[fmt];
91
+ const outPath = join(outputDir, filename);
92
+ await writeFile(outPath, content, 'utf-8');
93
+ written.push(outPath);
94
+ }
95
+ // 8. Print summary
96
+ console.log(chalk.cyan('\n✦ designmaxxing') + chalk.gray(' — tokens generated'));
97
+ console.log(chalk.gray(`\nSource: ${dir}`));
98
+ console.log(chalk.gray('Output files:'));
99
+ for (const p of written) {
100
+ console.log(chalk.white(` ${p}`));
101
+ }
102
+ const colorCount = Object.keys(tokens.colors).length;
103
+ const typographyCount = Object.keys(tokens.typography).length;
104
+ const spacingCount = Object.keys(tokens.spacing).length;
105
+ console.log(chalk.gray(`\nTokens extracted:`));
106
+ console.log(chalk.white(` Colors: ${colorCount}`));
107
+ console.log(chalk.white(` Typography: ${typographyCount}`));
108
+ console.log(chalk.white(` Spacing: ${spacingCount}`));
109
+ });
110
+ }
111
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/cli/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createVerifyCommand(): Command;
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuBnC,wBAAgB,mBAAmB,IAAI,OAAO,CAgG7C"}
@@ -0,0 +1,95 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { chromium } from 'playwright';
5
+ import { mkdir } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import { ZodError } from 'zod';
8
+ import { compareScreenshots } from '../utils/screenshot-diff.js';
9
+ import { registerCleanup } from './cleanup.js';
10
+ import { VerifyConfigSchema } from '../types/config.js';
11
+ export function createVerifyCommand() {
12
+ return new Command('verify')
13
+ .description('Visual regression comparison between original and rebuild')
14
+ .argument('<original-url>', 'Original website URL')
15
+ .argument('<rebuild-url>', 'Your rebuild URL (e.g., http://localhost:3000)')
16
+ .option('--breakpoints <list>', 'Comma-separated viewport widths', '375,768,1024,1280,1536')
17
+ .option('--threshold <ratio>', 'Max acceptable pixel diff ratio (0-1)', '0.02')
18
+ .option('-o, --output <dir>', 'Output directory', './designmaxxing-verify')
19
+ .option('--no-screenshots', 'Skip embedding screenshots in report')
20
+ .action(async (originalUrl, rebuildUrl, options) => {
21
+ let config;
22
+ try {
23
+ config = VerifyConfigSchema.parse({
24
+ originalUrl,
25
+ rebuildUrl,
26
+ breakpoints: options.breakpoints.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n)),
27
+ threshold: parseFloat(options.threshold),
28
+ output: options.output,
29
+ });
30
+ }
31
+ catch (err) {
32
+ if (err instanceof ZodError) {
33
+ console.error(chalk.red('Invalid options:'));
34
+ for (const issue of err.issues)
35
+ console.error(chalk.red(` ${issue.path.join('.')}: ${issue.message}`));
36
+ }
37
+ else {
38
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
39
+ }
40
+ process.exit(1);
41
+ }
42
+ const { breakpoints, threshold, output: outputDir } = config;
43
+ await mkdir(outputDir, { recursive: true });
44
+ const spinner = ora('Launching browser...').start();
45
+ const browser = await chromium.launch({ headless: true });
46
+ registerCleanup(async () => {
47
+ await browser.close();
48
+ spinner.stop();
49
+ });
50
+ const results = [];
51
+ try {
52
+ for (const bp of breakpoints) {
53
+ spinner.text = `Comparing at ${bp}px...`;
54
+ const context = await browser.newContext({ viewport: { width: bp, height: 900 } });
55
+ const page = await context.newPage();
56
+ // Screenshot original
57
+ await page.goto(originalUrl, { waitUntil: 'networkidle', timeout: 30000 });
58
+ const origPath = join(outputDir, `original-${bp}.png`);
59
+ await page.screenshot({ path: origPath, fullPage: true });
60
+ // Screenshot rebuild
61
+ await page.goto(rebuildUrl, { waitUntil: 'networkidle', timeout: 30000 });
62
+ const rebuildPath = join(outputDir, `rebuild-${bp}.png`);
63
+ await page.screenshot({ path: rebuildPath, fullPage: true });
64
+ await context.close();
65
+ // Compare
66
+ const diffPath = join(outputDir, `diff-${bp}.png`);
67
+ const diff = await compareScreenshots(origPath, rebuildPath, diffPath, 0.1);
68
+ const status = diff.diffPercent <= threshold ? 'PASS' :
69
+ diff.diffPercent <= threshold * 2 ? 'NEAR' : 'FAIL';
70
+ results.push({ breakpoint: bp, diffPercent: diff.diffPercent, status });
71
+ }
72
+ // Write comparison.json
73
+ const comparisonPath = join(outputDir, 'comparison.json');
74
+ const { writeFile } = await import('node:fs/promises');
75
+ await writeFile(comparisonPath, JSON.stringify(results, null, 2));
76
+ spinner.succeed('Comparison complete');
77
+ // Print results table
78
+ console.log('\n' + chalk.bold('Breakpoint Diff % Status'));
79
+ console.log(chalk.gray('─'.repeat(35)));
80
+ for (const r of results) {
81
+ const statusColor = r.status === 'PASS' ? chalk.green : r.status === 'NEAR' ? chalk.yellow : chalk.red;
82
+ const pct = (r.diffPercent * 100).toFixed(1);
83
+ console.log(`${String(r.breakpoint).padEnd(12)}${pct.padEnd(10)}${statusColor(r.status)}`);
84
+ }
85
+ console.log(chalk.gray('\nOutput saved to: ') + chalk.white(outputDir));
86
+ }
87
+ catch (err) {
88
+ spinner.fail(chalk.red(err instanceof Error ? err.message : String(err)));
89
+ await browser.close();
90
+ process.exit(1);
91
+ }
92
+ await browser.close();
93
+ });
94
+ }
95
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { AnimationExtractionResult } from '../types/extraction.js';
3
+ export declare class AnimationExtractor extends BaseExtractor<AnimationExtractionResult> {
4
+ extract(): Promise<AnimationExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=animations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.d.ts","sourceRoot":"","sources":["../../src/extractors/animations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAEvE,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,yBAAyB,CAAC;IACxE,OAAO,IAAI,OAAO,CAAC,yBAAyB,CAAC;CAGpD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class AnimationExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('AnimationExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=animations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.js","sourceRoot":"","sources":["../../src/extractors/animations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,kBAAmB,SAAQ,aAAwC;IAC9E,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { AssetExtractionResult } from '../types/extraction.js';
3
+ export declare class AssetExtractor extends BaseExtractor<AssetExtractionResult> {
4
+ extract(): Promise<AssetExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/extractors/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEnE,qBAAa,cAAe,SAAQ,aAAa,CAAC,qBAAqB,CAAC;IAChE,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC;CAGhD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class AssetExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('AssetExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/extractors/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,cAAe,SAAQ,aAAoC;IACtE,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Page } from 'playwright';
2
+ import type { ExtractionConfig } from '../types/config.js';
3
+ export declare abstract class BaseExtractor<TResult> {
4
+ protected page: Page;
5
+ protected config: ExtractionConfig;
6
+ constructor(config: ExtractionConfig);
7
+ abstract extract(): Promise<TResult>;
8
+ protected injectScript<T>(scriptContent: string, args?: unknown): Promise<T>;
9
+ setPage(page: Page): void;
10
+ protected screenshot(name: string): Promise<string>;
11
+ protected setBreakpoint(width: number): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/extractors/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAI1D,8BAAsB,aAAa,CAAC,OAAO;IACzC,SAAS,CAAC,IAAI,EAAG,IAAI,CAAA;IACrB,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAA;gBAEtB,MAAM,EAAE,gBAAgB;IAIpC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;cAEpB,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAOlF,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;cAIT,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAQzC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI5D"}
@@ -0,0 +1,27 @@
1
+ import { join } from 'node:path';
2
+ import { ensureDir } from '../utils/fs.js';
3
+ export class BaseExtractor {
4
+ page;
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async injectScript(scriptContent, args) {
10
+ return this.page.evaluate(new Function('args', scriptContent + '\nreturn __extract(args)'), args);
11
+ }
12
+ setPage(page) {
13
+ this.page = page;
14
+ }
15
+ async screenshot(name) {
16
+ const dir = join(this.config.output, 'screenshots');
17
+ await ensureDir(dir);
18
+ const path = join(dir, `${name}.png`);
19
+ await this.page.screenshot({ path, fullPage: this.config.fullPage });
20
+ return path;
21
+ }
22
+ async setBreakpoint(width) {
23
+ await this.page.setViewportSize({ width, height: this.config.viewport.height });
24
+ await this.page.waitForTimeout(500);
25
+ }
26
+ }
27
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/extractors/base.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,OAAgB,aAAa;IACvB,IAAI,CAAO;IACX,MAAM,CAAkB;IAElC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAIS,KAAK,CAAC,YAAY,CAAI,aAAqB,EAAE,IAAc;QACnE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CACvB,IAAI,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,0BAA0B,CAAyB,EACxF,IAAI,CACL,CAAA;IACH,CAAC;IAED,OAAO,CAAC,IAAU;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,IAAY;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QACnD,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpE,OAAO,IAAI,CAAA;IACb,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,KAAa;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAC/E,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { BehaviorExtractionResult } from '../types/extraction.js';
3
+ export declare class BehaviorExtractor extends BaseExtractor<BehaviorExtractionResult> {
4
+ extract(): Promise<BehaviorExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.d.ts","sourceRoot":"","sources":["../../src/extractors/behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEtE,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,wBAAwB,CAAC;IACtE,OAAO,IAAI,OAAO,CAAC,wBAAwB,CAAC;CAGnD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class BehaviorExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('BehaviorExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.js","sourceRoot":"","sources":["../../src/extractors/behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,iBAAkB,SAAQ,aAAuC;IAC5E,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { ComponentExtractionResult } from '../types/extraction.js';
3
+ export declare class ComponentExtractor extends BaseExtractor<ComponentExtractionResult> {
4
+ extract(): Promise<ComponentExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/extractors/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAEvE,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,yBAAyB,CAAC;IACxE,OAAO,IAAI,OAAO,CAAC,yBAAyB,CAAC;CAGpD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class ComponentExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('ComponentExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/extractors/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,kBAAmB,SAAQ,aAAwC;IAC9E,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { FrameworkDetection } from '../types/extraction.js';
3
+ export declare class FrameworkExtractor extends BaseExtractor<FrameworkDetection> {
4
+ extract(): Promise<FrameworkDetection>;
5
+ }
6
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/extractors/framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAEhE,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,kBAAkB,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAG7C"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class FrameworkExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('FrameworkExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/extractors/framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,kBAAmB,SAAQ,aAAiC;IACvE,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { LayoutExtractionResult } from '../types/extraction.js';
3
+ export declare class LayoutExtractor extends BaseExtractor<LayoutExtractionResult> {
4
+ extract(): Promise<LayoutExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/extractors/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,qBAAa,eAAgB,SAAQ,aAAa,CAAC,sBAAsB,CAAC;IAClE,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAAC;CAGjD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class LayoutExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('LayoutExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/extractors/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,eAAgB,SAAQ,aAAqC;IACxE,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { NetworkExtractionResult } from '../types/extraction.js';
3
+ export declare class NetworkExtractor extends BaseExtractor<NetworkExtractionResult> {
4
+ extract(): Promise<NetworkExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/extractors/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAErE,qBAAa,gBAAiB,SAAQ,aAAa,CAAC,uBAAuB,CAAC;IACpE,OAAO,IAAI,OAAO,CAAC,uBAAuB,CAAC;CAGlD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class NetworkExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('NetworkExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/extractors/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,gBAAiB,SAAQ,aAAsC;IAC1E,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ExtractionConfig } from '../types/config.js';
2
+ import type { ExtractionManifest } from '../types/extraction.js';
3
+ export declare function extractAll(config: ExtractionConfig): Promise<ExtractionManifest>;
4
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/extractors/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,oBAAoB,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,wBAAwB,CAAA;AA+BpF,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2FtF"}
@@ -0,0 +1,96 @@
1
+ import { chromium } from 'playwright';
2
+ import { ensureDir, writeJson } from '../utils/fs.js';
3
+ import { join } from 'node:path';
4
+ function getExtractorLoaders(config) {
5
+ return {
6
+ visual: async () => { const { VisualExtractor } = await import('./visual.js'); return new VisualExtractor(config); },
7
+ typography: async () => { const { TypographyExtractor } = await import('./typography.js'); return new TypographyExtractor(config); },
8
+ layout: async () => { const { LayoutExtractor } = await import('./layout.js'); return new LayoutExtractor(config); },
9
+ components: async () => { const { ComponentExtractor } = await import('./components.js'); return new ComponentExtractor(config); },
10
+ assets: async () => { const { AssetExtractor } = await import('./assets.js'); return new AssetExtractor(config); },
11
+ animations: async () => { const { AnimationExtractor } = await import('./animations.js'); return new AnimationExtractor(config); },
12
+ behavior: async () => { const { BehaviorExtractor } = await import('./behavior.js'); return new BehaviorExtractor(config); },
13
+ framework: async () => { const { FrameworkExtractor } = await import('./framework.js'); return new FrameworkExtractor(config); },
14
+ network: async () => { const { NetworkExtractor } = await import('./network.js'); return new NetworkExtractor(config); },
15
+ };
16
+ }
17
+ export async function extractAll(config) {
18
+ await ensureDir(config.output);
19
+ let browser = null;
20
+ let context = null;
21
+ try {
22
+ browser = await chromium.launch({ headless: config.headless });
23
+ context = await browser.newContext({
24
+ viewport: { width: config.viewport.width, height: config.viewport.height },
25
+ userAgent: config.userAgent,
26
+ });
27
+ // Load auth cookies if provided
28
+ if (config.authCookies) {
29
+ const { readJson } = await import('../utils/fs.js');
30
+ const cookies = await readJson(config.authCookies);
31
+ await context.addCookies(cookies);
32
+ }
33
+ const page = await context.newPage();
34
+ // Start HAR recording if network module enabled
35
+ const recordHar = config.modules.includes('network');
36
+ if (recordHar) {
37
+ await context.tracing.start({ screenshots: false, snapshots: false });
38
+ }
39
+ await page.goto(config.url, { waitUntil: 'networkidle', timeout: config.timeout });
40
+ if (config.waitForSelector) {
41
+ await page.waitForSelector(config.waitForSelector, { timeout: config.timeout });
42
+ }
43
+ const loaders = getExtractorLoaders(config);
44
+ const results = {};
45
+ let frameworkResult = null;
46
+ // Run framework detection first if enabled
47
+ if (config.modules.includes('framework')) {
48
+ const extractor = await loaders.framework();
49
+ extractor.setPage(page);
50
+ const result = await extractor.extract();
51
+ const outputPath = join(config.output, 'framework.json');
52
+ await writeJson(outputPath, result);
53
+ results['framework'] = 'framework.json';
54
+ frameworkResult = result;
55
+ }
56
+ // Run remaining modules
57
+ for (const mod of config.modules) {
58
+ if (mod === 'framework')
59
+ continue;
60
+ const extractor = await loaders[mod]();
61
+ extractor.setPage(page);
62
+ const result = await extractor.extract();
63
+ const filename = `${mod}.json`;
64
+ const outputPath = join(config.output, filename);
65
+ await writeJson(outputPath, result);
66
+ results[mod] = filename;
67
+ }
68
+ // Take screenshots at each breakpoint
69
+ for (const bp of config.breakpoints) {
70
+ await page.setViewportSize({ width: bp, height: config.viewport.height });
71
+ await page.waitForTimeout(500);
72
+ const screenshotDir = join(config.output, 'screenshots');
73
+ await ensureDir(screenshotDir);
74
+ await page.screenshot({
75
+ path: join(screenshotDir, `breakpoint-${bp}.png`),
76
+ fullPage: config.fullPage,
77
+ });
78
+ }
79
+ const manifest = {
80
+ url: config.url,
81
+ timestamp: new Date().toISOString(),
82
+ breakpoints: config.breakpoints,
83
+ modules: [...config.modules],
84
+ outputDir: config.output,
85
+ framework: frameworkResult,
86
+ results,
87
+ };
88
+ await writeJson(join(config.output, 'manifest.json'), manifest);
89
+ return manifest;
90
+ }
91
+ finally {
92
+ await context?.close();
93
+ await browser?.close();
94
+ }
95
+ }
96
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/extractors/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { TypographyExtractionResult } from '../types/extraction.js';
3
+ export declare class TypographyExtractor extends BaseExtractor<TypographyExtractionResult> {
4
+ extract(): Promise<TypographyExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=typography.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typography.d.ts","sourceRoot":"","sources":["../../src/extractors/typography.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAExE,qBAAa,mBAAoB,SAAQ,aAAa,CAAC,0BAA0B,CAAC;IAC1E,OAAO,IAAI,OAAO,CAAC,0BAA0B,CAAC;CAGrD"}
@@ -0,0 +1,7 @@
1
+ import { BaseExtractor } from './base.js';
2
+ export class TypographyExtractor extends BaseExtractor {
3
+ async extract() {
4
+ throw new Error('TypographyExtractor not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=typography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typography.js","sourceRoot":"","sources":["../../src/extractors/typography.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,OAAO,mBAAoB,SAAQ,aAAyC;IAChF,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { BaseExtractor } from './base.js';
2
+ import type { VisualExtractionResult } from '../types/extraction.js';
3
+ export declare class VisualExtractor extends BaseExtractor<VisualExtractionResult> {
4
+ extract(): Promise<VisualExtractionResult>;
5
+ }
6
+ //# sourceMappingURL=visual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual.d.ts","sourceRoot":"","sources":["../../src/extractors/visual.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,qBAAa,eAAgB,SAAQ,aAAa,CAAC,sBAAsB,CAAC;IAClE,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAAC;CAGjD"}