piral-cli 0.15.0-alpha.3555 → 0.15.0-alpha.3640

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.
Files changed (47) hide show
  1. package/lib/apps/debug-pilet.js +17 -11
  2. package/lib/apps/debug-pilet.js.map +1 -1
  3. package/lib/apps/debug-piral.js +16 -7
  4. package/lib/apps/debug-piral.js.map +1 -1
  5. package/lib/common/http.d.ts +0 -1
  6. package/lib/common/http.js +1 -14
  7. package/lib/common/http.js.map +1 -1
  8. package/lib/common/importmap.d.ts +2 -0
  9. package/lib/common/importmap.js +147 -0
  10. package/lib/common/importmap.js.map +1 -0
  11. package/lib/common/index.d.ts +1 -0
  12. package/lib/common/index.js +1 -0
  13. package/lib/common/index.js.map +1 -1
  14. package/lib/common/package.d.ts +2 -3
  15. package/lib/common/package.js +3 -95
  16. package/lib/common/package.js.map +1 -1
  17. package/lib/common/spec.js +1 -0
  18. package/lib/common/spec.js.map +1 -1
  19. package/lib/common/version.d.ts +2 -0
  20. package/lib/common/version.js +130 -0
  21. package/lib/common/version.js.map +1 -0
  22. package/lib/external/index.js +26215 -24856
  23. package/lib/helpers.js +11 -1
  24. package/lib/helpers.js.map +1 -1
  25. package/lib/injectors/pilet.d.ts +1 -0
  26. package/lib/injectors/pilet.js +7 -4
  27. package/lib/injectors/pilet.js.map +1 -1
  28. package/lib/messages.d.ts +187 -0
  29. package/lib/messages.js +201 -2
  30. package/lib/messages.js.map +1 -1
  31. package/lib/types/common.d.ts +1 -0
  32. package/package.json +2 -2
  33. package/src/apps/build-piral.test.ts +2 -2
  34. package/src/apps/debug-pilet.ts +9 -2
  35. package/src/apps/debug-piral.ts +6 -1
  36. package/src/common/http.ts +0 -13
  37. package/src/common/importmap.ts +153 -0
  38. package/src/common/index.ts +1 -0
  39. package/src/common/package.test.ts +2 -2
  40. package/src/common/package.ts +2 -104
  41. package/src/common/spec.ts +1 -0
  42. package/src/common/version.test.ts +233 -0
  43. package/src/common/version.ts +142 -0
  44. package/src/helpers.ts +11 -1
  45. package/src/injectors/pilet.ts +10 -4
  46. package/src/messages.ts +199 -0
  47. package/src/types/common.ts +1 -0
