@ethlete/cli 3.0.0-next.20 → 3.0.0-next.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +190 -0
- package/design/assets.d.ts +9 -0
- package/design/define-call.ts +20 -11
- package/design/define-part.ts +102 -0
- package/design/embed-page.ts +70 -0
- package/design/interaction-rows.ts +32 -0
- package/design/mark-part.ts +66 -0
- package/design/svg-asset.ts +36 -0
- package/design/systems/config.json +10 -0
- package/design/systems/ethlete-components/components/button/button.ts +18 -0
- package/design/web/env.d.ts +20 -0
- package/design/web/frame.ts +173 -41
- package/design/wireframe-kit.ts +386 -0
- package/package.json +4 -2
- package/src/index.js.map +1 -1
- package/src/lib/api/api-command.js.map +1 -1
- package/src/lib/api/api-context.js.map +1 -1
- package/src/lib/api/api-state.js.map +1 -1
- package/src/lib/api/auth-hint.js.map +1 -1
- package/src/lib/api/clear.js.map +1 -1
- package/src/lib/api/clone.js.map +1 -1
- package/src/lib/api/compose.js.map +1 -1
- package/src/lib/api/definition.js.map +1 -1
- package/src/lib/api/doctor.js.map +1 -1
- package/src/lib/api/fingerprint.js.map +1 -1
- package/src/lib/api/git.js.map +1 -1
- package/src/lib/api/help.js.map +1 -1
- package/src/lib/api/index.js.map +1 -1
- package/src/lib/api/load-definitions.js.map +1 -1
- package/src/lib/api/lock.js.map +1 -1
- package/src/lib/api/parse-argv.js.map +1 -1
- package/src/lib/api/ports.js.map +1 -1
- package/src/lib/api/resolve-checkout.js.map +1 -1
- package/src/lib/api/run-locked.js.map +1 -1
- package/src/lib/api/run-ready.js.map +1 -1
- package/src/lib/api/run-snapshot.js.map +1 -1
- package/src/lib/api/run-status.js.map +1 -1
- package/src/lib/api/run.js.map +1 -1
- package/src/lib/api/seeds.js.map +1 -1
- package/src/lib/api/setup.js.map +1 -1
- package/src/lib/api/snapshot.js.map +1 -1
- package/src/lib/api/state.js.map +1 -1
- package/src/lib/api/suggest.js.map +1 -1
- package/src/lib/api/validate-definition.js.map +1 -1
- package/src/lib/auth/auth-command.js.map +1 -1
- package/src/lib/auth/composer-auth.js.map +1 -1
- package/src/lib/auth/composer-repositories.js.map +1 -1
- package/src/lib/auth/gitlab-token.js.map +1 -1
- package/src/lib/auth/index.js.map +1 -1
- package/src/lib/config/diagnose.js.map +1 -1
- package/src/lib/config/index.js.map +1 -1
- package/src/lib/config/local-config.js.map +1 -1
- package/src/lib/design/asset-shot.d.ts +26 -0
- package/src/lib/design/asset-shot.js +191 -0
- package/src/lib/design/asset-shot.js.map +1 -0
- package/src/lib/design/browser.js.map +1 -1
- package/src/lib/design/calls-tsconfig.d.ts +14 -1
- package/src/lib/design/calls-tsconfig.js +23 -18
- package/src/lib/design/calls-tsconfig.js.map +1 -1
- package/src/lib/design/calls.d.ts +28 -0
- package/src/lib/design/calls.js +58 -0
- package/src/lib/design/calls.js.map +1 -0
- package/src/lib/design/changed-parts.d.ts +51 -0
- package/src/lib/design/changed-parts.js +103 -0
- package/src/lib/design/changed-parts.js.map +1 -0
- package/src/lib/design/check.js +53 -54
- package/src/lib/design/check.js.map +1 -1
- package/src/lib/design/contact-sheet.d.ts +68 -0
- package/src/lib/design/contact-sheet.js +169 -0
- package/src/lib/design/contact-sheet.js.map +1 -0
- package/src/lib/design/design-command.js +165 -6
- package/src/lib/design/design-command.js.map +1 -1
- package/src/lib/design/force-interactions.d.ts +13 -0
- package/src/lib/design/force-interactions.js +75 -0
- package/src/lib/design/force-interactions.js.map +1 -0
- package/src/lib/design/inbox-command.d.ts +21 -0
- package/src/lib/design/inbox-command.js +156 -0
- package/src/lib/design/inbox-command.js.map +1 -0
- package/src/lib/design/index.js.map +1 -1
- package/src/lib/design/json-layout.d.ts +5 -0
- package/src/lib/design/json-layout.js +41 -0
- package/src/lib/design/json-layout.js.map +1 -0
- package/src/lib/design/legacy.d.ts +7 -0
- package/src/lib/design/legacy.js +23 -8
- package/src/lib/design/legacy.js.map +1 -1
- package/src/lib/design/merge-compare.d.ts +57 -0
- package/src/lib/design/merge-compare.js +80 -0
- package/src/lib/design/merge-compare.js.map +1 -0
- package/src/lib/design/missing-package.js.map +1 -1
- package/src/lib/design/new-call.js.map +1 -1
- package/src/lib/design/part-marks.d.ts +12 -0
- package/src/lib/design/part-marks.js +38 -0
- package/src/lib/design/part-marks.js.map +1 -0
- package/src/lib/design/paths.d.ts +35 -2
- package/src/lib/design/paths.js +62 -4
- package/src/lib/design/paths.js.map +1 -1
- package/src/lib/design/product-command.d.ts +38 -0
- package/src/lib/design/product-command.js +158 -0
- package/src/lib/design/product-command.js.map +1 -0
- package/src/lib/design/ready-shots.d.ts +13 -0
- package/src/lib/design/ready-shots.js +55 -0
- package/src/lib/design/ready-shots.js.map +1 -0
- package/src/lib/design/render-fields.js.map +1 -1
- package/src/lib/design/render-packages.js.map +1 -1
- package/src/lib/design/render-worker.js.map +1 -1
- package/src/lib/design/render.d.ts +8 -1
- package/src/lib/design/render.js +43 -14
- package/src/lib/design/render.js.map +1 -1
- package/src/lib/design/serve.d.ts +17 -0
- package/src/lib/design/serve.js +446 -62
- package/src/lib/design/serve.js.map +1 -1
- package/src/lib/design/shot-command.d.ts +75 -0
- package/src/lib/design/shot-command.js +361 -0
- package/src/lib/design/shot-command.js.map +1 -0
- package/src/lib/design/shot.d.ts +97 -0
- package/src/lib/design/shot.js +346 -0
- package/src/lib/design/shot.js.map +1 -0
- package/src/lib/design/sketch-at.d.ts +16 -0
- package/src/lib/design/sketch-at.js +34 -0
- package/src/lib/design/sketch-at.js.map +1 -0
- package/src/lib/design/sketch-command.d.ts +9 -0
- package/src/lib/design/sketch-command.js +572 -0
- package/src/lib/design/sketch-command.js.map +1 -0
- package/src/lib/design/ssr-shims.js.map +1 -1
- package/src/lib/design/stamp.js.map +1 -1
- package/src/lib/design/status.d.ts +2 -2
- package/src/lib/design/status.js +2 -2
- package/src/lib/design/status.js.map +1 -1
- package/src/lib/design/studio-api.d.ts +102 -0
- package/src/lib/design/studio-api.js +452 -0
- package/src/lib/design/studio-api.js.map +1 -0
- package/src/lib/design/system/accept-command.d.ts +7 -0
- package/src/lib/design/system/accept-command.js +55 -0
- package/src/lib/design/system/accept-command.js.map +1 -0
- package/src/lib/design/system/assets.d.ts +34 -0
- package/src/lib/design/system/assets.js +64 -0
- package/src/lib/design/system/assets.js.map +1 -0
- package/src/lib/design/system/base.d.ts +33 -0
- package/src/lib/design/system/base.js +49 -0
- package/src/lib/design/system/base.js.map +1 -0
- package/src/lib/design/system/check-system.d.ts +23 -0
- package/src/lib/design/system/check-system.js +151 -0
- package/src/lib/design/system/check-system.js.map +1 -0
- package/src/lib/design/system/colour.d.ts +2 -0
- package/src/lib/design/system/colour.js +9 -0
- package/src/lib/design/system/colour.js.map +1 -0
- package/src/lib/design/system/comments/comment.d.ts +196 -0
- package/src/lib/design/system/comments/comment.js +332 -0
- package/src/lib/design/system/comments/comment.js.map +1 -0
- package/src/lib/design/system/comments/complete.d.ts +15 -0
- package/src/lib/design/system/comments/complete.js +63 -0
- package/src/lib/design/system/comments/complete.js.map +1 -0
- package/src/lib/design/system/comments/inbox.d.ts +49 -0
- package/src/lib/design/system/comments/inbox.js +100 -0
- package/src/lib/design/system/comments/inbox.js.map +1 -0
- package/src/lib/design/system/css-source.d.ts +12 -0
- package/src/lib/design/system/css-source.js +39 -0
- package/src/lib/design/system/css-source.js.map +1 -0
- package/src/lib/design/system/flows/flow.d.ts +66 -0
- package/src/lib/design/system/flows/flow.js +157 -0
- package/src/lib/design/system/flows/flow.js.map +1 -0
- package/src/lib/design/system/imports.d.ts +70 -0
- package/src/lib/design/system/imports.js +159 -0
- package/src/lib/design/system/imports.js.map +1 -0
- package/src/lib/design/system/kit.d.ts +4 -0
- package/src/lib/design/system/kit.js +51 -0
- package/src/lib/design/system/kit.js.map +1 -0
- package/src/lib/design/system/layers.d.ts +9 -0
- package/src/lib/design/system/layers.js +16 -0
- package/src/lib/design/system/layers.js.map +1 -0
- package/src/lib/design/system/list-system.d.ts +104 -0
- package/src/lib/design/system/list-system.js +212 -0
- package/src/lib/design/system/list-system.js.map +1 -0
- package/src/lib/design/system/notes/note.d.ts +53 -0
- package/src/lib/design/system/notes/note.js +116 -0
- package/src/lib/design/system/notes/note.js.map +1 -0
- package/src/lib/design/system/part-command.d.ts +7 -0
- package/src/lib/design/system/part-command.js +134 -0
- package/src/lib/design/system/part-command.js.map +1 -0
- package/src/lib/design/system/problem.d.ts +5 -0
- package/src/lib/design/system/problem.js +3 -0
- package/src/lib/design/system/problem.js.map +1 -0
- package/src/lib/design/system/product.d.ts +18 -0
- package/src/lib/design/system/product.js +35 -0
- package/src/lib/design/system/product.js.map +1 -0
- package/src/lib/design/system/render-check.d.ts +45 -0
- package/src/lib/design/system/render-check.js +427 -0
- package/src/lib/design/system/render-check.js.map +1 -0
- package/src/lib/design/system/resolve-product.d.ts +32 -0
- package/src/lib/design/system/resolve-product.js +62 -0
- package/src/lib/design/system/resolve-product.js.map +1 -0
- package/src/lib/design/system/rules/component-copy.d.ts +7 -0
- package/src/lib/design/system/rules/component-copy.js +53 -0
- package/src/lib/design/system/rules/component-copy.js.map +1 -0
- package/src/lib/design/system/rules/flow.d.ts +8 -0
- package/src/lib/design/system/rules/flow.js +60 -0
- package/src/lib/design/system/rules/flow.js.map +1 -0
- package/src/lib/design/system/rules/hard-coded-colour.d.ts +7 -0
- package/src/lib/design/system/rules/hard-coded-colour.js +27 -0
- package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -0
- package/src/lib/design/system/rules/interactions.d.ts +4 -0
- package/src/lib/design/system/rules/interactions.js +16 -0
- package/src/lib/design/system/rules/interactions.js.map +1 -0
- package/src/lib/design/system/rules/kit-outside-pages.d.ts +4 -0
- package/src/lib/design/system/rules/kit-outside-pages.js +14 -0
- package/src/lib/design/system/rules/kit-outside-pages.js.map +1 -0
- package/src/lib/design/system/rules/motion.d.ts +4 -0
- package/src/lib/design/system/rules/motion.js +13 -0
- package/src/lib/design/system/rules/motion.js.map +1 -0
- package/src/lib/design/system/rules/stale-comment.d.ts +8 -0
- package/src/lib/design/system/rules/stale-comment.js +51 -0
- package/src/lib/design/system/rules/stale-comment.js.map +1 -0
- package/src/lib/design/system/rules/stale-replace.d.ts +4 -0
- package/src/lib/design/system/rules/stale-replace.js +65 -0
- package/src/lib/design/system/rules/stale-replace.js.map +1 -0
- package/src/lib/design/system/rules/svg-asset.d.ts +6 -0
- package/src/lib/design/system/rules/svg-asset.js +30 -0
- package/src/lib/design/system/rules/svg-asset.js.map +1 -0
- package/src/lib/design/system/rules/token-selectors.d.ts +3 -0
- package/src/lib/design/system/rules/token-selectors.js +87 -0
- package/src/lib/design/system/rules/token-selectors.js.map +1 -0
- package/src/lib/design/system/rules/undefined-token.d.ts +8 -0
- package/src/lib/design/system/rules/undefined-token.js +103 -0
- package/src/lib/design/system/rules/undefined-token.js.map +1 -0
- package/src/lib/design/system/rules/unused-shared-export.d.ts +18 -0
- package/src/lib/design/system/rules/unused-shared-export.js +60 -0
- package/src/lib/design/system/rules/unused-shared-export.js.map +1 -0
- package/src/lib/design/system/rules/upward-dependency.d.ts +4 -0
- package/src/lib/design/system/rules/upward-dependency.js +17 -0
- package/src/lib/design/system/rules/upward-dependency.js.map +1 -0
- package/src/lib/design/system/rules/widths.d.ts +4 -0
- package/src/lib/design/system/rules/widths.js +14 -0
- package/src/lib/design/system/rules/widths.js.map +1 -0
- package/src/lib/design/system/sketch/baseline.d.ts +38 -0
- package/src/lib/design/system/sketch/baseline.js +66 -0
- package/src/lib/design/system/sketch/baseline.js.map +1 -0
- package/src/lib/design/system/sketch/check-format.d.ts +17 -0
- package/src/lib/design/system/sketch/check-format.js +56 -0
- package/src/lib/design/system/sketch/check-format.js.map +1 -0
- package/src/lib/design/system/sketch/check-sketches.d.ts +38 -0
- package/src/lib/design/system/sketch/check-sketches.js +104 -0
- package/src/lib/design/system/sketch/check-sketches.js.map +1 -0
- package/src/lib/design/system/sketch/cli-args.d.ts +26 -0
- package/src/lib/design/system/sketch/cli-args.js +63 -0
- package/src/lib/design/system/sketch/cli-args.js.map +1 -0
- package/src/lib/design/system/sketch/duplicate-class.d.ts +14 -0
- package/src/lib/design/system/sketch/duplicate-class.js +57 -0
- package/src/lib/design/system/sketch/duplicate-class.js.map +1 -0
- package/src/lib/design/system/sketch/merge-preview.d.ts +15 -0
- package/src/lib/design/system/sketch/merge-preview.js +43 -0
- package/src/lib/design/system/sketch/merge-preview.js.map +1 -0
- package/src/lib/design/system/sketch/merge-shared.d.ts +25 -0
- package/src/lib/design/system/sketch/merge-shared.js +53 -0
- package/src/lib/design/system/sketch/merge-shared.js.map +1 -0
- package/src/lib/design/system/sketch/merge.d.ts +31 -0
- package/src/lib/design/system/sketch/merge.js +145 -0
- package/src/lib/design/system/sketch/merge.js.map +1 -0
- package/src/lib/design/system/sketch/merged-parts.d.ts +59 -0
- package/src/lib/design/system/sketch/merged-parts.js +134 -0
- package/src/lib/design/system/sketch/merged-parts.js.map +1 -0
- package/src/lib/design/system/sketch/no-visible-change.d.ts +15 -0
- package/src/lib/design/system/sketch/no-visible-change.js +70 -0
- package/src/lib/design/system/sketch/no-visible-change.js.map +1 -0
- package/src/lib/design/system/sketch/overlay.d.ts +20 -0
- package/src/lib/design/system/sketch/overlay.js +38 -0
- package/src/lib/design/system/sketch/overlay.js.map +1 -0
- package/src/lib/design/system/sketch/part-definition.d.ts +31 -0
- package/src/lib/design/system/sketch/part-definition.js +157 -0
- package/src/lib/design/system/sketch/part-definition.js.map +1 -0
- package/src/lib/design/system/sketch/shared-class.d.ts +9 -0
- package/src/lib/design/system/sketch/shared-class.js +65 -0
- package/src/lib/design/system/sketch/shared-class.js.map +1 -0
- package/src/lib/design/system/sketch/sketch.d.ts +221 -0
- package/src/lib/design/system/sketch/sketch.js +481 -0
- package/src/lib/design/system/sketch/sketch.js.map +1 -0
- package/src/lib/design/system/sketch/unchanged-states.d.ts +23 -0
- package/src/lib/design/system/sketch/unchanged-states.js +144 -0
- package/src/lib/design/system/sketch/unchanged-states.js.map +1 -0
- package/src/lib/design/system/sketch/unused-files.d.ts +10 -0
- package/src/lib/design/system/sketch/unused-files.js +56 -0
- package/src/lib/design/system/sketch/unused-files.js.map +1 -0
- package/src/lib/design/system/system-command.d.ts +9 -0
- package/src/lib/design/system/system-command.js +56 -0
- package/src/lib/design/system/system-command.js.map +1 -0
- package/src/lib/design/system/system-modules.d.ts +58 -0
- package/src/lib/design/system/system-modules.js +189 -0
- package/src/lib/design/system/system-modules.js.map +1 -0
- package/src/lib/design/system/system-tsconfig.d.ts +26 -0
- package/src/lib/design/system/system-tsconfig.js +68 -0
- package/src/lib/design/system/system-tsconfig.js.map +1 -0
- package/src/lib/design/system/ts-source.d.ts +13 -0
- package/src/lib/design/system/ts-source.js +108 -0
- package/src/lib/design/system/ts-source.js.map +1 -0
- package/src/lib/design/system-use.js.map +1 -1
- package/src/lib/design/thumb.d.ts +67 -0
- package/src/lib/design/thumb.js +222 -0
- package/src/lib/design/thumb.js.map +1 -0
- package/src/lib/design/typecheck.d.ts +27 -0
- package/src/lib/design/typecheck.js +60 -0
- package/src/lib/design/typecheck.js.map +1 -0
- package/src/lib/design/variant-diff.d.ts +48 -0
- package/src/lib/design/variant-diff.js +77 -0
- package/src/lib/design/variant-diff.js.map +1 -0
- package/src/lib/design/vite-paths.d.ts +2 -0
- package/src/lib/design/vite-paths.js +10 -1
- package/src/lib/design/vite-paths.js.map +1 -1
- package/src/lib/doctor/doctor-command.js.map +1 -1
- package/src/lib/doctor/index.js.map +1 -1
- package/src/lib/index.js.map +1 -1
- package/src/lib/invocation.js +6 -2
- package/src/lib/invocation.js.map +1 -1
- package/src/lib/release.js.map +1 -1
- package/src/lib/update/agent-rules-sync.js.map +1 -1
- package/src/lib/update/agent-setup.js.map +1 -1
- package/src/lib/update/ai.js.map +1 -1
- package/src/lib/update/args.js.map +1 -1
- package/src/lib/update/available-migrations.js.map +1 -1
- package/src/lib/update/commits.js.map +1 -1
- package/src/lib/update/gitignore.js.map +1 -1
- package/src/lib/update/index.js.map +1 -1
- package/src/lib/update/migration-manifest.js.map +1 -1
- package/src/lib/update/migration-record.js.map +1 -1
- package/src/lib/update/migrations-command.js +14 -4
- package/src/lib/update/migrations-command.js.map +1 -1
- package/src/lib/update/package-manager.d.ts +1 -1
- package/src/lib/update/package-manager.js.map +1 -1
- package/src/lib/update/packages.js.map +1 -1
- package/src/lib/update/pending.js.map +1 -1
- package/src/lib/update/plan.js.map +1 -1
- package/src/lib/update/registry.js.map +1 -1
- package/src/lib/update/run-migrations.js.map +1 -1
- package/src/lib/update/scan.js +8 -3
- package/src/lib/update/scan.js.map +1 -1
- package/src/lib/update/semver.js.map +1 -1
- package/src/lib/update/tasks.js.map +1 -1
- package/src/lib/update/update-command.js.map +1 -1
- package/src/lib/utils.js.map +1 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ResolvedProduct } from '../resolve-product';
|
|
2
|
+
import { Sketch } from '../sketch/sketch';
|
|
3
|
+
/** A point on a frame, in CSS pixels from its top left corner, at the comment's size. */
|
|
4
|
+
export type CommentPoint = {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
};
|
|
8
|
+
/** The size of the frame a comment was made on: a preset name, a width in CSS pixels, or `fitted` to its content. */
|
|
9
|
+
export type CommentSize = string | number;
|
|
10
|
+
export declare const FITTED = "fitted";
|
|
11
|
+
export declare const REST = "rest";
|
|
12
|
+
/**
|
|
13
|
+
* One answer in a comment thread, by the user (from Studio) or by the agent (`et design comment reply`).
|
|
14
|
+
* `author` is the model id of the agent; a reply written before it was recorded has none.
|
|
15
|
+
* `question` marks an agent reply that waits for the user's answer (`--question`).
|
|
16
|
+
*/
|
|
17
|
+
export type CommentReply = {
|
|
18
|
+
by: 'user' | 'agent';
|
|
19
|
+
author?: string;
|
|
20
|
+
text: string;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
question?: true;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Who a thread waits on: `agent` when the user spoke last, `question` when the agent's last reply asks the user,
|
|
26
|
+
* `answered` when the agent's last reply asks nothing. An answered thread stays open until the user withdraws it or replies.
|
|
27
|
+
*/
|
|
28
|
+
export type ThreadState = 'agent' | 'question' | 'answered';
|
|
29
|
+
/** What answered a thread: `inbox done`, a new sketch round from its variant, or the merge or discard of its sketch. */
|
|
30
|
+
export type CommentAddressReason = 'done' | 'round' | 'merge' | 'discard';
|
|
31
|
+
/**
|
|
32
|
+
* How a thread was answered. It stays open until the user resolves it in Studio, and a reply by the user opens it again.
|
|
33
|
+
* `author` is the model id of the agent; `round` is the key of the round a `round` answer started.
|
|
34
|
+
*/
|
|
35
|
+
export type CommentAddressed = {
|
|
36
|
+
by: 'user' | 'agent';
|
|
37
|
+
author?: string;
|
|
38
|
+
reason: CommentAddressReason;
|
|
39
|
+
addressedAt: string;
|
|
40
|
+
note?: string;
|
|
41
|
+
round?: string;
|
|
42
|
+
};
|
|
43
|
+
/** How the user closed a thread in Studio. A comment file without it is open or addressed. */
|
|
44
|
+
export type CommentResolution = {
|
|
45
|
+
by: 'user';
|
|
46
|
+
resolvedAt: string;
|
|
47
|
+
note?: string;
|
|
48
|
+
};
|
|
49
|
+
export type CommentFile = {
|
|
50
|
+
part: string;
|
|
51
|
+
state: string;
|
|
52
|
+
size: CommentSize;
|
|
53
|
+
/** `rest` or one of the part's interactions; a file without it is on `rest`. */
|
|
54
|
+
interaction?: string;
|
|
55
|
+
point?: CommentPoint;
|
|
56
|
+
/** `createdAt` is the sketch's own, so a later sketch on the same target shows none of its comments. */
|
|
57
|
+
sketch?: {
|
|
58
|
+
target: string;
|
|
59
|
+
variant: string;
|
|
60
|
+
createdAt?: string;
|
|
61
|
+
};
|
|
62
|
+
text: string;
|
|
63
|
+
createdAt: string;
|
|
64
|
+
replies?: CommentReply[];
|
|
65
|
+
addressed?: CommentAddressed;
|
|
66
|
+
resolved?: CommentResolution;
|
|
67
|
+
};
|
|
68
|
+
export type DesignComment = CommentFile & {
|
|
69
|
+
id: string;
|
|
70
|
+
product: string;
|
|
71
|
+
file: string;
|
|
72
|
+
interaction: string;
|
|
73
|
+
replies: CommentReply[];
|
|
74
|
+
};
|
|
75
|
+
export declare const commentsDirOf: (productDir: string) => string;
|
|
76
|
+
export declare const isPoint: (value: unknown) => value is CommentPoint;
|
|
77
|
+
export declare const isSize: (value: unknown) => value is CommentSize;
|
|
78
|
+
export declare const isOpenComment: (comment: Pick<CommentFile, "addressed" | "resolved">) => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* The open comment files of a product, oldest first, or every one with `all` (addressed and resolved too); a file
|
|
81
|
+
* that cannot be read answers with its problem.
|
|
82
|
+
*/
|
|
83
|
+
export declare const listComments: (options: {
|
|
84
|
+
productDir: string;
|
|
85
|
+
product: string;
|
|
86
|
+
all?: boolean;
|
|
87
|
+
}) => {
|
|
88
|
+
comments: DesignComment[];
|
|
89
|
+
unreadable: {
|
|
90
|
+
file: string;
|
|
91
|
+
problem: string;
|
|
92
|
+
}[];
|
|
93
|
+
};
|
|
94
|
+
/** Why a part key and state name point at nothing in a product, or `null`. A part whose states are not an object literal keeps any state. */
|
|
95
|
+
export declare const goneStateOf: (options: {
|
|
96
|
+
product: ResolvedProduct;
|
|
97
|
+
part: string;
|
|
98
|
+
state: string;
|
|
99
|
+
}) => string | null;
|
|
100
|
+
/** Why a size points at nothing: a preset the product lacks, or a width a part with readable `widths` lacks. */
|
|
101
|
+
export declare const goneSizeOf: (options: {
|
|
102
|
+
product: ResolvedProduct;
|
|
103
|
+
part: string;
|
|
104
|
+
size: CommentSize;
|
|
105
|
+
}) => string | null;
|
|
106
|
+
/** Whether the sketch a comment was made on was merged, discarded or replaced by a later one on the same target. */
|
|
107
|
+
export declare const sketchGoneOf: (options: {
|
|
108
|
+
product: ResolvedProduct;
|
|
109
|
+
comment: Pick<CommentFile, "sketch">;
|
|
110
|
+
}) => boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Why a comment no longer points at anything: its sketch variant, part, state, size or interaction is gone.
|
|
113
|
+
* `null` when it still does. A part whose states are not an object literal keeps any state.
|
|
114
|
+
*/
|
|
115
|
+
export declare const staleReasonOf: (options: {
|
|
116
|
+
product: ResolvedProduct;
|
|
117
|
+
comment: Omit<CommentFile, "text" | "createdAt">;
|
|
118
|
+
}) => string | null;
|
|
119
|
+
/** Writes a comment on a state of a part, or answers with why it points at nothing. */
|
|
120
|
+
export declare const createComment: (options: {
|
|
121
|
+
product: ResolvedProduct;
|
|
122
|
+
comment: Omit<CommentFile, "createdAt">;
|
|
123
|
+
}) => DesignComment | string;
|
|
124
|
+
/** Who spoke last in a comment thread: the user wrote the comment, so a thread without replies is the user's. */
|
|
125
|
+
export declare const lastWordOf: (comment: Pick<DesignComment, "replies">) => "user" | "agent";
|
|
126
|
+
export declare const threadStateOf: (comment: Pick<DesignComment, "replies">) => ThreadState;
|
|
127
|
+
export declare const findComment: (options: {
|
|
128
|
+
products: {
|
|
129
|
+
name: string;
|
|
130
|
+
dir: string;
|
|
131
|
+
}[];
|
|
132
|
+
id: string;
|
|
133
|
+
}) => string | DesignComment;
|
|
134
|
+
/**
|
|
135
|
+
* Adds a reply to the thread of an open or addressed comment, searching the named products. A reply by the user
|
|
136
|
+
* opens an addressed thread again. Answers with the updated comment.
|
|
137
|
+
*/
|
|
138
|
+
export declare const replyToComment: (options: {
|
|
139
|
+
products: {
|
|
140
|
+
name: string;
|
|
141
|
+
dir: string;
|
|
142
|
+
}[];
|
|
143
|
+
id: string;
|
|
144
|
+
by: CommentReply["by"];
|
|
145
|
+
author?: string;
|
|
146
|
+
text: string;
|
|
147
|
+
question?: boolean;
|
|
148
|
+
}) => DesignComment | string;
|
|
149
|
+
/** Deletes a withdrawn comment thread by its id, searching the named products. Answers with the deleted comment. */
|
|
150
|
+
export declare const deleteComment: (options: {
|
|
151
|
+
products: {
|
|
152
|
+
name: string;
|
|
153
|
+
dir: string;
|
|
154
|
+
}[];
|
|
155
|
+
id: string;
|
|
156
|
+
}) => DesignComment | string;
|
|
157
|
+
/**
|
|
158
|
+
* Marks an open or addressed comment thread as addressed by `inbox done`, searching the named products. Without
|
|
159
|
+
* `author` the user addressed it. Answers with the addressed comment.
|
|
160
|
+
*/
|
|
161
|
+
export declare const addressComment: (options: {
|
|
162
|
+
products: {
|
|
163
|
+
name: string;
|
|
164
|
+
dir: string;
|
|
165
|
+
}[];
|
|
166
|
+
id: string;
|
|
167
|
+
author?: string;
|
|
168
|
+
note?: string;
|
|
169
|
+
}) => DesignComment | string;
|
|
170
|
+
/** Resolves an open or addressed comment thread for the user, searching the named products: the file stays, marked `resolved`. */
|
|
171
|
+
export declare const resolveComment: (options: {
|
|
172
|
+
products: {
|
|
173
|
+
name: string;
|
|
174
|
+
dir: string;
|
|
175
|
+
}[];
|
|
176
|
+
id: string;
|
|
177
|
+
note?: string;
|
|
178
|
+
}) => DesignComment | string;
|
|
179
|
+
/** The open comments made on any variant of a sketch, matched by its target and its `createdAt`. */
|
|
180
|
+
export declare const commentsOnSketch: (options: {
|
|
181
|
+
productDir: string;
|
|
182
|
+
product: string;
|
|
183
|
+
sketch: Pick<Sketch, "target" | "createdAt">;
|
|
184
|
+
}) => DesignComment[];
|
|
185
|
+
/**
|
|
186
|
+
* Marks the open comments on the variants of a sketch, or only those on `variant`, as addressed for `reason`. `round`
|
|
187
|
+
* is the key of the round a `round` answer started; without `author` the user addressed them. Answers with the addressed comments.
|
|
188
|
+
*/
|
|
189
|
+
export declare const addressSketchComments: (options: {
|
|
190
|
+
sketch: Sketch;
|
|
191
|
+
variant?: string;
|
|
192
|
+
reason: Exclude<CommentAddressReason, "done">;
|
|
193
|
+
author?: string;
|
|
194
|
+
note?: string;
|
|
195
|
+
round?: string;
|
|
196
|
+
}) => DesignComment[];
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.addressSketchComments = exports.commentsOnSketch = exports.resolveComment = exports.addressComment = exports.deleteComment = exports.replyToComment = exports.findComment = exports.threadStateOf = exports.lastWordOf = exports.createComment = exports.staleReasonOf = exports.sketchGoneOf = exports.goneSizeOf = exports.goneStateOf = exports.listComments = exports.isOpenComment = exports.isSize = exports.isPoint = exports.commentsDirOf = exports.REST = exports.FITTED = void 0;
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
const force_interactions_1 = require("../../force-interactions");
|
|
19
|
+
const resolve_product_1 = require("../resolve-product");
|
|
20
|
+
const overlay_1 = require("../sketch/overlay");
|
|
21
|
+
const part_definition_1 = require("../sketch/part-definition");
|
|
22
|
+
const sketch_1 = require("../sketch/sketch");
|
|
23
|
+
exports.FITTED = 'fitted';
|
|
24
|
+
exports.REST = 'rest';
|
|
25
|
+
const ID = /^[A-Za-z0-9-]+$/u;
|
|
26
|
+
const commentsDirOf = (productDir) => (0, path_1.resolve)(productDir, 'comments');
|
|
27
|
+
exports.commentsDirOf = commentsDirOf;
|
|
28
|
+
const isPoint = (value) => {
|
|
29
|
+
const point = value;
|
|
30
|
+
return typeof (point === null || point === void 0 ? void 0 : point.x) === 'number' && typeof point.y === 'number' && point.x >= 0 && point.y >= 0;
|
|
31
|
+
};
|
|
32
|
+
exports.isPoint = isPoint;
|
|
33
|
+
const isReply = (value) => {
|
|
34
|
+
const reply = value;
|
|
35
|
+
return (((reply === null || reply === void 0 ? void 0 : reply.by) === 'user' || (reply === null || reply === void 0 ? void 0 : reply.by) === 'agent') &&
|
|
36
|
+
typeof reply.text === 'string' &&
|
|
37
|
+
reply.text !== '' &&
|
|
38
|
+
typeof reply.createdAt === 'string' &&
|
|
39
|
+
(reply.author === undefined || (typeof reply.author === 'string' && reply.author !== '')) &&
|
|
40
|
+
(reply.question === undefined || (reply.question === true && reply.by === 'agent')));
|
|
41
|
+
};
|
|
42
|
+
const isSize = (value) => (typeof value === 'string' && value !== '') || (typeof value === 'number' && value > 0);
|
|
43
|
+
exports.isSize = isSize;
|
|
44
|
+
const ADDRESS_REASONS = ['done', 'round', 'merge', 'discard'];
|
|
45
|
+
const isOptionalText = (value) => value === undefined || (typeof value === 'string' && value !== '');
|
|
46
|
+
const isAddressed = (value) => {
|
|
47
|
+
const addressed = value;
|
|
48
|
+
return (((addressed === null || addressed === void 0 ? void 0 : addressed.by) === 'user' || (addressed === null || addressed === void 0 ? void 0 : addressed.by) === 'agent') &&
|
|
49
|
+
ADDRESS_REASONS.some((reason) => reason === addressed.reason) &&
|
|
50
|
+
typeof addressed.addressedAt === 'string' &&
|
|
51
|
+
addressed.addressedAt !== '' &&
|
|
52
|
+
isOptionalText(addressed.author) &&
|
|
53
|
+
isOptionalText(addressed.note) &&
|
|
54
|
+
isOptionalText(addressed.round));
|
|
55
|
+
};
|
|
56
|
+
const isResolution = (value) => {
|
|
57
|
+
const resolved = value;
|
|
58
|
+
return (((resolved === null || resolved === void 0 ? void 0 : resolved.by) === 'user' || (resolved === null || resolved === void 0 ? void 0 : resolved.by) === 'agent') &&
|
|
59
|
+
(resolved.reason === undefined || ADDRESS_REASONS.some((reason) => reason === resolved.reason)) &&
|
|
60
|
+
typeof resolved.resolvedAt === 'string' &&
|
|
61
|
+
resolved.resolvedAt !== '' &&
|
|
62
|
+
isOptionalText(resolved.author) &&
|
|
63
|
+
isOptionalText(resolved.note) &&
|
|
64
|
+
isOptionalText(resolved.round));
|
|
65
|
+
};
|
|
66
|
+
const isKnownInteraction = (value) => value === exports.REST || force_interactions_1.INTERACTIONS.some((known) => known === value);
|
|
67
|
+
const shapeProblemOf = (value) => {
|
|
68
|
+
var _a;
|
|
69
|
+
for (const key of ['part', 'state', 'text', 'createdAt'])
|
|
70
|
+
if (typeof value[key] !== 'string' || value[key] === '')
|
|
71
|
+
return `${key} must be a non-empty string`;
|
|
72
|
+
if (!(0, exports.isSize)(value.size))
|
|
73
|
+
return `size must be a preset name, a width in CSS pixels or "${exports.FITTED}"`;
|
|
74
|
+
if (value.interaction !== undefined && !isKnownInteraction(value.interaction))
|
|
75
|
+
return `interaction must be ${exports.REST} or one of ${force_interactions_1.INTERACTIONS.join(', ')}`;
|
|
76
|
+
if (value.point !== undefined && !(0, exports.isPoint)(value.point))
|
|
77
|
+
return 'point must be { x, y } in CSS pixels, both >= 0';
|
|
78
|
+
if (value.sketch !== undefined &&
|
|
79
|
+
(typeof ((_a = value.sketch) === null || _a === void 0 ? void 0 : _a.target) !== 'string' ||
|
|
80
|
+
typeof value.sketch.variant !== 'string' ||
|
|
81
|
+
(value.sketch.createdAt !== undefined && typeof value.sketch.createdAt !== 'string')))
|
|
82
|
+
return 'sketch must be { target, variant, createdAt? }';
|
|
83
|
+
if (value.replies !== undefined && !(Array.isArray(value.replies) && value.replies.every(isReply)))
|
|
84
|
+
return 'replies must be [{ by: "user" | "agent", author?, text, createdAt, question?: true }], question only on an agent reply';
|
|
85
|
+
if (value.addressed !== undefined && !isAddressed(value.addressed))
|
|
86
|
+
return `addressed must be { by: "user" | "agent", author?, reason: ${ADDRESS_REASONS.join(' | ')}, addressedAt, note?, round? }`;
|
|
87
|
+
if (value.resolved !== undefined && !isResolution(value.resolved))
|
|
88
|
+
return 'resolved must be { by: "user", resolvedAt, note? }';
|
|
89
|
+
return null;
|
|
90
|
+
};
|
|
91
|
+
const migratedOf = (stored) => {
|
|
92
|
+
const legacy = stored.resolved;
|
|
93
|
+
if ((legacy === null || legacy === void 0 ? void 0 : legacy.reason) === undefined)
|
|
94
|
+
return stored;
|
|
95
|
+
const { by, author, reason, resolvedAt, note, round } = legacy;
|
|
96
|
+
if (reason === 'done' && by === 'user')
|
|
97
|
+
return Object.assign(Object.assign({}, stored), { resolved: Object.assign({ by, resolvedAt }, (note ? { note } : {})) });
|
|
98
|
+
return Object.assign(Object.assign({}, stored), { resolved: undefined, addressed: Object.assign(Object.assign(Object.assign(Object.assign({ by }, (author ? { author } : {})), { reason, addressedAt: resolvedAt }), (note ? { note } : {})), (round ? { round } : {})) });
|
|
99
|
+
};
|
|
100
|
+
const rewrite = (file, change) => {
|
|
101
|
+
const changed = change(migratedOf(JSON.parse((0, fs_1.readFileSync)(file, 'utf8'))));
|
|
102
|
+
(0, fs_1.writeFileSync)(file, `${JSON.stringify(changed, null, 2)}\n`);
|
|
103
|
+
return changed;
|
|
104
|
+
};
|
|
105
|
+
const isOpenComment = (comment) => !comment.addressed && !comment.resolved;
|
|
106
|
+
exports.isOpenComment = isOpenComment;
|
|
107
|
+
/**
|
|
108
|
+
* The open comment files of a product, oldest first, or every one with `all` (addressed and resolved too); a file
|
|
109
|
+
* that cannot be read answers with its problem.
|
|
110
|
+
*/
|
|
111
|
+
const listComments = (options) => {
|
|
112
|
+
const dir = (0, exports.commentsDirOf)(options.productDir);
|
|
113
|
+
const files = (0, fs_1.existsSync)(dir) ? (0, fs_1.readdirSync)(dir).filter((name) => name.endsWith('.json')) : [];
|
|
114
|
+
const read = files.map((name) => {
|
|
115
|
+
var _a, _b;
|
|
116
|
+
const file = (0, path_1.resolve)(dir, name);
|
|
117
|
+
try {
|
|
118
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(file, 'utf8'));
|
|
119
|
+
const problem = shapeProblemOf(parsed);
|
|
120
|
+
return problem
|
|
121
|
+
? { file, problem }
|
|
122
|
+
: Object.assign(Object.assign({}, migratedOf(parsed)), { interaction: (_a = parsed.interaction) !== null && _a !== void 0 ? _a : exports.REST, replies: (_b = parsed.replies) !== null && _b !== void 0 ? _b : [], id: name.slice(0, -'.json'.length), product: options.product, file });
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return { file, problem: `is no JSON: ${error instanceof Error ? error.message : String(error)}` };
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
comments: read
|
|
130
|
+
.filter((entry) => !('problem' in entry))
|
|
131
|
+
.filter((comment) => options.all || (0, exports.isOpenComment)(comment))
|
|
132
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id)),
|
|
133
|
+
unreadable: read.filter((entry) => 'problem' in entry),
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
exports.listComments = listComments;
|
|
137
|
+
/** Why a part key and state name point at nothing in a product, or `null`. A part whose states are not an object literal keeps any state. */
|
|
138
|
+
const goneStateOf = (options) => {
|
|
139
|
+
const { product, part: key, state } = options;
|
|
140
|
+
const part = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key);
|
|
141
|
+
if (!part)
|
|
142
|
+
return `part ${key} no longer exists`;
|
|
143
|
+
const states = (0, part_definition_1.stateNamesOf)(part.source);
|
|
144
|
+
return states && !states.includes(state) ? `${key} has no state "${state}"` : null;
|
|
145
|
+
};
|
|
146
|
+
exports.goneStateOf = goneStateOf;
|
|
147
|
+
/** Why a size points at nothing: a preset the product lacks, or a width a part with readable `widths` lacks. */
|
|
148
|
+
const goneSizeOf = (options) => {
|
|
149
|
+
const { product, part: key, size } = options;
|
|
150
|
+
if (typeof size === 'string')
|
|
151
|
+
return size === exports.FITTED || product.presets[size] ? null : `preset "${size}" no longer exists`;
|
|
152
|
+
const part = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key);
|
|
153
|
+
const widths = part ? (0, part_definition_1.widthsOf)(part.source) : null;
|
|
154
|
+
return widths === null || widths.includes(size) ? null : `${key} has no width ${size}`;
|
|
155
|
+
};
|
|
156
|
+
exports.goneSizeOf = goneSizeOf;
|
|
157
|
+
/** Why an interaction points at nothing: one the part no longer declares. */
|
|
158
|
+
const goneInteractionOf = (options) => {
|
|
159
|
+
const { product, part: key, interaction = exports.REST } = options;
|
|
160
|
+
if (interaction === exports.REST)
|
|
161
|
+
return null;
|
|
162
|
+
const part = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key);
|
|
163
|
+
return part && !(0, part_definition_1.interactionNamesOf)(part.source).includes(interaction)
|
|
164
|
+
? `${key} has no interaction "${interaction}"`
|
|
165
|
+
: null;
|
|
166
|
+
};
|
|
167
|
+
const openSketchOf = ({ product, target }) => {
|
|
168
|
+
const parsed = (0, sketch_1.parseTarget)(target);
|
|
169
|
+
const sketch = typeof parsed === 'string' ? null : (0, sketch_1.findSketch)({ productDir: product.dir, product: product.name, sketch: parsed });
|
|
170
|
+
return sketch && typeof sketch !== 'string' ? sketch : null;
|
|
171
|
+
};
|
|
172
|
+
/** Whether the sketch a comment was made on was merged, discarded or replaced by a later one on the same target. */
|
|
173
|
+
const sketchGoneOf = (options) => {
|
|
174
|
+
const { product, comment } = options;
|
|
175
|
+
if (!comment.sketch)
|
|
176
|
+
return false;
|
|
177
|
+
const sketch = openSketchOf({ product, target: comment.sketch.target });
|
|
178
|
+
return !sketch || (comment.sketch.createdAt !== undefined && comment.sketch.createdAt !== sketch.createdAt);
|
|
179
|
+
};
|
|
180
|
+
exports.sketchGoneOf = sketchGoneOf;
|
|
181
|
+
/**
|
|
182
|
+
* Why a comment no longer points at anything: its sketch variant, part, state, size or interaction is gone.
|
|
183
|
+
* `null` when it still does. A part whose states are not an object literal keeps any state.
|
|
184
|
+
*/
|
|
185
|
+
const staleReasonOf = (options) => {
|
|
186
|
+
var _a;
|
|
187
|
+
const { product, comment } = options;
|
|
188
|
+
let drawn = product;
|
|
189
|
+
if (comment.sketch) {
|
|
190
|
+
const sketch = openSketchOf({ product, target: comment.sketch.target });
|
|
191
|
+
if (!sketch || (0, exports.sketchGoneOf)({ product, comment }))
|
|
192
|
+
return `the sketch on ${comment.sketch.target} no longer exists`;
|
|
193
|
+
if (!sketch.variants.includes(comment.sketch.variant))
|
|
194
|
+
return `the sketch on ${comment.sketch.target} has no variant "${comment.sketch.variant}"`;
|
|
195
|
+
drawn = (0, overlay_1.overlaySketch)({ product, sketch, variant: comment.sketch.variant });
|
|
196
|
+
}
|
|
197
|
+
const gone = (0, exports.goneStateOf)({ product: drawn, part: comment.part, state: comment.state });
|
|
198
|
+
if (gone)
|
|
199
|
+
return gone;
|
|
200
|
+
return ((_a = (0, exports.goneSizeOf)({ product: drawn, part: comment.part, size: comment.size })) !== null && _a !== void 0 ? _a : goneInteractionOf({ product: drawn, part: comment.part, interaction: comment.interaction }));
|
|
201
|
+
};
|
|
202
|
+
exports.staleReasonOf = staleReasonOf;
|
|
203
|
+
let lastCreatedAt = 0;
|
|
204
|
+
const strictlyLaterNow = () => {
|
|
205
|
+
lastCreatedAt = Math.max(Date.now(), lastCreatedAt + 1);
|
|
206
|
+
return new Date(lastCreatedAt).toISOString();
|
|
207
|
+
};
|
|
208
|
+
const newId = () => `${new Date()
|
|
209
|
+
.toISOString()
|
|
210
|
+
.replace(/[-:]/gu, '')
|
|
211
|
+
.replace(/\.\d+Z$/u, 'Z')}-${(0, crypto_1.randomBytes)(2).toString('hex')}`;
|
|
212
|
+
/** Writes a comment on a state of a part, or answers with why it points at nothing. */
|
|
213
|
+
const createComment = (options) => {
|
|
214
|
+
var _a, _b, _c;
|
|
215
|
+
const { product } = options;
|
|
216
|
+
const _d = options.comment, { interaction, sketch } = _d, rest = __rest(_d, ["interaction", "sketch"]);
|
|
217
|
+
const createdAt = sketch && ((_a = openSketchOf({ product, target: sketch.target })) === null || _a === void 0 ? void 0 : _a.createdAt);
|
|
218
|
+
const comment = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), (sketch && { sketch: Object.assign({ target: sketch.target, variant: sketch.variant }, (createdAt && { createdAt })) })), (interaction === undefined || interaction === exports.REST ? {} : { interaction })), { createdAt: strictlyLaterNow() });
|
|
219
|
+
const problem = (_b = shapeProblemOf(Object.assign(Object.assign({}, comment), { interaction }))) !== null && _b !== void 0 ? _b : (0, exports.staleReasonOf)({ product, comment });
|
|
220
|
+
if (problem)
|
|
221
|
+
return problem;
|
|
222
|
+
const dir = (0, exports.commentsDirOf)(product.dir);
|
|
223
|
+
const id = newId();
|
|
224
|
+
const file = (0, path_1.resolve)(dir, `${id}.json`);
|
|
225
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
226
|
+
(0, fs_1.writeFileSync)(file, `${JSON.stringify(comment, null, 2)}\n`);
|
|
227
|
+
return Object.assign(Object.assign({}, comment), { interaction: (_c = comment.interaction) !== null && _c !== void 0 ? _c : exports.REST, replies: [], id, product: product.name, file });
|
|
228
|
+
};
|
|
229
|
+
exports.createComment = createComment;
|
|
230
|
+
/** Who spoke last in a comment thread: the user wrote the comment, so a thread without replies is the user's. */
|
|
231
|
+
const lastWordOf = (comment) => { var _a, _b; return (_b = (_a = comment.replies[comment.replies.length - 1]) === null || _a === void 0 ? void 0 : _a.by) !== null && _b !== void 0 ? _b : 'user'; };
|
|
232
|
+
exports.lastWordOf = lastWordOf;
|
|
233
|
+
const threadStateOf = (comment) => {
|
|
234
|
+
const last = comment.replies[comment.replies.length - 1];
|
|
235
|
+
if ((last === null || last === void 0 ? void 0 : last.by) !== 'agent')
|
|
236
|
+
return 'agent';
|
|
237
|
+
return last.question ? 'question' : 'answered';
|
|
238
|
+
};
|
|
239
|
+
exports.threadStateOf = threadStateOf;
|
|
240
|
+
const findComment = (options) => {
|
|
241
|
+
const { products, id } = options;
|
|
242
|
+
if (!ID.test(id))
|
|
243
|
+
return `"${id}" is no comment id`;
|
|
244
|
+
for (const product of products) {
|
|
245
|
+
const found = (0, exports.listComments)({ productDir: product.dir, product: product.name, all: true }).comments.find((comment) => comment.id === id);
|
|
246
|
+
if (found === null || found === void 0 ? void 0 : found.resolved)
|
|
247
|
+
return `comment "${id}" is resolved - it takes no reply and no done`;
|
|
248
|
+
if (found)
|
|
249
|
+
return found;
|
|
250
|
+
}
|
|
251
|
+
return `no open comment "${id}"`;
|
|
252
|
+
};
|
|
253
|
+
exports.findComment = findComment;
|
|
254
|
+
/**
|
|
255
|
+
* Adds a reply to the thread of an open or addressed comment, searching the named products. A reply by the user
|
|
256
|
+
* opens an addressed thread again. Answers with the updated comment.
|
|
257
|
+
*/
|
|
258
|
+
const replyToComment = (options) => {
|
|
259
|
+
const { by, author, text, question } = options;
|
|
260
|
+
if (text.trim() === '')
|
|
261
|
+
return 'a reply needs a text';
|
|
262
|
+
if (by === 'agent' && !(author === null || author === void 0 ? void 0 : author.trim()))
|
|
263
|
+
return 'an agent reply needs --by <model id>';
|
|
264
|
+
if (question && by !== 'agent')
|
|
265
|
+
return 'only an agent reply can be a question';
|
|
266
|
+
const found = (0, exports.findComment)(options);
|
|
267
|
+
if (typeof found === 'string')
|
|
268
|
+
return found;
|
|
269
|
+
const reply = Object.assign(Object.assign(Object.assign({ by }, (author ? { author } : {})), { text, createdAt: new Date().toISOString() }), (question ? { question: true } : {}));
|
|
270
|
+
const replies = [...found.replies, reply];
|
|
271
|
+
const addressed = by === 'agent' ? found.addressed : undefined;
|
|
272
|
+
rewrite(found.file, (stored) => (Object.assign(Object.assign({}, stored), { addressed, replies })));
|
|
273
|
+
return Object.assign(Object.assign({}, found), { addressed, replies });
|
|
274
|
+
};
|
|
275
|
+
exports.replyToComment = replyToComment;
|
|
276
|
+
/** Deletes a withdrawn comment thread by its id, searching the named products. Answers with the deleted comment. */
|
|
277
|
+
const deleteComment = (options) => {
|
|
278
|
+
const found = (0, exports.findComment)(options);
|
|
279
|
+
if (typeof found !== 'string')
|
|
280
|
+
(0, fs_1.rmSync)(found.file);
|
|
281
|
+
return found;
|
|
282
|
+
};
|
|
283
|
+
exports.deleteComment = deleteComment;
|
|
284
|
+
const addressedOf = (options) => {
|
|
285
|
+
const { reason, author, note, round } = options;
|
|
286
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ by: author ? 'agent' : 'user' }, (author ? { author } : {})), { reason, addressedAt: new Date().toISOString() }), ((note === null || note === void 0 ? void 0 : note.trim()) ? { note: note.trim() } : {})), (round ? { round } : {}));
|
|
287
|
+
};
|
|
288
|
+
const withAddressed = (comment, addressed) => {
|
|
289
|
+
rewrite(comment.file, (stored) => (Object.assign(Object.assign({}, stored), { addressed })));
|
|
290
|
+
return Object.assign(Object.assign({}, comment), { addressed });
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* Marks an open or addressed comment thread as addressed by `inbox done`, searching the named products. Without
|
|
294
|
+
* `author` the user addressed it. Answers with the addressed comment.
|
|
295
|
+
*/
|
|
296
|
+
const addressComment = (options) => {
|
|
297
|
+
const found = (0, exports.findComment)(options);
|
|
298
|
+
return typeof found === 'string' ? found : withAddressed(found, addressedOf(Object.assign(Object.assign({}, options), { reason: 'done' })));
|
|
299
|
+
};
|
|
300
|
+
exports.addressComment = addressComment;
|
|
301
|
+
/** Resolves an open or addressed comment thread for the user, searching the named products: the file stays, marked `resolved`. */
|
|
302
|
+
const resolveComment = (options) => {
|
|
303
|
+
var _a;
|
|
304
|
+
const found = (0, exports.findComment)(options);
|
|
305
|
+
if (typeof found === 'string')
|
|
306
|
+
return found;
|
|
307
|
+
const note = (_a = options.note) === null || _a === void 0 ? void 0 : _a.trim();
|
|
308
|
+
const resolved = Object.assign({ by: 'user', resolvedAt: new Date().toISOString() }, (note ? { note } : {}));
|
|
309
|
+
rewrite(found.file, (stored) => (Object.assign(Object.assign({}, stored), { resolved })));
|
|
310
|
+
return Object.assign(Object.assign({}, found), { resolved });
|
|
311
|
+
};
|
|
312
|
+
exports.resolveComment = resolveComment;
|
|
313
|
+
/** The open comments made on any variant of a sketch, matched by its target and its `createdAt`. */
|
|
314
|
+
const commentsOnSketch = (options) => (0, exports.listComments)(options).comments.filter((comment) => { var _a; return ((_a = comment.sketch) === null || _a === void 0 ? void 0 : _a.target) === options.sketch.target && comment.sketch.createdAt === options.sketch.createdAt; });
|
|
315
|
+
exports.commentsOnSketch = commentsOnSketch;
|
|
316
|
+
/**
|
|
317
|
+
* Marks the open comments on the variants of a sketch, or only those on `variant`, as addressed for `reason`. `round`
|
|
318
|
+
* is the key of the round a `round` answer started; without `author` the user addressed them. Answers with the addressed comments.
|
|
319
|
+
*/
|
|
320
|
+
const addressSketchComments = (options) => {
|
|
321
|
+
const { sketch, variant } = options;
|
|
322
|
+
const addressed = addressedOf(options);
|
|
323
|
+
return (0, exports.commentsOnSketch)({
|
|
324
|
+
productDir: (0, path_1.resolve)(sketch.dir, '..', '..'),
|
|
325
|
+
product: sketch.product,
|
|
326
|
+
sketch,
|
|
327
|
+
})
|
|
328
|
+
.filter((comment) => { var _a; return variant === undefined || ((_a = comment.sketch) === null || _a === void 0 ? void 0 : _a.variant) === variant; })
|
|
329
|
+
.map((comment) => withAddressed(comment, addressed));
|
|
330
|
+
};
|
|
331
|
+
exports.addressSketchComments = addressSketchComments;
|
|
332
|
+
//# sourceMappingURL=comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/comments/comment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ResolvedProduct } from '../resolve-product';
|
|
2
|
+
import { DesignComment } from './comment';
|
|
3
|
+
/**
|
|
4
|
+
* Completes a handled comment thread: replaces the `note` of the part it was made on with `note`, then marks the thread addressed
|
|
5
|
+
* with that note, for the user to resolve. A thread on a sketch variant sets the note in the variant's own copy of the part, never in
|
|
6
|
+
* the product, and changes no part file when the variant does not hold the part; otherwise a part taken from the base is copied into the product first.
|
|
7
|
+
* With `author`, its model id is stored where the comment sat unless it is there already: in the authors of
|
|
8
|
+
* the sketch variant, or in the `madeBy` of the part. Answers with the addressed comment, or with why nothing changed.
|
|
9
|
+
*/
|
|
10
|
+
export declare const completeComment: (options: {
|
|
11
|
+
products: ResolvedProduct[];
|
|
12
|
+
id: string;
|
|
13
|
+
note: string;
|
|
14
|
+
author?: string;
|
|
15
|
+
}) => DesignComment | string;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.completeComment = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const resolve_product_1 = require("../resolve-product");
|
|
7
|
+
const overlay_1 = require("../sketch/overlay");
|
|
8
|
+
const sketch_1 = require("../sketch/sketch");
|
|
9
|
+
const part_definition_1 = require("../sketch/part-definition");
|
|
10
|
+
const comment_1 = require("./comment");
|
|
11
|
+
/**
|
|
12
|
+
* Completes a handled comment thread: replaces the `note` of the part it was made on with `note`, then marks the thread addressed
|
|
13
|
+
* with that note, for the user to resolve. A thread on a sketch variant sets the note in the variant's own copy of the part, never in
|
|
14
|
+
* the product, and changes no part file when the variant does not hold the part; otherwise a part taken from the base is copied into the product first.
|
|
15
|
+
* With `author`, its model id is stored where the comment sat unless it is there already: in the authors of
|
|
16
|
+
* the sketch variant, or in the `madeBy` of the part. Answers with the addressed comment, or with why nothing changed.
|
|
17
|
+
*/
|
|
18
|
+
const completeComment = (options) => {
|
|
19
|
+
const { products, id, note, author } = options;
|
|
20
|
+
if (note.trim() === '')
|
|
21
|
+
return 'done needs --note with the note that explains the whole shape of the part';
|
|
22
|
+
const found = (0, comment_1.findComment)({ products: products.map(({ name, dir }) => ({ name, dir })), id });
|
|
23
|
+
if (typeof found === 'string')
|
|
24
|
+
return found;
|
|
25
|
+
const product = products.find(({ name }) => name === found.product);
|
|
26
|
+
const part = product === null || product === void 0 ? void 0 : product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === found.part);
|
|
27
|
+
if (!product || !part)
|
|
28
|
+
return `${found.part} is no part of ${found.product} - the note has nowhere to go`;
|
|
29
|
+
if (found.sketch) {
|
|
30
|
+
const target = (0, sketch_1.parseTarget)(found.sketch.target);
|
|
31
|
+
const sketch = typeof target === 'string'
|
|
32
|
+
? null
|
|
33
|
+
: (0, sketch_1.findSketch)({ productDir: product.dir, product: product.name, sketch: target });
|
|
34
|
+
if (!sketch || typeof sketch === 'string')
|
|
35
|
+
return `${found.sketch.target} is no sketch of ${product.name}`;
|
|
36
|
+
const drawn = (0, overlay_1.overlaySketch)({ product, sketch, variant: found.sketch.variant }).parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === found.part);
|
|
37
|
+
if (drawn && drawn.file.startsWith(`${sketch.dir}${path_1.sep}`)) {
|
|
38
|
+
const noted = (0, part_definition_1.withNote)((0, fs_1.readFileSync)(drawn.file, 'utf8'), note);
|
|
39
|
+
if (noted === null)
|
|
40
|
+
return `${drawn.file} holds no definePart({ note: '…' }) to set the note on`;
|
|
41
|
+
(0, fs_1.writeFileSync)(drawn.file, noted);
|
|
42
|
+
}
|
|
43
|
+
if (author) {
|
|
44
|
+
const authored = (0, sketch_1.withAuthor)({ sketch, variant: found.sketch.variant, author });
|
|
45
|
+
if (authored !== sketch)
|
|
46
|
+
(0, sketch_1.writeSketchFile)(authored);
|
|
47
|
+
}
|
|
48
|
+
return (0, comment_1.addressComment)({ products: [{ name: product.name, dir: product.dir }], id, author, note });
|
|
49
|
+
}
|
|
50
|
+
const source = (0, fs_1.readFileSync)(part.file, 'utf8');
|
|
51
|
+
const withNoted = (0, part_definition_1.withNote)(source, note);
|
|
52
|
+
const madeBy = (0, part_definition_1.madeByOf)(source);
|
|
53
|
+
const noted = withNoted !== null && author && !madeBy.includes(author) ? (0, part_definition_1.withMadeBy)(withNoted, [...madeBy, author]) : withNoted;
|
|
54
|
+
if (noted === null)
|
|
55
|
+
return `${part.file} holds no definePart({ note: '…' }) to set the note on`;
|
|
56
|
+
const partDir = (0, path_1.resolve)(product.dir, part.layer, part.name);
|
|
57
|
+
if (part.origin === 'base')
|
|
58
|
+
(0, fs_1.cpSync)((0, path_1.dirname)(part.file), partDir, { recursive: true });
|
|
59
|
+
(0, fs_1.writeFileSync)((0, path_1.resolve)(partDir, `${part.name}.ts`), noted);
|
|
60
|
+
return (0, comment_1.addressComment)({ products: [{ name: product.name, dir: product.dir }], id, author, note });
|
|
61
|
+
};
|
|
62
|
+
exports.completeComment = completeComment;
|
|
63
|
+
//# sourceMappingURL=complete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../../../../../libs/cli/src/lib/design/system/comments/complete.ts"],"names":[],"mappings":"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"}
|