loopwind 0.10.0 โ 0.10.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/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +85 -35
- package/dist/lib/utils.js.map +1 -1
- package/package.json +1 -1
- package/test-templates/run-tests.sh +14 -9
package/dist/lib/utils.d.ts
CHANGED
|
@@ -12,16 +12,23 @@ export declare function ensureTemplatesDir(): Promise<void>;
|
|
|
12
12
|
export declare function ensureOutputDir(): Promise<void>;
|
|
13
13
|
/**
|
|
14
14
|
* Get all installed template names
|
|
15
|
+
* Includes both folder-based and single-file templates
|
|
15
16
|
*/
|
|
16
17
|
export declare function getInstalledTemplates(): Promise<string[]>;
|
|
17
18
|
/**
|
|
18
19
|
* Check if a template is installed
|
|
20
|
+
* Checks for both folder-based and single-file templates
|
|
19
21
|
*/
|
|
20
22
|
export declare function isTemplateInstalled(name: string): Promise<boolean>;
|
|
21
23
|
/**
|
|
22
24
|
* Get the path to a template's main file
|
|
23
25
|
* Note: This is a sync function for backwards compatibility
|
|
24
26
|
* It uses default paths - for custom paths, use getTemplatePathAsync
|
|
27
|
+
*
|
|
28
|
+
* Resolution order:
|
|
29
|
+
* 1. templates/{name}/template.tsx (folder with template.tsx)
|
|
30
|
+
* 2. templates/{name}.tsx (single file)
|
|
31
|
+
* 3. templates/{name}/{name}.tsx (folder with named file - legacy)
|
|
25
32
|
*/
|
|
26
33
|
export declare function getTemplatePath(name: string): string;
|
|
27
34
|
/**
|
package/dist/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB/D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgF7F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAWtF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAsDlF"}
|
package/dist/lib/utils.js
CHANGED
|
@@ -26,15 +26,25 @@ export async function ensureOutputDir() {
|
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Get all installed template names
|
|
29
|
+
* Includes both folder-based and single-file templates
|
|
29
30
|
*/
|
|
30
31
|
export async function getInstalledTemplates() {
|
|
31
32
|
try {
|
|
32
33
|
await ensureTemplatesDir();
|
|
33
34
|
const paths = await getResolvedPaths();
|
|
34
35
|
const entries = await fs.readdir(paths.templates, { withFileTypes: true });
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const templates = [];
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
// Folder-based template
|
|
40
|
+
templates.push(entry.name);
|
|
41
|
+
}
|
|
42
|
+
else if (entry.isFile() && entry.name.endsWith('.tsx')) {
|
|
43
|
+
// Single-file template
|
|
44
|
+
templates.push(entry.name.replace('.tsx', ''));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return templates;
|
|
38
48
|
}
|
|
39
49
|
catch (error) {
|
|
40
50
|
return [];
|
|
@@ -42,36 +52,57 @@ export async function getInstalledTemplates() {
|
|
|
42
52
|
}
|
|
43
53
|
/**
|
|
44
54
|
* Check if a template is installed
|
|
55
|
+
* Checks for both folder-based and single-file templates
|
|
45
56
|
*/
|
|
46
57
|
export async function isTemplateInstalled(name) {
|
|
47
58
|
const paths = await getResolvedPaths();
|
|
48
|
-
|
|
59
|
+
// Check for folder-based template
|
|
60
|
+
const folderPath = path.join(paths.templates, name);
|
|
49
61
|
try {
|
|
50
|
-
await fs.access(
|
|
62
|
+
await fs.access(folderPath);
|
|
51
63
|
return true;
|
|
52
64
|
}
|
|
53
65
|
catch {
|
|
54
|
-
|
|
66
|
+
// Check for single-file template
|
|
67
|
+
const singleFilePath = path.join(paths.templates, `${name}.tsx`);
|
|
68
|
+
try {
|
|
69
|
+
await fs.access(singleFilePath);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
55
75
|
}
|
|
56
76
|
}
|
|
57
77
|
/**
|
|
58
78
|
* Get the path to a template's main file
|
|
59
79
|
* Note: This is a sync function for backwards compatibility
|
|
60
80
|
* It uses default paths - for custom paths, use getTemplatePathAsync
|
|
81
|
+
*
|
|
82
|
+
* Resolution order:
|
|
83
|
+
* 1. templates/{name}/template.tsx (folder with template.tsx)
|
|
84
|
+
* 2. templates/{name}.tsx (single file)
|
|
85
|
+
* 3. templates/{name}/{name}.tsx (folder with named file - legacy)
|
|
61
86
|
*/
|
|
62
87
|
export function getTemplatePath(name) {
|
|
63
88
|
const basePath = path.join(TEMPLATES_DIR, name);
|
|
64
|
-
// Try template.tsx
|
|
89
|
+
// Try template.tsx in folder first
|
|
65
90
|
const templatePath = path.join(basePath, 'template.tsx');
|
|
66
|
-
// Fallback to {name}.tsx for backwards compatibility
|
|
67
|
-
const namedPath = path.join(basePath, `${name}.tsx`);
|
|
68
|
-
// Check which one exists (synchronously for simplicity)
|
|
69
91
|
try {
|
|
70
92
|
accessSync(templatePath);
|
|
71
93
|
return templatePath;
|
|
72
94
|
}
|
|
73
95
|
catch {
|
|
74
|
-
|
|
96
|
+
// Try single file {name}.tsx
|
|
97
|
+
const singleFilePath = path.join(TEMPLATES_DIR, `${name}.tsx`);
|
|
98
|
+
try {
|
|
99
|
+
accessSync(singleFilePath);
|
|
100
|
+
return singleFilePath;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Fallback to {name}/{name}.tsx for legacy
|
|
104
|
+
return path.join(basePath, `${name}.tsx`);
|
|
105
|
+
}
|
|
75
106
|
}
|
|
76
107
|
}
|
|
77
108
|
/**
|
|
@@ -85,16 +116,29 @@ export async function getTemplatePathAsync(name, relativeTo) {
|
|
|
85
116
|
const paths = await getResolvedPaths();
|
|
86
117
|
// Check if this is an absolute path (e.g., from SDK temp dir)
|
|
87
118
|
if (path.isAbsolute(name)) {
|
|
88
|
-
//
|
|
119
|
+
// If the path itself is a .tsx file, use it directly
|
|
120
|
+
if (name.endsWith('.tsx')) {
|
|
121
|
+
return name;
|
|
122
|
+
}
|
|
123
|
+
// Try template.tsx in folder first
|
|
89
124
|
const templatePath = path.join(name, 'template.tsx');
|
|
90
125
|
try {
|
|
91
126
|
await fs.access(templatePath);
|
|
92
127
|
return templatePath;
|
|
93
128
|
}
|
|
94
129
|
catch {
|
|
95
|
-
//
|
|
130
|
+
// Try single file (parent dir + {basename}.tsx)
|
|
96
131
|
const baseName = path.basename(name);
|
|
97
|
-
|
|
132
|
+
const parentDir = path.dirname(name);
|
|
133
|
+
const singleFilePath = path.join(parentDir, `${baseName}.tsx`);
|
|
134
|
+
try {
|
|
135
|
+
await fs.access(singleFilePath);
|
|
136
|
+
return singleFilePath;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Fallback to {name}/{basename}.tsx for legacy
|
|
140
|
+
return path.join(name, `${baseName}.tsx`);
|
|
141
|
+
}
|
|
98
142
|
}
|
|
99
143
|
}
|
|
100
144
|
// Check if this is a relative path
|
|
@@ -102,44 +146,50 @@ export async function getTemplatePathAsync(name, relativeTo) {
|
|
|
102
146
|
if (isRelativePath && relativeTo) {
|
|
103
147
|
// Resolve relative to the provided template directory
|
|
104
148
|
const resolvedPath = path.resolve(path.dirname(relativeTo), name);
|
|
105
|
-
//
|
|
149
|
+
// If the path itself is a .tsx file, use it directly
|
|
150
|
+
if (resolvedPath.endsWith('.tsx')) {
|
|
151
|
+
return resolvedPath;
|
|
152
|
+
}
|
|
153
|
+
// Try template.tsx in folder first
|
|
106
154
|
const templatePath = path.join(resolvedPath, 'template.tsx');
|
|
107
|
-
// Fallback to checking if the path itself is a .tsx file
|
|
108
|
-
const directPath = resolvedPath.endsWith('.tsx') ? resolvedPath : null;
|
|
109
|
-
// Fallback to {name}.tsx using the last segment of the path
|
|
110
|
-
const baseName = path.basename(resolvedPath);
|
|
111
|
-
const namedPath = path.join(resolvedPath, `${baseName}.tsx`);
|
|
112
|
-
// Check which one exists
|
|
113
155
|
try {
|
|
114
156
|
await fs.access(templatePath);
|
|
115
157
|
return templatePath;
|
|
116
158
|
}
|
|
117
159
|
catch {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
160
|
+
// Try single file (parent dir + {basename}.tsx)
|
|
161
|
+
const baseName = path.basename(resolvedPath);
|
|
162
|
+
const parentDir = path.dirname(resolvedPath);
|
|
163
|
+
const singleFilePath = path.join(parentDir, `${baseName}.tsx`);
|
|
164
|
+
try {
|
|
165
|
+
await fs.access(singleFilePath);
|
|
166
|
+
return singleFilePath;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Fallback to {name}/{basename}.tsx for legacy
|
|
170
|
+
return path.join(resolvedPath, `${baseName}.tsx`);
|
|
126
171
|
}
|
|
127
|
-
return namedPath;
|
|
128
172
|
}
|
|
129
173
|
}
|
|
130
174
|
// Default behavior: resolve from templates directory
|
|
131
175
|
const basePath = path.join(paths.templates, name);
|
|
132
|
-
// Try template.tsx
|
|
176
|
+
// Try template.tsx in folder first
|
|
133
177
|
const templatePath = path.join(basePath, 'template.tsx');
|
|
134
|
-
// Fallback to {name}.tsx for backwards compatibility
|
|
135
|
-
const namedPath = path.join(basePath, `${name}.tsx`);
|
|
136
|
-
// Check which one exists
|
|
137
178
|
try {
|
|
138
179
|
await fs.access(templatePath);
|
|
139
180
|
return templatePath;
|
|
140
181
|
}
|
|
141
182
|
catch {
|
|
142
|
-
|
|
183
|
+
// Try single file {name}.tsx
|
|
184
|
+
const singleFilePath = path.join(paths.templates, `${name}.tsx`);
|
|
185
|
+
try {
|
|
186
|
+
await fs.access(singleFilePath);
|
|
187
|
+
return singleFilePath;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Fallback to {name}/{name}.tsx for legacy
|
|
191
|
+
return path.join(basePath, `${name}.tsx`);
|
|
192
|
+
}
|
|
143
193
|
}
|
|
144
194
|
}
|
|
145
195
|
/**
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAA4B,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,39 +1,44 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
3
|
# Test script for loopwind templates
|
|
4
|
-
# Outputs to test-templates/
|
|
4
|
+
# Outputs to test-templates/output/
|
|
5
5
|
|
|
6
6
|
cd "$(dirname "$0")"
|
|
7
7
|
|
|
8
|
+
# Use local build
|
|
9
|
+
LW="node ../dist/cli.js"
|
|
10
|
+
|
|
8
11
|
echo "๐งช Running loopwind template tests..."
|
|
9
12
|
echo ""
|
|
10
13
|
|
|
14
|
+
mkdir -p output
|
|
15
|
+
|
|
11
16
|
# Static image test
|
|
12
17
|
echo "๐ท Testing static-image..."
|
|
13
|
-
|
|
18
|
+
$LW render static-image '{"title":"Hello World","subtitle":"Testing static image template"}' --out output/static-image.png
|
|
14
19
|
|
|
15
20
|
# QR code test
|
|
16
21
|
echo "๐ฑ Testing qr-code..."
|
|
17
|
-
|
|
22
|
+
$LW render qr-code '{"url":"https://loopwind.dev","title":"Scan to visit"}' --out output/qr-code.png
|
|
18
23
|
|
|
19
24
|
# Composite template test
|
|
20
25
|
echo "๐งฉ Testing composite..."
|
|
21
|
-
|
|
26
|
+
$LW render composite '{"title":"Composite Test","qrUrl":"https://github.com/tomtev/loopwind"}' --out output/composite.png
|
|
22
27
|
|
|
23
28
|
# Animated intro video test
|
|
24
29
|
echo "๐ฌ Testing animated-intro..."
|
|
25
|
-
|
|
30
|
+
$LW render animated-intro '{"title":"Welcome","subtitle":"Animation classes test"}' --out output/animated-intro.mp4
|
|
26
31
|
|
|
27
32
|
# Video loops test
|
|
28
33
|
echo "๐ Testing video-loops..."
|
|
29
|
-
|
|
34
|
+
$LW render video-loops '{"title":"Loop Test"}' --out output/video-loops.mp4
|
|
30
35
|
|
|
31
36
|
# Easing test video
|
|
32
37
|
echo "๐ Testing easing-test..."
|
|
33
|
-
|
|
38
|
+
$LW render easing-test '{}' --out output/easing-test.mp4
|
|
34
39
|
|
|
35
40
|
echo ""
|
|
36
|
-
echo "โ
All tests complete! Check
|
|
41
|
+
echo "โ
All tests complete! Check output/ for results."
|
|
37
42
|
echo ""
|
|
38
43
|
echo "Output files:"
|
|
39
|
-
ls -la
|
|
44
|
+
ls -la output/
|