@daviesayo/mise-en-scene 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/dist/commands/clean.d.ts +7 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +54 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +30 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/gallery.d.ts +2 -0
- package/dist/commands/gallery.d.ts.map +1 -0
- package/dist/commands/gallery.js +23 -0
- package/dist/commands/gallery.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +25 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/stop.d.ts +6 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +18 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/taste.d.ts +7 -0
- package/dist/commands/taste.d.ts.map +1 -0
- package/dist/commands/taste.js +33 -0
- package/dist/commands/taste.js.map +1 -0
- package/dist/config-writer.d.ts +2 -0
- package/dist/config-writer.d.ts.map +1 -0
- package/dist/config-writer.js +33 -0
- package/dist/config-writer.js.map +1 -0
- package/dist/detect-platform.d.ts +16 -0
- package/dist/detect-platform.d.ts.map +1 -0
- package/dist/detect-platform.js +41 -0
- package/dist/detect-platform.js.map +1 -0
- package/dist/hooks-installer.d.ts +8 -0
- package/dist/hooks-installer.d.ts.map +1 -0
- package/dist/hooks-installer.js +62 -0
- package/dist/hooks-installer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold.d.ts +2 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +38 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/server/export/index.d.ts +10 -0
- package/dist/server/export/index.d.ts.map +1 -0
- package/dist/server/export/index.js +65 -0
- package/dist/server/export/index.js.map +1 -0
- package/dist/server/export/pdf-export.d.ts +8 -0
- package/dist/server/export/pdf-export.d.ts.map +1 -0
- package/dist/server/export/pdf-export.js +17 -0
- package/dist/server/export/pdf-export.js.map +1 -0
- package/dist/server/export/presets.d.ts +4 -0
- package/dist/server/export/presets.d.ts.map +1 -0
- package/dist/server/export/presets.js +22 -0
- package/dist/server/export/presets.js.map +1 -0
- package/dist/server/export/puppeteer-manager.d.ts +8 -0
- package/dist/server/export/puppeteer-manager.d.ts.map +1 -0
- package/dist/server/export/puppeteer-manager.js +24 -0
- package/dist/server/export/puppeteer-manager.js.map +1 -0
- package/dist/server/export/raster-export.d.ts +11 -0
- package/dist/server/export/raster-export.d.ts.map +1 -0
- package/dist/server/export/raster-export.js +28 -0
- package/dist/server/export/raster-export.js.map +1 -0
- package/dist/server/export/svg-export.d.ts +2 -0
- package/dist/server/export/svg-export.d.ts.map +1 -0
- package/dist/server/export/svg-export.js +17 -0
- package/dist/server/export/svg-export.js.map +1 -0
- package/dist/server/feedback.d.ts +4 -0
- package/dist/server/feedback.d.ts.map +1 -0
- package/dist/server/feedback.js +29 -0
- package/dist/server/feedback.js.map +1 -0
- package/dist/server/http-server.d.ts +19 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +199 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +44 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +433 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +248 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/preview.d.ts +2 -0
- package/dist/server/preview.d.ts.map +1 -0
- package/dist/server/preview.js +15 -0
- package/dist/server/preview.js.map +1 -0
- package/dist/server/screenshot.d.ts +7 -0
- package/dist/server/screenshot.d.ts.map +1 -0
- package/dist/server/screenshot.js +23 -0
- package/dist/server/screenshot.js.map +1 -0
- package/dist/server/serve.d.ts +3 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +39 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/types.d.ts +84 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/typography/analyze-url.d.ts +10 -0
- package/dist/server/typography/analyze-url.d.ts.map +1 -0
- package/dist/server/typography/analyze-url.js +28 -0
- package/dist/server/typography/analyze-url.js.map +1 -0
- package/dist/server/typography/classify.d.ts +9 -0
- package/dist/server/typography/classify.d.ts.map +1 -0
- package/dist/server/typography/classify.js +15 -0
- package/dist/server/typography/classify.js.map +1 -0
- package/dist/server/typography/embed.d.ts +5 -0
- package/dist/server/typography/embed.d.ts.map +1 -0
- package/dist/server/typography/embed.js +34 -0
- package/dist/server/typography/embed.js.map +1 -0
- package/dist/server/typography/mood-match.d.ts +3 -0
- package/dist/server/typography/mood-match.d.ts.map +1 -0
- package/dist/server/typography/mood-match.js +21 -0
- package/dist/server/typography/mood-match.js.map +1 -0
- package/dist/server/typography/registry.d.ts +23 -0
- package/dist/server/typography/registry.d.ts.map +1 -0
- package/dist/server/typography/registry.js +93 -0
- package/dist/server/typography/registry.js.map +1 -0
- package/dist/server/typography/scale.d.ts +3 -0
- package/dist/server/typography/scale.d.ts.map +1 -0
- package/dist/server/typography/scale.js +43 -0
- package/dist/server/typography/scale.js.map +1 -0
- package/dist/server/typography/suggest.d.ts +9 -0
- package/dist/server/typography/suggest.d.ts.map +1 -0
- package/dist/server/typography/suggest.js +21 -0
- package/dist/server/typography/suggest.js.map +1 -0
- package/dist/server/versioning/gallery.d.ts +3 -0
- package/dist/server/versioning/gallery.d.ts.map +1 -0
- package/dist/server/versioning/gallery.js +57 -0
- package/dist/server/versioning/gallery.js.map +1 -0
- package/dist/server/versioning/versions.d.ts +19 -0
- package/dist/server/versioning/versions.d.ts.map +1 -0
- package/dist/server/versioning/versions.js +91 -0
- package/dist/server/versioning/versions.js.map +1 -0
- package/dist/server/watcher.d.ts +6 -0
- package/dist/server/watcher.d.ts.map +1 -0
- package/dist/server/watcher.js +23 -0
- package/dist/server/watcher.js.map +1 -0
- package/dist/server/websocket.d.ts +13 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +36 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/skill/SKILL.md +280 -0
- package/dist/taste-memory/db.d.ts +5 -0
- package/dist/taste-memory/db.d.ts.map +1 -0
- package/dist/taste-memory/db.js +64 -0
- package/dist/taste-memory/db.js.map +1 -0
- package/dist/taste-memory/embeddings.d.ts +3 -0
- package/dist/taste-memory/embeddings.d.ts.map +1 -0
- package/dist/taste-memory/embeddings.js +24 -0
- package/dist/taste-memory/embeddings.js.map +1 -0
- package/dist/taste-memory/index.d.ts +3 -0
- package/dist/taste-memory/index.d.ts.map +1 -0
- package/dist/taste-memory/index.js +113 -0
- package/dist/taste-memory/index.js.map +1 -0
- package/dist/taste-memory/profile.d.ts +6 -0
- package/dist/taste-memory/profile.d.ts.map +1 -0
- package/dist/taste-memory/profile.js +33 -0
- package/dist/taste-memory/profile.js.map +1 -0
- package/dist/taste-memory/search.d.ts +16 -0
- package/dist/taste-memory/search.d.ts.map +1 -0
- package/dist/taste-memory/search.js +53 -0
- package/dist/taste-memory/search.js.map +1 -0
- package/dist/taste-memory/server.d.ts +43 -0
- package/dist/taste-memory/server.d.ts.map +1 -0
- package/dist/taste-memory/server.js +64 -0
- package/dist/taste-memory/server.js.map +1 -0
- package/dist/taste-memory/store.d.ts +21 -0
- package/dist/taste-memory/store.d.ts.map +1 -0
- package/dist/taste-memory/store.js +72 -0
- package/dist/taste-memory/store.js.map +1 -0
- package/dist/taste-memory/types.d.ts +95 -0
- package/dist/taste-memory/types.d.ts.map +1 -0
- package/dist/taste-memory/types.js +2 -0
- package/dist/taste-memory/types.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { init } from './commands/init.js';
|
|
4
|
+
import { serve } from './commands/serve.js';
|
|
5
|
+
import { stop } from './commands/stop.js';
|
|
6
|
+
import { exportDesign } from './commands/export.js';
|
|
7
|
+
import { gallery } from './commands/gallery.js';
|
|
8
|
+
import { taste } from './commands/taste.js';
|
|
9
|
+
import { clean } from './commands/clean.js';
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('mise-en-scene')
|
|
13
|
+
.description('✦ mise en scène — aesthetic design studio')
|
|
14
|
+
.version('0.1.0');
|
|
15
|
+
program
|
|
16
|
+
.command('init')
|
|
17
|
+
.description('Bootstrap mise en scène in the current project')
|
|
18
|
+
.option('-d, --dir <path>', 'Project directory', process.cwd())
|
|
19
|
+
.option('-s, --scope <scope>', 'Skill install scope: project or global (skips prompt)', undefined)
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const skillScope = opts.scope === 'project' || opts.scope === 'global'
|
|
22
|
+
? opts.scope
|
|
23
|
+
: undefined;
|
|
24
|
+
await init({ projectDir: opts.dir, skillScope });
|
|
25
|
+
});
|
|
26
|
+
program
|
|
27
|
+
.command('serve')
|
|
28
|
+
.description('Start the design preview server')
|
|
29
|
+
.option('-p, --port <number>', 'Port number', '3333')
|
|
30
|
+
.option('-d, --dir <path>', 'Design directory', 'mise-en-scene/main')
|
|
31
|
+
.action(async (opts) => {
|
|
32
|
+
await serve({ port: parseInt(opts.port, 10), designDir: opts.dir });
|
|
33
|
+
});
|
|
34
|
+
program
|
|
35
|
+
.command('stop')
|
|
36
|
+
.description('Stop the design preview server and Puppeteer')
|
|
37
|
+
.option('-p, --port <number>', 'Port number', '3333')
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
await stop({ port: parseInt(opts.port, 10) });
|
|
40
|
+
});
|
|
41
|
+
program
|
|
42
|
+
.command('export')
|
|
43
|
+
.description('Export current design')
|
|
44
|
+
.option('-f, --format <type>', 'Export format (svg, png, jpg, pdf)', 'png')
|
|
45
|
+
.option('-o, --output <path>', 'Output file path')
|
|
46
|
+
.option('-w, --width <pixels>', 'Width in pixels')
|
|
47
|
+
.option('-H, --height <pixels>', 'Height in pixels')
|
|
48
|
+
.option('-q, --quality <percent>', 'JPEG quality (1-100)', '90')
|
|
49
|
+
.option('-p, --port <number>', 'Server port', '3333')
|
|
50
|
+
.action(async (opts) => {
|
|
51
|
+
await exportDesign({
|
|
52
|
+
format: opts.format,
|
|
53
|
+
output: opts.output,
|
|
54
|
+
width: opts.width ? parseInt(opts.width, 10) : undefined,
|
|
55
|
+
height: opts.height ? parseInt(opts.height, 10) : undefined,
|
|
56
|
+
quality: parseInt(opts.quality, 10),
|
|
57
|
+
port: parseInt(opts.port, 10),
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
program
|
|
61
|
+
.command('gallery')
|
|
62
|
+
.description('Open the version gallery in browser')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
await gallery();
|
|
65
|
+
});
|
|
66
|
+
program
|
|
67
|
+
.command('taste')
|
|
68
|
+
.description('Show current taste profile summary')
|
|
69
|
+
.option('-s, --scope <scope>', 'Profile scope (user, project, merged)', 'merged')
|
|
70
|
+
.option('-p, --project <name>', 'Project name')
|
|
71
|
+
.action(async (opts) => {
|
|
72
|
+
await taste({ scope: opts.scope, project: opts.project });
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command('clean')
|
|
76
|
+
.description('Remove taste profile and branches (keeps exports)')
|
|
77
|
+
.option('-d, --dir <path>', 'Project directory', process.cwd())
|
|
78
|
+
.option('--all', 'Also remove exports')
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
await clean({ projectDir: opts.dir, keepExports: !opts.all });
|
|
81
|
+
});
|
|
82
|
+
program.parse();
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAsBA,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB3D"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/scaffold.ts
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const TASTE_FILES = [
|
|
5
|
+
'brief.json',
|
|
6
|
+
'references.json',
|
|
7
|
+
'design-system.json',
|
|
8
|
+
'mood-board.json',
|
|
9
|
+
'decisions.json',
|
|
10
|
+
];
|
|
11
|
+
const DIRS = [
|
|
12
|
+
'references',
|
|
13
|
+
'exports',
|
|
14
|
+
'.taste',
|
|
15
|
+
'main',
|
|
16
|
+
'branches',
|
|
17
|
+
];
|
|
18
|
+
const GITKEEP_DIRS = ['references', 'exports', 'main', 'branches'];
|
|
19
|
+
export function scaffoldProject(projectRoot) {
|
|
20
|
+
const miseDir = path.join(projectRoot, 'mise-en-scene');
|
|
21
|
+
for (const dir of DIRS) {
|
|
22
|
+
fs.mkdirSync(path.join(miseDir, dir), { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
for (const file of TASTE_FILES) {
|
|
25
|
+
const filePath = path.join(miseDir, '.taste', file);
|
|
26
|
+
if (!fs.existsSync(filePath)) {
|
|
27
|
+
fs.writeFileSync(filePath, '{}\n');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const dir of GITKEEP_DIRS) {
|
|
31
|
+
const gitkeepPath = path.join(miseDir, dir, '.gitkeep');
|
|
32
|
+
if (!fs.existsSync(gitkeepPath)) {
|
|
33
|
+
fs.writeFileSync(gitkeepPath, '');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return miseDir;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,GAAG;IAClB,YAAY;IACZ,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;IACjB,gBAAgB;CACjB,CAAC;AAEF,MAAM,IAAI,GAAG;IACX,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,MAAM;IACN,UAAU;CACX,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEnE,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PuppeteerManager } from './puppeteer-manager.js';
|
|
2
|
+
import type { ExportOptions } from '../types.js';
|
|
3
|
+
export declare class ExportPipeline {
|
|
4
|
+
private puppeteer;
|
|
5
|
+
getPuppeteerManager(): PuppeteerManager;
|
|
6
|
+
export(html: string, outputDir: string, opts: ExportOptions): Promise<string>;
|
|
7
|
+
screenshot(url: string, selector?: string): Promise<Buffer>;
|
|
8
|
+
shutdown(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAA0B;IAE3C,mBAAmB,IAAI,gBAAgB;IAIjC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA+C7E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// src/export/index.ts
|
|
2
|
+
import { PuppeteerManager } from './puppeteer-manager.js';
|
|
3
|
+
import { extractAndOptimizeSvg } from './svg-export.js';
|
|
4
|
+
import { exportRaster } from './raster-export.js';
|
|
5
|
+
import { exportPdf } from './pdf-export.js';
|
|
6
|
+
import { getPreset } from './presets.js';
|
|
7
|
+
import { takeScreenshot } from '../screenshot.js';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
export class ExportPipeline {
|
|
11
|
+
puppeteer = new PuppeteerManager();
|
|
12
|
+
getPuppeteerManager() {
|
|
13
|
+
return this.puppeteer;
|
|
14
|
+
}
|
|
15
|
+
async export(html, outputDir, opts) {
|
|
16
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
17
|
+
let width = opts.width;
|
|
18
|
+
let height = opts.height;
|
|
19
|
+
if (opts.preset) {
|
|
20
|
+
const preset = getPreset(opts.preset);
|
|
21
|
+
if (preset) {
|
|
22
|
+
width = width ?? preset.width;
|
|
23
|
+
height = height ?? preset.height;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const timestamp = Date.now();
|
|
27
|
+
switch (opts.format) {
|
|
28
|
+
case 'svg': {
|
|
29
|
+
const svg = await extractAndOptimizeSvg(html);
|
|
30
|
+
const outPath = path.join(outputDir, `export-${timestamp}.svg`);
|
|
31
|
+
fs.writeFileSync(outPath, svg);
|
|
32
|
+
return outPath;
|
|
33
|
+
}
|
|
34
|
+
case 'png':
|
|
35
|
+
case 'jpg': {
|
|
36
|
+
const buffer = await exportRaster(this.puppeteer, html, {
|
|
37
|
+
format: opts.format,
|
|
38
|
+
width,
|
|
39
|
+
height,
|
|
40
|
+
quality: opts.quality,
|
|
41
|
+
dpi: opts.dpi,
|
|
42
|
+
});
|
|
43
|
+
const ext = opts.format === 'jpg' ? 'jpg' : 'png';
|
|
44
|
+
const outPath = path.join(outputDir, `export-${timestamp}.${ext}`);
|
|
45
|
+
fs.writeFileSync(outPath, buffer);
|
|
46
|
+
return outPath;
|
|
47
|
+
}
|
|
48
|
+
case 'pdf': {
|
|
49
|
+
const buffer = await exportPdf(this.puppeteer, html, { width, height });
|
|
50
|
+
const outPath = path.join(outputDir, `export-${timestamp}.pdf`);
|
|
51
|
+
fs.writeFileSync(outPath, buffer);
|
|
52
|
+
return outPath;
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
throw new Error(`Unsupported format: ${opts.format}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async screenshot(url, selector) {
|
|
59
|
+
return takeScreenshot(this.puppeteer, url, { selector });
|
|
60
|
+
}
|
|
61
|
+
async shutdown() {
|
|
62
|
+
await this.puppeteer.shutdown();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PuppeteerManager } from './puppeteer-manager.js';
|
|
2
|
+
interface PdfOptions {
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function exportPdf(manager: PuppeteerManager, html: string, opts?: PdfOptions): Promise<Buffer>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=pdf-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-export.d.ts","sourceRoot":"","sources":["../../src/export/pdf-export.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function exportPdf(manager, html, opts) {
|
|
2
|
+
const page = await manager.getPage();
|
|
3
|
+
try {
|
|
4
|
+
await page.setContent(html, { waitUntil: 'networkidle0', timeout: 10000 });
|
|
5
|
+
const buffer = await page.pdf({
|
|
6
|
+
width: opts?.width ? `${opts.width}px` : undefined,
|
|
7
|
+
height: opts?.height ? `${opts.height}px` : undefined,
|
|
8
|
+
printBackground: true,
|
|
9
|
+
margin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
10
|
+
});
|
|
11
|
+
return Buffer.from(buffer);
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
await page.close();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=pdf-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-export.js","sourceRoot":"","sources":["../../src/export/pdf-export.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAyB,EACzB,IAAY,EACZ,IAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;YAC5B,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS;YAClD,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS;YACrD,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/export/presets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkBnD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAE9D;AAED,wBAAgB,WAAW,IAAI,eAAe,EAAE,CAE/C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const PRESETS = {
|
|
2
|
+
'instagram-post': { name: 'Instagram Post', width: 1080, height: 1080, category: 'social' },
|
|
3
|
+
'instagram-story': { name: 'Instagram Story', width: 1080, height: 1920, category: 'social' },
|
|
4
|
+
'twitter-header': { name: 'Twitter Header', width: 1500, height: 500, category: 'social' },
|
|
5
|
+
'twitter-post': { name: 'Twitter Post', width: 1200, height: 675, category: 'social' },
|
|
6
|
+
'facebook-cover': { name: 'Facebook Cover', width: 1640, height: 624, category: 'social' },
|
|
7
|
+
'linkedin-banner': { name: 'LinkedIn Banner', width: 1584, height: 396, category: 'social' },
|
|
8
|
+
'og-image': { name: 'OG Image', width: 1200, height: 630, category: 'web' },
|
|
9
|
+
'favicon': { name: 'Favicon', width: 512, height: 512, category: 'web' },
|
|
10
|
+
'hd': { name: 'HD 1080p', width: 1920, height: 1080, category: 'web' },
|
|
11
|
+
'a4': { name: 'A4 (300dpi)', width: 2480, height: 3508, category: 'print' },
|
|
12
|
+
'letter': { name: 'US Letter (300dpi)', width: 2550, height: 3300, category: 'print' },
|
|
13
|
+
'poster-18x24': { name: 'Poster 18×24 (150dpi)', width: 2700, height: 3600, category: 'print' },
|
|
14
|
+
'business-card': { name: 'Business Card (300dpi)', width: 1050, height: 600, category: 'print' },
|
|
15
|
+
};
|
|
16
|
+
export function getPreset(name) {
|
|
17
|
+
return PRESETS[name] ?? null;
|
|
18
|
+
}
|
|
19
|
+
export function listPresets() {
|
|
20
|
+
return Object.values(PRESETS);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/export/presets.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,GAAoC;IAC/C,gBAAgB,EAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9F,iBAAiB,EAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC/F,gBAAgB,EAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC7F,cAAc,EAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC3F,gBAAgB,EAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC7F,iBAAiB,EAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9F,UAAU,EAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpF,SAAS,EAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClF,IAAI,EAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IACrF,IAAI,EAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC1F,QAAQ,EAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IACjG,cAAc,EAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IACnG,eAAe,EAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;CACrG,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer-manager.d.ts","sourceRoot":"","sources":["../../src/export/puppeteer-manager.ts"],"names":[],"mappings":"AACA,OAAkB,EAAgB,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAE/D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/export/puppeteer-manager.ts
|
|
2
|
+
import puppeteer from 'puppeteer';
|
|
3
|
+
export class PuppeteerManager {
|
|
4
|
+
browser = null;
|
|
5
|
+
isRunning() {
|
|
6
|
+
return this.browser !== null && this.browser.connected;
|
|
7
|
+
}
|
|
8
|
+
async getPage() {
|
|
9
|
+
if (!this.browser || !this.browser.connected) {
|
|
10
|
+
this.browser = await puppeteer.launch({
|
|
11
|
+
headless: true,
|
|
12
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return this.browser.newPage();
|
|
16
|
+
}
|
|
17
|
+
async shutdown() {
|
|
18
|
+
if (this.browser) {
|
|
19
|
+
await this.browser.close();
|
|
20
|
+
this.browser = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=puppeteer-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer-manager.js","sourceRoot":"","sources":["../../src/export/puppeteer-manager.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,SAAsC,MAAM,WAAW,CAAC;AAE/D,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAAmB,IAAI,CAAC;IAEvC,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;gBACpC,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PuppeteerManager } from './puppeteer-manager.js';
|
|
2
|
+
interface RasterOptions {
|
|
3
|
+
format: 'png' | 'jpg';
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
quality?: number;
|
|
7
|
+
dpi?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function exportRaster(manager: PuppeteerManager, html: string, opts: RasterOptions): Promise<Buffer>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=raster-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster-export.d.ts","sourceRoot":"","sources":["../../src/export/raster-export.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,UAAU,aAAa;IACrB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export async function exportRaster(manager, html, opts) {
|
|
2
|
+
const page = await manager.getPage();
|
|
3
|
+
try {
|
|
4
|
+
const width = opts.width ?? 1200;
|
|
5
|
+
const height = opts.height ?? 800;
|
|
6
|
+
const dpi = opts.dpi ?? 1;
|
|
7
|
+
await page.setViewport({
|
|
8
|
+
width,
|
|
9
|
+
height,
|
|
10
|
+
deviceScaleFactor: dpi,
|
|
11
|
+
});
|
|
12
|
+
await page.setContent(html, { waitUntil: 'networkidle0', timeout: 10000 });
|
|
13
|
+
const screenshotOpts = {
|
|
14
|
+
type: opts.format === 'jpg' ? 'jpeg' : 'png',
|
|
15
|
+
fullPage: false,
|
|
16
|
+
clip: { x: 0, y: 0, width, height },
|
|
17
|
+
};
|
|
18
|
+
if (opts.format === 'jpg' && opts.quality) {
|
|
19
|
+
screenshotOpts.quality = opts.quality;
|
|
20
|
+
}
|
|
21
|
+
const buffer = await page.screenshot(screenshotOpts);
|
|
22
|
+
return Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await page.close();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=raster-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster-export.js","sourceRoot":"","sources":["../../src/export/raster-export.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAyB,EACzB,IAAY,EACZ,IAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAE1B,MAAM,IAAI,CAAC,WAAW,CAAC;YACrB,KAAK;YACL,MAAM;YACN,iBAAiB,EAAE,GAAG;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE3E,MAAM,cAAc,GAAiI;YACnJ,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAC5C,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;SACpC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAgC,CAAC,CAAC;IAC1F,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-export.d.ts","sourceRoot":"","sources":["../../src/export/svg-export.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/export/svg-export.ts
|
|
2
|
+
import { optimize } from 'svgo';
|
|
3
|
+
export async function extractAndOptimizeSvg(html) {
|
|
4
|
+
const svgMatch = html.match(/<svg[\s\S]*?<\/svg>/i);
|
|
5
|
+
if (!svgMatch) {
|
|
6
|
+
throw new Error('No SVG element found in the provided HTML');
|
|
7
|
+
}
|
|
8
|
+
const rawSvg = svgMatch[0];
|
|
9
|
+
const result = optimize(rawSvg, {
|
|
10
|
+
multipass: true,
|
|
11
|
+
plugins: [
|
|
12
|
+
'preset-default',
|
|
13
|
+
],
|
|
14
|
+
});
|
|
15
|
+
return result.data;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=svg-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-export.js","sourceRoot":"","sources":["../../src/export/svg-export.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE;QAC9B,SAAS,EAAE,IAAI;QACf,OAAO,EAAE;YACP,gBAAgB;SACjB;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB/D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAItF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/feedback.ts
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
export function readFeedback(designDir) {
|
|
5
|
+
const feedbackPath = path.join(designDir, '.feedback');
|
|
6
|
+
if (!fs.existsSync(feedbackPath))
|
|
7
|
+
return [];
|
|
8
|
+
const content = fs.readFileSync(feedbackPath, 'utf-8').trim();
|
|
9
|
+
if (!content)
|
|
10
|
+
return [];
|
|
11
|
+
return content
|
|
12
|
+
.split('\n')
|
|
13
|
+
.filter((line) => line.trim())
|
|
14
|
+
.map((line) => {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(line);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
.filter((e) => e !== null);
|
|
23
|
+
}
|
|
24
|
+
export function appendFeedback(designDir, event) {
|
|
25
|
+
fs.mkdirSync(designDir, { recursive: true });
|
|
26
|
+
const feedbackPath = path.join(designDir, '.feedback');
|
|
27
|
+
fs.appendFileSync(feedbackPath, JSON.stringify(event) + '\n');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAA8B;IAC9E,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
interface ServerOptions {
|
|
3
|
+
port: number;
|
|
4
|
+
designDir: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
/** WebSocket port for client connection. If omitted, uses HTTP port. */
|
|
7
|
+
wsPort?: number;
|
|
8
|
+
/** Enable /api/export and /api/shutdown routes for CLI usage */
|
|
9
|
+
enableApi?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface ServerInstance {
|
|
12
|
+
port: number;
|
|
13
|
+
server: http.Server;
|
|
14
|
+
close: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function getNewestHtmlFile(dir: string): string | null;
|
|
17
|
+
export declare function createHttpServer(opts: ServerOptions): Promise<ServerInstance>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=http-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa5D;AAgCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAiKnF"}
|