@ethlete/cli 3.0.0-next.23 → 3.0.0-next.25

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 (202) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/design/contrast.ts +49 -0
  3. package/design/define-call.ts +48 -8
  4. package/design/define-part.ts +83 -1
  5. package/design/embed-page.ts +37 -4
  6. package/design/icon-sheet.ts +151 -0
  7. package/design/mark-part.ts +79 -2
  8. package/design/morph.ts +67 -0
  9. package/design/motion-runtime.ts +407 -0
  10. package/design/spring.ts +53 -0
  11. package/design/token-sheet.ts +87 -0
  12. package/design/web/env.d.ts +6 -2
  13. package/design/web/frame.ts +159 -6
  14. package/package.json +2 -1
  15. package/src/lib/design/calls-tsconfig.js +1 -2
  16. package/src/lib/design/calls-tsconfig.js.map +1 -1
  17. package/src/lib/design/changed-parts.d.ts +4 -4
  18. package/src/lib/design/changed-parts.js +10 -6
  19. package/src/lib/design/changed-parts.js.map +1 -1
  20. package/src/lib/design/contact-sheet.d.ts +26 -13
  21. package/src/lib/design/contact-sheet.js +122 -40
  22. package/src/lib/design/contact-sheet.js.map +1 -1
  23. package/src/lib/design/design-command.js +50 -2
  24. package/src/lib/design/design-command.js.map +1 -1
  25. package/src/lib/design/force-interactions.d.ts +2 -1
  26. package/src/lib/design/force-interactions.js +7 -4
  27. package/src/lib/design/force-interactions.js.map +1 -1
  28. package/src/lib/design/generated-stylesheets.d.ts +15 -0
  29. package/src/lib/design/generated-stylesheets.js +52 -0
  30. package/src/lib/design/generated-stylesheets.js.map +1 -0
  31. package/src/lib/design/inbox-command.d.ts +1 -0
  32. package/src/lib/design/inbox-command.js +15 -0
  33. package/src/lib/design/inbox-command.js.map +1 -1
  34. package/src/lib/design/mcp-command.d.ts +60 -0
  35. package/src/lib/design/mcp-command.js +327 -0
  36. package/src/lib/design/mcp-command.js.map +1 -0
  37. package/src/lib/design/merge-compare.d.ts +10 -0
  38. package/src/lib/design/merge-compare.js +17 -4
  39. package/src/lib/design/merge-compare.js.map +1 -1
  40. package/src/lib/design/motion-command.d.ts +71 -0
  41. package/src/lib/design/motion-command.js +314 -0
  42. package/src/lib/design/motion-command.js.map +1 -0
  43. package/src/lib/design/motion-endpoint.d.ts +61 -0
  44. package/src/lib/design/motion-endpoint.js +133 -0
  45. package/src/lib/design/motion-endpoint.js.map +1 -0
  46. package/src/lib/design/motion-flow.d.ts +5 -0
  47. package/src/lib/design/motion-flow.js +29 -0
  48. package/src/lib/design/motion-flow.js.map +1 -0
  49. package/src/lib/design/motion-shot.d.ts +43 -0
  50. package/src/lib/design/motion-shot.js +97 -0
  51. package/src/lib/design/motion-shot.js.map +1 -0
  52. package/src/lib/design/paths.d.ts +11 -0
  53. package/src/lib/design/paths.js.map +1 -1
  54. package/src/lib/design/ready-shots.d.ts +7 -0
  55. package/src/lib/design/ready-shots.js +22 -1
  56. package/src/lib/design/ready-shots.js.map +1 -1
  57. package/src/lib/design/render-packages.d.ts +9 -0
  58. package/src/lib/design/render-packages.js +13 -3
  59. package/src/lib/design/render-packages.js.map +1 -1
  60. package/src/lib/design/render.js +3 -3
  61. package/src/lib/design/render.js.map +1 -1
  62. package/src/lib/design/serve.js +108 -21
  63. package/src/lib/design/serve.js.map +1 -1
  64. package/src/lib/design/shot-command.d.ts +12 -6
  65. package/src/lib/design/shot-command.js +60 -48
  66. package/src/lib/design/shot-command.js.map +1 -1
  67. package/src/lib/design/shot.d.ts +30 -4
  68. package/src/lib/design/shot.js +138 -53
  69. package/src/lib/design/shot.js.map +1 -1
  70. package/src/lib/design/sketch-command.js +132 -39
  71. package/src/lib/design/sketch-command.js.map +1 -1
  72. package/src/lib/design/sketch-stylesheets.d.ts +7 -0
  73. package/src/lib/design/sketch-stylesheets.js +63 -0
  74. package/src/lib/design/sketch-stylesheets.js.map +1 -0
  75. package/src/lib/design/studio-api.d.ts +28 -6
  76. package/src/lib/design/studio-api.js +102 -17
  77. package/src/lib/design/studio-api.js.map +1 -1
  78. package/src/lib/design/system/check-system.js +8 -0
  79. package/src/lib/design/system/check-system.js.map +1 -1
  80. package/src/lib/design/system/comments/comment.d.ts +17 -0
  81. package/src/lib/design/system/comments/comment.js +35 -1
  82. package/src/lib/design/system/comments/comment.js.map +1 -1
  83. package/src/lib/design/system/comments/complete.js +4 -2
  84. package/src/lib/design/system/comments/complete.js.map +1 -1
  85. package/src/lib/design/system/complete-command.d.ts +9 -0
  86. package/src/lib/design/system/complete-command.js +134 -0
  87. package/src/lib/design/system/complete-command.js.map +1 -0
  88. package/src/lib/design/system/complete.d.ts +171 -0
  89. package/src/lib/design/system/complete.js +1106 -0
  90. package/src/lib/design/system/complete.js.map +1 -0
  91. package/src/lib/design/system/contrast-check.d.ts +26 -0
  92. package/src/lib/design/system/contrast-check.js +153 -0
  93. package/src/lib/design/system/contrast-check.js.map +1 -0
  94. package/src/lib/design/system/exceptions.d.ts +59 -0
  95. package/src/lib/design/system/exceptions.js +132 -0
  96. package/src/lib/design/system/exceptions.js.map +1 -0
  97. package/src/lib/design/system/flows/flow.d.ts +3 -0
  98. package/src/lib/design/system/flows/flow.js +5 -3
  99. package/src/lib/design/system/flows/flow.js.map +1 -1
  100. package/src/lib/design/system/handoff.d.ts +11 -0
  101. package/src/lib/design/system/handoff.js +30 -0
  102. package/src/lib/design/system/handoff.js.map +1 -0
  103. package/src/lib/design/system/imports.d.ts +28 -3
  104. package/src/lib/design/system/imports.js +84 -7
  105. package/src/lib/design/system/imports.js.map +1 -1
  106. package/src/lib/design/system/inventory-approval.d.ts +41 -0
  107. package/src/lib/design/system/inventory-approval.js +71 -0
  108. package/src/lib/design/system/inventory-approval.js.map +1 -0
  109. package/src/lib/design/system/inventory.d.ts +65 -0
  110. package/src/lib/design/system/inventory.js +168 -0
  111. package/src/lib/design/system/inventory.js.map +1 -0
  112. package/src/lib/design/system/list-system.d.ts +11 -0
  113. package/src/lib/design/system/list-system.js +26 -3
  114. package/src/lib/design/system/list-system.js.map +1 -1
  115. package/src/lib/design/system/product-stylesheets.d.ts +3 -0
  116. package/src/lib/design/system/product-stylesheets.js +40 -0
  117. package/src/lib/design/system/product-stylesheets.js.map +1 -0
  118. package/src/lib/design/system/render-check.js +30 -4
  119. package/src/lib/design/system/render-check.js.map +1 -1
  120. package/src/lib/design/system/resolve-product.d.ts +2 -3
  121. package/src/lib/design/system/resolve-product.js +4 -6
  122. package/src/lib/design/system/resolve-product.js.map +1 -1
  123. package/src/lib/design/system/rules/canonical-class.d.ts +9 -0
  124. package/src/lib/design/system/rules/canonical-class.js +132 -0
  125. package/src/lib/design/system/rules/canonical-class.js.map +1 -0
  126. package/src/lib/design/system/rules/inline-svg.d.ts +7 -0
  127. package/src/lib/design/system/rules/inline-svg.js +28 -0
  128. package/src/lib/design/system/rules/inline-svg.js.map +1 -0
  129. package/src/lib/design/system/rules/motion.d.ts +4 -0
  130. package/src/lib/design/system/rules/motion.js +46 -2
  131. package/src/lib/design/system/rules/motion.js.map +1 -1
  132. package/src/lib/design/system/rules/stale-replace.js +41 -2
  133. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  134. package/src/lib/design/system/rules/token-selectors.js +1 -1
  135. package/src/lib/design/system/rules/token-selectors.js.map +1 -1
  136. package/src/lib/design/system/rules/utility-css.d.ts +11 -0
  137. package/src/lib/design/system/rules/utility-css.js +290 -0
  138. package/src/lib/design/system/rules/utility-css.js.map +1 -0
  139. package/src/lib/design/system/sketch/baseline.d.ts +3 -2
  140. package/src/lib/design/system/sketch/baseline.js +10 -4
  141. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  142. package/src/lib/design/system/sketch/host-edit.d.ts +4 -0
  143. package/src/lib/design/system/sketch/host-edit.js +68 -0
  144. package/src/lib/design/system/sketch/host-edit.js.map +1 -0
  145. package/src/lib/design/system/sketch/merge-preview.d.ts +4 -2
  146. package/src/lib/design/system/sketch/merge-preview.js +20 -3
  147. package/src/lib/design/system/sketch/merge-preview.js.map +1 -1
  148. package/src/lib/design/system/sketch/merge-shared.d.ts +42 -6
  149. package/src/lib/design/system/sketch/merge-shared.js +122 -24
  150. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  151. package/src/lib/design/system/sketch/merge.d.ts +6 -5
  152. package/src/lib/design/system/sketch/merge.js +95 -35
  153. package/src/lib/design/system/sketch/merge.js.map +1 -1
  154. package/src/lib/design/system/sketch/merged-parts.d.ts +17 -0
  155. package/src/lib/design/system/sketch/merged-parts.js +35 -2
  156. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  157. package/src/lib/design/system/sketch/no-visible-change.d.ts +10 -3
  158. package/src/lib/design/system/sketch/no-visible-change.js +75 -20
  159. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  160. package/src/lib/design/system/sketch/overlay.js +16 -3
  161. package/src/lib/design/system/sketch/overlay.js.map +1 -1
  162. package/src/lib/design/system/sketch/part-definition.d.ts +12 -0
  163. package/src/lib/design/system/sketch/part-definition.js +40 -1
  164. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  165. package/src/lib/design/system/sketch/sketch.d.ts +40 -3
  166. package/src/lib/design/system/sketch/sketch.js +147 -50
  167. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  168. package/src/lib/design/system/sketch/unchanged-states.d.ts +10 -4
  169. package/src/lib/design/system/sketch/unchanged-states.js +37 -23
  170. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  171. package/src/lib/design/system/sketch/unused-closure.d.ts +12 -0
  172. package/src/lib/design/system/sketch/unused-closure.js +185 -0
  173. package/src/lib/design/system/sketch/unused-closure.js.map +1 -0
  174. package/src/lib/design/system/system-modules.d.ts +5 -1
  175. package/src/lib/design/system/system-modules.js +32 -17
  176. package/src/lib/design/system/system-modules.js.map +1 -1
  177. package/src/lib/design/system/system-tsconfig.d.ts +2 -1
  178. package/src/lib/design/system/system-tsconfig.js +11 -6
  179. package/src/lib/design/system/system-tsconfig.js.map +1 -1
  180. package/src/lib/design/thumb.d.ts +6 -2
  181. package/src/lib/design/thumb.js +36 -15
  182. package/src/lib/design/thumb.js.map +1 -1
  183. package/src/lib/design/variant-diff.d.ts +12 -10
  184. package/src/lib/design/variant-diff.js +14 -13
  185. package/src/lib/design/variant-diff.js.map +1 -1
  186. package/src/lib/design/warm-pages.d.ts +20 -0
  187. package/src/lib/design/warm-pages.js +78 -0
  188. package/src/lib/design/warm-pages.js.map +1 -0
  189. package/src/lib/update/commits.d.ts +9 -0
  190. package/src/lib/update/commits.js +15 -1
  191. package/src/lib/update/commits.js.map +1 -1
  192. package/src/lib/update/migration-manifest.d.ts +6 -0
  193. package/src/lib/update/migration-manifest.js +7 -0
  194. package/src/lib/update/migration-manifest.js.map +1 -1
  195. package/src/lib/update/migrations-command.js +1 -0
  196. package/src/lib/update/migrations-command.js.map +1 -1
  197. package/src/lib/update/run-migrations.d.ts +22 -0
  198. package/src/lib/update/run-migrations.js +60 -1
  199. package/src/lib/update/run-migrations.js.map +1 -1
  200. package/src/lib/update/update-command.d.ts +10 -0
  201. package/src/lib/update/update-command.js +28 -2
  202. package/src/lib/update/update-command.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/sketch/overlay.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA+B;AAC/B,sCAA0C;AAC1C,sCAA+C;AAC/C,wCAAqD;AAErD,wDAA8E;AAC9E,qCAAiF;AASjF,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,IAAsD,EAAE,EAAE,CAC3F,IAAA,2BAAS,EAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,mBAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAEpH;;;;;;GAMG;AACI,MAAM,aAAa,GAAG,CAAC,OAI7B,EAAmB,EAAE;;IACpB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,2BAAS,CAAC,CAAC,CAAC;IACnG,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAgB,EAAE,CAAC,iCAClD,IAAI,KACP,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAA,2BAAS,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAChE,MAAM,EAAE,IAAA,iBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EACvC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAY,EAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IACnF,CAAC,CAAC;IACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAA,2BAAS,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAC7F,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,eAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5F,CAAC;IACF,MAAM,OAAO,GAAc,QAAQ;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,eAAe,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,KAAK,iCAAiC,IAAA,2BAAS,EAAC,IAAI,CAAC,EAAE;KACnH,CAAC,CAAC,CAAC;IAEN,uCACK,OAAO,KACV,KAAK,EACL,QAAQ,EAAE,MAAA,IAAA,oBAAU,EAAC,GAAG,CAAC,mCAAI,OAAO,CAAC,QAAQ,EAC7C,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,EAC5D,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,EACnB,SAAS,EAAE,IAAA,oBAAW,EAAC,MAAM,CAAC,EAC9B,gBAAgB,EAAE,IAAA,2BAAkB,EAAC,MAAM,EAAE,OAAO,CAAC,EACrD,SAAS,EAAE,IAAA,cAAO,EAAC,GAAG,EAAE,sBAAa,CAAC,IACtC;AACJ,CAAC,CAAC;AArCW,QAAA,aAAa,iBAqCxB"}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/sketch/overlay.ts"],"names":[],"mappings":"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"}
