@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.
@@ -0,0 +1,7 @@
1
+ import { WidgetInfo } from '../widget';
2
+ export declare var logo: string;
3
+ export declare const watermark: {
4
+ html(widget: WidgetInfo): string;
5
+ css(widget: WidgetInfo): string;
6
+ script(widget: WidgetInfo): string;
7
+ };
@@ -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
- // watermark for the files
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 === 0) {
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 (['html', 'HTML'].some((k) => key === k)) {
364
- result += watermark.html + '\n';
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'].some((k) => key === k)) {
392
- result += watermark.css + '\n';
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'].some((k) => key === k)) {
414
- result += watermark.script + '\n';
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'].some((k) => key === k)) {
426
- result += watermark.script + '\n';
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', 'FIELDS', 'fielddata', 'fieldData'].some((k) => key === k)) {
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
- const content = results[key];
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
- const content = results[key];
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)
@@ -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>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tixyel/cli",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "description": "CLI tool for streamelements widgets",
5
5
  "keywords": [
6
6
  "cli",