loopwind 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/compiler.d.ts +94 -0
- package/dist/sdk/compiler.d.ts.map +1 -0
- package/dist/sdk/compiler.js +122 -0
- package/dist/sdk/compiler.js.map +1 -0
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/template.d.ts +30 -43
- package/dist/sdk/template.d.ts.map +1 -1
- package/dist/sdk/template.js +52 -73
- package/dist/sdk/template.js.map +1 -1
- package/examples/template-compiler-workflow.ts +251 -0
- package/output/sdk-static.jpg +0 -0
- package/package.json +7 -1
- package/test-jsx-support.mjs +146 -0
- package/test-sdk-source-config.mjs +427 -0
- package/test-templates/config-test.mjs +17 -0
- package/website/astro.config.mjs +10 -0
- package/website/dist/.gitkeep +1 -0
- package/website/dist/_worker.js/index.js +1 -1
- package/website/dist/_worker.js/{manifest_BAAoOzaU.mjs → manifest_CT_D-YDe.mjs} +1 -1
- package/website/dist/llm.txt +1 -1
- package/website/dist/sdk/index.html +405 -102
- package/website/dist/sitemap.xml +12 -12
- 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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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile JSX template source to plain JavaScript
|
|
3
|
+
*
|
|
4
|
+
* This function transforms JSX syntax to React.createElement calls using Babel.
|
|
5
|
+
* Use this in your admin panel, build pipeline, or anywhere you need to compile
|
|
6
|
+
* user-generated JSX templates before storing or deploying them.
|
|
7
|
+
*
|
|
8
|
+
* **When to use this:**
|
|
9
|
+
* - In admin panels where users edit templates in a code editor
|
|
10
|
+
* - In build pipelines that process templates before deployment
|
|
11
|
+
* - Before storing templates in a database
|
|
12
|
+
*
|
|
13
|
+
* **Benefits:**
|
|
14
|
+
* - Compile JSX at save time instead of runtime
|
|
15
|
+
* - Catch syntax errors early (before production)
|
|
16
|
+
* - Reduce production bundle size (no Babel in production)
|
|
17
|
+
* - Faster rendering (no compilation overhead)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // In your admin panel API
|
|
22
|
+
* import { compileTemplate } from 'loopwind/sdk/compiler';
|
|
23
|
+
*
|
|
24
|
+
* export async function POST(req: Request) {
|
|
25
|
+
* const { templateId, jsxCode } = await req.json();
|
|
26
|
+
*
|
|
27
|
+
* try {
|
|
28
|
+
* // Compile JSX to JavaScript
|
|
29
|
+
* const compiled = compileTemplate(jsxCode);
|
|
30
|
+
*
|
|
31
|
+
* // Save compiled version to database
|
|
32
|
+
* await db.templates.update(templateId, {
|
|
33
|
+
* sourceCode: compiled,
|
|
34
|
+
* updatedAt: new Date()
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* return Response.json({ success: true });
|
|
38
|
+
* } catch (error) {
|
|
39
|
+
* return Response.json({
|
|
40
|
+
* error: 'Compilation failed',
|
|
41
|
+
* message: error.message
|
|
42
|
+
* }, { status: 400 });
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* // Input JSX
|
|
50
|
+
* const jsxSource = `
|
|
51
|
+
* export const meta = {
|
|
52
|
+
* name: 'card',
|
|
53
|
+
* size: { width: 1200, height: 630 }
|
|
54
|
+
* };
|
|
55
|
+
*
|
|
56
|
+
* export default ({ tw, title }) => (
|
|
57
|
+
* <div style={tw('flex items-center justify-center w-full h-full bg-blue-500')}>
|
|
58
|
+
* <h1 style={tw('text-6xl font-bold text-white')}>{title}</h1>
|
|
59
|
+
* </div>
|
|
60
|
+
* );
|
|
61
|
+
* `;
|
|
62
|
+
*
|
|
63
|
+
* // Compile to plain JavaScript
|
|
64
|
+
* const compiled = compileTemplate(jsxSource);
|
|
65
|
+
*
|
|
66
|
+
* // compiled now contains React.createElement calls
|
|
67
|
+
* // You can safely use this with defineTemplateFromSource in production
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @param jsxSource - Template source code containing JSX syntax
|
|
71
|
+
* @returns Compiled JavaScript with React.createElement calls
|
|
72
|
+
* @throws Error if the JSX syntax is invalid or compilation fails
|
|
73
|
+
*/
|
|
74
|
+
export declare function compileTemplate(jsxSource: string): string;
|
|
75
|
+
/**
|
|
76
|
+
* Check if source code contains JSX syntax
|
|
77
|
+
*
|
|
78
|
+
* This is a simple heuristic check that looks for common JSX patterns.
|
|
79
|
+
* Use this to determine if source code needs compilation.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const code1 = '<div>Hello</div>';
|
|
84
|
+
* const code2 = 'React.createElement("div", null, "Hello")';
|
|
85
|
+
*
|
|
86
|
+
* containsJSX(code1); // true
|
|
87
|
+
* containsJSX(code2); // false
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @param sourceCode - Source code to check
|
|
91
|
+
* @returns true if the code appears to contain JSX
|
|
92
|
+
*/
|
|
93
|
+
export declare function containsJSX(sourceCode: string): boolean;
|
|
94
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/sdk/compiler.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAcvD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as Babel from '@babel/standalone';
|
|
2
|
+
/**
|
|
3
|
+
* Compile JSX template source to plain JavaScript
|
|
4
|
+
*
|
|
5
|
+
* This function transforms JSX syntax to React.createElement calls using Babel.
|
|
6
|
+
* Use this in your admin panel, build pipeline, or anywhere you need to compile
|
|
7
|
+
* user-generated JSX templates before storing or deploying them.
|
|
8
|
+
*
|
|
9
|
+
* **When to use this:**
|
|
10
|
+
* - In admin panels where users edit templates in a code editor
|
|
11
|
+
* - In build pipelines that process templates before deployment
|
|
12
|
+
* - Before storing templates in a database
|
|
13
|
+
*
|
|
14
|
+
* **Benefits:**
|
|
15
|
+
* - Compile JSX at save time instead of runtime
|
|
16
|
+
* - Catch syntax errors early (before production)
|
|
17
|
+
* - Reduce production bundle size (no Babel in production)
|
|
18
|
+
* - Faster rendering (no compilation overhead)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // In your admin panel API
|
|
23
|
+
* import { compileTemplate } from 'loopwind/sdk/compiler';
|
|
24
|
+
*
|
|
25
|
+
* export async function POST(req: Request) {
|
|
26
|
+
* const { templateId, jsxCode } = await req.json();
|
|
27
|
+
*
|
|
28
|
+
* try {
|
|
29
|
+
* // Compile JSX to JavaScript
|
|
30
|
+
* const compiled = compileTemplate(jsxCode);
|
|
31
|
+
*
|
|
32
|
+
* // Save compiled version to database
|
|
33
|
+
* await db.templates.update(templateId, {
|
|
34
|
+
* sourceCode: compiled,
|
|
35
|
+
* updatedAt: new Date()
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* return Response.json({ success: true });
|
|
39
|
+
* } catch (error) {
|
|
40
|
+
* return Response.json({
|
|
41
|
+
* error: 'Compilation failed',
|
|
42
|
+
* message: error.message
|
|
43
|
+
* }, { status: 400 });
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Input JSX
|
|
51
|
+
* const jsxSource = `
|
|
52
|
+
* export const meta = {
|
|
53
|
+
* name: 'card',
|
|
54
|
+
* size: { width: 1200, height: 630 }
|
|
55
|
+
* };
|
|
56
|
+
*
|
|
57
|
+
* export default ({ tw, title }) => (
|
|
58
|
+
* <div style={tw('flex items-center justify-center w-full h-full bg-blue-500')}>
|
|
59
|
+
* <h1 style={tw('text-6xl font-bold text-white')}>{title}</h1>
|
|
60
|
+
* </div>
|
|
61
|
+
* );
|
|
62
|
+
* `;
|
|
63
|
+
*
|
|
64
|
+
* // Compile to plain JavaScript
|
|
65
|
+
* const compiled = compileTemplate(jsxSource);
|
|
66
|
+
*
|
|
67
|
+
* // compiled now contains React.createElement calls
|
|
68
|
+
* // You can safely use this with defineTemplateFromSource in production
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @param jsxSource - Template source code containing JSX syntax
|
|
72
|
+
* @returns Compiled JavaScript with React.createElement calls
|
|
73
|
+
* @throws Error if the JSX syntax is invalid or compilation fails
|
|
74
|
+
*/
|
|
75
|
+
export function compileTemplate(jsxSource) {
|
|
76
|
+
try {
|
|
77
|
+
const result = Babel.transform(jsxSource, {
|
|
78
|
+
presets: ['react'],
|
|
79
|
+
filename: 'template.tsx',
|
|
80
|
+
});
|
|
81
|
+
if (!result.code) {
|
|
82
|
+
throw new Error('Babel compilation returned empty code');
|
|
83
|
+
}
|
|
84
|
+
return result.code;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new Error(`Failed to compile JSX template: ${error instanceof Error ? error.message : String(error)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if source code contains JSX syntax
|
|
92
|
+
*
|
|
93
|
+
* This is a simple heuristic check that looks for common JSX patterns.
|
|
94
|
+
* Use this to determine if source code needs compilation.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const code1 = '<div>Hello</div>';
|
|
99
|
+
* const code2 = 'React.createElement("div", null, "Hello")';
|
|
100
|
+
*
|
|
101
|
+
* containsJSX(code1); // true
|
|
102
|
+
* containsJSX(code2); // false
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @param sourceCode - Source code to check
|
|
106
|
+
* @returns true if the code appears to contain JSX
|
|
107
|
+
*/
|
|
108
|
+
export function containsJSX(sourceCode) {
|
|
109
|
+
// Look for JSX-like patterns:
|
|
110
|
+
// - Opening tags: <div, <Component
|
|
111
|
+
// - Self-closing tags: <div />, <Component />
|
|
112
|
+
// - JSX fragments: <>, </>
|
|
113
|
+
const jsxPatterns = [
|
|
114
|
+
/<[A-Za-z][A-Za-z0-9]*\s/, // <div , <Component
|
|
115
|
+
/<[A-Za-z][A-Za-z0-9]*>/, // <div>, <Component>
|
|
116
|
+
/<[A-Za-z][A-Za-z0-9]*\s*\/>/, // <div/>, <Component />
|
|
117
|
+
/<>\s*/, // Fragment opening
|
|
118
|
+
/<\/>\s*/, // Fragment closing
|
|
119
|
+
];
|
|
120
|
+
return jsxPatterns.some((pattern) => pattern.test(sourceCode));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/sdk/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE;YACxC,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,QAAQ,EAAE,cAAc;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,8BAA8B;IAC9B,mCAAmC;IACnC,8CAA8C;IAC9C,2BAA2B;IAC3B,MAAM,WAAW,GAAG;QAClB,yBAAyB,EAAE,oBAAoB;QAC/C,wBAAwB,EAAE,qBAAqB;QAC/C,6BAA6B,EAAE,wBAAwB;QACvD,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,mBAAmB;KAC/B,CAAC;IAEF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TemplateDefinition, StyleConfig } from './template.js';
|
|
2
|
-
export { defineTemplate,
|
|
2
|
+
export { defineTemplate, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
|
|
3
3
|
export type { TemplateDefinition, StyleConfig, TemplateSchema, SchemaElement } from './template.js';
|
|
4
4
|
/**
|
|
5
5
|
* Render options for image generation
|
package/dist/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQrE,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQrE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACnG,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
|
package/dist/sdk/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { renderVideo as renderVideoInternal } from '../lib/video-renderer.js';
|
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import os from 'os';
|
|
7
|
-
export { defineTemplate,
|
|
7
|
+
export { defineTemplate, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
|
|
8
8
|
/**
|
|
9
9
|
* Render an image from a template definition
|
|
10
10
|
*
|
package/dist/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/template.d.ts
CHANGED
|
@@ -15,25 +15,6 @@ export interface TemplateDefinition<TProps = any> {
|
|
|
15
15
|
config?: StyleConfig;
|
|
16
16
|
render: (props: TProps & TemplateProps) => JSX.Element;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Define a template programmatically for use in serverless environments
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```typescript
|
|
23
|
-
* const ogImage = defineTemplate({
|
|
24
|
-
* name: 'og-image',
|
|
25
|
-
* type: 'image',
|
|
26
|
-
* size: { width: 1200, height: 630 },
|
|
27
|
-
* render: ({ tw, title, description }) => (
|
|
28
|
-
* <div style={tw('flex flex-col w-full h-full bg-white p-12')}>
|
|
29
|
-
* <h1 style={tw('text-6xl font-bold')}>{title}</h1>
|
|
30
|
-
* <p style={tw('text-2xl text-gray-600')}>{description}</p>
|
|
31
|
-
* </div>
|
|
32
|
-
* )
|
|
33
|
-
* });
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export declare function defineTemplate<TProps = any>(definition: TemplateDefinition<TProps>): TemplateDefinition<TProps>;
|
|
37
18
|
/**
|
|
38
19
|
* Convert a template definition to template metadata
|
|
39
20
|
* @internal
|
|
@@ -42,22 +23,23 @@ export declare function templateToMeta(template: TemplateDefinition): TemplateMe
|
|
|
42
23
|
/**
|
|
43
24
|
* Define a template from an imported template file
|
|
44
25
|
*
|
|
45
|
-
*
|
|
26
|
+
* The standard way to create templates in loopwind. Import a template file
|
|
27
|
+
* and pass it to defineTemplate() with optional config overrides.
|
|
46
28
|
*
|
|
47
29
|
* @example
|
|
48
30
|
* ```typescript
|
|
49
|
-
* import * as
|
|
31
|
+
* import * as ogImage from './_loopwind/templates/og-image/template';
|
|
50
32
|
*
|
|
51
|
-
* const template =
|
|
33
|
+
* const template = defineTemplate(ogImage, {
|
|
52
34
|
* config: {
|
|
53
35
|
* colors: { primary: '#ff0000' }
|
|
54
36
|
* }
|
|
55
37
|
* });
|
|
56
38
|
*
|
|
57
|
-
* const
|
|
39
|
+
* const png = await renderImage(template, { title: 'Hello' });
|
|
58
40
|
* ```
|
|
59
41
|
*/
|
|
60
|
-
export declare function
|
|
42
|
+
export declare function defineTemplate<TProps = any>(templateModule: {
|
|
61
43
|
meta: TemplateMeta;
|
|
62
44
|
default: (props: TProps & TemplateProps) => JSX.Element;
|
|
63
45
|
}, options?: {
|
|
@@ -66,37 +48,42 @@ export declare function defineTemplateFromFile<TProps = any>(templateModule: {
|
|
|
66
48
|
/**
|
|
67
49
|
* Define a template from a source code string
|
|
68
50
|
*
|
|
51
|
+
* **IMPORTANT:** This function expects **pre-compiled JavaScript** with React.createElement
|
|
52
|
+
* calls. If you have JSX source code, compile it first using `compileTemplate()` from
|
|
53
|
+
* 'loopwind/sdk/compiler'.
|
|
54
|
+
*
|
|
69
55
|
* **WARNING:** This function evaluates code strings using `new Function()`.
|
|
70
56
|
* Only use with **trusted** template sources. Never use with user input from
|
|
71
57
|
* untrusted sources as it can execute arbitrary code.
|
|
72
58
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
59
|
+
* **Recommended workflow:**
|
|
60
|
+
* 1. In your admin panel: Use `compileTemplate()` to transform JSX → JavaScript
|
|
61
|
+
* 2. Store the compiled JavaScript in your database
|
|
62
|
+
* 3. In production: Load compiled code and pass to `defineTemplateFromSource()`
|
|
63
|
+
*
|
|
64
|
+
* This approach keeps @babel/standalone out of your production bundle!
|
|
77
65
|
*
|
|
78
66
|
* @example
|
|
79
67
|
* ```typescript
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* name: 'user-template',
|
|
83
|
-
* type: 'image',
|
|
84
|
-
* size: { width: 1200, height: 630 }
|
|
85
|
-
* };
|
|
68
|
+
* // Admin panel: Compile and save
|
|
69
|
+
* import { compileTemplate } from 'loopwind/sdk/compiler';
|
|
86
70
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* );
|
|
92
|
-
* };
|
|
93
|
-
* `;
|
|
71
|
+
* const jsxCode = getUserCodeFromEditor(); // Contains JSX
|
|
72
|
+
* const compiled = compileTemplate(jsxCode);
|
|
73
|
+
* await db.templates.save({ code: compiled });
|
|
74
|
+
* ```
|
|
94
75
|
*
|
|
95
|
-
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Production API: Load and render
|
|
79
|
+
* import { defineTemplateFromSource, renderImage } from 'loopwind/sdk';
|
|
80
|
+
*
|
|
81
|
+
* const template = await db.templates.findById(id);
|
|
82
|
+
* const templateDef = defineTemplateFromSource(template.code, {
|
|
96
83
|
* config: { colors: { primary: '#3b82f6' } }
|
|
97
84
|
* });
|
|
98
85
|
*
|
|
99
|
-
* const png = await renderImage(
|
|
86
|
+
* const png = await renderImage(templateDef, { title: 'Hello' });
|
|
100
87
|
* ```
|
|
101
88
|
*/
|
|
102
89
|
export declare function defineTemplateFromSource<TProps = any>(sourceCode: string, options?: {
|
|
@@ -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;AAIvD,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
|
|
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;AAIvD,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;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CASzE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAG,GAAG,EACzC,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,CA0B5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,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,CAgC5B;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,CAkE5B"}
|