@@ -29,3 +29,15 @@ export declare const widthsOf: (source: string) => number[] | null;
29
29
  * without running it. An empty list when it has none or they are not written as a literal list.
30
30
  */
31
31
  export declare const interactionNamesOf: (source: string) => string[];
32
+ /**
33
+ * The motions a part file writes in `definePart({ motions: { … } })` with the `from` and `to` it gives as string
34
+ * literals, and the `motion` each literal rule in `rules` names, read without running it.
35
+ */
36
+ export declare const motionRefsOf: (source: string) => {
37
+ motions: {
38
+ name: string;
39
+ from: string | null;
40
+ to: string | null;
41
+ }[];
42
+ ruleMotions: string[];
43
+ };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.interactionNamesOf = exports.widthsOf = exports.hasBadWidths = exports.withMadeBy = exports.withNote = exports.noteOf = exports.madeByOf = exports.stateNamesOf = void 0;
6
+ exports.motionRefsOf = exports.interactionNamesOf = exports.widthsOf = exports.hasBadWidths = exports.withMadeBy = exports.withNote = exports.noteOf = exports.madeByOf = exports.stateNamesOf = void 0;
7
7
  const typescript_1 = __importDefault(require("typescript"));
8
8
  const definitionOf = (source) => {
9
9
  const file = typescript_1.default.createSourceFile('part.ts', source, typescript_1.default.ScriptTarget.Latest, true);
@@ -154,4 +154,43 @@ const interactionNamesOf = (source) => {
154
154
  return interactions.elements.flatMap((element) => typescript_1.default.isStringLiteral(element) || typescript_1.default.isNoSubstitutionTemplateLiteral(element) ? [element.text] : []);
155
155
  };
156
156
  exports.interactionNamesOf = interactionNamesOf;
157
+ const literalOf = (node) => node && (typescript_1.default.isStringLiteral(node) || typescript_1.default.isNoSubstitutionTemplateLiteral(node)) ? node.text : null;
158
+ /**
159
+ * The motions a part file writes in `definePart({ motions: { … } })` with the `from` and `to` it gives as string
160
+ * literals, and the `motion` each literal rule in `rules` names, read without running it.
161
+ */
162
+ const motionRefsOf = (source) => {
163
+ var _a, _b;
164
+ const { definition } = definitionOf(source);
165
+ const motions = definition ? (_a = propertyOf(definition, 'motions')) === null || _a === void 0 ? void 0 : _a.initializer : undefined;
166
+ const rules = definition ? (_b = propertyOf(definition, 'rules')) === null || _b === void 0 ? void 0 : _b.initializer : undefined;
167
+ return {
168
+ motions: motions && typescript_1.default.isObjectLiteralExpression(motions)
169
+ ? motions.properties.flatMap((property) => {
170
+ var _a, _b;
171
+ if (!typescript_1.default.isPropertyAssignment(property) || !typescript_1.default.isObjectLiteralExpression(property.initializer))
172
+ return [];
173
+ const name = nameOf(property.name);
174
+ if (name === null)
175
+ return [];
176
+ const body = property.initializer;
177
+ return [
178
+ {
179
+ name,
180
+ from: literalOf((_a = propertyOf(body, 'from')) === null || _a === void 0 ? void 0 : _a.initializer),
181
+ to: literalOf((_b = propertyOf(body, 'to')) === null || _b === void 0 ? void 0 : _b.initializer),
182
+ },
183
+ ];
184
+ })
185
+ : [],
186
+ ruleMotions: rules && typescript_1.default.isArrayLiteralExpression(rules)
187
+ ? rules.elements.flatMap((rule) => {
188
+ var _a;
189
+ const name = typescript_1.default.isObjectLiteralExpression(rule) ? literalOf((_a = propertyOf(rule, 'motion')) === null || _a === void 0 ? void 0 : _a.initializer) : null;
190
+ return name === null ? [] : [name];
191
+ })
192
+ : [],
193
+ };
194
+ };
195
+ exports.motionRefsOf = motionRefsOf;
157
196
  //# sourceMappingURL=part-definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"part-definition.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/sketch/part-definition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"part-definition.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/sketch/part-definition.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { SHARED_FOLDER } from '../imports';
1
2
  import { Layer } from '../layers';
2
3
  import { ResolvedProduct } from '../resolve-product';
3
4
  export declare const SKETCH_STATUSES: readonly ["in progress", "ready"];
@@ -53,8 +54,16 @@ export type SketchRound = {
53
54
  lost?: string;
54
55
  drops?: string[];
55
56
  };
57
+ /** A change to the sketch that waits on something; while it holds, the sketch stays in progress and cannot be ready. */
58
+ export type SketchHold = {
59
+ until: string;
60
+ by: string;
61
+ heldAt: string;
62
+ };
56
63
  export type SketchFile = {
57
64
  target: string;
65
+ /** Every part the sketch targets, `target` first; absent on a sketch with one target. */
66
+ targets?: string[];
58
67
  status: SketchStatus;
59
68
  createdAt: string;
60
69
  /** The content hash of each part and of the fixtures in the product when the sketch was created or rebased. */
@@ -64,9 +73,18 @@ export type SketchFile = {
64
73
  /** Per variant, every rejection it had, oldest first. */
65
74
  rejections?: Record<string, SketchRejection[]>;
66
75
  rounds?: SketchRound[];
76
+ /**
77
+ * Where a target the product takes from its base merges: absent, into the base; `override`, into a product copy;
78
+ * `into-base`, into the base, removing the product copy the sketch started from.
79
+ */
80
+ merge?: SketchMerge;
81
+ hold?: SketchHold;
67
82
  };
83
+ export declare const SKETCH_MERGES: readonly ["override", "into-base"];
84
+ export type SketchMerge = (typeof SKETCH_MERGES)[number];
68
85
  /** A sketch as read: `rounds` holds at least one round, and `variantInfo` names the round of every variant. */
69
86
  export type Sketch = SketchFile & {
87
+ targets: string[];
70
88
  rounds: SketchRound[];
71
89
  variantInfo: Record<string, SketchVariantInfo>;
72
90
  product: string;
@@ -83,8 +101,7 @@ export declare const sketchDirOf: (options: {
83
101
  sketch: SketchTarget;
84
102
  }) => string;
85
103
  export declare const variantDirOf: (sketch: Sketch, variant: string) => string;
86
- /** The folder of a sketch that holds no variant: code every variant imports as `@shared/<path>`. */
87
- export declare const SHARED_FOLDER = "shared";
104
+ export { SHARED_FOLDER };
88
105
  export declare const sharedDirOf: (sketch: Pick<Sketch, "dir">) => string;
89
106
  /** A variant's own `shared/` folder: a file there wins over the sketch's `shared/` file of the same path. */
90
107
  export declare const variantSharedDirOf: (sketch: Sketch, variant: string) => string;
@@ -110,6 +127,7 @@ export declare const listSketches: (options: {
110
127
  productDir: string;
111
128
  product: string;
112
129
  }) => (string | Sketch)[];
130
+ /** The open sketch that targets `sketch`, found by its first target or by any other it names; `null` when none does. */
113
131
  export declare const findSketch: (options: {
114
132
  productDir: string;
115
133
  product: string;
@@ -135,17 +153,20 @@ export declare const sketchSourceOf: (options: {
135
153
  * author. Each variant starts from `like` when given - renamed to the target, without its `madeBy`, and with its
136
154
  * sketch's `shared/` folder - else from the part the product resolves for the target, or from an empty part when the
137
155
  * target is new. A part's own `shared/` folder becomes the sketch's, imported as `@shared/`. A target holds one open
138
- * sketch at a time.
156
+ * sketch at a time. Each of `others` joins every variant the same way, as a further target; `like` takes one target only.
157
+ * A target the product overrides in its base needs `merge`: `override` or `into-base`.
139
158
  */
140
159
  export declare const createSketch: (options: {
141
160
  product: ResolvedProduct;
142
161
  sketch: SketchTarget;
162
+ others?: SketchTarget[];
143
163
  variants: string[];
144
164
  roundTitle?: string;
145
165
  roundNote?: string;
146
166
  author?: string;
147
167
  like?: SketchSource;
148
168
  variantNotes?: Map<string, string>;
169
+ merge?: SketchMerge;
149
170
  }) => Sketch | string;
150
171
  /** The sketch with `author` among the authors of `variant`; the same sketch when it is there already. */
151
172
  export declare const withAuthor: (options: {
@@ -200,6 +221,22 @@ export declare const markSketchReady: (options: {
200
221
  sketch: Sketch;
201
222
  author?: string;
202
223
  }) => Sketch | string;
224
+ /** Why a held sketch cannot be ready, or `null` when it holds nothing. */
225
+ export declare const heldProblemOf: (sketch: Pick<Sketch, "target" | "hold">) => string | null;
226
+ /**
227
+ * Holds a sketch until a change that waits on something is made: it goes back to in progress, which drops a pick
228
+ * and takes it out of the merge queue, and `sketch ready` refuses until the hold is released.
229
+ */
230
+ export declare const holdSketch: (options: {
231
+ sketch: Sketch;
232
+ until: string;
233
+ by: string;
234
+ now?: Date;
235
+ }) => Sketch | string;
236
+ /** Removes the hold on a sketch, so it can be marked ready again. */
237
+ export declare const releaseSketch: (options: {
238
+ sketch: Sketch;
239
+ }) => Sketch | string;
203
240
  /** A verdict on one variant: reject it, set the reason of its rejection, or reopen it. */
204
241
  export type SketchVariantVerdict = {
205
242
  kind: 'reject';
@@ -11,18 +11,21 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.editRound = exports.addVariant = exports.rebaseSketch = exports.decideSketch = exports.markSketchReady = exports.finishSketchReport = exports.clearSketchReport = exports.readSketchReport = exports.reportSketch = exports.sketchReportPath = exports.withAuthor = exports.createSketch = exports.sketchSourceOf = exports.writeSketchFile = exports.findSketch = exports.listSketches = exports.readSketch = exports.authorsOf = exports.rejectedProblemOf = exports.rejectionOf = exports.runningRoundOf = exports.isVariantName = exports.parseTarget = exports.sourceFilesIn = exports.variantSharedDirOf = exports.sharedDirOf = exports.SHARED_FOLDER = exports.variantDirOf = exports.sketchDirOf = exports.sketchFolderOf = exports.sketchesDirOf = exports.SKETCH_FILE = exports.SKETCH_STATUSES = void 0;
14
+ exports.editRound = exports.addVariant = exports.rebaseSketch = exports.decideSketch = exports.releaseSketch = exports.holdSketch = exports.heldProblemOf = exports.markSketchReady = exports.finishSketchReport = exports.clearSketchReport = exports.readSketchReport = exports.reportSketch = exports.sketchReportPath = exports.withAuthor = exports.createSketch = exports.sketchSourceOf = exports.writeSketchFile = exports.findSketch = exports.listSketches = exports.readSketch = exports.authorsOf = exports.rejectedProblemOf = exports.rejectionOf = exports.runningRoundOf = exports.isVariantName = exports.parseTarget = exports.sourceFilesIn = exports.variantSharedDirOf = exports.sharedDirOf = exports.SHARED_FOLDER = exports.variantDirOf = exports.sketchDirOf = exports.sketchFolderOf = exports.sketchesDirOf = exports.SKETCH_FILE = exports.SKETCH_MERGES = exports.SKETCH_STATUSES = void 0;
15
15
  const fs_1 = require("fs");
16
16
  const path_1 = require("path");
17
17
  const json_layout_1 = require("../../json-layout");
18
18
  const status_1 = require("../../status");
19
19
  const assets_1 = require("../assets");
20
20
  const imports_1 = require("../imports");
21
+ Object.defineProperty(exports, "SHARED_FOLDER", { enumerable: true, get: function () { return imports_1.SHARED_FOLDER; } });
22
+ const base_1 = require("../base");
21
23
  const layers_1 = require("../layers");
22
24
  const resolve_product_1 = require("../resolve-product");
23
25
  const baseline_1 = require("./baseline");
24
26
  const part_definition_1 = require("./part-definition");
25
27
  exports.SKETCH_STATUSES = ['in progress', 'ready'];
28
+ exports.SKETCH_MERGES = ['override', 'into-base'];
26
29
  const NAME = /^[a-z0-9][a-z0-9-]*$/u;
27
30
  exports.SKETCH_FILE = 'sketch.json';
28
31
  const sketchesDirOf = (productDir) => (0, path_1.resolve)(productDir, 'sketches');
@@ -33,12 +36,10 @@ const sketchDirOf = (options) => (0, path_1.resolve)((0, exports.sketchesDirOf)(
33
36
  exports.sketchDirOf = sketchDirOf;
34
37
  const variantDirOf = (sketch, variant) => (0, path_1.resolve)(sketch.dir, variant);
35
38
  exports.variantDirOf = variantDirOf;
36
- /** The folder of a sketch that holds no variant: code every variant imports as `@shared/<path>`. */
37
- exports.SHARED_FOLDER = 'shared';
38
- const sharedDirOf = (sketch) => (0, path_1.resolve)(sketch.dir, exports.SHARED_FOLDER);
39
+ const sharedDirOf = (sketch) => (0, path_1.resolve)(sketch.dir, imports_1.SHARED_FOLDER);
39
40
  exports.sharedDirOf = sharedDirOf;
40
41
  /** A variant's own `shared/` folder: a file there wins over the sketch's `shared/` file of the same path. */
41
- const variantSharedDirOf = (sketch, variant) => (0, path_1.resolve)((0, exports.variantDirOf)(sketch, variant), exports.SHARED_FOLDER);
42
+ const variantSharedDirOf = (sketch, variant) => (0, path_1.resolve)((0, exports.variantDirOf)(sketch, variant), imports_1.SHARED_FOLDER);
42
43
  exports.variantSharedDirOf = variantSharedDirOf;
43
44
  const SOURCE = /\.(?:ts|js|mjs)$/u;
44
45
  const sourceFilesIn = (dir) => (0, fs_1.existsSync)(dir)
@@ -49,7 +50,7 @@ const sourceFilesIn = (dir) => (0, fs_1.existsSync)(dir)
49
50
  exports.sourceFilesIn = sourceFilesIn;
50
51
  const liftShared = (options) => {
51
52
  const { partDir, sketchSharedDir } = options;
52
- const shared = (0, path_1.resolve)(partDir, exports.SHARED_FOLDER);
53
+ const shared = (0, path_1.resolve)(partDir, imports_1.SHARED_FOLDER);
53
54
  if (!(0, fs_1.existsSync)(shared))
54
55
  return;
55
56
  for (const file of (0, exports.sourceFilesIn)(partDir)) {
@@ -66,6 +67,23 @@ const liftShared = (options) => {
66
67
  (0, fs_1.cpSync)(shared, sketchSharedDir, { recursive: true });
67
68
  (0, fs_1.rmSync)(shared, { recursive: true });
68
69
  };
70
+ const sharedClashOf = (parts) => {
71
+ const seen = new Map();
72
+ for (const part of parts) {
73
+ if (!part)
74
+ continue;
75
+ const shared = (0, path_1.resolve)((0, path_1.dirname)(part.file), imports_1.SHARED_FOLDER);
76
+ for (const file of (0, assets_1.filesBelow)(shared)) {
77
+ const path = (0, path_1.relative)(shared, file).split(path_1.sep).join('/');
78
+ const source = (0, fs_1.readFileSync)(file, 'utf8');
79
+ const held = seen.get(path);
80
+ if (held && held.source !== source)
81
+ return `${held.key} and ${(0, resolve_product_1.partKeyOf)(part)} each hold a different ${imports_1.SHARED_FOLDER}/${path} - rename one, then open the sketch`;
82
+ seen.set(path, { key: (0, resolve_product_1.partKeyOf)(part), source });
83
+ }
84
+ }
85
+ return undefined;
86
+ };
69
87
  /** Reads `<layer>/<name>` as a sketch target, or answers with why it is not one. */
70
88
  const parseTarget = (value) => {
71
89
  const [layer = '', name = '', ...rest] = (value !== null && value !== void 0 ? value : '').split('/');
@@ -74,7 +92,7 @@ const parseTarget = (value) => {
74
92
  return { layer, name };
75
93
  };
76
94
  exports.parseTarget = parseTarget;
77
- const isVariantName = (name) => NAME.test(name) && name !== exports.SHARED_FOLDER;
95
+ const isVariantName = (name) => NAME.test(name) && name !== imports_1.SHARED_FOLDER;
78
96
  exports.isVariantName = isVariantName;
79
97
  const foldersOf = (dir) => (0, fs_1.existsSync)(dir)
80
98
  ? (0, fs_1.readdirSync)(dir)
@@ -127,6 +145,15 @@ const isRounds = (value) => Array.isArray(value) &&
127
145
  (round.lost === undefined || typeof round.lost === 'string') &&
128
146
  (round.drops === undefined || (Array.isArray(round.drops) && round.drops.every((d) => typeof d === 'string')))) &&
129
147
  new Set(value.map((round) => round.key)).size === value.length;
148
+ const isHold = (value) => {
149
+ const hold = value;
150
+ return (typeof hold === 'object' &&
151
+ hold !== null &&
152
+ typeof hold.until === 'string' &&
153
+ hold.until.trim() !== '' &&
154
+ typeof hold.by === 'string' &&
155
+ typeof hold.heldAt === 'string');
156
+ };
130
157
  const FIRST_ROUND = 'r1';
131
158
  const firstRoundOf = (title = '', note = '') => ({ key: FIRST_ROUND, title, note: note.trim() });
132
159
  const nextRoundKeyOf = (rounds) => `r${Math.max(0, ...rounds.map((round) => { var _a, _b; return Number((_b = (_a = /^r(\d+)$/u.exec(round.key)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : 0); })) + 1}`;
@@ -154,7 +181,7 @@ const authorsOf = (sketch, variant) => { var _a, _b, _c; return (_c = (_b = (_a
154
181
  exports.authorsOf = authorsOf;
155
182
  /** The sketch in a sketch folder, or why it cannot be read. */
156
183
  const readSketch = (options) => {
157
- var _a, _b, _c, _d;
184
+ var _a, _b, _c, _d, _e;
158
185
  const { product, dir } = options;
159
186
  const file = (0, path_1.resolve)(dir, exports.SKETCH_FILE);
160
187
  if (!(0, fs_1.existsSync)(file))
@@ -169,6 +196,12 @@ const readSketch = (options) => {
169
196
  const target = (0, exports.parseTarget)(parsed.target);
170
197
  if (typeof target === 'string')
171
198
  return `${file}: ${target}`;
199
+ const targets = (_a = parsed.targets) !== null && _a !== void 0 ? _a : [(0, resolve_product_1.partKeyOf)(target)];
200
+ if (!Array.isArray(targets) ||
201
+ targets[0] !== (0, resolve_product_1.partKeyOf)(target) ||
202
+ new Set(targets).size !== targets.length ||
203
+ targets.some((entry) => typeof (0, exports.parseTarget)(entry) === 'string'))
204
+ return `${file}: targets must list unique <layer>/<name> keys, the target first`;
172
205
  if (!isStatus(parsed.status))
173
206
  return `${file}: status must be one of ${exports.SKETCH_STATUSES.join(', ')}`;
174
207
  if (parsed.variantInfo !== undefined && !isVariantInfo(parsed.variantInfo))
@@ -177,16 +210,23 @@ const readSketch = (options) => {
177
210
  return `${file}: rejections must be { <variant>: [{ by: designer | agent, decidedAt, reason?, reasonBy?, reopened?: { by, decidedAt, reason? } }] }, each but the last reopened`;
178
211
  if (parsed.rounds !== undefined && !isRounds(parsed.rounds))
179
212
  return `${file}: rounds must be a non-empty list of { key, title, note } with unique keys`;
180
- const rounds = (_a = parsed.rounds) !== null && _a !== void 0 ? _a : [firstRoundOf()];
213
+ if (parsed.merge !== undefined && !exports.SKETCH_MERGES.includes(parsed.merge))
214
+ return `${file}: merge must be one of ${exports.SKETCH_MERGES.join(', ')}`;
215
+ if (parsed.hold !== undefined && !isHold(parsed.hold))
216
+ return `${file}: hold must be { until, by, heldAt }`;
217
+ if (parsed.hold !== undefined && parsed.status !== 'in progress')
218
+ return `${file}: a held sketch must be in progress`;
219
+ const rounds = (_b = parsed.rounds) !== null && _b !== void 0 ? _b : [firstRoundOf()];
181
220
  const running = (0, exports.runningRoundOf)({ rounds }).key;
182
- const variants = foldersOf(dir).filter((folder) => folder !== exports.SHARED_FOLDER);
221
+ const variants = foldersOf(dir).filter((folder) => folder !== imports_1.SHARED_FOLDER);
183
222
  const variantInfo = Object.assign({}, parsed.variantInfo);
184
223
  for (const variant of variants)
185
- variantInfo[variant] = Object.assign(Object.assign({}, variantInfo[variant]), { round: (_c = (_b = variantInfo[variant]) === null || _b === void 0 ? void 0 : _b.round) !== null && _c !== void 0 ? _c : running });
224
+ variantInfo[variant] = Object.assign(Object.assign({}, variantInfo[variant]), { round: (_d = (_c = variantInfo[variant]) === null || _c === void 0 ? void 0 : _c.round) !== null && _d !== void 0 ? _d : running });
186
225
  const lost = variants.find((variant) => !rounds.some((round) => { var _a; return round.key === ((_a = variantInfo[variant]) === null || _a === void 0 ? void 0 : _a.round); }));
187
226
  if (lost !== undefined)
188
- return `${file}: variant ${lost} names round "${(_d = variantInfo[lost]) === null || _d === void 0 ? void 0 : _d.round}", which rounds does not hold`;
189
- return Object.assign(Object.assign({}, parsed), { rounds,
227
+ return `${file}: variant ${lost} names round "${(_e = variantInfo[lost]) === null || _e === void 0 ? void 0 : _e.round}", which rounds does not hold`;
228
+ return Object.assign(Object.assign({}, parsed), { targets,
229
+ rounds,
190
230
  variantInfo,
191
231
  product, layer: target.layer, name: target.name, dir,
192
232
  variants });
@@ -195,13 +235,18 @@ exports.readSketch = readSketch;
195
235
  /** Every sketch folder of a product, read; a folder that cannot be read answers with its problem. */
196
236
  const listSketches = (options) => foldersOf((0, exports.sketchesDirOf)(options.productDir)).map((folder) => (0, exports.readSketch)({ product: options.product, dir: (0, path_1.resolve)((0, exports.sketchesDirOf)(options.productDir), folder) }));
197
237
  exports.listSketches = listSketches;
238
+ /** The open sketch that targets `sketch`, found by its first target or by any other it names; `null` when none does. */
198
239
  const findSketch = (options) => {
240
+ var _a;
199
241
  const dir = (0, exports.sketchDirOf)(options);
200
- return (0, fs_1.existsSync)(dir) ? (0, exports.readSketch)({ product: options.product, dir }) : null;
242
+ if ((0, fs_1.existsSync)(dir))
243
+ return (0, exports.readSketch)({ product: options.product, dir });
244
+ const key = (0, resolve_product_1.partKeyOf)(options.sketch);
245
+ return ((_a = (0, exports.listSketches)(options).find((sketch) => typeof sketch !== 'string' && sketch.targets.includes(key))) !== null && _a !== void 0 ? _a : null);
201
246
  };
202
247
  exports.findSketch = findSketch;
203
248
  const writeSketchFile = (sketch) => {
204
- const file = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ target: (0, resolve_product_1.partKeyOf)(sketch), status: sketch.status, createdAt: sketch.createdAt }, (sketch.baseline ? { baseline: sketch.baseline } : {})), (sketch.decision ? { decision: sketch.decision } : {})), { rounds: sketch.rounds }), (Object.keys(sketch.variantInfo).length > 0 ? { variantInfo: sketch.variantInfo } : {})), (sketch.rejections && Object.keys(sketch.rejections).length > 0 ? { rejections: sketch.rejections } : {}));
249
+ const file = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ target: (0, resolve_product_1.partKeyOf)(sketch) }, (sketch.targets.length > 1 ? { targets: sketch.targets } : {})), { status: sketch.status, createdAt: sketch.createdAt }), (sketch.baseline ? { baseline: sketch.baseline } : {})), (sketch.decision ? { decision: sketch.decision } : {})), { rounds: sketch.rounds }), (Object.keys(sketch.variantInfo).length > 0 ? { variantInfo: sketch.variantInfo } : {})), (sketch.rejections && Object.keys(sketch.rejections).length > 0 ? { rejections: sketch.rejections } : {})), (sketch.merge ? { merge: sketch.merge } : {})), (sketch.hold ? { hold: sketch.hold } : {}));
205
250
  (0, fs_1.writeFileSync)((0, path_1.resolve)(sketch.dir, exports.SKETCH_FILE), (0, json_layout_1.jsonLayoutOf)(file));
206
251
  };
207
252
  exports.writeSketchFile = writeSketchFile;
@@ -279,6 +324,22 @@ const copyPartAs = (options) => {
279
324
  const source = (0, fs_1.readFileSync)(file, 'utf8').split(`./${from.name}.css`).join(`./${name}.css`);
280
325
  (0, fs_1.writeFileSync)(file, (_a = (0, part_definition_1.withMadeBy)(source, [])) !== null && _a !== void 0 ? _a : source);
281
326
  };
327
+ /** Why the sketch cannot open with `merge` on its targets, or `null`: a base part merges into the base unless `override`. */
328
+ const mergeProblemOf = (options) => {
329
+ var _a, _b, _c;
330
+ const { product, targets, merge } = options;
331
+ const originOf = (key) => { var _a; return (_a = product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === key)) === null || _a === void 0 ? void 0 : _a.origin; };
332
+ const overridden = targets.filter((key) => originOf(key) === 'overridden');
333
+ const fromBase = targets.filter((key) => originOf(key) === 'base' || originOf(key) === 'overridden');
334
+ const baseName = (_b = (_a = product.base) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'base';
335
+ if (merge === 'into-base' && overridden.length === 0)
336
+ return `--into-base: ${product.name} has no override of ${targets.join(', ')}`;
337
+ if (merge === undefined && overridden.length > 0)
338
+ return `${product.name} overrides the ${baseName} base part ${overridden.join(', ')} - pass --override to sketch the product copy, or --into-base to start from it and merge into the base, which removes the copy`;
339
+ if (merge !== 'override' && fromBase.length > 0 && product.base && (0, base_1.isBuiltInBase)((_c = product.config.base) !== null && _c !== void 0 ? _c : ''))
340
+ return `${fromBase.join(', ')} comes from the built-in base ${product.config.base}, which a sketch cannot merge into - pass --override`;
341
+ return null;
342
+ };
282
343
  const variantInfoOf = (options) => {
283
344
  var _a;
284
345
  return (Object.assign(Object.assign(Object.assign({}, (options.author ? { authors: [options.author] } : {})), { round: options.round }), (((_a = options.note) === null || _a === void 0 ? void 0 : _a.trim()) ? { note: options.note.trim() } : {})));
@@ -288,63 +349,68 @@ const variantInfoOf = (options) => {
288
349
  * author. Each variant starts from `like` when given - renamed to the target, without its `madeBy`, and with its
289
350
  * sketch's `shared/` folder - else from the part the product resolves for the target, or from an empty part when the
290
351
  * target is new. A part's own `shared/` folder becomes the sketch's, imported as `@shared/`. A target holds one open
291
- * sketch at a time.
352
+ * sketch at a time. Each of `others` joins every variant the same way, as a further target; `like` takes one target only.
353
+ * A target the product overrides in its base needs `merge`: `override` or `into-base`.
292
354
  */
293
355
  const createSketch = (options) => {
294
- const { product, sketch, variants, roundTitle, roundNote, author, like, variantNotes } = options;
356
+ var _a;
357
+ const { product, sketch, variants, roundTitle, roundNote, author, like, variantNotes, merge } = options;
295
358
  const dir = (0, exports.sketchDirOf)({ productDir: product.dir, sketch });
296
359
  const key = (0, resolve_product_1.partKeyOf)(sketch);
297
- if ((0, fs_1.existsSync)(dir))
298
- return `${key} already has an open sketch - merge or discard it first`;
360
+ const all = [sketch, ...((_a = options.others) !== null && _a !== void 0 ? _a : [])];
361
+ const targets = all.map(resolve_product_1.partKeyOf);
362
+ if (new Set(targets).size !== targets.length)
363
+ return 'name each target once';
364
+ if (like && all.length > 1)
365
+ return '--like starts one target - open a sketch with several targets without it';
366
+ const taken = all.find((target) => (0, exports.findSketch)({ productDir: product.dir, product: product.name, sketch: target }) !== null);
367
+ if ((0, fs_1.existsSync)(dir) || taken)
368
+ return `${(0, resolve_product_1.partKeyOf)(taken !== null && taken !== void 0 ? taken : sketch)} already has an open sketch - merge or discard it first`;
299
369
  if (variants.length === 0)
300
370
  return 'name at least one variant';
371
+ const mergeProblem = mergeProblemOf({ product, targets, merge });
372
+ if (mergeProblem)
373
+ return mergeProblem;
301
374
  const invalid = variants.find((variant) => !(0, exports.isVariantName)(variant));
302
375
  if (invalid !== undefined)
303
376
  return `"${invalid}" is no variant name - use lower case letters, digits and dashes, and not "shared"`;
304
377
  if (new Set(variants).size !== variants.length)
305
378
  return 'each variant name must be unique';
306
- const existing = product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === key);
379
+ const clash = like
380
+ ? undefined
381
+ : sharedClashOf(all.map((target) => product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === (0, resolve_product_1.partKeyOf)(target))));
382
+ if (clash)
383
+ return clash;
307
384
  for (const variant of variants) {
308
- const folder = (0, path_1.resolve)(dir, variant, sketch.layer, sketch.name);
309
- (0, fs_1.mkdirSync)(folder, { recursive: true });
310
385
  (0, fs_1.mkdirSync)((0, path_1.resolve)(dir, variant, assets_1.ASSETS_FOLDER), { recursive: true });
311
- if (like) {
312
- copyPartAs({ from: like, to: folder, name: sketch.name });
313
- liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, exports.SHARED_FOLDER) });
314
- }
315
- else if (existing) {
316
- (0, fs_1.cpSync)((0, path_1.resolve)(existing.file, '..'), folder, { recursive: true });
317
- liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, exports.SHARED_FOLDER) });
318
- }
319
- else {
320
- if (sketch.layer === 'pages') {
386
+ for (const target of all) {
387
+ const folder = (0, path_1.resolve)(dir, variant, target.layer, target.name);
388
+ const existing = product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === (0, resolve_product_1.partKeyOf)(target));
389
+ (0, fs_1.mkdirSync)(folder, { recursive: true });
390
+ if (like) {
391
+ copyPartAs({ from: like, to: folder, name: target.name });
392
+ liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
393
+ }
394
+ else if (existing) {
395
+ (0, fs_1.cpSync)((0, path_1.resolve)(existing.file, '..'), folder, { recursive: true });
396
+ liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
397
+ }
398
+ else if (target.layer === 'pages') {
321
399
  const widths = [...new Set(Object.values(product.presets).map((preset) => preset.width))].sort((a, b) => a - b);
322
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${sketch.name}.ts`), pageStubOf({ name: sketch.name, madeBy: author, widths }));
400
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), pageStubOf({ name: target.name, madeBy: author, widths }));
323
401
  }
324
402
  else {
325
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${sketch.name}.ts`), stubOf(sketch.name));
326
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${sketch.name}.css`), '');
403
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), stubOf(target.name));
404
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.css`), '');
327
405
  }
328
406
  }