@@ -0,0 +1,142 @@
1
+ const semver =
2
+ /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;
3
+
4
+ const acceptsAll = ['*', 'x', '>=0'];
5
+
6
+ const operatorResMap: Record<string, [number, number?]> = {
7
+ '>': [1],
8
+ '>=': [0, 1],
9
+ '=': [0],
10
+ '<=': [-1, 0],
11
+ '<': [-1],
12
+ };
13
+
14
+ function indexOrEnd(str: string, q: string) {
15
+ return str.indexOf(q) === -1 ? str.length : str.indexOf(q);
16
+ }
17
+
18
+ function splitVersion(v: string) {
19
+ var c = v.replace(/^v/, '').replace(/\+.*$/, '');
20
+ var patchIndex = indexOrEnd(c, '-');
21
+ var arr = c.substring(0, patchIndex).split('.');
22
+ arr.push(c.substring(patchIndex + 1));
23
+ return arr;
24
+ }
25
+
26
+ function parseSegment(v: string) {
27
+ var n = parseInt(v, 10);
28
+ return isNaN(n) ? v : n;
29
+ }
30
+
31
+ function validateAndParse(v: string) {
32
+ const match = v.match(semver);
33
+ match.shift();
34
+ return match;
35
+ }
36
+
37
+ function compareStrings(a: string, b: string) {
38
+ const ap = parseSegment(a);
39
+ const bp = parseSegment(b);
40
+
41
+ if (ap > bp) {
42
+ return 1;
43
+ } else if (ap < bp) {
44
+ return -1;
45
+ } else {
46
+ return 0;
47
+ }
48
+ }
49
+
50
+ function compareSegments(a: [string, string], b: [string, string]) {
51
+ for (let i = 0; i < 2; i++) {
52
+ const r = compareStrings(a[i] || '0', b[i] || '0');
53
+
54
+ if (r !== 0) {
55
+ return r;
56
+ }
57
+ }
58
+
59
+ return 0;
60
+ }
61
+
62
+ function compareVersions(v1: string, v2: string) {
63
+ const s1 = splitVersion(v1);
64
+ const s2 = splitVersion(v2);
65
+ const len = Math.max(s1.length - 1, s2.length - 1);
66
+
67
+ for (let i = 0; i < len; i++) {
68
+ const n1 = parseInt(s1[i] || '0', 10);
69
+ const n2 = parseInt(s2[i] || '0', 10);
70
+
71
+ if (n1 > n2) {
72
+ return 1;
73
+ } else if (n2 > n1) {
74
+ return -1;
75
+ }
76
+ }
77
+
78
+ const sp1 = s1[s1.length - 1];
79
+ const sp2 = s2[s2.length - 1];
80
+
81
+ if (sp1 && sp2) {
82
+ const p1 = sp1.split('.').map(parseSegment);
83
+ const p2 = sp2.split('.').map(parseSegment);
84
+ const len = Math.max(p1.length, p2.length);
85
+
86
+ for (let i = 0; i < len; i++) {
87
+ if (p1[i] === undefined || (typeof p2[i] === 'string' && typeof p1[i] === 'number')) {
88
+ return -1;
89
+ } else if (p2[i] === undefined || (typeof p1[i] === 'string' && typeof p2[i] === 'number')) {
90
+ return 1;
91
+ } else if (p1[i] > p2[i]) {
92
+ return 1;
93
+ } else if (p2[i] > p1[i]) {
94
+ return -1;
95
+ }
96
+ }
97
+ } else if (sp1 || sp2) {
98
+ return sp1 ? -1 : 1;
99
+ }
100
+
101
+ return 0;
102
+ }
103
+
104
+ function compare(v1: string, v2: string, operator: string) {
105
+ // since result of compareVersions can only be -1 or 0 or 1
106
+ // a simple map can be used to replace switch
107
+ const res = compareVersions(v1, v2);
108
+ return operatorResMap[operator].indexOf(res) > -1;
109
+ }
110
+
111
+ export function validate(version: string) {
112
+ return acceptsAll.includes(version) || semver.test(version);
113
+ }
114
+
115
+ export function satisfies(v: string, r: string) {
116
+ if (!acceptsAll.includes(r)) {
117
+ // if no range operator then "="
118
+ const match = r.match(/^([<>=~^]+)/);
119
+ const op = match ? match[1] : '=';
120
+
121
+ // if gt/lt/eq then operator compare
122
+ if (op !== '^' && op !== '~') {
123
+ return compare(v, r, op);
124
+ }
125
+
126
+ // else range of either "~" or "^" is assumed
127
+ const [v1, v2, v3] = validateAndParse(v);
128
+ const [m1, m2, m3] = validateAndParse(r);
129
+
130
+ if (compareStrings(v1, m1) !== 0) {
131
+ return false;
132
+ } else if (op === '^') {
133
+ return compareSegments([v2, v3], [m2, m3]) >= 0;
134
+ } else if (compareStrings(v2, m2) !== 0) {
135
+ return false;
136
+ }
137
+
138
+ return compareStrings(v3, m3) >= 0;
139
+ }
140
+
141
+ return true;
142
+ }
package/src/helpers.ts CHANGED
@@ -13,7 +13,17 @@ export const fromKeys: Array<PiletPublishSource> = ['local', 'remote', 'npm'];
13
13
  export const piralBuildTypeKeys: Array<PiralBuildType> = ['all', 'release', 'emulator', 'emulator-sources'];
14
14
  export const piletBuildTypeKeys: Array<PiletBuildType> = ['default', 'standalone', 'manifest'];
15
15
  export const clientTypeKeys: Array<NpmClientType> = ['npm', 'pnpm', 'yarn'];
16
- export const bundlerKeys: Array<string> = ['none', 'parcel', 'webpack', 'webpack5', 'esbuild', 'xbuild'];
16
+ export const bundlerKeys: Array<string> = [
17
+ 'none',
18
+ 'esbuild',
19
+ 'parcel',
20
+ 'parcel2',
21
+ 'rollup',
22
+ 'webpack',
23
+ 'webpack5',
24
+ 'vite',
25
+ 'xbuild',
26
+ ];
17
27
  export const availableBundlers: Array<string> = [];
18
28
  export const availableReleaseProviders: Array<string> = [];
19
29
  export const frameworkKeys: Array<Framework> = ['piral', 'piral-core', 'piral-base'];
