loopwind 0.9.1
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/FONTS.md +156 -0
- package/HELPERS_DEMO.md +134 -0
- package/PROJECT_STRUCTURE.md +286 -0
- package/PUBLISHING.md +171 -0
- package/README.md +1020 -0
- package/REGISTRY_SETUP.md +427 -0
- package/SHADCN_INTEGRATION.md +269 -0
- package/TAILWIND.md +228 -0
- package/TEMPLATE_SOURCES.md +363 -0
- package/_dsgn/templates/banner-hero/banner-hero.tsx +57 -0
- package/_dsgn/templates/banner-hero/meta.json +14 -0
- package/_dsgn/templates/composite-card/meta.json +16 -0
- package/_dsgn/templates/composite-card/template.tsx +44 -0
- package/_dsgn/templates/image/meta.json +13 -0
- package/_dsgn/templates/image/template.tsx +28 -0
- package/_dsgn/templates/kitchen-sink/meta.json +13 -0
- package/_dsgn/templates/kitchen-sink/template.tsx +72 -0
- package/_dsgn/templates/qr-card/meta.json +14 -0
- package/_dsgn/templates/qr-card/template.tsx +39 -0
- package/_dsgn/templates/test-parent/child/meta.json +11 -0
- package/_dsgn/templates/test-parent/child/template.tsx +27 -0
- package/_dsgn/templates/test-parent/meta.json +12 -0
- package/_dsgn/templates/test-parent/template.tsx +30 -0
- package/_dsgn/templates/test-sibling/meta.json +11 -0
- package/_dsgn/templates/test-sibling/template.tsx +20 -0
- package/_dsgn/templates/video/.tmp/template-1763421345296.mjs +43 -0
- package/_dsgn/templates/video/.tmp/template-1763421362228.mjs +43 -0
- package/_dsgn/templates/video/.tmp/template-1763421377706.mjs +43 -0
- package/_dsgn/templates/video/meta.json +17 -0
- package/_dsgn/templates/video/template.tsx +48 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +86 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/default.d.ts +2 -0
- package/dist/commands/default.d.ts.map +1 -0
- package/dist/commands/default.js +69 -0
- package/dist/commands/default.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +75 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +83 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/preview.d.ts +3 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +296 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/render.d.ts +10 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +204 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +107 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/default-templates/AGENTS.md +229 -0
- package/dist/default-templates/image/meta.json +13 -0
- package/dist/default-templates/image/template.d.ts +20 -0
- package/dist/default-templates/image/template.d.ts.map +1 -0
- package/dist/default-templates/image/template.js +18 -0
- package/dist/default-templates/image/template.js.map +1 -0
- package/dist/default-templates/image/template.tsx +20 -0
- package/dist/default-templates/image-template/meta.json +13 -0
- package/dist/default-templates/image-template/template.tsx +19 -0
- package/dist/default-templates/kitchen-sink/meta.json +13 -0
- package/dist/default-templates/kitchen-sink/template.tsx +64 -0
- package/dist/default-templates/page/meta.json +17 -0
- package/dist/default-templates/page/template.tsx +37 -0
- package/dist/default-templates/video/meta.json +17 -0
- package/dist/default-templates/video/template.d.ts +26 -0
- package/dist/default-templates/video/template.d.ts.map +1 -0
- package/dist/default-templates/video/template.js +33 -0
- package/dist/default-templates/video/template.js.map +1 -0
- package/dist/default-templates/video/template.tsx +37 -0
- package/dist/default-templates/video-template/meta.json +17 -0
- package/dist/default-templates/video-template/template.tsx +36 -0
- package/dist/default-templates/website/meta.json +16 -0
- package/dist/default-templates/website/pages/home.tsx +17 -0
- package/dist/default-templates/website/parts/footer.tsx +17 -0
- package/dist/default-templates/website/parts/header.tsx +17 -0
- package/dist/default-templates/website/template.tsx +17 -0
- package/dist/default-templates/website-template/meta.json +16 -0
- package/dist/default-templates/website-template/pages/home.tsx +16 -0
- package/dist/default-templates/website-template/parts/footer.tsx +16 -0
- package/dist/default-templates/website-template/parts/header.tsx +16 -0
- package/dist/default-templates/website-template/template.tsx +16 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +248 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +7 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +12 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/helpers.d.ts +29 -0
- package/dist/lib/helpers.d.ts.map +1 -0
- package/dist/lib/helpers.js +159 -0
- package/dist/lib/helpers.js.map +1 -0
- package/dist/lib/installer.d.ts +51 -0
- package/dist/lib/installer.d.ts.map +1 -0
- package/dist/lib/installer.js +215 -0
- package/dist/lib/installer.js.map +1 -0
- package/dist/lib/renderer.d.ts +51 -0
- package/dist/lib/renderer.d.ts.map +1 -0
- package/dist/lib/renderer.js +524 -0
- package/dist/lib/renderer.js.map +1 -0
- package/dist/lib/tailwind-config-loader.d.ts +47 -0
- package/dist/lib/tailwind-config-loader.d.ts.map +1 -0
- package/dist/lib/tailwind-config-loader.js +432 -0
- package/dist/lib/tailwind-config-loader.js.map +1 -0
- package/dist/lib/tailwind-detector.d.ts +36 -0
- package/dist/lib/tailwind-detector.d.ts.map +1 -0
- package/dist/lib/tailwind-detector.js +156 -0
- package/dist/lib/tailwind-detector.js.map +1 -0
- package/dist/lib/tailwind.d.ts +8 -0
- package/dist/lib/tailwind.d.ts.map +1 -0
- package/dist/lib/tailwind.js +994 -0
- package/dist/lib/tailwind.js.map +1 -0
- package/dist/lib/template-validator.d.ts +22 -0
- package/dist/lib/template-validator.d.ts.map +1 -0
- package/dist/lib/template-validator.js +174 -0
- package/dist/lib/template-validator.js.map +1 -0
- package/dist/lib/utils.d.ts +44 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +207 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/version-check.d.ts +16 -0
- package/dist/lib/version-check.d.ts.map +1 -0
- package/dist/lib/version-check.js +88 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/lib/video-renderer.d.ts +32 -0
- package/dist/lib/video-renderer.d.ts.map +1 -0
- package/dist/lib/video-renderer.js +226 -0
- package/dist/lib/video-renderer.js.map +1 -0
- package/dist/sdk/index.d.ts +58 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +119 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/template.d.ts +40 -0
- package/dist/sdk/template.d.ts.map +1 -0
- package/dist/sdk/template.js +60 -0
- package/dist/sdk/template.js.map +1 -0
- package/dist/types/config.d.ts +62 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +47 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/template.d.ts +79 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/types/template.js +2 -0
- package/dist/types/template.js.map +1 -0
- package/examples/nextjs-api/README.md +180 -0
- package/examples/nextjs-api/package.json +21 -0
- package/examples/nextjs-api/pages/api/intro-video.ts +53 -0
- package/examples/nextjs-api/pages/api/og-image.ts +50 -0
- package/netlify.toml +13 -0
- package/package.json +84 -0
- package/patches/satori+0.18.3.patch +13 -0
- package/test-templates/TESTS.md +63 -0
- package/test-templates/_dsgn/templates/absolute-spin/meta.json +7 -0
- package/test-templates/_dsgn/templates/absolute-spin/template.tsx +16 -0
- package/test-templates/_dsgn/templates/animated-intro/.tmp/template-1763468771640.mjs +7 -0
- package/test-templates/_dsgn/templates/animated-intro/meta.json +10 -0
- package/test-templates/_dsgn/templates/animated-intro/template.tsx +23 -0
- package/test-templates/_dsgn/templates/centered-spin/.tmp/template-1763468525386.mjs +7 -0
- package/test-templates/_dsgn/templates/centered-spin/meta.json +7 -0
- package/test-templates/_dsgn/templates/centered-spin/template.tsx +11 -0
- package/test-templates/_dsgn/templates/composite/.tmp/template-1763468815645.mjs +7 -0
- package/test-templates/_dsgn/templates/composite/meta.json +9 -0
- package/test-templates/_dsgn/templates/composite/template.tsx +23 -0
- package/test-templates/_dsgn/templates/easing-test/.tmp/template-1763468824501.mjs +7 -0
- package/test-templates/_dsgn/templates/easing-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/easing-test/template.tsx +47 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466364336.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466584319.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466667797.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466746504.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466930225.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467004552.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467060334.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467124493.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467174690.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467359134.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467451928.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467758275.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467985201.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468020563.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468090428.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468211036.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468394057.mjs +10 -0
- package/test-templates/_dsgn/templates/minimal-spin/meta.json +7 -0
- package/test-templates/_dsgn/templates/minimal-spin/template.tsx +13 -0
- package/test-templates/_dsgn/templates/no-origin-spin/meta.json +7 -0
- package/test-templates/_dsgn/templates/no-origin-spin/template.tsx +10 -0
- package/test-templates/_dsgn/templates/opacity-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/opacity-test/template.tsx +9 -0
- package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468758954.mjs +17 -0
- package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468815672.mjs +17 -0
- package/test-templates/_dsgn/templates/qr-code/meta.json +9 -0
- package/test-templates/_dsgn/templates/qr-code/template.tsx +20 -0
- package/test-templates/_dsgn/templates/rotation-abs-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/rotation-abs-test/template.tsx +15 -0
- package/test-templates/_dsgn/templates/rotation-corner/meta.json +7 -0
- package/test-templates/_dsgn/templates/rotation-corner/template.tsx +12 -0
- package/test-templates/_dsgn/templates/rotation-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/rotation-test/template.tsx +12 -0
- package/test-templates/_dsgn/templates/shake-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/shake-test/template.tsx +12 -0
- package/test-templates/_dsgn/templates/static-image/.tmp/template-1763468746271.mjs +7 -0
- package/test-templates/_dsgn/templates/static-image/meta.json +9 -0
- package/test-templates/_dsgn/templates/static-image/template.tsx +19 -0
- package/test-templates/_dsgn/templates/translate-test/meta.json +7 -0
- package/test-templates/_dsgn/templates/translate-test/template.tsx +9 -0
- package/test-templates/_dsgn/templates/video-loops/.tmp/template-1763468793192.mjs +15 -0
- package/test-templates/_dsgn/templates/video-loops/meta.json +9 -0
- package/test-templates/_dsgn/templates/video-loops/template.tsx +39 -0
- package/test-templates/_dsgn/templates/wrapped-spin/meta.json +7 -0
- package/test-templates/_dsgn/templates/wrapped-spin/template.tsx +17 -0
- package/test-templates/compare-svgs.mjs +30 -0
- package/test-templates/convert-frames.mjs +15 -0
- package/test-templates/debug-rotation.mjs +25 -0
- package/test-templates/run-tests.sh +39 -0
- package/test-templates/test-sdk.mjs +115 -0
- package/website/.astro/settings.json +5 -0
- package/website/.astro/types.d.ts +1 -0
- package/website/README.md +112 -0
- package/website/astro.config.mjs +18 -0
- package/website/dist/_astro/fonts.DHdiHGBO.css +1 -0
- package/website/dist/fonts/index.html +193 -0
- package/website/dist/helpers/index.html +166 -0
- package/website/dist/images/index.html +314 -0
- package/website/dist/index.html +219 -0
- package/website/dist/llm.txt +2448 -0
- package/website/dist/styling/index.html +365 -0
- package/website/dist/templates/index.html +124 -0
- package/website/dist/video/index.html +636 -0
- package/website/package-lock.json +7606 -0
- package/website/package.json +23 -0
- package/website/public/robots.txt +5 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import QRCode from 'qrcode';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
/**
|
|
7
|
+
* QR Code helper for templates
|
|
8
|
+
* Generates a data URI for a QR code from a string
|
|
9
|
+
*/
|
|
10
|
+
export async function qr(text, options) {
|
|
11
|
+
try {
|
|
12
|
+
const dataUrl = await QRCode.toDataURL(text, {
|
|
13
|
+
width: options?.width || 200,
|
|
14
|
+
margin: options?.margin || 1,
|
|
15
|
+
errorCorrectionLevel: options?.errorCorrectionLevel || 'M',
|
|
16
|
+
color: {
|
|
17
|
+
dark: options?.color?.dark || '#000000',
|
|
18
|
+
light: options?.color?.light || '#FFFFFF',
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
return dataUrl;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('QR code generation failed:', error);
|
|
25
|
+
// Return a placeholder data URI on error
|
|
26
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Image helper for templates
|
|
31
|
+
* Converts an image file to a data URI
|
|
32
|
+
*/
|
|
33
|
+
export async function image(filePath) {
|
|
34
|
+
try {
|
|
35
|
+
const buffer = await fs.readFile(filePath);
|
|
36
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
37
|
+
// Determine MIME type
|
|
38
|
+
let mimeType = 'image/png';
|
|
39
|
+
if (ext === '.jpg' || ext === '.jpeg')
|
|
40
|
+
mimeType = 'image/jpeg';
|
|
41
|
+
else if (ext === '.png')
|
|
42
|
+
mimeType = 'image/png';
|
|
43
|
+
else if (ext === '.gif')
|
|
44
|
+
mimeType = 'image/gif';
|
|
45
|
+
else if (ext === '.webp')
|
|
46
|
+
mimeType = 'image/webp';
|
|
47
|
+
else if (ext === '.svg')
|
|
48
|
+
mimeType = 'image/svg+xml';
|
|
49
|
+
const base64 = buffer.toString('base64');
|
|
50
|
+
return `data:${mimeType};base64,${base64}`;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Image loading failed:', error);
|
|
54
|
+
// Return a placeholder data URI on error (1x1 transparent pixel)
|
|
55
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Video frame cache
|
|
60
|
+
* Maps video path -> array of frame data URIs
|
|
61
|
+
*/
|
|
62
|
+
const videoFrameCache = new Map();
|
|
63
|
+
/**
|
|
64
|
+
* Extract frames from a video file using ffmpeg
|
|
65
|
+
*/
|
|
66
|
+
async function extractVideoFrames(videoPath, fps) {
|
|
67
|
+
// Check cache first
|
|
68
|
+
const cacheKey = `${videoPath}:${fps}`;
|
|
69
|
+
if (videoFrameCache.has(cacheKey)) {
|
|
70
|
+
return videoFrameCache.get(cacheKey);
|
|
71
|
+
}
|
|
72
|
+
// Create temp directory for frames
|
|
73
|
+
const tmpDir = path.join(os.tmpdir(), `loopwind-video-${Date.now()}`);
|
|
74
|
+
await fs.mkdir(tmpDir, { recursive: true });
|
|
75
|
+
try {
|
|
76
|
+
// Extract frames using ffmpeg
|
|
77
|
+
await new Promise((resolve, reject) => {
|
|
78
|
+
const args = [
|
|
79
|
+
'-i', videoPath,
|
|
80
|
+
'-vf', `fps=${fps}`,
|
|
81
|
+
path.join(tmpDir, 'frame-%04d.png')
|
|
82
|
+
];
|
|
83
|
+
const ffmpeg = spawn('ffmpeg', args);
|
|
84
|
+
let stderr = '';
|
|
85
|
+
ffmpeg.stderr.on('data', (data) => {
|
|
86
|
+
stderr += data.toString();
|
|
87
|
+
});
|
|
88
|
+
ffmpeg.on('error', (err) => {
|
|
89
|
+
// Check if it's a "command not found" error (ffmpeg not installed)
|
|
90
|
+
if (err.message.includes('ENOENT') || err.message.includes('not found')) {
|
|
91
|
+
reject(new Error('FFmpeg is not installed. Video embedding requires FFmpeg.\n' +
|
|
92
|
+
'Install it:\n' +
|
|
93
|
+
' macOS: brew install ffmpeg\n' +
|
|
94
|
+
' Ubuntu: apt-get install ffmpeg\n' +
|
|
95
|
+
' Windows: choco install ffmpeg'));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
reject(new Error(`Failed to extract video frames: ${err.message}`));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
ffmpeg.on('close', (code) => {
|
|
102
|
+
if (code === 0) {
|
|
103
|
+
resolve();
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
reject(new Error(`ffmpeg exited with code ${code}\n${stderr}`));
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
// Read all extracted frames and convert to data URIs
|
|
111
|
+
const files = await fs.readdir(tmpDir);
|
|
112
|
+
const frameFiles = files
|
|
113
|
+
.filter(f => f.startsWith('frame-') && f.endsWith('.png'))
|
|
114
|
+
.sort();
|
|
115
|
+
const frames = [];
|
|
116
|
+
for (const file of frameFiles) {
|
|
117
|
+
const framePath = path.join(tmpDir, file);
|
|
118
|
+
const buffer = await fs.readFile(framePath);
|
|
119
|
+
const base64 = buffer.toString('base64');
|
|
120
|
+
frames.push(`data:image/png;base64,${base64}`);
|
|
121
|
+
}
|
|
122
|
+
// Cache the frames
|
|
123
|
+
videoFrameCache.set(cacheKey, frames);
|
|
124
|
+
// Clean up temp directory
|
|
125
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
126
|
+
return frames;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// Clean up on error
|
|
130
|
+
await fs.rm(tmpDir, { recursive: true, force: true }).catch(() => { });
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Pre-extract all frames from a video file
|
|
136
|
+
* This should be called during the discovery/pre-generation phase
|
|
137
|
+
*/
|
|
138
|
+
export async function extractVideoFramesForCache(filePath, fps) {
|
|
139
|
+
return extractVideoFrames(filePath, fps);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Video helper for templates
|
|
143
|
+
* Returns the appropriate video frame as a data URI based on current frame number
|
|
144
|
+
*/
|
|
145
|
+
export async function video(filePath, currentFrame, fps) {
|
|
146
|
+
try {
|
|
147
|
+
const frames = await extractVideoFrames(filePath, fps);
|
|
148
|
+
// Return the frame that matches the current frame
|
|
149
|
+
// If we run out of frames, loop back to start
|
|
150
|
+
const frameIndex = currentFrame % frames.length;
|
|
151
|
+
return frames[frameIndex];
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Video frame extraction failed:', error);
|
|
155
|
+
// Return a placeholder data URI on error
|
|
156
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/lib/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { RegistryTemplate } from '../types/template.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect the source type of a template
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectTemplateSource(templateSource: string): {
|
|
6
|
+
type: 'registry';
|
|
7
|
+
name: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'url';
|
|
10
|
+
url: string;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'github';
|
|
13
|
+
repo: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'local';
|
|
17
|
+
path: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Fetch a template from the registry
|
|
21
|
+
*/
|
|
22
|
+
export declare function fetchFromRegistry(templateName: string, registryUrl: string): Promise<RegistryTemplate>;
|
|
23
|
+
/**
|
|
24
|
+
* Fetch a template from a direct URL
|
|
25
|
+
*/
|
|
26
|
+
export declare function fetchFromURL(url: string): Promise<RegistryTemplate>;
|
|
27
|
+
/**
|
|
28
|
+
* Fetch a template from GitHub
|
|
29
|
+
*/
|
|
30
|
+
export declare function fetchFromGitHub(repo: string, templatePath?: string): Promise<RegistryTemplate>;
|
|
31
|
+
/**
|
|
32
|
+
* Load a template from local filesystem
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadFromLocal(localPath: string): Promise<RegistryTemplate>;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch a template from any source
|
|
37
|
+
*/
|
|
38
|
+
export declare function fetchTemplate(templateSource: string, registryUrl: string): Promise<RegistryTemplate>;
|
|
39
|
+
/**
|
|
40
|
+
* Install a template to the current project
|
|
41
|
+
*/
|
|
42
|
+
export declare function installTemplate(templateData: RegistryTemplate): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if template exists in registry
|
|
45
|
+
*/
|
|
46
|
+
export declare function templateExistsInRegistry(templateName: string, registryUrl: string): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Install a default template bundled with the CLI
|
|
49
|
+
*/
|
|
50
|
+
export declare function installDefaultTemplate(templateName: 'image' | 'video'): Promise<void>;
|
|
51
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAyBlC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAwC3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8ChF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAmB3B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,gBAAgB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC3F"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { CWD } from './constants.js';
|
|
5
|
+
import { ensureTemplatesDir } from './utils.js';
|
|
6
|
+
import { getResolvedPaths } from './config.js';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
/**
|
|
10
|
+
* Detect the source type of a template
|
|
11
|
+
*/
|
|
12
|
+
export function detectTemplateSource(templateSource) {
|
|
13
|
+
// Direct URL (http:// or https://)
|
|
14
|
+
if (templateSource.startsWith('http://') || templateSource.startsWith('https://')) {
|
|
15
|
+
return { type: 'url', url: templateSource };
|
|
16
|
+
}
|
|
17
|
+
// GitHub shorthand (github:username/repo or github:username/repo/path)
|
|
18
|
+
if (templateSource.startsWith('github:')) {
|
|
19
|
+
const withoutPrefix = templateSource.slice(7); // Remove 'github:'
|
|
20
|
+
const [repo, ...pathParts] = withoutPrefix.split('/');
|
|
21
|
+
return {
|
|
22
|
+
type: 'github',
|
|
23
|
+
repo: withoutPrefix.includes('/') ? withoutPrefix.split('/').slice(0, 2).join('/') : withoutPrefix,
|
|
24
|
+
path: pathParts.length > 0 ? pathParts.join('/') : undefined,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Local path (starts with ./ or ../ or /)
|
|
28
|
+
if (templateSource.startsWith('./') || templateSource.startsWith('../') || templateSource.startsWith('/')) {
|
|
29
|
+
return { type: 'local', path: templateSource };
|
|
30
|
+
}
|
|
31
|
+
// Registry name (default)
|
|
32
|
+
return { type: 'registry', name: templateSource };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fetch a template from the registry
|
|
36
|
+
*/
|
|
37
|
+
export async function fetchFromRegistry(templateName, registryUrl) {
|
|
38
|
+
const url = `${registryUrl}/${templateName}`;
|
|
39
|
+
const response = await fetch(url);
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`Failed to fetch template from registry: ${response.statusText}\n\nInstall from GitHub: loopwind add github:username/repo/template\nOr from a URL: loopwind add https://example.com/template.json\nOr from local: loopwind add ./my-template`);
|
|
42
|
+
}
|
|
43
|
+
return await response.json();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fetch a template from a direct URL
|
|
47
|
+
*/
|
|
48
|
+
export async function fetchFromURL(url) {
|
|
49
|
+
const response = await fetch(url);
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
throw new Error(`Failed to fetch template from URL: ${response.statusText}`);
|
|
52
|
+
}
|
|
53
|
+
return await response.json();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch a template from GitHub
|
|
57
|
+
*/
|
|
58
|
+
export async function fetchFromGitHub(repo, templatePath) {
|
|
59
|
+
// Convert github:username/repo/templates/banner-hero
|
|
60
|
+
// to https://raw.githubusercontent.com/username/repo/main/templates/banner-hero.json
|
|
61
|
+
const basePath = templatePath || '';
|
|
62
|
+
const jsonUrl = `https://raw.githubusercontent.com/${repo}/main/${basePath}/template.json`;
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(jsonUrl);
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
throw new Error(`Failed to fetch from GitHub: ${response.statusText}`);
|
|
67
|
+
}
|
|
68
|
+
const templateData = await response.json();
|
|
69
|
+
// Fetch actual files from GitHub
|
|
70
|
+
const files = await Promise.all(templateData.files.map(async (file) => {
|
|
71
|
+
const fileUrl = `https://raw.githubusercontent.com/${repo}/main/${basePath}/${file.path}`;
|
|
72
|
+
const fileResponse = await fetch(fileUrl);
|
|
73
|
+
if (!fileResponse.ok) {
|
|
74
|
+
throw new Error(`Failed to fetch ${file.path}: ${fileResponse.statusText}`);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
path: file.path,
|
|
78
|
+
content: await fileResponse.text(),
|
|
79
|
+
};
|
|
80
|
+
}));
|
|
81
|
+
return {
|
|
82
|
+
...templateData,
|
|
83
|
+
files,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new Error(`Failed to fetch template from GitHub: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Load a template from local filesystem
|
|
92
|
+
*/
|
|
93
|
+
export async function loadFromLocal(localPath) {
|
|
94
|
+
// Resolve relative paths
|
|
95
|
+
const absolutePath = path.isAbsolute(localPath)
|
|
96
|
+
? localPath
|
|
97
|
+
: path.join(CWD, localPath);
|
|
98
|
+
try {
|
|
99
|
+
// Check if path exists
|
|
100
|
+
await fs.access(absolutePath);
|
|
101
|
+
// Look for template.json or meta.json
|
|
102
|
+
let metaPath;
|
|
103
|
+
try {
|
|
104
|
+
metaPath = path.join(absolutePath, 'template.json');
|
|
105
|
+
await fs.access(metaPath);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
metaPath = path.join(absolutePath, 'meta.json');
|
|
109
|
+
}
|
|
110
|
+
const metaContent = await fs.readFile(metaPath, 'utf-8');
|
|
111
|
+
const meta = JSON.parse(metaContent);
|
|
112
|
+
// Read all files in the directory
|
|
113
|
+
const entries = await fs.readdir(absolutePath, { withFileTypes: true });
|
|
114
|
+
const files = [];
|
|
115
|
+
for (const entry of entries) {
|
|
116
|
+
if (entry.isFile() && !entry.name.startsWith('.')) {
|
|
117
|
+
const filePath = path.join(absolutePath, entry.name);
|
|
118
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
119
|
+
files.push({
|
|
120
|
+
path: entry.name,
|
|
121
|
+
content,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
name: meta.name || path.basename(absolutePath),
|
|
127
|
+
version: meta.version || '1.0.0',
|
|
128
|
+
description: meta.description || '',
|
|
129
|
+
files,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new Error(`Failed to load template from local path: ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Fetch a template from any source
|
|
138
|
+
*/
|
|
139
|
+
export async function fetchTemplate(templateSource, registryUrl) {
|
|
140
|
+
const source = detectTemplateSource(templateSource);
|
|
141
|
+
switch (source.type) {
|
|
142
|
+
case 'registry':
|
|
143
|
+
return fetchFromRegistry(source.name, registryUrl);
|
|
144
|
+
case 'url':
|
|
145
|
+
return fetchFromURL(source.url);
|
|
146
|
+
case 'github':
|
|
147
|
+
return fetchFromGitHub(source.repo, source.path);
|
|
148
|
+
case 'local':
|
|
149
|
+
return loadFromLocal(source.path);
|
|
150
|
+
default:
|
|
151
|
+
throw new Error('Unknown template source type');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Install a template to the current project
|
|
156
|
+
*/
|
|
157
|
+
export async function installTemplate(templateData) {
|
|
158
|
+
await ensureTemplatesDir();
|
|
159
|
+
const paths = await getResolvedPaths();
|
|
160
|
+
const templateDir = path.join(paths.templates, templateData.name);
|
|
161
|
+
// Create template directory
|
|
162
|
+
await fs.mkdir(templateDir, { recursive: true });
|
|
163
|
+
// Write all files
|
|
164
|
+
for (const file of templateData.files) {
|
|
165
|
+
const filePath = path.join(templateDir, file.path);
|
|
166
|
+
await fs.writeFile(filePath, file.content, 'utf-8');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if template exists in registry
|
|
171
|
+
*/
|
|
172
|
+
export async function templateExistsInRegistry(templateName, registryUrl) {
|
|
173
|
+
try {
|
|
174
|
+
await fetchTemplate(templateName, registryUrl);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Install a default template bundled with the CLI
|
|
183
|
+
*/
|
|
184
|
+
export async function installDefaultTemplate(templateName) {
|
|
185
|
+
await ensureTemplatesDir();
|
|
186
|
+
// Path to bundled default template (in dist/default-templates/)
|
|
187
|
+
const defaultTemplatePath = path.join(__dirname, '..', 'default-templates', templateName);
|
|
188
|
+
// Destination path
|
|
189
|
+
const paths = await getResolvedPaths();
|
|
190
|
+
const templateDir = path.join(paths.templates, templateName);
|
|
191
|
+
try {
|
|
192
|
+
// Create template directory
|
|
193
|
+
await fs.mkdir(templateDir, { recursive: true });
|
|
194
|
+
// Copy only source files (exclude TypeScript compilation artifacts)
|
|
195
|
+
const files = await fs.readdir(defaultTemplatePath);
|
|
196
|
+
// Filter out compiled files - only copy source files
|
|
197
|
+
const sourceFiles = files.filter(file => {
|
|
198
|
+
// Exclude TypeScript compilation outputs
|
|
199
|
+
return !file.endsWith('.js') &&
|
|
200
|
+
!file.endsWith('.js.map') &&
|
|
201
|
+
!file.endsWith('.d.ts') &&
|
|
202
|
+
!file.endsWith('.d.ts.map');
|
|
203
|
+
});
|
|
204
|
+
for (const file of sourceFiles) {
|
|
205
|
+
const sourcePath = path.join(defaultTemplatePath, file);
|
|
206
|
+
const destPath = path.join(templateDir, file);
|
|
207
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
208
|
+
await fs.writeFile(destPath, content, 'utf-8');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
throw new Error(`Failed to install default template: ${error.message}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { TemplateProps } from '../types/template.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load a template module dynamically
|
|
4
|
+
* Transpiles TSX to JS on-the-fly using esbuild
|
|
5
|
+
* @param templateName - Template name or relative path
|
|
6
|
+
* @param relativeTo - Optional path to resolve relative paths against
|
|
7
|
+
* @returns The loaded template module and its resolved path
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadTemplate(templateName: string, relativeTo?: string): Promise<{
|
|
10
|
+
module: any;
|
|
11
|
+
templatePath: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Render a template to SVG using Satori
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderToSVG(templateName: string, props?: TemplateProps): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Render a template to PNG
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderToPNG(templateName: string, props?: TemplateProps, options?: {
|
|
21
|
+
scale?: number;
|
|
22
|
+
}): Promise<Buffer>;
|
|
23
|
+
/**
|
|
24
|
+
* Render a template to JPEG (faster for video frames)
|
|
25
|
+
*/
|
|
26
|
+
export declare function renderToJPEG(templateName: string, props?: TemplateProps, options?: {
|
|
27
|
+
scale?: number;
|
|
28
|
+
quality?: number;
|
|
29
|
+
}): Promise<Buffer>;
|
|
30
|
+
/**
|
|
31
|
+
* Render a template to WebP
|
|
32
|
+
*/
|
|
33
|
+
export declare function renderToWebP(templateName: string, props?: TemplateProps): Promise<Buffer>;
|
|
34
|
+
/**
|
|
35
|
+
* Save rendered output to file
|
|
36
|
+
*/
|
|
37
|
+
export declare function saveToFile(data: Buffer | string, outputPath: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Render options interface
|
|
40
|
+
*/
|
|
41
|
+
export interface RenderOptions {
|
|
42
|
+
templateName: string;
|
|
43
|
+
props?: TemplateProps;
|
|
44
|
+
outputPath?: string;
|
|
45
|
+
format?: 'png' | 'svg' | 'webp' | 'jpg' | 'jpeg';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Main render function
|
|
49
|
+
*/
|
|
50
|
+
export declare function render(options: RenderOptions): Promise<Buffer | string>;
|
|
51
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/lib/renderer.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAiB1D;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAmFhD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,aAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CA0NjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,aAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAGD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAEf;AAwKD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAClD;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CA8B7E"}
|