329
407
  }
330
408
  if (like === null || like === void 0 ? void 0 : like.shared)
331
- (0, fs_1.cpSync)(like.shared, (0, path_1.resolve)(dir, exports.SHARED_FOLDER), { recursive: true });
332
- const created = {
333
- target: key,
334
- status: 'in progress',
335
- createdAt: new Date().toISOString(),
336
- baseline: (0, baseline_1.baselineOf)(product),
337
- rounds: [firstRoundOf(roundTitle, roundNote)],
338
- variantInfo: Object.fromEntries(variants.map((variant) => [
409
+ (0, fs_1.cpSync)(like.shared, (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER), { recursive: true });
410
+ const created = Object.assign({ target: key, targets, status: 'in progress', createdAt: new Date().toISOString(), baseline: (0, baseline_1.baselineOf)(product), rounds: [firstRoundOf(roundTitle, roundNote)], variantInfo: Object.fromEntries(variants.map((variant) => [
339
411
  variant,
340
412
  variantInfoOf({ round: FIRST_ROUND, author, note: variantNotes === null || variantNotes === void 0 ? void 0 : variantNotes.get(variant) }),
341
- ])),
342
- product: product.name,
343
- layer: sketch.layer,
344
- name: sketch.name,
345
- dir,
346
- variants: [...variants].sort(),
347
- };
413
+ ])), product: product.name, layer: sketch.layer, name: sketch.name, dir, variants: [...variants].sort() }, (merge ? { merge } : {}));
348
414
  (0, exports.writeSketchFile)(created);