@@ -19,6 +19,7 @@ interface Pilet {
19
19
 
20
20
  export interface PiletInjectorConfig extends KrasInjectorConfig {
21
21
  pilets: Array<Pilet>;
22
+ meta: string;
22
23
  api: string;
23
24
  app: string;
24
25
  feed?: string;
@@ -29,17 +30,22 @@ interface PiletMetadata {
29
30
  [key: string]: unknown;
30
31
  }
31
32
 
32
- function fillPiletMeta(pilet: Pilet, basePath: string) {
33
+ function fillPiletMeta(pilet: Pilet, basePath: string, metaFile: string) {
33
34
  const { root, bundler } = pilet;
34
- const def = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
35
+ const metaPath = join(root, metaFile);
36
+ const packagePath = join(root, 'package.json');
37
+ const def = JSON.parse(readFileSync(packagePath, 'utf8'));
38
+ const metaOverride = existsSync(metaPath) ? JSON.parse(readFileSync(metaPath, 'utf8')) : undefined;
35
39
  const file = bundler.bundle.name.replace(/^[\/\\]/, '');
36
40
  const target = join(bundler.bundle.dir, file);
37
41
  const url = new URL(file, basePath);
38
42
  const meta = {
43
+ custom: def.custom,
44
+ config: def.piletConfig,
45
+ ...metaOverride,
39
46
  name: def.name,
40
47
  version: def.version,
41
48
  link: `${url.href}?updated=${Date.now()}`,
42
- custom: def.custom,
43
49
  ...getPiletSpecMeta(target, basePath),
44
50
  };
45
51
 
@@ -92,7 +98,7 @@ export default class PiletInjector implements KrasInjector {
92
98
  pilets.forEach((p, i) =>
93
99
  p.bundler.on(() => {
94
100
  const basePath = `${this.piletApi}/${i}/`;
95
- const meta = fillPiletMeta(p, basePath);
101
+ const meta = fillPiletMeta(p, basePath, options.meta);
96
102
 
97
103
  for (const id of Object.keys(cbs)) {
98
104
  cbs[id](meta);
package/src/messages.ts CHANGED
@@ -392,6 +392,205 @@ export function packageVersionInvalid_0024(version: string): QuickMessage {
392
392
  return [LogLevels.error, '0024', `The given package version "${version}" is invalid.`];
393
393
  }
394
394
 
395
+ /**
396
+ * @kind Error
397
+ *
398
+ * @summary
399
+ * Cannot add the shared dependency since its version constraint is not satisfied.
400
+ *
401
+ * @abstract
402
+ * The importmap definition allows you to define a version specifier separated with
403
+ * the '@' character. If you write down a version specifier then it has to be
404
+ * fulfilled already from the local version, otherwise the packaged version can
405
+ * potentially not be resolved at runtime. This would resolve in a pilet that fails
406
+ * when running in isolation and most likely fails when running with other pilets.
407
+ *
408
+ * @see
409
+ * - [import-maps specification](https://github.com/WICG/import-maps)
410
+ *
411
+ * @example
412
+ * Check the contents of the available package.json:
413
+ *
414
+ * ```sh
415
+ * cat package.json
416
+ * ```
417
+ *
418
+ * The displayed content should look similar to (i.e., contain an importmap such as):
419
+ *
420
+ * ```json
421
+ * {
422
+ * "importmap": {
423
+ * "imports": {
424
+ * "foo@^3.2.1": "foo"
425
+ * }
426
+ * }
427
+ * }
428
+ * ```
429
+ *
430
+ * For the error to occur the specifier (^3.2.1) potentially does not match the version (e.g., if
431
+ * the version of the dependency is 3.1.2).
432
+ *
433
+ * One strategy is to remove the specifier, which will automatically use the exact current version
434
+ * as specifier:
435
+ *
436
+ * ```json
437
+ * {
438
+ * "importmap": {
439
+ * "imports": {
440
+ * "foo": "foo"
441
+ * }
442
+ * }
443
+ * }
444
+ * ```
445
+ *
446
+ * The best way, however, is to look at the used version and adjust the specifier to be correct again.
447
+ * Alternatively, change the used version to satisfy the constraint again.
448
+ */
449
+ export function importMapVersionSpecNotSatisfied_0025(depName: string, version: string): QuickMessage {
450
+ return [LogLevels.error, '0025', `The dependency "${depName}" in only available in version "${version}".`];
451
+ }
452
+
453
+ /**
454
+ * @kind Error
455
+ *
456
+ * @summary
457
+ * The version spec part of the importmap identifer is invalid.
458
+ *
459
+ * @abstract
460
+ * The importmap definition allows you to define a version specifier separated with
461
+ * the '@' character. This part has to follow the semver convention and rules.
462
+ *
463
+ * Check your specifier via online tools such as "Semver check" to verify it is
464
+ * valid and follows the semver specification.
465
+ *
466
+ * @see
467
+ * - [Online Checker](https://jubianchi.github.io/semver-check/)
468
+ *
469
+ * @example
470
+ * Check the contents of the available package.json:
471
+ *
472
+ * ```sh
473
+ * cat package.json
474
+ * ```
475
+ *
476
+ * The displayed content should look similar to (i.e., contain an importmap such as):
477
+ *
478
+ * ```json
479
+ * {
480
+ * "importmap": {
481
+ * "imports": {
482
+ * "foo@bar": "foo"
483
+ * }
484
+ * }
485
+ * }
486
+ * ```
487
+ *
488
+ * For the error to occur the specifier (bar) is not following the semver specification.
489
+ *
490
+ * One way is to remove the version spec, which will resolve to an exact version specifier
491
+ * and therefore always works:
492
+ *
493
+ * ```json
494
+ * {
495
+ * "importmap": {
496
+ * "imports": {
497
+ * "foo": "foo"
498
+ * }
499
+ * }
500
+ * }
501
+ * ```
502
+ *
503
+ * The best way, however, is to look at the used version and adjust the specifier to be correct again,
504
+ * such as "^1.2.3" or "1.x" or "3" etc.
505
+ */
506
+ export function importMapVersionSpecInvalid_0026(depName: string): QuickMessage {
507
+ return [LogLevels.error, '0026', `The dependency "${depName}" has an invalid version spec.`];
508
+ }
509
+
510
+ /**
511
+ * @kind Error
512
+ *
513
+ * @summary
514
+ * The provided importmap reference could not be resolved.
515
+ *
516
+ * @abstract
517
+ * The importmap consists of keys and values. The keys represent the packages names and optional
518
+ * version specifiers to demand at runtime. The values represent the entry point or URL to use
519
+ * when the dependency is not yet loaded.
520
+ *
521
+ * In case of a non-URL value the reference has either to be a valid package name or a file path
522
+ * that leads to either a package or valid JS module. Either way, it needs to exist. If the path
523
+ * is invalid an error will be emitted.
524
+ *
525
+ * @see
526
+ * - [npm Install](https://docs.npmjs.com/cli/install)
527
+ *
528
+ * @example
529
+ * Check the contents of the available package.json:
530
+ *
531
+ * ```sh
532
+ * cat package.json
533
+ * ```
534
+ *
535
+ * The displayed content should look similar to (i.e., contain an importmap such as):
536
+ *
537
+ * ```json
538
+ * {
539
+ * "importmap": {
540
+ * "imports": {
541
+ * "foo@bar": "./node_modules/prect"
542
+ * }
543
+ * }
544
+ * }
545
+ * ```
546
+ *
547
+ * Note the potential misspelling. It maybe should have been "./node_modules/preact". In such
548
+ * cases the reference may not be resolved locally. If everything was written correctly the
549
+ * node modules are most likely not installed (correctly).
550
+ */
551
+ export function importMapReferenceNotFound_0027(dir: string, reference: string): QuickMessage {
552
+ return [LogLevels.error, '0027', `The reference to "${reference}" could not be resolved from "${dir}". Are you sure the file or package exists?`];
553
+ }
554
+
555
+ /**
556
+ * @kind Error
557
+ *
558
+ * @summary
559
+ * The provided importmap file could not be found.
560
+ *
561
+ * @abstract
562
+ * The importmap can be referenced in a file from the package.json. If the named
563
+ * file cannot be found the build process has to be stopped. Make sure that the
564
+ * file has been specified relative to the package.json where it was referenced
565
+ * from.
566
+ *
567
+ * @see
568
+ * - [import-maps specification](https://github.com/WICG/import-maps)
569
+ *
570
+ * @example
571
+ * Check the contents of the available package.json:
572
+ *
573
+ * ```sh
574
+ * cat package.json
575
+ * ```
576
+ *
577
+ * The displayed content should look similar to (i.e., contain an importmap such as):
578
+ *
579
+ * ```json
580
+ * {
581
+ * "importmap": "./import-map.json"
582
+ * }
583
+ * ```
584
+ *
585
+ * If the importmap has instead been (re)named "importmap.json" then this will not work.
586
+ * Likewise, with the reference above the file is expected to be in the same directory
587
+ * as the package.json. If it is, e.g., in the "src" subfolder you'd should reference it
588
+ * as "./src/import-map.json" instead.
589
+ */
590
+ export function importMapFileNotFound_0028(dir: string, file: string): QuickMessage {
591
+ return [LogLevels.error, '0028', `The importmap "${file}" could not be found at "${dir}".`];
592
+ }
593
+
395
594
  /**
396
595
  * @kind Error
397
596
  *
@@ -79,6 +79,7 @@ export interface RuleContext {
79
79
 
80
80
  export interface SharedDependency {
81
81
  id: string;
82
+ requireId: string;
82
83
  name: string;
83
84
  ref: string;
84
85
  type: 'local' | 'remote';