@ethlete/cli 3.0.0-next.18 → 3.0.0-next.19

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 (107) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/design/css-inline.d.ts +4 -0
  3. package/design/define-call.ts +228 -3
  4. package/design/web/env.d.ts +2 -1
  5. package/design/web/frame.ts +51 -6
  6. package/package.json +27 -3
  7. package/src/index.js +26 -4
  8. package/src/index.js.map +1 -1
  9. package/src/lib/api/clear.js +10 -2
  10. package/src/lib/api/clear.js.map +1 -1
  11. package/src/lib/api/index.js +33 -20
  12. package/src/lib/api/index.js.map +1 -1
  13. package/src/lib/api/lock.js +11 -3
  14. package/src/lib/api/lock.js.map +1 -1
  15. package/src/lib/api/ports.js +12 -4
  16. package/src/lib/api/ports.js.map +1 -1
  17. package/src/lib/api/run-locked.js +10 -2
  18. package/src/lib/api/run-locked.js.map +1 -1
  19. package/src/lib/api/run-ready.js +12 -4
  20. package/src/lib/api/run-ready.js.map +1 -1
  21. package/src/lib/api/run-snapshot.js +10 -2
  22. package/src/lib/api/run-snapshot.js.map +1 -1
  23. package/src/lib/api/run.js +13 -5
  24. package/src/lib/api/run.js.map +1 -1
  25. package/src/lib/api/snapshot.js +13 -5
  26. package/src/lib/api/snapshot.js.map +1 -1
  27. package/src/lib/auth/auth-command.js +10 -2
  28. package/src/lib/auth/auth-command.js.map +1 -1
  29. package/src/lib/auth/gitlab-token.js +12 -4
  30. package/src/lib/auth/gitlab-token.js.map +1 -1
  31. package/src/lib/auth/index.js +18 -5
  32. package/src/lib/auth/index.js.map +1 -1
  33. package/src/lib/config/index.js +16 -3
  34. package/src/lib/config/index.js.map +1 -1
  35. package/src/lib/design/browser.d.ts +9 -0
  36. package/src/lib/design/browser.js +37 -0
  37. package/src/lib/design/browser.js.map +1 -0
  38. package/src/lib/design/calls-tsconfig.js +6 -2
  39. package/src/lib/design/calls-tsconfig.js.map +1 -1
  40. package/src/lib/design/check.d.ts +2 -1
  41. package/src/lib/design/check.js +151 -69
  42. package/src/lib/design/check.js.map +1 -1
  43. package/src/lib/design/design-command.d.ts +1 -1
  44. package/src/lib/design/design-command.js +58 -3
  45. package/src/lib/design/design-command.js.map +1 -1
  46. package/src/lib/design/index.js +19 -6
  47. package/src/lib/design/index.js.map +1 -1
  48. package/src/lib/design/legacy.d.ts +9 -0
  49. package/src/lib/design/legacy.js +52 -0
  50. package/src/lib/design/legacy.js.map +1 -0
  51. package/src/lib/design/missing-package.d.ts +2 -0
  52. package/src/lib/design/missing-package.js +15 -0
  53. package/src/lib/design/missing-package.js.map +1 -0
  54. package/src/lib/design/new-call.d.ts +11 -0
  55. package/src/lib/design/new-call.js +124 -0
  56. package/src/lib/design/new-call.js.map +1 -0
  57. package/src/lib/design/paths.d.ts +23 -2
  58. package/src/lib/design/paths.js +1 -1
  59. package/src/lib/design/paths.js.map +1 -1
  60. package/src/lib/design/render-fields.d.ts +29 -0
  61. package/src/lib/design/render-fields.js +31 -0
  62. package/src/lib/design/render-fields.js.map +1 -0
  63. package/src/lib/design/render-packages.d.ts +69 -0
  64. package/src/lib/design/render-packages.js +168 -0
  65. package/src/lib/design/render-packages.js.map +1 -0
  66. package/src/lib/design/render-worker.d.ts +1 -0
  67. package/src/lib/design/render-worker.js +149 -0
  68. package/src/lib/design/render-worker.js.map +1 -0
  69. package/src/lib/design/render.d.ts +23 -0
  70. package/src/lib/design/render.js +119 -0
  71. package/src/lib/design/render.js.map +1 -0
  72. package/src/lib/design/serve.d.ts +1 -1
  73. package/src/lib/design/serve.js +49 -12
  74. package/src/lib/design/serve.js.map +1 -1
  75. package/src/lib/design/ssr-shims.d.ts +10 -0
  76. package/src/lib/design/ssr-shims.js +128 -0
  77. package/src/lib/design/ssr-shims.js.map +1 -0
  78. package/src/lib/design/stamp.d.ts +16 -0
  79. package/src/lib/design/stamp.js +77 -0
  80. package/src/lib/design/stamp.js.map +1 -0
  81. package/src/lib/design/status.d.ts +33 -0
  82. package/src/lib/design/status.js +58 -0
  83. package/src/lib/design/status.js.map +1 -0
  84. package/src/lib/design/system-use.d.ts +23 -0
  85. package/src/lib/design/system-use.js +61 -0
  86. package/src/lib/design/system-use.js.map +1 -0
  87. package/src/lib/doctor/index.js +15 -2
  88. package/src/lib/doctor/index.js.map +1 -1
  89. package/src/lib/index.js +22 -9
  90. package/src/lib/index.js.map +1 -1
  91. package/src/lib/release.js +10 -2
  92. package/src/lib/release.js.map +1 -1
  93. package/src/lib/update/agent-setup.js +11 -3
  94. package/src/lib/update/agent-setup.js.map +1 -1
  95. package/src/lib/update/ai.js +13 -5
  96. package/src/lib/update/ai.js.map +1 -1
  97. package/src/lib/update/index.js +32 -19
  98. package/src/lib/update/index.js.map +1 -1
  99. package/src/lib/update/registry.js +10 -2
  100. package/src/lib/update/registry.js.map +1 -1
  101. package/src/lib/update/update-command.js +16 -8
  102. package/src/lib/update/update-command.js.map +1 -1
  103. package/src/lib/utils.js +11 -3
  104. package/src/lib/utils.js.map +1 -1
  105. package/design/web/host.css +0 -494
  106. package/design/web/host.ts +0 -445
  107. package/design/web/index.html +0 -11