349
415
  return created;
350
416
  };
@@ -430,6 +496,9 @@ const markSketchReady = (options) => {
430
496
  const { checkout, sketch, author } = options;
431
497
  if (sketch.status !== 'in progress')
432
498
  return `${sketch.target} is ${sketch.status}, not in progress`;
499
+ const held = (0, exports.heldProblemOf)(sketch);
500
+ if (held !== null)
501
+ return held;
433
502
  if (sketch.variants.length === 0)
434
503
  return `${sketch.target} holds no variant`;
435
504
  const authored = author
@@ -443,6 +512,34 @@ const markSketchReady = (options) => {
443
512
  return ready;
444
513
  };
445
514
  exports.markSketchReady = markSketchReady;
515
+ /** Why a held sketch cannot be ready, or `null` when it holds nothing. */
516
+ const heldProblemOf = (sketch) => sketch.hold ? `${sketch.target} is held until: ${sketch.hold.until} - make the change, then sketch release it` : null;
517
+ exports.heldProblemOf = heldProblemOf;
518
+ /**
519
+ * Holds a sketch until a change that waits on something is made: it goes back to in progress, which drops a pick
520
+ * and takes it out of the merge queue, and `sketch ready` refuses until the hold is released.
521
+ */
522
+ const holdSketch = (options) => {
523
+ const { sketch, by, now = new Date() } = options;
524
+ const until = options.until.trim();
525
+ if (until === '')
526
+ return 'a hold needs --until <what the change waits on>';
527
+ const { decision: _decision } = sketch, undecided = __rest(sketch, ["decision"]);
528
+ const held = Object.assign(Object.assign({}, undecided), { status: 'in progress', hold: { until, by, heldAt: now.toISOString() } });
529
+ (0, exports.writeSketchFile)(held);
530
+ return held;
531
+ };
532
+ exports.holdSketch = holdSketch;
533
+ /** Removes the hold on a sketch, so it can be marked ready again. */
534
+ const releaseSketch = (options) => {
535
+ const { sketch } = options;
536
+ if (!sketch.hold)
537
+ return `${sketch.target} is not held`;
538
+ const { hold: _hold } = sketch, released = __rest(sketch, ["hold"]);
539
+ (0, exports.writeSketchFile)(released);
540
+ return released;
541
+ };
542
+ exports.releaseSketch = releaseSketch;
446
543
  const withVerdict = (sketch, verdict) => {
447
544
  var _a, _b, _c, _d;
448
545
  const { variant, by } = verdict;