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.
Files changed (245) hide show
  1. package/FONTS.md +156 -0
  2. package/HELPERS_DEMO.md +134 -0
  3. package/PROJECT_STRUCTURE.md +286 -0
  4. package/PUBLISHING.md +171 -0
  5. package/README.md +1020 -0
  6. package/REGISTRY_SETUP.md +427 -0
  7. package/SHADCN_INTEGRATION.md +269 -0
  8. package/TAILWIND.md +228 -0
  9. package/TEMPLATE_SOURCES.md +363 -0
  10. package/_dsgn/templates/banner-hero/banner-hero.tsx +57 -0
  11. package/_dsgn/templates/banner-hero/meta.json +14 -0
  12. package/_dsgn/templates/composite-card/meta.json +16 -0
  13. package/_dsgn/templates/composite-card/template.tsx +44 -0
  14. package/_dsgn/templates/image/meta.json +13 -0
  15. package/_dsgn/templates/image/template.tsx +28 -0
  16. package/_dsgn/templates/kitchen-sink/meta.json +13 -0
  17. package/_dsgn/templates/kitchen-sink/template.tsx +72 -0
  18. package/_dsgn/templates/qr-card/meta.json +14 -0
  19. package/_dsgn/templates/qr-card/template.tsx +39 -0
  20. package/_dsgn/templates/test-parent/child/meta.json +11 -0
  21. package/_dsgn/templates/test-parent/child/template.tsx +27 -0
  22. package/_dsgn/templates/test-parent/meta.json +12 -0
  23. package/_dsgn/templates/test-parent/template.tsx +30 -0
  24. package/_dsgn/templates/test-sibling/meta.json +11 -0
  25. package/_dsgn/templates/test-sibling/template.tsx +20 -0
  26. package/_dsgn/templates/video/.tmp/template-1763421345296.mjs +43 -0
  27. package/_dsgn/templates/video/.tmp/template-1763421362228.mjs +43 -0
  28. package/_dsgn/templates/video/.tmp/template-1763421377706.mjs +43 -0
  29. package/_dsgn/templates/video/meta.json +17 -0
  30. package/_dsgn/templates/video/template.tsx +48 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +70 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/add.d.ts +6 -0
  36. package/dist/commands/add.d.ts.map +1 -0
  37. package/dist/commands/add.js +86 -0
  38. package/dist/commands/add.js.map +1 -0
  39. package/dist/commands/default.d.ts +2 -0
  40. package/dist/commands/default.d.ts.map +1 -0
  41. package/dist/commands/default.js +69 -0
  42. package/dist/commands/default.js.map +1 -0
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +75 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/list.d.ts +2 -0
  48. package/dist/commands/list.d.ts.map +1 -0
  49. package/dist/commands/list.js +83 -0
  50. package/dist/commands/list.js.map +1 -0
  51. package/dist/commands/preview.d.ts +3 -0
  52. package/dist/commands/preview.d.ts.map +1 -0
  53. package/dist/commands/preview.js +296 -0
  54. package/dist/commands/preview.js.map +1 -0
  55. package/dist/commands/render.d.ts +10 -0
  56. package/dist/commands/render.d.ts.map +1 -0
  57. package/dist/commands/render.js +204 -0
  58. package/dist/commands/render.js.map +1 -0
  59. package/dist/commands/validate.d.ts +2 -0
  60. package/dist/commands/validate.d.ts.map +1 -0
  61. package/dist/commands/validate.js +107 -0
  62. package/dist/commands/validate.js.map +1 -0
  63. package/dist/default-templates/AGENTS.md +229 -0
  64. package/dist/default-templates/image/meta.json +13 -0
  65. package/dist/default-templates/image/template.d.ts +20 -0
  66. package/dist/default-templates/image/template.d.ts.map +1 -0
  67. package/dist/default-templates/image/template.js +18 -0
  68. package/dist/default-templates/image/template.js.map +1 -0
  69. package/dist/default-templates/image/template.tsx +20 -0
  70. package/dist/default-templates/image-template/meta.json +13 -0
  71. package/dist/default-templates/image-template/template.tsx +19 -0
  72. package/dist/default-templates/kitchen-sink/meta.json +13 -0
  73. package/dist/default-templates/kitchen-sink/template.tsx +64 -0
  74. package/dist/default-templates/page/meta.json +17 -0
  75. package/dist/default-templates/page/template.tsx +37 -0
  76. package/dist/default-templates/video/meta.json +17 -0
  77. package/dist/default-templates/video/template.d.ts +26 -0
  78. package/dist/default-templates/video/template.d.ts.map +1 -0
  79. package/dist/default-templates/video/template.js +33 -0
  80. package/dist/default-templates/video/template.js.map +1 -0
  81. package/dist/default-templates/video/template.tsx +37 -0
  82. package/dist/default-templates/video-template/meta.json +17 -0
  83. package/dist/default-templates/video-template/template.tsx +36 -0
  84. package/dist/default-templates/website/meta.json +16 -0
  85. package/dist/default-templates/website/pages/home.tsx +17 -0
  86. package/dist/default-templates/website/parts/footer.tsx +17 -0
  87. package/dist/default-templates/website/parts/header.tsx +17 -0
  88. package/dist/default-templates/website/template.tsx +17 -0
  89. package/dist/default-templates/website-template/meta.json +16 -0
  90. package/dist/default-templates/website-template/pages/home.tsx +16 -0
  91. package/dist/default-templates/website-template/parts/footer.tsx +16 -0
  92. package/dist/default-templates/website-template/parts/header.tsx +16 -0
  93. package/dist/default-templates/website-template/template.tsx +16 -0
  94. package/dist/lib/config.d.ts +34 -0
  95. package/dist/lib/config.d.ts.map +1 -0
  96. package/dist/lib/config.js +248 -0
  97. package/dist/lib/config.js.map +1 -0
  98. package/dist/lib/constants.d.ts +7 -0
  99. package/dist/lib/constants.d.ts.map +1 -0
  100. package/dist/lib/constants.js +12 -0
  101. package/dist/lib/constants.js.map +1 -0
  102. package/dist/lib/helpers.d.ts +29 -0
  103. package/dist/lib/helpers.d.ts.map +1 -0
  104. package/dist/lib/helpers.js +159 -0
  105. package/dist/lib/helpers.js.map +1 -0
  106. package/dist/lib/installer.d.ts +51 -0
  107. package/dist/lib/installer.d.ts.map +1 -0
  108. package/dist/lib/installer.js +215 -0
  109. package/dist/lib/installer.js.map +1 -0
  110. package/dist/lib/renderer.d.ts +51 -0
  111. package/dist/lib/renderer.d.ts.map +1 -0
  112. package/dist/lib/renderer.js +524 -0
  113. package/dist/lib/renderer.js.map +1 -0
  114. package/dist/lib/tailwind-config-loader.d.ts +47 -0
  115. package/dist/lib/tailwind-config-loader.d.ts.map +1 -0
  116. package/dist/lib/tailwind-config-loader.js +432 -0
  117. package/dist/lib/tailwind-config-loader.js.map +1 -0
  118. package/dist/lib/tailwind-detector.d.ts +36 -0
  119. package/dist/lib/tailwind-detector.d.ts.map +1 -0
  120. package/dist/lib/tailwind-detector.js +156 -0
  121. package/dist/lib/tailwind-detector.js.map +1 -0
  122. package/dist/lib/tailwind.d.ts +8 -0
  123. package/dist/lib/tailwind.d.ts.map +1 -0
  124. package/dist/lib/tailwind.js +994 -0
  125. package/dist/lib/tailwind.js.map +1 -0
  126. package/dist/lib/template-validator.d.ts +22 -0
  127. package/dist/lib/template-validator.d.ts.map +1 -0
  128. package/dist/lib/template-validator.js +174 -0
  129. package/dist/lib/template-validator.js.map +1 -0
  130. package/dist/lib/utils.d.ts +44 -0
  131. package/dist/lib/utils.d.ts.map +1 -0
  132. package/dist/lib/utils.js +207 -0
  133. package/dist/lib/utils.js.map +1 -0
  134. package/dist/lib/version-check.d.ts +16 -0
  135. package/dist/lib/version-check.d.ts.map +1 -0
  136. package/dist/lib/version-check.js +88 -0
  137. package/dist/lib/version-check.js.map +1 -0
  138. package/dist/lib/video-renderer.d.ts +32 -0
  139. package/dist/lib/video-renderer.d.ts.map +1 -0
  140. package/dist/lib/video-renderer.js +226 -0
  141. package/dist/lib/video-renderer.js.map +1 -0
  142. package/dist/sdk/index.d.ts +58 -0
  143. package/dist/sdk/index.d.ts.map +1 -0
  144. package/dist/sdk/index.js +119 -0
  145. package/dist/sdk/index.js.map +1 -0
  146. package/dist/sdk/template.d.ts +40 -0
  147. package/dist/sdk/template.d.ts.map +1 -0
  148. package/dist/sdk/template.js +60 -0
  149. package/dist/sdk/template.js.map +1 -0
  150. package/dist/types/config.d.ts +62 -0
  151. package/dist/types/config.d.ts.map +1 -0
  152. package/dist/types/config.js +47 -0
  153. package/dist/types/config.js.map +1 -0
  154. package/dist/types/template.d.ts +79 -0
  155. package/dist/types/template.d.ts.map +1 -0
  156. package/dist/types/template.js +2 -0
  157. package/dist/types/template.js.map +1 -0
  158. package/examples/nextjs-api/README.md +180 -0
  159. package/examples/nextjs-api/package.json +21 -0
  160. package/examples/nextjs-api/pages/api/intro-video.ts +53 -0
  161. package/examples/nextjs-api/pages/api/og-image.ts +50 -0
  162. package/netlify.toml +13 -0
  163. package/package.json +84 -0
  164. package/patches/satori+0.18.3.patch +13 -0
  165. package/test-templates/TESTS.md +63 -0
  166. package/test-templates/_dsgn/templates/absolute-spin/meta.json +7 -0
  167. package/test-templates/_dsgn/templates/absolute-spin/template.tsx +16 -0
  168. package/test-templates/_dsgn/templates/animated-intro/.tmp/template-1763468771640.mjs +7 -0
  169. package/test-templates/_dsgn/templates/animated-intro/meta.json +10 -0
  170. package/test-templates/_dsgn/templates/animated-intro/template.tsx +23 -0
  171. package/test-templates/_dsgn/templates/centered-spin/.tmp/template-1763468525386.mjs +7 -0
  172. package/test-templates/_dsgn/templates/centered-spin/meta.json +7 -0
  173. package/test-templates/_dsgn/templates/centered-spin/template.tsx +11 -0
  174. package/test-templates/_dsgn/templates/composite/.tmp/template-1763468815645.mjs +7 -0
  175. package/test-templates/_dsgn/templates/composite/meta.json +9 -0
  176. package/test-templates/_dsgn/templates/composite/template.tsx +23 -0
  177. package/test-templates/_dsgn/templates/easing-test/.tmp/template-1763468824501.mjs +7 -0
  178. package/test-templates/_dsgn/templates/easing-test/meta.json +7 -0
  179. package/test-templates/_dsgn/templates/easing-test/template.tsx +47 -0
  180. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466364336.mjs +10 -0
  181. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466584319.mjs +10 -0
  182. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466667797.mjs +10 -0
  183. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466746504.mjs +10 -0
  184. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466930225.mjs +10 -0
  185. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467004552.mjs +10 -0
  186. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467060334.mjs +10 -0
  187. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467124493.mjs +10 -0
  188. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467174690.mjs +10 -0
  189. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467359134.mjs +10 -0
  190. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467451928.mjs +10 -0
  191. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467758275.mjs +10 -0
  192. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467985201.mjs +10 -0
  193. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468020563.mjs +10 -0
  194. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468090428.mjs +10 -0
  195. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468211036.mjs +10 -0
  196. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468394057.mjs +10 -0
  197. package/test-templates/_dsgn/templates/minimal-spin/meta.json +7 -0
  198. package/test-templates/_dsgn/templates/minimal-spin/template.tsx +13 -0
  199. package/test-templates/_dsgn/templates/no-origin-spin/meta.json +7 -0
  200. package/test-templates/_dsgn/templates/no-origin-spin/template.tsx +10 -0
  201. package/test-templates/_dsgn/templates/opacity-test/meta.json +7 -0
  202. package/test-templates/_dsgn/templates/opacity-test/template.tsx +9 -0
  203. package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468758954.mjs +17 -0
  204. package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468815672.mjs +17 -0
  205. package/test-templates/_dsgn/templates/qr-code/meta.json +9 -0
  206. package/test-templates/_dsgn/templates/qr-code/template.tsx +20 -0
  207. package/test-templates/_dsgn/templates/rotation-abs-test/meta.json +7 -0
  208. package/test-templates/_dsgn/templates/rotation-abs-test/template.tsx +15 -0
  209. package/test-templates/_dsgn/templates/rotation-corner/meta.json +7 -0
  210. package/test-templates/_dsgn/templates/rotation-corner/template.tsx +12 -0
  211. package/test-templates/_dsgn/templates/rotation-test/meta.json +7 -0
  212. package/test-templates/_dsgn/templates/rotation-test/template.tsx +12 -0
  213. package/test-templates/_dsgn/templates/shake-test/meta.json +7 -0
  214. package/test-templates/_dsgn/templates/shake-test/template.tsx +12 -0
  215. package/test-templates/_dsgn/templates/static-image/.tmp/template-1763468746271.mjs +7 -0
  216. package/test-templates/_dsgn/templates/static-image/meta.json +9 -0
  217. package/test-templates/_dsgn/templates/static-image/template.tsx +19 -0
  218. package/test-templates/_dsgn/templates/translate-test/meta.json +7 -0
  219. package/test-templates/_dsgn/templates/translate-test/template.tsx +9 -0
  220. package/test-templates/_dsgn/templates/video-loops/.tmp/template-1763468793192.mjs +15 -0
  221. package/test-templates/_dsgn/templates/video-loops/meta.json +9 -0
  222. package/test-templates/_dsgn/templates/video-loops/template.tsx +39 -0
  223. package/test-templates/_dsgn/templates/wrapped-spin/meta.json +7 -0
  224. package/test-templates/_dsgn/templates/wrapped-spin/template.tsx +17 -0
  225. package/test-templates/compare-svgs.mjs +30 -0
  226. package/test-templates/convert-frames.mjs +15 -0
  227. package/test-templates/debug-rotation.mjs +25 -0
  228. package/test-templates/run-tests.sh +39 -0
  229. package/test-templates/test-sdk.mjs +115 -0
  230. package/website/.astro/settings.json +5 -0
  231. package/website/.astro/types.d.ts +1 -0
  232. package/website/README.md +112 -0
  233. package/website/astro.config.mjs +18 -0
  234. package/website/dist/_astro/fonts.DHdiHGBO.css +1 -0
  235. package/website/dist/fonts/index.html +193 -0
  236. package/website/dist/helpers/index.html +166 -0
  237. package/website/dist/images/index.html +314 -0
  238. package/website/dist/index.html +219 -0
  239. package/website/dist/llm.txt +2448 -0
  240. package/website/dist/styling/index.html +365 -0
  241. package/website/dist/templates/index.html +124 -0
  242. package/website/dist/video/index.html +636 -0
  243. package/website/package-lock.json +7606 -0
  244. package/website/package.json +23 -0
  245. 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"}