@@ -1,10 +1,22 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.designCommand = void 0;
4
- const tslib_1 = require("tslib");
5
13
  const path_1 = require("path");
6
14
  const check_1 = require("./check");
15
+ const legacy_1 = require("./legacy");
16
+ const new_call_1 = require("./new-call");
7
17
  const serve_1 = require("./serve");
18
+ const stamp_1 = require("./stamp");
19
+ const status_1 = require("./status");
8
20
  /** Reads `--checkout <path>` out of an argument list, and answers with the path and the rest. */
9
21
  const splitCheckout = (argv, root) => {
10
22
  var _a;
@@ -13,17 +25,60 @@ const splitCheckout = (argv, root) => {
13
25
  return { target: root, rest: argv };
14
26
  return { target: (0, path_1.resolve)(root, (_a = argv[index + 1]) !== null && _a !== void 0 ? _a : '.'), rest: [...argv.slice(0, index), ...argv.slice(index + 2)] };
15
27
  };
28
+ const helpOf = (invocation) => [
29
+ `${invocation} [checkout]`,
30
+ ' Serve the variant frames of a checkout. The checkout defaults to the working directory.',
31
+ '',
32
+ `${invocation} check [--lint <file>…] [--tsconfig [path]] [--call <slug> [--variant <key>]]`,
33
+ ' Find out why a call does not render: eslint, then tsc, then the live frames.',
34
+ '',
35
+ `${invocation} new <project>/<group>/<name> --stage <stage> [--variants a,b]`,
36
+ ' Write a call that renders at once: call.ts, fixture.ts and one variant file per key.',
37
+ ' A quick exploration of an idea takes --stage sketch.',
38
+ '',
39
+ `${invocation} legacy <project>`,
40
+ ' Mark every call of a project without a stage as legacy, so check accepts it.',
41
+ '',
42
+ `${invocation} status <slug> <${status_1.CALL_STATES.join('|')}>`,
43
+ ' Record the state of a call for Ethlete Studio. new and check --call record theirs on their own.',
44
+ '',
45
+ `${invocation} stamp`,
46
+ ' Print the version and build of this cli as JSON, which a running server answers with too.',
47
+ '',
48
+ 'Every command takes --checkout <path>. DE_PORT overrules the port in .ethlete/design/config.json.',
49
+ '',
50
+ ].join('\n');
16
51
  /**
17
- * `et design [checkout]` serves the design page of a checkout, and `et design check …` says why
52
+ * `et design [checkout]` serves the variant frames of a checkout, and `et design check …` says why
18
53
  * a call does not render. Both work on any checkout that keeps a `.ethlete/design` folder, so a
19
54
  * repository needs no design tooling of its own.
20
55
  */
21
- const designCommand = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
56
+ const designCommand = (options) => __awaiter(void 0, void 0, void 0, function* () {
22
57
  const { root, argv, invocation } = options;
58
+ if (argv[0] === '--help' || argv[0] === '-h' || argv[0] === 'help') {
59
+ console.log(helpOf(invocation));
60
+ return 0;
61
+ }
62
+ if (argv[0] === 'stamp') {
63
+ console.log(JSON.stringify((0, stamp_1.buildStampOf)()));
64
+ return 0;
65
+ }
23
66
  if (argv[0] === 'check') {
24
67
  const { target, rest } = splitCheckout(argv.slice(1), root);
25
68
  return (0, check_1.checkDesign)({ target, argv: rest, invocation });
26
69
  }
70
+ if (argv[0] === 'new') {
71
+ const { target, rest } = splitCheckout(argv.slice(1), root);
72
+ return (0, new_call_1.newCall)({ target, argv: rest, invocation });
73
+ }
74
+ if (argv[0] === 'legacy') {
75
+ const { target, rest } = splitCheckout(argv.slice(1), root);
76
+ return (0, legacy_1.markLegacy)({ target, argv: rest, invocation });
77
+ }
78
+ if (argv[0] === 'status') {
79
+ const { target, rest } = splitCheckout(argv.slice(1), root);
80
+ return (0, status_1.designStatus)({ target, argv: rest, invocation });
81
+ }
27
82
  const { target, rest } = splitCheckout(argv, root);
28
83
  const positional = rest[0];
29
84
  return (0, serve_1.serveDesign)({ target: positional ? (0, path_1.resolve)(root, positional) : target });
@@ -1 +1 @@
1
- {"version":3,"file":"design-command.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/design-command.ts"],"names":[],"mappings":";;;;AAAA,+BAA+B;AAC/B,mCAAsC;AACtC,mCAAsC;AAEtC,iGAAiG;AACjG,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,IAAY,EAAE,EAAE;;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEtD,OAAO,EAAE,MAAM,EAAE,IAAA,cAAO,EAAC,IAAI,EAAE,MAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACtH,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAO,OAA6D,EAAmB,EAAE;IACpH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAE5D,OAAO,IAAA,mBAAW,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,OAAO,IAAA,mBAAW,EAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAClF,CAAC,CAAA,CAAC;AAbW,QAAA,aAAa,iBAaxB"}
1
+ {"version":3,"file":"design-command.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/design-command.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./calls-tsconfig"), exports);
5
- tslib_1.__exportStar(require("./check"), exports);
6
- tslib_1.__exportStar(require("./design-command"), exports);
7
- tslib_1.__exportStar(require("./paths"), exports);
8
- tslib_1.__exportStar(require("./serve"), exports);
17
+ __exportStar(require("./calls-tsconfig"), exports);
18
+ __exportStar(require("./check"), exports);
19
+ __exportStar(require("./design-command"), exports);
20
+ __exportStar(require("./paths"), exports);
21
+ __exportStar(require("./serve"), exports);
9
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,kDAAwB;AACxB,2DAAiC;AACjC,kDAAwB;AACxB,kDAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,0CAAwB;AACxB,mDAAiC;AACjC,0CAAwB;AACxB,0CAAwB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Writes `legacy: true` into every call of a project that declares no stage, so `et design check`
3
+ * accepts the calls made before the stage was required. A call that declares one stays untouched.
4
+ */
5
+ export declare const markLegacy: (options: {
6
+ target: string;
7
+ argv: string[];
8
+ invocation: string;
9
+ }) => 0 | 1 | 2;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.markLegacy = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const paths_1 = require("./paths");
7
+ const OPENING = /defineCall\(\{\n/;
8
+ const DECLARES = /^\s*(stage|legacy)\s*:/m;
9
+ const callFilesOf = (folder) => (0, fs_1.readdirSync)(folder).flatMap((name) => {
10
+ const path = (0, path_1.join)(folder, name);
11
+ if ((0, fs_1.statSync)(path).isDirectory())
12
+ return callFilesOf(path);
13
+ return name === 'call.ts' ? [path] : [];
14
+ });
15
+ /**
16
+ * Writes `legacy: true` into every call of a project that declares no stage, so `et design check`
17
+ * accepts the calls made before the stage was required. A call that declares one stays untouched.
18
+ */
19
+ const markLegacy = (options) => {
20
+ const { target, argv, invocation } = options;
21
+ const project = argv.find((argument) => !argument.startsWith('--'));
22
+ if (!project) {
23
+ console.error(`usage: ${invocation} legacy <project>`);
24
+ return 2;
25
+ }
26
+ const folder = (0, path_1.join)((0, paths_1.callsRootOf)(target), project);
27
+ if (!(0, fs_1.existsSync)(folder)) {
28
+ console.error(`NO PROJECT "${project}" - ${(0, path_1.relative)(target, folder)} does not exist.`);
29
+ return 1;
30
+ }
31
+ const unreadable = [];
32
+ let marked = 0;
33
+ for (const path of callFilesOf(folder)) {
34
+ const text = (0, fs_1.readFileSync)(path, 'utf8');
35
+ if (DECLARES.test(text))
36
+ continue;
37
+ if (!OPENING.test(text)) {
38
+ unreadable.push((0, path_1.relative)(target, path));
39
+ continue;
40
+ }
41
+ (0, fs_1.writeFileSync)(path, text.replace(OPENING, (opening) => `${opening} legacy: true,\n`));
42
+ console.log(`legacy ${(0, path_1.relative)(target, path)}`);
43
+ marked++;
44
+ }
45
+ for (const path of unreadable) {
46
+ console.error(`SKIPPED ${path} - no "defineCall({" line. Add legacy: true by hand.`);
47
+ }
48
+ console.log(`ok ${marked} call${marked === 1 ? '' : 's'} marked legacy in ${project}`);
49
+ return unreadable.length > 0 ? 1 : 0;
50
+ };
51
+ exports.markLegacy = markLegacy;
52
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Turns a failed Angular import into a message that names the missing package, or returns null for any other error. */
2
+ export declare const missingPackageMessage: (error: unknown, checkout: string) => string | null;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.missingPackageMessage = void 0;
4
+ const MISSING_PACKAGE = /Cannot find package '([^']+)'/;
5
+ /** Turns a failed Angular import into a message that names the missing package, or returns null for any other error. */
6
+ const missingPackageMessage = (error, checkout) => {
7
+ var _a;
8
+ const text = error instanceof Error ? error.message : String(error);
9
+ const name = (_a = MISSING_PACKAGE.exec(text)) === null || _a === void 0 ? void 0 : _a[1];
10
+ if (!name || !name.startsWith('@angular/'))
11
+ return null;
12
+ return `ng() needs ${name} in ${checkout}; install it as a dev dependency.`;
13
+ };
14
+ exports.missingPackageMessage = missingPackageMessage;
15
+ //# sourceMappingURL=missing-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missing-package.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/missing-package.ts"],"names":[],"mappings":";;;AAAA,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAExD,wHAAwH;AACjH,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAE,QAAgB,EAAiB,EAAE;;IACvF,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAA,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0CAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,OAAO,cAAc,IAAI,OAAO,QAAQ,mCAAmC,CAAC;AAC9E,CAAC,CAAC;AAPW,QAAA,qBAAqB,yBAOhC"}
@@ -0,0 +1,11 @@
1
+ /** The values of `CallStage` in `design/define-call.ts`; a spec keeps the two lists equal. */
2
+ export declare const CALL_STAGES: string[];
3
+ /**
4
+ * Writes a call that renders at once: `call.ts`, a shared `fixture.ts` and one drawing per variant
5
+ * key. Refuses a slug whose folder exists, so it never overwrites a drawing.
6
+ */
7
+ export declare const newCall: (options: {
8
+ target: string;
9
+ argv: string[];
10
+ invocation: string;
11
+ }) => 0 | 1 | 2;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newCall = exports.CALL_STAGES = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const paths_1 = require("./paths");
7
+ const status_1 = require("./status");
8
+ const SEGMENT = /^[a-z0-9][a-z0-9-]*$/;
9
+ /** The values of `CallStage` in `design/define-call.ts`; a spec keeps the two lists equal. */
10
+ exports.CALL_STAGES = ['themes', 'ci', 'wireframe', 'component', 'element', 'page', 'prototype', 'sketch'];
11
+ const KEY = /^[a-z][a-z0-9-]*$/;
12
+ const titled = (word) => `${word.charAt(0).toUpperCase()}${word.slice(1).replace(/-/g, ' ')}`;
13
+ const callFile = (options) => {
14
+ var _a;
15
+ const { slug, keys, stage } = options;
16
+ const variants = keys
17
+ .map((key) => ` {\n key: '${key}',\n name: 'Variant ${key}',\n claim: 'What this variant argues.',\n` +
18
+ ` cost: 'What it costs.',\n load: () => import('./variant-${key}'),\n },`)
19
+ .join('\n');
20
+ const eyebrow = `${titled((_a = slug.split('/')[0]) !== null && _a !== void 0 ? _a : '')} · ${titled(stage)}`;
21
+ return `import { defineCall } from '@design-explore';
22
+
23
+ export default defineCall({
24
+ stage: '${stage}',
25
+ eyebrow: '${eyebrow}',
26
+ headline: 'The open question, in one sentence',
27
+ intro: 'What the call is about, and what the variants share.',
28
+ frameWidth: 720,
29
+ variants: [
30
+ ${variants}
31
+ ],
32
+ });
33
+ `;
34
+ };
35
+ const FIXTURE_FILE = `export const FIXTURE = {
36
+ title: 'The data every variant shares',
37
+ };
38
+ `;
39
+ const PLACEHOLDER_STYLES = ` styles: css\`
40
+ .placeholder {
41
+ margin: 0;
42
+ padding: 24px;
43
+ font-family: system-ui, sans-serif;
44
+ }
45
+ \`,`;
46
+ const variantFile = (key) => `import { css, drawing, html } from '@design-explore';
47
+ import { FIXTURE } from './fixture';
48
+
49
+ export default drawing({
50
+ body: html\`<p class="placeholder">\${FIXTURE.title} · variant ${key}</p>\`,
51
+ ${PLACEHOLDER_STYLES}
52
+ });
53
+ `;
54
+ const ngVariantFile = (key) => `import { css, drawing, html, ng } from '@design-explore';
55
+ import { FIXTURE } from './fixture';
56
+
57
+ const button = await ng(html\`<button et-button type="button">\${FIXTURE.title} · variant ${key}</button>\`, {
58
+ imports: ['BUTTON_IMPORTS'],
59
+ });
60
+
61
+ export default drawing({
62
+ body: html\`<div class="placeholder">\${button}</div>\`,
63
+ ${PLACEHOLDER_STYLES}
64
+ });
65
+ `;
66
+ /**
67
+ * Writes a call that renders at once: `call.ts`, a shared `fixture.ts` and one drawing per variant
68
+ * key. Refuses a slug whose folder exists, so it never overwrites a drawing.
69
+ */
70
+ const newCall = (options) => {
71
+ var _a, _b, _c, _d;
72
+ const { target, argv, invocation } = options;
73
+ const slug = argv.find((argument, index) => { var _a; return !argument.startsWith('--') && !['--variants', '--stage'].includes((_a = argv[index - 1]) !== null && _a !== void 0 ? _a : ''); });
74
+ const listed = argv[argv.indexOf('--variants') + 1];
75
+ const stage = argv.includes('--stage') ? ((_a = argv[argv.indexOf('--stage') + 1]) !== null && _a !== void 0 ? _a : '') : null;
76
+ const keys = argv.includes('--variants') ? (listed !== null && listed !== void 0 ? listed : '').split(',').filter(Boolean) : ['a', 'b'];
77
+ if (!slug || stage === null) {
78
+ console.error(`usage: ${invocation} new <project>/<group>/<name> --stage <stage> [--variants a,b]`);
79
+ return 2;
80
+ }
81
+ const segments = slug.split('/');
82
+ if (segments.length < 2 || !segments.every((segment) => SEGMENT.test(segment))) {
83
+ console.error(`BAD SLUG "${slug}" - use lowercase segments joined by "/", led by the project, e.g. app/checkout/01-summary.`);
84
+ return 2;
85
+ }
86
+ if (keys.length === 0 || !keys.every((key) => KEY.test(key)) || new Set(keys).size !== keys.length) {
87
+ console.error(`BAD VARIANTS "${listed !== null && listed !== void 0 ? listed : ''}" - give distinct lowercase keys, e.g. --variants a,b,c.`);
88
+ return 2;
89
+ }
90
+ if (!exports.CALL_STAGES.includes(stage)) {
91
+ console.error(`BAD STAGE "${stage}" - use one of ${exports.CALL_STAGES.join(', ')}.`);
92
+ return 2;
93
+ }
94
+ const folder = (0, path_1.join)((0, paths_1.callsRootOf)(target), ...segments);
95
+ const project = segments[0];
96
+ const projects = (_c = (_b = (0, paths_1.readConfig)(target)) === null || _b === void 0 ? void 0 : _b.projects) !== null && _c !== void 0 ? _c : {};
97
+ const rendersComponents = Boolean((_d = projects[project]) === null || _d === void 0 ? void 0 : _d.providers);
98
+ if ((0, fs_1.existsSync)(folder)) {
99
+ console.error(`CALL EXISTS - ${(0, path_1.relative)(target, folder)} is already there. Pick another slug.`);
100
+ return 1;
101
+ }
102
+ (0, fs_1.mkdirSync)(folder, { recursive: true });
103
+ (0, fs_1.writeFileSync)((0, path_1.join)(folder, 'call.ts'), callFile({ slug, keys, stage }));
104
+ (0, fs_1.writeFileSync)((0, path_1.join)(folder, 'fixture.ts'), FIXTURE_FILE);
105
+ for (const key of keys) {
106
+ (0, fs_1.writeFileSync)((0, path_1.join)(folder, `variant-${key}.ts`), rendersComponents ? ngVariantFile(key) : variantFile(key));
107
+ }
108
+ (0, status_1.writeStatus)({ checkout: target, slug, state: 'scaffolded' });
109
+ if (!(project in projects)) {
110
+ console.warn(`note: config.json names no project "${project}", so its drawings get no styles and no \`providers\`, ` +
111
+ 'and the variants draw plain html instead of real components through ng().');
112
+ }
113
+ else if (!rendersComponents) {
114
+ console.warn(`note: project "${project}" sets no \`providers\` in config.json, so the variants draw plain html. ` +
115
+ 'Name a providers module to render real components through ng().');
116
+ }
117
+ console.log([
118
+ `wrote ${(0, path_1.relative)(target, folder)}: call.ts, fixture.ts, ${keys.map((key) => `variant-${key}.ts`).join(', ')}`,
119
+ `next: ${invocation} check --call ${slug}`,
120
+ ].join('\n'));
121
+ return 0;
122
+ };
123
+ exports.newCall = newCall;
124
+ //# sourceMappingURL=new-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-call.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/new-call.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,39 @@
1
1
  /** Where every repository keeps its design work. The layout is convention, not configuration. */
2
2
  export declare const DESIGN_DIR = ".ethlete/design";
3
- /** One project's drawing environment: the stylesheets a frame loads, and the markup it puts in `<head>`. */
3
+ /**
4
+ * One project's drawing environment: the stylesheets a frame loads, the markup it puts in `<head>`,
5
+ * the module whose default export is the Angular providers array `ng()` renders under, and the
6
+ * surface and colour theme names a call can be drawn under. The first name of each list is the default.
7
+ */
4
8
  export type DesignProject = {
5
9
  styles?: string[];
6
10
  head?: string;
11
+ providers?: string;
12
+ themes?: DesignThemes;
13
+ };
14
+ export type DesignThemes = {
15
+ surface?: string[];
16
+ color?: string[];
17
+ };
18
+ /**
19
+ * Where `ng()` takes its code from. `packages` maps a package pattern to a checkout path, for
20
+ * example `{ "@ethlete/*": "dist/libs/*" }`; a drawing's subpath imports such as
21
+ * `@ethlete/core/design/theme-css` load from the mapped folder too. `modules` names the packages an
22
+ * import name is looked up in, `['@ethlete/components', '@ethlete/core']` when left out.
23
+ */
24
+ export type DesignRenderConfig = {
25
+ packages?: Record<string, string>;
26
+ modules?: string[];
7
27
  };
8
28
  export type DesignConfig = {
9
29
  port?: number;
10
30
  defaultCall?: string;
31
+ render?: DesignRenderConfig;
11
32
  projects?: Record<string, DesignProject>;
12
33
  };
13
34
  export declare const DEFAULT_PORT = 4402;
14
35
  /**
15
- * The package's own `design` folder, which carries the web pages and the authoring API. It sits
36
+ * The package's own `design` folder, which carries the frame page and the authoring API. It sits
16
37
  * three levels above this file both in the source tree and in the build output.
17
38
  */
18
39
  export declare const assetRoot: () => string;
@@ -7,7 +7,7 @@ const path_1 = require("path");
7
7
  exports.DESIGN_DIR = '.ethlete/design';
8
8
  exports.DEFAULT_PORT = 4402;
9
9
  /**
10
- * The package's own `design` folder, which carries the web pages and the authoring API. It sits
10
+ * The package's own `design` folder, which carries the frame page and the authoring API. It sits
11
11
  * three levels above this file both in the source tree and in the build output.
12
12
  */
13
13
  const assetRoot = () => (0, path_1.resolve)(__dirname, '../../../design');
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/paths.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA+B;AAE/B,iGAAiG;AACpF,QAAA,UAAU,GAAG,iBAAiB,CAAC;AAc/B,QAAA,YAAY,GAAG,IAAI,CAAC;AAEjC;;;GAGG;AACI,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAAxD,QAAA,SAAS,aAA+C;AAE9D,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,kBAAU,EAAE,aAAa,CAAC,CAAC;AAA9E,QAAA,YAAY,gBAAkE;AAEpF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,kBAAU,EAAE,OAAO,CAAC,CAAC;AAAvE,QAAA,WAAW,eAA4D;AAEpF,8FAA8F;AACvF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAAjF,QAAA,UAAU,cAAuE;AAEvF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAuB,EAAE;IAChE,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,MAAM,CAAC,CAAC;IAElC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAiB,CAAC;AAChE,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEK,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,oBAAY,CAAC;AAAjG,QAAA,MAAM,UAA2F"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/paths.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA+B;AAE/B,iGAAiG;AACpF,QAAA,UAAU,GAAG,iBAAiB,CAAC;AAqC/B,QAAA,YAAY,GAAG,IAAI,CAAC;AAEjC;;;GAGG;AACI,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAAxD,QAAA,SAAS,aAA+C;AAE9D,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,kBAAU,EAAE,aAAa,CAAC,CAAC;AAA9E,QAAA,YAAY,gBAAkE;AAEpF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,kBAAU,EAAE,OAAO,CAAC,CAAC;AAAvE,QAAA,WAAW,eAA4D;AAEpF,8FAA8F;AACvF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAAjF,QAAA,UAAU,cAAuE;AAEvF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAuB,EAAE;IAChE,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,MAAM,CAAC,CAAC;IAElC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAiB,CAAC;AAChE,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEK,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,oBAAY,CAAC;AAAjG,QAAA,MAAM,UAA2F"}
@@ -0,0 +1,29 @@
1
+ export type FieldErrorSpec = string | {
2
+ kind: string;
3
+ message?: string;
4
+ };
5
+ export type FieldSpec = {
6
+ value: unknown;
7
+ errors?: FieldErrorSpec[];
8
+ touched?: boolean;
9
+ };
10
+ type SignalForms = {
11
+ form: (model: unknown, schema: (path: Record<string, unknown>) => void) => Record<string, () => FieldStateLike>;
12
+ validate: (path: unknown, logic: () => {
13
+ kind: string;
14
+ message?: string;
15
+ }[]) => void;
16
+ };
17
+ type FieldStateLike = {
18
+ markAsTouched: () => void;
19
+ };
20
+ /**
21
+ * A signal form tree with one field per entry of `specs`, each holding its value, its fixed
22
+ * errors and its touched state. Must run in an injection context.
23
+ */
24
+ export declare const buildFields: (options: {
25
+ specs: Record<string, FieldSpec>;
26
+ forms: SignalForms;
27
+ signal: <T>(value: T) => unknown;
28
+ }) => Record<string, () => FieldStateLike>;
29
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFields = void 0;
4
+ const toError = (error) => (typeof error === 'string' ? { kind: error } : error);
5
+ /**
6
+ * A signal form tree with one field per entry of `specs`, each holding its value, its fixed
7
+ * errors and its touched state. Must run in an injection context.
8
+ */
9
+ const buildFields = (options) => {
10
+ const { specs, forms, signal } = options;
11
+ const entries = Object.entries(specs);
12
+ const model = signal(Object.fromEntries(entries.map(([name, spec]) => [name, spec.value])));
13
+ const tree = forms.form(model, (path) => {
14
+ var _a;
15
+ for (const [name, spec] of entries) {
16
+ const errors = ((_a = spec.errors) !== null && _a !== void 0 ? _a : []).map(toError);
17
+ if (errors.length > 0)
18
+ forms.validate(path[name], () => errors);
19
+ }
20
+ });
21
+ // A field tree is a proxy whose every property is a child field, so `field?.()` breaks once it
22
+ // is compiled down to `field.call(...)`.
23
+ for (const [name, spec] of entries) {
24
+ const field = tree[name];
25
+ if (spec.touched && field)
26
+ field().markAsTouched();
27
+ }
28
+ return tree;
29
+ };
30
+ exports.buildFields = buildFields;
31
+ //# sourceMappingURL=render-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-fields.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/render-fields.ts"],"names":[],"mappings":";;;AAWA,MAAM,OAAO,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjG;;;GAGG;AACI,MAAM,WAAW,GAAG,CAAC,OAI3B,EAAE,EAAE;IACH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;;QACtC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,MAAA,IAAI,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEhD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+FAA+F;IAC/F,yCAAyC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK;YAAE,KAAK,EAAE,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAzBW,QAAA,WAAW,eAyBtB"}
@@ -0,0 +1,69 @@
1
+ import { FieldSpec } from './render-fields';
2
+ export declare const DEFAULT_RENDER_MODULES: string[];
3
+ export type RenderWorkerData = {
4
+ target: string;
5
+ packages: Record<string, string>;
6
+ modules: string[];
7
+ };
8
+ export type RenderRequest = {
9
+ id: number;
10
+ template: string;
11
+ imports: string[];
12
+ fields: Record<string, FieldSpec> | null;
13
+ providers: string | null;
14
+ };
15
+ export type RenderResult = {
16
+ markup: string;
17
+ styles: string[];
18
+ } | {
19
+ error: string;
20
+ };
21
+ export type RenderResponse = RenderResult & {
22
+ id: number;
23
+ watched: Record<string, number>;
24
+ };
25
+ export type MappedPackage = {
26
+ dir: string;
27
+ subpath: string;
28
+ };
29
+ /**
30
+ * The checkout folder a bare specifier is mapped to by `render.packages`, and the export subpath
31
+ * inside it. `@ethlete/*` → `dist/libs/*` maps `@ethlete/core/design` to `dist/libs/core` and `./design`.
32
+ */
33
+ export declare const mapPackage: (options: {
34
+ specifier: string;
35
+ packages: Record<string, string>;
36
+ target: string;
37
+ }) => MappedPackage | null;
38
+ /** The file a mapped package exports at its subpath, read from its own `package.json` exports. */
39
+ export declare const entryOf: (mapped: MappedPackage) => string;
40
+ /**
41
+ * The file a drawing's subpath import of a mapped package loads in the browser, or null to leave it
42
+ * to the checkout. The root stays with the checkout: the browser has its own `@angular/core`.
43
+ */
44
+ export declare const mappedSubpathOf: (options: {
45
+ specifier: string;
46
+ packages: Record<string, string>;
47
+ target: string;
48
+ }) => string | null;
49
+ /** The values behind the names a call imports, each from the first module that exports it. */
50
+ export declare const lookupImports: (options: {
51
+ names: string[];
52
+ modules: Record<string, Record<string, unknown>>;
53
+ }) => unknown[];
54
+ /**
55
+ * The inner markup of the render host followed by what the app attached to `<body>` after it (an
56
+ * open overlay, shown: positioning never runs on the server), and the text of every `<style>` tag.
57
+ */
58
+ export declare const extractRender: (document: string) => {
59
+ markup: string;
60
+ styles: string[];
61
+ };
62
+ /**
63
+ * The tsconfig `paths` that type a mapped package's imports from the folder `ng()` loads it from:
64
+ * the root and every subpath its `exports` types, so `@ethlete/core/design/theme-css` resolves too.
65
+ */
66
+ export declare const typePathsOf: (options: {
67
+ packages: Record<string, string>;
68
+ target: string;
69
+ }) => Record<string, string[]>;