loopwind 0.18.0 → 0.18.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/REGISTRY_SETUP.md +1 -55
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +0 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/lib/installer.d.ts +0 -8
- package/dist/lib/installer.d.ts.map +1 -1
- package/dist/lib/installer.js +1 -48
- package/dist/lib/installer.js.map +1 -1
- package/dist/sdk/template.d.ts +0 -36
- package/dist/sdk/template.d.ts.map +1 -1
- package/dist/sdk/template.js +21 -2
- package/dist/sdk/template.js.map +1 -1
- package/package.json +3 -1
- package/test-jsx-support.mjs +120 -0
- package/website/astro.config.mjs +10 -0
- package/website/package-lock.json +1077 -17
- package/website/package.json +5 -1
- package/website/public/.gitkeep +1 -0
- package/website/deploy.sh +0 -19
- package/website/public/.assetsignore +0 -3
- package/website/wrangler.toml +0 -12
package/REGISTRY_SETUP.md
CHANGED
|
@@ -104,40 +104,6 @@ vercel deploy
|
|
|
104
104
|
netlify deploy
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
### Option 3: Use GitHub as Registry (Temporary)
|
|
108
|
-
|
|
109
|
-
Until you set up a real registry, use GitHub:
|
|
110
|
-
|
|
111
|
-
**1. Create a templates repo:**
|
|
112
|
-
|
|
113
|
-
```
|
|
114
|
-
github.com/yourusername/loopwind-templates/
|
|
115
|
-
├── banner-hero/
|
|
116
|
-
│ └── template.tsx # Contains export const meta + component
|
|
117
|
-
├── product-card/
|
|
118
|
-
│ └── template.tsx
|
|
119
|
-
└── README.md
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**2. Users install with:**
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
loopwind add github:yourusername/loopwind-templates/banner-hero
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**3. Update CLI default:**
|
|
129
|
-
|
|
130
|
-
```typescript
|
|
131
|
-
// src/lib/constants.ts
|
|
132
|
-
export const DEFAULT_REGISTRY = 'github:yourusername/loopwind-templates';
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Then users can:
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
loopwind add banner-hero # Uses GitHub as registry
|
|
139
|
-
```
|
|
140
|
-
|
|
141
107
|
## Creating Template JSON Files
|
|
142
108
|
|
|
143
109
|
### Script to Convert Local Templates
|
|
@@ -347,27 +313,7 @@ loopwind add banner-hero
|
|
|
347
313
|
|
|
348
314
|
## Until Registry is Ready
|
|
349
315
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
```bash
|
|
353
|
-
loopwind add github:yourusername/loopwind-templates/banner-hero
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
**Option 2:** Update README with temporary instructions:
|
|
357
|
-
|
|
358
|
-
```markdown
|
|
359
|
-
## Installation
|
|
360
|
-
|
|
361
|
-
Templates are currently hosted on GitHub. Install with:
|
|
362
|
-
|
|
363
|
-
\`\`\`bash
|
|
364
|
-
loopwind add github:loopwindcli/templates/banner-hero
|
|
365
|
-
\`\`\`
|
|
366
|
-
|
|
367
|
-
Official registry coming soon!
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
**Option 3:** Ship with bundled templates in the CLI package itself (see below).
|
|
316
|
+
Ship with bundled templates in the CLI package itself (see below).
|
|
371
317
|
|
|
372
318
|
## Bundled Templates (Alternative)
|
|
373
319
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAyFf"}
|
package/dist/commands/add.js
CHANGED
|
@@ -46,9 +46,6 @@ export async function addCommand(templateSource, options) {
|
|
|
46
46
|
case 'url':
|
|
47
47
|
sourceMessage = `from URL: ${chalk.dim(source.url)}`;
|
|
48
48
|
break;
|
|
49
|
-
case 'github':
|
|
50
|
-
sourceMessage = `from GitHub: ${chalk.dim(source.repo)}`;
|
|
51
|
-
break;
|
|
52
49
|
case 'local':
|
|
53
50
|
sourceMessage = `from local: ${chalk.dim(source.path)}`;
|
|
54
51
|
break;
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/installer.d.ts
CHANGED
|
@@ -8,10 +8,6 @@ export declare function detectTemplateSource(templateSource: string): {
|
|
|
8
8
|
} | {
|
|
9
9
|
type: 'url';
|
|
10
10
|
url: string;
|
|
11
|
-
} | {
|
|
12
|
-
type: 'github';
|
|
13
|
-
repo: string;
|
|
14
|
-
path?: string;
|
|
15
11
|
} | {
|
|
16
12
|
type: 'local';
|
|
17
13
|
path: string;
|
|
@@ -24,10 +20,6 @@ export declare function fetchFromRegistry(templateName: string, registryUrl: str
|
|
|
24
20
|
* Fetch a template from a direct URL
|
|
25
21
|
*/
|
|
26
22
|
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
23
|
/**
|
|
32
24
|
* Load a template from local filesystem
|
|
33
25
|
*/
|
|
@@ -1 +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,
|
|
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,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAclC;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,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+DhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAgB3B;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"}
|
package/dist/lib/installer.js
CHANGED
|
@@ -14,16 +14,6 @@ export function detectTemplateSource(templateSource) {
|
|
|
14
14
|
if (templateSource.startsWith('http://') || templateSource.startsWith('https://')) {
|
|
15
15
|
return { type: 'url', url: templateSource };
|
|
16
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
17
|
// Local path (starts with ./ or ../ or /)
|
|
28
18
|
if (templateSource.startsWith('./') || templateSource.startsWith('../') || templateSource.startsWith('/')) {
|
|
29
19
|
return { type: 'local', path: templateSource };
|
|
@@ -38,7 +28,7 @@ export async function fetchFromRegistry(templateName, registryUrl) {
|
|
|
38
28
|
const url = `${registryUrl}/${templateName}`;
|
|
39
29
|
const response = await fetch(url);
|
|
40
30
|
if (!response.ok) {
|
|
41
|
-
throw new Error(`Failed to fetch template from registry: ${response.statusText}\n\nInstall from
|
|
31
|
+
throw new Error(`Failed to fetch template from registry: ${response.statusText}\n\nInstall from a URL: loopwind add https://example.com/template.json\nOr from local: loopwind add ./my-template`);
|
|
42
32
|
}
|
|
43
33
|
return await response.json();
|
|
44
34
|
}
|
|
@@ -52,41 +42,6 @@ export async function fetchFromURL(url) {
|
|
|
52
42
|
}
|
|
53
43
|
return await response.json();
|
|
54
44
|
}
|
|
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
45
|
/**
|
|
91
46
|
* Load a template from local filesystem
|
|
92
47
|
*/
|
|
@@ -161,8 +116,6 @@ export async function fetchTemplate(templateSource, registryUrl) {
|
|
|
161
116
|
return fetchFromRegistry(source.name, registryUrl);
|
|
162
117
|
case 'url':
|
|
163
118
|
return fetchFromURL(source.url);
|
|
164
|
-
case 'github':
|
|
165
|
-
return fetchFromGitHub(source.repo, source.path);
|
|
166
119
|
case 'local':
|
|
167
120
|
return loadFromLocal(source.path);
|
|
168
121
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAiB,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAuB,MAAM,YAAY,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,cAAsB;
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/template.d.ts
CHANGED
|
@@ -63,42 +63,6 @@ export declare function defineTemplateFromFile<TProps = any>(templateModule: {
|
|
|
63
63
|
}, options?: {
|
|
64
64
|
config?: StyleConfig;
|
|
65
65
|
}): TemplateDefinition<TProps>;
|
|
66
|
-
/**
|
|
67
|
-
* Define a template from a source code string
|
|
68
|
-
*
|
|
69
|
-
* **WARNING:** This function evaluates code strings using `new Function()`.
|
|
70
|
-
* Only use with **trusted** template sources. Never use with user input from
|
|
71
|
-
* untrusted sources as it can execute arbitrary code.
|
|
72
|
-
*
|
|
73
|
-
* Perfect for:
|
|
74
|
-
* - Templates stored in a database (admin-created only)
|
|
75
|
-
* - Templates from a trusted CMS
|
|
76
|
-
* - Code editor features where templates are validated
|
|
77
|
-
*
|
|
78
|
-
* @example
|
|
79
|
-
* ```typescript
|
|
80
|
-
* const templateSource = `
|
|
81
|
-
* export const meta = {
|
|
82
|
-
* name: 'user-template',
|
|
83
|
-
* type: 'image',
|
|
84
|
-
* size: { width: 1200, height: 630 }
|
|
85
|
-
* };
|
|
86
|
-
*
|
|
87
|
-
* export default ({ tw, title }) => {
|
|
88
|
-
* const h = React.createElement;
|
|
89
|
-
* return h('div', { style: tw('flex w-full h-full bg-blue-500 p-12') },
|
|
90
|
-
* h('h1', { style: tw('text-6xl font-bold text-white') }, title)
|
|
91
|
-
* );
|
|
92
|
-
* };
|
|
93
|
-
* `;
|
|
94
|
-
*
|
|
95
|
-
* const template = defineTemplateFromSource(templateSource, {
|
|
96
|
-
* config: { colors: { primary: '#3b82f6' } }
|
|
97
|
-
* });
|
|
98
|
-
*
|
|
99
|
-
* const png = await renderImage(template, { title: 'Hello' });
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
66
|
export declare function defineTemplateFromSource<TProps = any>(sourceCode: string, options?: {
|
|
103
67
|
config?: StyleConfig;
|
|
104
68
|
}): TemplateDefinition<TProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AAEvC,MAAM,WAAW,kBAAkB,CAAC,MAAM,GAAG,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAG,GAAG,EACzC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAyB5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CASzE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,GAAG,EACjD,cAAc,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,GAAG,CAAC,OAAO,CAAA;CAAE,EAC/F,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAW5B;AAuDD,wBAAgB,wBAAwB,CAAC,MAAM,GAAG,GAAG,EACnD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAmC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,GAAG,GAAG,EACnD,MAAM,EAAE,cAAc,GACrB,kBAAkB,CAAC,MAAM,CAAC,CA+D5B"}
|
package/dist/sdk/template.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import * as Babel from '@babel/standalone';
|
|
2
3
|
/**
|
|
3
4
|
* Define a template programmatically for use in serverless environments
|
|
4
5
|
*
|
|
@@ -117,19 +118,37 @@ export function defineTemplateFromFile(templateModule, options = {}) {
|
|
|
117
118
|
* const png = await renderImage(template, { title: 'Hello' });
|
|
118
119
|
* ```
|
|
119
120
|
*/
|
|
121
|
+
/**
|
|
122
|
+
* Transform JSX to JavaScript using Babel
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
function transformJSX(code) {
|
|
126
|
+
try {
|
|
127
|
+
const result = Babel.transform(code, {
|
|
128
|
+
presets: ['react'],
|
|
129
|
+
filename: 'template.tsx',
|
|
130
|
+
});
|
|
131
|
+
return result.code || code;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// If Babel fails, return original code (might be plain JS without JSX)
|
|
135
|
+
return code;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
120
138
|
export function defineTemplateFromSource(sourceCode, options = {}) {
|
|
121
139
|
try {
|
|
140
|
+
// Transform JSX to React.createElement calls
|
|
141
|
+
let processedSource = transformJSX(sourceCode);
|
|
122
142
|
// Strip export keywords to make it work in function context
|
|
123
143
|
// Convert "export const meta = ..." to "const meta = ..."
|
|
124
144
|
// Convert "export default ..." to "const defaultExport = ..."
|
|
125
|
-
|
|
145
|
+
processedSource = processedSource
|
|
126
146
|
.replace(/export\s+const\s+meta\s*=/g, 'const meta =')
|
|
127
147
|
.replace(/export\s+default\s+/g, 'const defaultExport = ');
|
|
128
148
|
// Create a module evaluation function
|
|
129
149
|
// This executes the source code and returns the exports
|
|
130
150
|
const moduleFactory = new Function('React', `
|
|
131
151
|
'use strict';
|
|
132
|
-
const h = React.createElement;
|
|
133
152
|
${processedSource}
|
|
134
153
|
return { meta, default: defaultExport };
|
|
135
154
|
`);
|
package/dist/sdk/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loopwind",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.1",
|
|
4
4
|
"description": "A CLI tool for AI code agents and developers for generating images and videos.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"url": "https://github.com/tomtev/loopwind/issues"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
+
"@babel/standalone": "^7.28.5",
|
|
49
50
|
"@resvg/resvg-js": "^2.6.0",
|
|
50
51
|
"@vitejs/plugin-react": "^5.1.1",
|
|
51
52
|
"boxen": "^7.1.1",
|
|
@@ -74,6 +75,7 @@
|
|
|
74
75
|
"vite": "^7.2.2"
|
|
75
76
|
},
|
|
76
77
|
"devDependencies": {
|
|
78
|
+
"@types/babel__standalone": "^7.1.9",
|
|
77
79
|
"@types/chalk-animation": "^1.6.3",
|
|
78
80
|
"@types/express": "^5.0.5",
|
|
79
81
|
"@types/gradient-string": "^1.1.6",
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test JSX support in defineTemplateFromSource
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { defineTemplateFromSource, renderImage } from './dist/sdk/index.js';
|
|
6
|
+
|
|
7
|
+
console.log('Testing JSX Support in defineTemplateFromSource\n');
|
|
8
|
+
|
|
9
|
+
// Test 1: Simple JSX template
|
|
10
|
+
const simpleJSX = `
|
|
11
|
+
export const meta = {
|
|
12
|
+
name: 'jsx-test',
|
|
13
|
+
type: 'image',
|
|
14
|
+
size: { width: 400, height: 200 }
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default ({ tw, title }) => (
|
|
18
|
+
<div style={tw('flex items-center justify-center w-full h-full bg-blue-500')}>
|
|
19
|
+
<h1 style={tw('text-4xl font-bold text-white')}>{title}</h1>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const template1 = defineTemplateFromSource(simpleJSX);
|
|
26
|
+
const png1 = await renderImage(template1, { title: 'JSX Works!' });
|
|
27
|
+
console.log('✓ Simple JSX template works');
|
|
28
|
+
console.log(' PNG size:', png1.length, 'bytes\n');
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error('✗ Simple JSX template failed:', error.message);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Test 2: Nested JSX
|
|
34
|
+
const nestedJSX = `
|
|
35
|
+
export const meta = {
|
|
36
|
+
name: 'nested-jsx',
|
|
37
|
+
size: { width: 600, height: 300 }
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default ({ tw, title, subtitle, items }) => (
|
|
41
|
+
<div style={tw('flex flex-col w-full h-full bg-white p-8')}>
|
|
42
|
+
<h1 style={tw('text-5xl font-bold text-gray-900 mb-4')}>{title}</h1>
|
|
43
|
+
<p style={tw('text-2xl text-gray-600 mb-6')}>{subtitle}</p>
|
|
44
|
+
<div style={tw('flex gap-4')}>
|
|
45
|
+
{items.map((item, i) => (
|
|
46
|
+
<div style={tw('px-4 py-2 bg-blue-500 text-white rounded')}>
|
|
47
|
+
{item}
|
|
48
|
+
</div>
|
|
49
|
+
))}
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
);
|
|
53
|
+
`;
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const template2 = defineTemplateFromSource(nestedJSX);
|
|
57
|
+
const png2 = await renderImage(template2, {
|
|
58
|
+
title: 'Nested JSX',
|
|
59
|
+
subtitle: 'With multiple levels',
|
|
60
|
+
items: ['One', 'Two', 'Three']
|
|
61
|
+
});
|
|
62
|
+
console.log('✓ Nested JSX template works');
|
|
63
|
+
console.log(' PNG size:', png2.length, 'bytes\n');
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error('✗ Nested JSX template failed:', error.message);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Test 3: Self-closing tags
|
|
69
|
+
const selfClosing = `
|
|
70
|
+
export const meta = {
|
|
71
|
+
name: 'self-closing',
|
|
72
|
+
size: { width: 400, height: 200 }
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export default ({ tw }) => (
|
|
76
|
+
<div style={tw('flex flex-col items-center justify-center w-full h-full bg-gray-100 gap-4')}>
|
|
77
|
+
<div style={tw('w-32 h-32 bg-red-500 rounded-full')} />
|
|
78
|
+
<div style={tw('w-32 h-32 bg-blue-500 rounded-lg')} />
|
|
79
|
+
<div style={tw('w-32 h-32 bg-green-500')} />
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const template3 = defineTemplateFromSource(selfClosing);
|
|
86
|
+
const png3 = await renderImage(template3, {});
|
|
87
|
+
console.log('✓ Self-closing tags work');
|
|
88
|
+
console.log(' PNG size:', png3.length, 'bytes\n');
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error('✗ Self-closing tags failed:', error.message);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Test 4: Complex attributes
|
|
94
|
+
const complexAttrs = `
|
|
95
|
+
export const meta = {
|
|
96
|
+
name: 'complex-attrs',
|
|
97
|
+
size: { width: 500, height: 250 }
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export default ({ tw, title, count }) => (
|
|
101
|
+
<div style={tw('flex flex-col w-full h-full bg-gradient-to-br from-purple-600 to-pink-500 p-8')}>
|
|
102
|
+
<h1 style={tw('text-4xl font-bold text-white mb-4')}>{title}</h1>
|
|
103
|
+
<div style={tw('flex items-center gap-2')}>
|
|
104
|
+
<span style={tw('text-2xl text-white')}>Count:</span>
|
|
105
|
+
<span style={tw('text-3xl font-bold text-yellow-300')}>{count}</span>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
);
|
|
109
|
+
`;
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
const template4 = defineTemplateFromSource(complexAttrs);
|
|
113
|
+
const png4 = await renderImage(template4, { title: 'Complex JSX', count: 42 });
|
|
114
|
+
console.log('✓ Complex attributes work');
|
|
115
|
+
console.log(' PNG size:', png4.length, 'bytes\n');
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.error('✗ Complex attributes failed:', error.message);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
console.log('✅ All JSX tests completed!');
|
package/website/astro.config.mjs
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { defineConfig } from 'astro/config';
|
|
2
2
|
import mdx from '@astrojs/mdx';
|
|
3
3
|
import tailwindcss from '@tailwindcss/vite';
|
|
4
|
+
import cloudflare from '@astrojs/cloudflare';
|
|
4
5
|
|
|
5
6
|
// https://astro.build/config
|
|
6
7
|
export default defineConfig({
|
|
7
8
|
site: 'https://loopwind.dev',
|
|
8
9
|
output: 'hybrid',
|
|
10
|
+
adapter: cloudflare({
|
|
11
|
+
platformProxy: {
|
|
12
|
+
enabled: true,
|
|
13
|
+
},
|
|
14
|
+
}),
|
|
9
15
|
integrations: [mdx()],
|
|
10
16
|
vite: {
|
|
11
17
|
plugins: [tailwindcss()],
|
|
18
|
+
ssr: {
|
|
19
|
+
external: ['node:fs/promises', 'node:fs', 'node:path', 'fs', 'fs/promises', 'path'],
|
|
20
|
+
noExternal: ['loopwind'],
|
|
21
|
+
},
|
|
12
22
|
},
|
|
13
23
|
markdown: {
|
|
14
24
|
shikiConfig: {
|