@tixyel/cli 2.5.0 → 2.6.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/utils/watermark.d.ts +7 -0
- package/dist/utils/watermark.js +71 -0
- package/dist/widget.js +56 -83
- package/dist/workspace.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export var logo = ` ____ _ _ _
|
|
2
|
+
/ __ \\ | |_ (_) __ __ _ _ ___ | |
|
|
3
|
+
/ / _\` | | __| | | \\ \\/ / | | | | / _ \\ | |
|
|
4
|
+
| | (_| | | |_ | | > < | |_| | | __/ | |
|
|
5
|
+
\\ \\__,_| \\__| |_| /_/\\_\\ \\__, | \\___| |_|
|
|
6
|
+
\\____/ |___/\n`;
|
|
7
|
+
export const watermark = {
|
|
8
|
+
html(widget) {
|
|
9
|
+
return [
|
|
10
|
+
`<!---`,
|
|
11
|
+
logo,
|
|
12
|
+
`Generated by Tixyel Widgets SDK`,
|
|
13
|
+
`Widget name: ${widget.config.name}`,
|
|
14
|
+
`Version: ${widget.config.version}`,
|
|
15
|
+
`Description: ${widget.config.description}`,
|
|
16
|
+
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
17
|
+
`Made by: ${widget.config.metadata?.author}`,
|
|
18
|
+
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
19
|
+
...Object.entries(widget.config.metadata || {})
|
|
20
|
+
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
21
|
+
.map(([key, value]) => `${key}: ${value}`),
|
|
22
|
+
' ',
|
|
23
|
+
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
24
|
+
`--->`,
|
|
25
|
+
]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join('\n');
|
|
28
|
+
},
|
|
29
|
+
css(widget) {
|
|
30
|
+
return [
|
|
31
|
+
`/**`,
|
|
32
|
+
logo,
|
|
33
|
+
`Generated by Tixyel Widgets SDK`,
|
|
34
|
+
`Widget name: ${widget.config.name}`,
|
|
35
|
+
`Version: ${widget.config.version}`,
|
|
36
|
+
`Description: ${widget.config.description}`,
|
|
37
|
+
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
38
|
+
`Made by: ${widget.config.metadata?.author}`,
|
|
39
|
+
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
40
|
+
...Object.entries(widget.config.metadata || {})
|
|
41
|
+
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
42
|
+
.map(([key, value]) => `${key}: ${value}`),
|
|
43
|
+
' ',
|
|
44
|
+
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
45
|
+
`*/`,
|
|
46
|
+
]
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join('\n');
|
|
49
|
+
},
|
|
50
|
+
script(widget) {
|
|
51
|
+
return [
|
|
52
|
+
`/**`,
|
|
53
|
+
logo,
|
|
54
|
+
`Generated by Tixyel Widgets SDK`,
|
|
55
|
+
`Widget name: ${widget.config.name}`,
|
|
56
|
+
`Version: ${widget.config.version}`,
|
|
57
|
+
`Description: ${widget.config.description}`,
|
|
58
|
+
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
59
|
+
`Made by: ${widget.config.metadata?.author}`,
|
|
60
|
+
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
61
|
+
...Object.entries(widget.config.metadata || {})
|
|
62
|
+
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
63
|
+
.map(([key, value]) => `${key}: ${value}`),
|
|
64
|
+
' ',
|
|
65
|
+
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
66
|
+
`*/`,
|
|
67
|
+
]
|
|
68
|
+
.filter(Boolean)
|
|
69
|
+
.join('\n');
|
|
70
|
+
},
|
|
71
|
+
};
|
package/dist/widget.js
CHANGED
|
@@ -15,6 +15,7 @@ import postcss from 'postcss';
|
|
|
15
15
|
import cssnano from 'cssnano';
|
|
16
16
|
import JSZip from 'jszip';
|
|
17
17
|
import { transformSync } from 'esbuild';
|
|
18
|
+
import { watermark } from './utils/watermark';
|
|
18
19
|
export async function createWidget(path, metadata, config, root) {
|
|
19
20
|
try {
|
|
20
21
|
console.log(`📁 Creating ${metadata?.name} at: ${path}`);
|
|
@@ -287,81 +288,26 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
287
288
|
}
|
|
288
289
|
return contents;
|
|
289
290
|
};
|
|
290
|
-
|
|
291
|
-
var ref = ` ____ _ _ _
|
|
292
|
-
/ __ \\ | |_ (_) __ __ _ _ ___ | |
|
|
293
|
-
/ / _\` | | __| | | \\ \\/ / | | | | / _ \\ | |
|
|
294
|
-
| | (_| | | |_ | | > < | |_| | | __/ | |
|
|
295
|
-
\\ \\__,_| \\__| |_| /_/\\_\\ \\__, | \\___| |_|
|
|
296
|
-
\\____/ |___/\n`;
|
|
297
|
-
var watermark = {
|
|
298
|
-
html: [
|
|
299
|
-
`<!---`,
|
|
300
|
-
ref,
|
|
301
|
-
`Generated by Tixyel Widgets SDK`,
|
|
302
|
-
`Widget name: ${widget.config.name}`,
|
|
303
|
-
`Version: ${widget.config.version}`,
|
|
304
|
-
`Description: ${widget.config.description}`,
|
|
305
|
-
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
306
|
-
`Made by: ${widget.config.metadata?.author}`,
|
|
307
|
-
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
308
|
-
...Object.entries(widget.config.metadata || {})
|
|
309
|
-
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
310
|
-
.map(([key, value]) => `${key}: ${value}`),
|
|
311
|
-
' ',
|
|
312
|
-
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
313
|
-
`--->`,
|
|
314
|
-
]
|
|
315
|
-
.filter(Boolean)
|
|
316
|
-
.join('\n'),
|
|
317
|
-
css: [
|
|
318
|
-
`/**`,
|
|
319
|
-
ref,
|
|
320
|
-
`Generated by Tixyel Widgets SDK`,
|
|
321
|
-
`Widget name: ${widget.config.name}`,
|
|
322
|
-
`Version: ${widget.config.version}`,
|
|
323
|
-
`Description: ${widget.config.description}`,
|
|
324
|
-
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
325
|
-
`Made by: ${widget.config.metadata?.author}`,
|
|
326
|
-
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
327
|
-
...Object.entries(widget.config.metadata || {})
|
|
328
|
-
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
329
|
-
.map(([key, value]) => `${key}: ${value}`),
|
|
330
|
-
' ',
|
|
331
|
-
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
332
|
-
`*/`,
|
|
333
|
-
]
|
|
334
|
-
.filter(Boolean)
|
|
335
|
-
.join('\n'),
|
|
336
|
-
script: [
|
|
337
|
-
`/**`,
|
|
338
|
-
ref,
|
|
339
|
-
`Generated by Tixyel Widgets SDK`,
|
|
340
|
-
`Widget name: ${widget.config.name}`,
|
|
341
|
-
`Version: ${widget.config.version}`,
|
|
342
|
-
`Description: ${widget.config.description}`,
|
|
343
|
-
`Tags: ${widget.config.metadata?.tags?.join(', ')}`,
|
|
344
|
-
`Made by: ${widget.config.metadata?.author}`,
|
|
345
|
-
widget.config.metadata?.clientId ? `Made for: ${widget.config.metadata?.clientId}` : undefined,
|
|
346
|
-
...Object.entries(widget.config.metadata || {})
|
|
347
|
-
.filter(([key]) => !['tags', 'author', 'clientId'].includes(key))
|
|
348
|
-
.map(([key, value]) => `${key}: ${value}`),
|
|
349
|
-
' ',
|
|
350
|
-
'DO NOT EDIT, SHARE OR DISTRIBUTE THIS CODE WITHOUT PERMISSION FROM THE AUTHOR',
|
|
351
|
-
`*/`,
|
|
352
|
-
]
|
|
353
|
-
.filter(Boolean)
|
|
354
|
-
.join('\n'),
|
|
355
|
-
};
|
|
291
|
+
const usedWatermarks = new Set();
|
|
356
292
|
const results = Object.fromEntries(await Promise.all(Object.entries(findPatterns).map(async ([key, patterns]) => {
|
|
357
293
|
let result = '';
|
|
358
294
|
const list = normalizeList(patterns);
|
|
359
|
-
if (list.length
|
|
295
|
+
if (!list.length)
|
|
360
296
|
return [key, ''];
|
|
361
|
-
|
|
297
|
+
const check = (keys, formats) => {
|
|
298
|
+
!Array.isArray(keys) && (keys = [keys]);
|
|
299
|
+
!Array.isArray(formats) && (formats = [formats]);
|
|
300
|
+
return (
|
|
301
|
+
// check keys
|
|
302
|
+
keys.some((k) => key.toLowerCase() === k.toLowerCase()) ||
|
|
303
|
+
// check formats
|
|
304
|
+
list.some((p) => formats.some((f) => p.toLowerCase().endsWith(f.toLowerCase()))));
|
|
305
|
+
};
|
|
362
306
|
// Process HTML
|
|
363
|
-
if (
|
|
364
|
-
|
|
307
|
+
if (check('html', '.html')) {
|
|
308
|
+
if (!usedWatermarks.has('html'))
|
|
309
|
+
result += watermark.html(widget) + '\n';
|
|
310
|
+
usedWatermarks.add('html');
|
|
365
311
|
if (verbose)
|
|
366
312
|
console.log(` - Processing HTML...`);
|
|
367
313
|
const files = findAndRead(entryDir, list);
|
|
@@ -388,8 +334,10 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
388
334
|
const minified = await minifyHTML(mergedHTML, workspaceConfig.build?.obfuscation?.html);
|
|
389
335
|
result += minified.trim();
|
|
390
336
|
}
|
|
391
|
-
else if (['css', 'style', 'styles'].
|
|
392
|
-
|
|
337
|
+
else if (check(['css', 'style', 'styles'], '.css')) {
|
|
338
|
+
if (!usedWatermarks.has('css'))
|
|
339
|
+
result += watermark.css(widget) + '\n';
|
|
340
|
+
usedWatermarks.add('css');
|
|
393
341
|
if (verbose)
|
|
394
342
|
console.log(` - Processing CSS...`);
|
|
395
343
|
const files = findAndRead(entryDir, list);
|
|
@@ -410,8 +358,10 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
410
358
|
}
|
|
411
359
|
result += mergedCSS.trim();
|
|
412
360
|
}
|
|
413
|
-
else if (['script', 'js', 'javascript'].
|
|
414
|
-
|
|
361
|
+
else if (check(['script', 'js', 'javascript'], '.js')) {
|
|
362
|
+
if (!usedWatermarks.has('script'))
|
|
363
|
+
result += watermark.script(widget) + '\n';
|
|
364
|
+
usedWatermarks.add('script');
|
|
415
365
|
if (verbose)
|
|
416
366
|
console.log(` - Processing JavaScript...`);
|
|
417
367
|
const files = findAndRead(entryDir, list);
|
|
@@ -422,8 +372,10 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
422
372
|
}
|
|
423
373
|
result += mergedJS.trim();
|
|
424
374
|
}
|
|
425
|
-
else if (['typescript', 'ts'].
|
|
426
|
-
|
|
375
|
+
else if (check(['typescript', 'ts'], '.ts')) {
|
|
376
|
+
if (!usedWatermarks.has('script'))
|
|
377
|
+
result += watermark.script(widget) + '\n';
|
|
378
|
+
usedWatermarks.add('script');
|
|
427
379
|
if (verbose)
|
|
428
380
|
console.log(` - Processing TypeScript...`);
|
|
429
381
|
const files = findAndRead(entryDir, list);
|
|
@@ -446,7 +398,7 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
446
398
|
const obfuscated = JavaScriptObfuscator.obfuscate(mergedTS.trim(), workspaceConfig.build?.obfuscation?.javascript);
|
|
447
399
|
result += obfuscated.getObfuscatedCode();
|
|
448
400
|
}
|
|
449
|
-
else if (['fields', '
|
|
401
|
+
else if (check(['fields', 'fielddata', 'fieldData', 'cf', 'customfields'], '.json')) {
|
|
450
402
|
if (verbose)
|
|
451
403
|
console.log(` - Processing Json...`);
|
|
452
404
|
const files = findAndRead(entryDir, list);
|
|
@@ -455,10 +407,7 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
455
407
|
try {
|
|
456
408
|
const noComments = parse(content);
|
|
457
409
|
const parsed = JSON.parse(JSON.stringify(noComments));
|
|
458
|
-
mergedFields
|
|
459
|
-
...mergedFields,
|
|
460
|
-
...parsed,
|
|
461
|
-
};
|
|
410
|
+
Object.assign(mergedFields, parsed);
|
|
462
411
|
}
|
|
463
412
|
catch (error) {
|
|
464
413
|
console.warn(` ⚠️ Failed to parse fields JSON: ${error}`);
|
|
@@ -475,7 +424,19 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
475
424
|
return [key, result];
|
|
476
425
|
})));
|
|
477
426
|
for await (const [filename, key] of Object.entries(resultMapping)) {
|
|
478
|
-
|
|
427
|
+
let content = '';
|
|
428
|
+
if (typeof key === 'string')
|
|
429
|
+
content = results[key];
|
|
430
|
+
else if (Array.isArray(key)) {
|
|
431
|
+
for await (const k of key) {
|
|
432
|
+
const part = results[k];
|
|
433
|
+
if (part) {
|
|
434
|
+
content += '\n' + part;
|
|
435
|
+
if (verbose)
|
|
436
|
+
console.log(` ✓ Merged part for: ${k}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
479
440
|
if (content) {
|
|
480
441
|
const outPath = join(outDir, filename);
|
|
481
442
|
writeFileSync(outPath, content, 'utf-8');
|
|
@@ -487,7 +448,19 @@ export async function processBuild(widget, workspaceConfig, verbose = false) {
|
|
|
487
448
|
try {
|
|
488
449
|
const zip = new JSZip();
|
|
489
450
|
for await (const [filename, key] of Object.entries(compactedMapping)) {
|
|
490
|
-
|
|
451
|
+
let content = '';
|
|
452
|
+
if (typeof key === 'string')
|
|
453
|
+
content = results[key];
|
|
454
|
+
else if (Array.isArray(key)) {
|
|
455
|
+
for await (const k of key) {
|
|
456
|
+
const part = results[k];
|
|
457
|
+
if (part) {
|
|
458
|
+
content += '\n' + part;
|
|
459
|
+
if (verbose)
|
|
460
|
+
console.log(` ✓ Merged part for ZIP: ${k}`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
491
464
|
if (content) {
|
|
492
465
|
zip.file(filename, content);
|
|
493
466
|
if (verbose)
|
package/dist/workspace.d.ts
CHANGED
|
@@ -104,7 +104,7 @@ export interface WorkspaceConfig<Find extends BuildFindMap = BuildFindMap> {
|
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
type BuildFindMap = Record<string, string[]>;
|
|
107
|
-
type BuildResultMap<Find extends BuildFindMap> = Record<string, keyof Find>;
|
|
107
|
+
type BuildResultMap<Find extends BuildFindMap> = Record<string, keyof Find | (keyof Find)[]>;
|
|
108
108
|
export declare function defineWorkspaceConfig<const Find extends BuildFindMap>(config: WorkspaceConfig<Find>): WorkspaceConfig<Find>;
|
|
109
109
|
export declare function resolveConfig(path: string): Promise<WorkspaceConfig>;
|
|
110
110
|
export declare function findWorkspaceRoot(startPath?: string): Promise<string | null>;
|