@meltemi/diagrams-edit 0.0.0-stage → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -2
  3. package/dist/animate.d.ts +18 -0
  4. package/dist/animate.d.ts.map +1 -0
  5. package/dist/animate.js +188 -0
  6. package/dist/animate.js.map +1 -0
  7. package/dist/attachments.d.ts +30 -0
  8. package/dist/attachments.d.ts.map +1 -0
  9. package/dist/attachments.js +85 -0
  10. package/dist/attachments.js.map +1 -0
  11. package/dist/batch.d.ts +18 -0
  12. package/dist/batch.d.ts.map +1 -0
  13. package/dist/batch.js +120 -0
  14. package/dist/batch.js.map +1 -0
  15. package/dist/c4.d.ts +55 -0
  16. package/dist/c4.d.ts.map +1 -0
  17. package/dist/c4.js +970 -0
  18. package/dist/c4.js.map +1 -0
  19. package/dist/context.d.ts +36 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/context.js +133 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/create.d.ts +28 -0
  24. package/dist/create.d.ts.map +1 -0
  25. package/dist/create.js +222 -0
  26. package/dist/create.js.map +1 -0
  27. package/dist/delete.d.ts +10 -0
  28. package/dist/delete.d.ts.map +1 -0
  29. package/dist/delete.js +150 -0
  30. package/dist/delete.js.map +1 -0
  31. package/dist/diagrams.d.ts +19 -0
  32. package/dist/diagrams.d.ts.map +1 -0
  33. package/dist/diagrams.js +92 -0
  34. package/dist/diagrams.js.map +1 -0
  35. package/dist/free.d.ts +54 -0
  36. package/dist/free.d.ts.map +1 -0
  37. package/dist/free.js +598 -0
  38. package/dist/free.js.map +1 -0
  39. package/dist/index.d.ts +13 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +12 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/insert.d.ts +41 -0
  44. package/dist/insert.d.ts.map +1 -0
  45. package/dist/insert.js +165 -0
  46. package/dist/insert.js.map +1 -0
  47. package/dist/labels.d.ts +8 -0
  48. package/dist/labels.d.ts.map +1 -0
  49. package/dist/labels.js +186 -0
  50. package/dist/labels.js.map +1 -0
  51. package/dist/lines.d.ts +16 -0
  52. package/dist/lines.d.ts.map +1 -0
  53. package/dist/lines.js +130 -0
  54. package/dist/lines.js.map +1 -0
  55. package/dist/messages/en.d.ts +559 -0
  56. package/dist/messages/en.d.ts.map +1 -0
  57. package/dist/messages/en.js +553 -0
  58. package/dist/messages/en.js.map +1 -0
  59. package/dist/messages/es.d.ts +3 -0
  60. package/dist/messages/es.d.ts.map +1 -0
  61. package/dist/messages/es.js +385 -0
  62. package/dist/messages/es.js.map +1 -0
  63. package/dist/messages/index.d.ts +307 -0
  64. package/dist/messages/index.d.ts.map +1 -0
  65. package/dist/messages/index.js +15 -0
  66. package/dist/messages/index.js.map +1 -0
  67. package/dist/plan.d.ts +24 -0
  68. package/dist/plan.d.ts.map +1 -0
  69. package/dist/plan.js +922 -0
  70. package/dist/plan.js.map +1 -0
  71. package/dist/relations.d.ts +19 -0
  72. package/dist/relations.d.ts.map +1 -0
  73. package/dist/relations.js +168 -0
  74. package/dist/relations.js.map +1 -0
  75. package/dist/routes.d.ts +21 -0
  76. package/dist/routes.d.ts.map +1 -0
  77. package/dist/routes.js +37 -0
  78. package/dist/routes.js.map +1 -0
  79. package/dist/sequence.d.ts +44 -0
  80. package/dist/sequence.d.ts.map +1 -0
  81. package/dist/sequence.js +695 -0
  82. package/dist/sequence.js.map +1 -0
  83. package/dist/stories.d.ts +23 -0
  84. package/dist/stories.d.ts.map +1 -0
  85. package/dist/stories.js +238 -0
  86. package/dist/stories.js.map +1 -0
  87. package/dist/structure.d.ts +29 -0
  88. package/dist/structure.d.ts.map +1 -0
  89. package/dist/structure.js +541 -0
  90. package/dist/structure.js.map +1 -0
  91. package/dist/styles.d.ts +11 -0
  92. package/dist/styles.d.ts.map +1 -0
  93. package/dist/styles.js +219 -0
  94. package/dist/styles.js.map +1 -0
  95. package/dist/text.d.ts +26 -0
  96. package/dist/text.d.ts.map +1 -0
  97. package/dist/text.js +59 -0
  98. package/dist/text.js.map +1 -0
  99. package/dist/themes.d.ts +9 -0
  100. package/dist/themes.d.ts.map +1 -0
  101. package/dist/themes.js +110 -0
  102. package/dist/themes.js.map +1 -0
  103. package/dist/types.d.ts +727 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +43 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Architecture Studio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,57 @@
1
- # Temporary Holding Version
1
+ # @meltemi/diagrams-edit
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Structured edits of `.meltemi` sources: an operation (move, resize, route, relabel, rename,
4
+ reorder, add, remove and many more) becomes the smallest text change that does it, keeping
5
+ comments and formatting, or a refusal with its reason.
6
+
7
+ It is part of [Meltemi Diagrams](https://github.com/askenaz-dev/meltemi-diagrams#readme), diagrams as code with a canvas, motion and
8
+ exports. Every package of the product has the same version.
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @meltemi/diagrams-edit
14
+ ```
15
+
16
+ Node 22.12.0 or later. The package is an ES module with type declarations.
17
+
18
+ ## Use
19
+
20
+ ```ts
21
+ import { planEdit } from "@meltemi/diagrams-edit";
22
+ import { applyTextEdits } from "@meltemi/diagrams-language";
23
+ import { compile } from "@meltemi/diagrams-model";
24
+
25
+ const text = `language "0.2"
26
+
27
+ diagram shop: flow {
28
+ web["Web shop"]
29
+ api["Orders API"]
30
+ db[("Orders")]
31
+ web -> api: "HTTPS" as call
32
+ api -> db: "SQL" as store
33
+ }
34
+ `;
35
+
36
+ const result = planEdit(compile(text), {
37
+ kind: "setRelationLabel",
38
+ diagram: "shop",
39
+ relation: "call",
40
+ label: "HTTPS and JSON",
41
+ });
42
+ if (result.ok) console.log(applyTextEdits(text, result.plan.edits));
43
+ else console.log(result.rejection.reason);
44
+ ```
45
+
46
+ Elements created without a label take `defaultLabel(kind)` in the interface language of
47
+ `@meltemi/diagrams-i18n` ("Node", or "Nodo" in Spanish), as if the person had typed it;
48
+ `DEFAULT_LABELS` keeps the English ones.
49
+
50
+ ## Documentation
51
+
52
+ - [Editor guide](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/editor.md)
53
+ - [All documentation](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/README.md)
54
+
55
+ ## Licence
56
+
57
+ MIT. Third-party components and their licences are listed in [THIRD_PARTY_LICENSES.md](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/THIRD_PARTY_LICENSES.md).
@@ -0,0 +1,18 @@
1
+ import { type TextEdit } from "@meltemi/diagrams-language";
2
+ import { type AnimationEffect } from "@meltemi/diagrams-model";
3
+ import { type EditContext } from "./context.js";
4
+ import { type OperationOf } from "./plan.js";
5
+ export declare const ANIMATION_PROPERTIES: readonly ["duration", "repeat", "delay", "direction", "particles", "color"];
6
+ export type AnimationProperty = (typeof ANIMATION_PROPERTIES)[number];
7
+ /** Whether a property can be written for an effect. */
8
+ export declare function animationPropertyApplies(effect: AnimationEffect, property: string): boolean;
9
+ /** Writes an animation value as the language reads it; times are milliseconds. */
10
+ export declare function formatAnimationValue(property: string, value: string | number): string;
11
+ /**
12
+ * Makes sure a target has an `animate` statement with an effect, and sets or (with `null`) removes
13
+ * one of its properties. A statement shared by several targets is split.
14
+ */
15
+ export declare function setAnimation(ctx: EditContext, op: OperationOf<"setAnimation">): TextEdit[];
16
+ /** Removes a target's effect: the target leaves its statement, or the statement goes. */
17
+ export declare function removeAnimation(ctx: EditContext, op: OperationOf<"removeAnimation">): TextEdit[];
18
+ //# sourceMappingURL=animate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA2C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIzF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAgB9D,eAAO,MAAM,oBAAoB,6EAOvB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,uDAAuD;AACvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK3F;AA+BD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA4CrF;AAaD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,QAAQ,EAAE,CAmE1F;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,QAAQ,EAAE,CAehG"}
@@ -0,0 +1,188 @@
1
+ import { isIdentifierText } from "@meltemi/diagrams-language";
2
+ import { ANIMATION_DIRECTIONS, ANIMATION_EFFECT_PROPERTIES, ANIMATION_LIMITS, } from "@meltemi/diagrams-model";
3
+ import { insertStatement, reject, requireElement } from "./context.js";
4
+ import { deleteStatements } from "./delete.js";
5
+ import { diagramBody, insertAfter, isKeyword, verifyNoNewErrors } from "./insert.js";
6
+ import { reasons } from "./messages/index.js";
7
+ import { removeListItems } from "./plan.js";
8
+ import { requireRelation } from "./relations.js";
9
+ import { formatNumber, quoteString } from "./text.js";
10
+ /** Element kinds drawn without an outline, which a moving dash cannot follow. */
11
+ const NO_OUTLINE = new Set([
12
+ "note",
13
+ "text",
14
+ "icon",
15
+ "image",
16
+ "actor",
17
+ "boundary",
18
+ "control",
19
+ "entity",
20
+ ]);
21
+ export const ANIMATION_PROPERTIES = [
22
+ "duration",
23
+ "repeat",
24
+ "delay",
25
+ "direction",
26
+ "particles",
27
+ "color",
28
+ ];
29
+ /** Whether a property can be written for an effect. */
30
+ export function animationPropertyApplies(effect, property) {
31
+ return (["duration", "repeat", "delay"].includes(property) ||
32
+ ANIMATION_EFFECT_PROPERTIES[effect].includes(property));
33
+ }
34
+ function requireTarget(ctx, target, kind, effect) {
35
+ if (kind === "element") {
36
+ const element = requireElement(ctx, target);
37
+ if (effect === "flow")
38
+ reject("edit.invalid-value", reasons().animations.flowOnBoxes);
39
+ if (effect === "trace")
40
+ reject("edit.invalid-value", reasons().animations.traceOnBoxes);
41
+ if (effect === "dash" && NO_OUTLINE.has(element.kind)) {
42
+ reject("edit.invalid-value", reasons().animations.noOutline(target));
43
+ }
44
+ return;
45
+ }
46
+ if (kind === "relation") {
47
+ const relation = requireRelation(ctx, target);
48
+ if (relation.id === null) {
49
+ reject("edit.anonymous-relation", reasons().animations.nameRelation);
50
+ }
51
+ return;
52
+ }
53
+ const event = ctx.diagram.eventsByKey.get(target);
54
+ if (!event || event.id !== target || event.kind === "message") {
55
+ reject("edit.unsafe-target", reasons().animations.unnamedEvent(target));
56
+ }
57
+ if (effect !== "pulse")
58
+ reject("edit.invalid-value", reasons().animations.pulseOnly);
59
+ }
60
+ /** Writes an animation value as the language reads it; times are milliseconds. */
61
+ export function formatAnimationValue(property, value) {
62
+ switch (property) {
63
+ case "duration":
64
+ case "delay": {
65
+ const ms = typeof value === "number" ? value : Number(value);
66
+ const min = property === "duration" ? ANIMATION_LIMITS.minDuration : 0;
67
+ const max = property === "duration" ? ANIMATION_LIMITS.maxDuration : ANIMATION_LIMITS.maxDelay;
68
+ if (!Number.isFinite(ms) || ms < min || ms > max) {
69
+ reject("edit.invalid-value", reasons().animations.timeRange(property, min, max));
70
+ }
71
+ return `${formatNumber(ms)}ms`;
72
+ }
73
+ case "repeat": {
74
+ if (value === "forever")
75
+ return "forever";
76
+ const n = typeof value === "number" ? value : Number(value);
77
+ if (!Number.isInteger(n) || n < 1 || n > ANIMATION_LIMITS.maxRepeat) {
78
+ reject("edit.invalid-value", reasons().animations.repeatRange(ANIMATION_LIMITS.maxRepeat));
79
+ }
80
+ return String(n);
81
+ }
82
+ case "particles": {
83
+ const n = typeof value === "number" ? value : Number(value);
84
+ if (!Number.isInteger(n) || n < 1 || n > ANIMATION_LIMITS.maxParticles) {
85
+ reject("edit.invalid-value", reasons().animations.particlesRange(ANIMATION_LIMITS.maxParticles));
86
+ }
87
+ return String(n);
88
+ }
89
+ case "direction":
90
+ if (!ANIMATION_DIRECTIONS.includes(String(value))) {
91
+ reject("edit.invalid-value", reasons().animations.direction);
92
+ }
93
+ return String(value);
94
+ case "color": {
95
+ const text = String(value);
96
+ const token = text.startsWith("@") ? text.slice(1) : text;
97
+ return isIdentifierText(token) ? token : quoteString(text);
98
+ }
99
+ default:
100
+ return reject("edit.invalid-value", reasons().animations.notProperty(property));
101
+ }
102
+ }
103
+ function entryFor(ctx, target, kind, effect) {
104
+ return ctx.diagram.animations.find((e) => e.target === target && e.targetKind === kind && e.effect === effect);
105
+ }
106
+ /**
107
+ * Makes sure a target has an `animate` statement with an effect, and sets or (with `null`) removes
108
+ * one of its properties. A statement shared by several targets is split.
109
+ */
110
+ export function setAnimation(ctx, op) {
111
+ requireTarget(ctx, op.target, op.targetKind, op.effect);
112
+ const property = op.property;
113
+ if (property !== undefined && !animationPropertyApplies(op.effect, property)) {
114
+ reject("edit.invalid-value", reasons().animations.notForEffect(property, op.effect));
115
+ }
116
+ const value = property === undefined || op.value === undefined || op.value === null
117
+ ? null
118
+ : formatAnimationValue(property, op.value);
119
+ const entry = entryFor(ctx, op.target, op.targetKind, op.effect);
120
+ const edits = [];
121
+ if (!entry) {
122
+ if (property !== undefined && value === null)
123
+ return [];
124
+ const inner = [
125
+ `effect ${op.effect}`,
126
+ ...(property !== undefined && value !== null ? [`${property} ${value}`] : []),
127
+ ];
128
+ const text = `animate ${op.target} { ${inner.join("; ")} }`;
129
+ const body = diagramBody(ctx);
130
+ const anchors = body.statements.filter((s) => isKeyword(s, "animate") || isKeyword(s, "style"));
131
+ const last = anchors[anchors.length - 1];
132
+ edits.push(last
133
+ ? insertAfter(ctx, body, last, () => text)
134
+ : insertStatement(ctx, body, ctx.diagram.node.start, () => text));
135
+ verifyNoNewErrors(ctx, edits);
136
+ return edits;
137
+ }
138
+ if (property === undefined)
139
+ return [];
140
+ const statement = entry.node;
141
+ const block = statement.block;
142
+ const written = block.statements.find((s) => isKeyword(s, property));
143
+ if (statement.args.length > 1) {
144
+ // The target leaves the shared statement and gets its own copy with the change.
145
+ const index = statement.args.findIndex((a) => a.start === entry.targetRange.start.offset);
146
+ edits.push(...removeListItems(statement.args, new Set([index])));
147
+ const kept = block.statements
148
+ .filter((s) => !isKeyword(s, property))
149
+ .map((s) => ctx.text.slice(s.start, s.end));
150
+ if (value !== null)
151
+ kept.push(`${property} ${value}`);
152
+ edits.push(insertAfter(ctx, diagramBody(ctx), statement, () => `animate ${op.target} { ${kept.join("; ")} }`));
153
+ }
154
+ else if (written) {
155
+ if (value === null) {
156
+ edits.push(...deleteStatements(ctx.text, ctx.compilation.parse.root, [written]));
157
+ }
158
+ else {
159
+ const first = written.args[0];
160
+ const last = written.args[written.args.length - 1];
161
+ if (!first || !last)
162
+ reject("edit.unsafe-target", reasons().targets.propertyUnreadable);
163
+ if (ctx.text.slice(first.start, last.end) === value)
164
+ return [];
165
+ edits.push({ start: first.start, end: last.end, newText: value });
166
+ }
167
+ }
168
+ else {
169
+ if (value === null)
170
+ return [];
171
+ edits.push(insertStatement(ctx, block, statement.start, () => `${property} ${value}`));
172
+ }
173
+ verifyNoNewErrors(ctx, edits);
174
+ return edits;
175
+ }
176
+ /** Removes a target's effect: the target leaves its statement, or the statement goes. */
177
+ export function removeAnimation(ctx, op) {
178
+ const entry = ctx.diagram.animations.find((e) => e.target === op.target && e.effect === op.effect);
179
+ if (!entry)
180
+ return [];
181
+ const statement = entry.node;
182
+ const edits = statement.args.length > 1
183
+ ? removeListItems(statement.args, new Set([statement.args.findIndex((a) => a.start === entry.targetRange.start.offset)]))
184
+ : deleteStatements(ctx.text, ctx.compilation.parse.root, [statement]);
185
+ verifyNoNewErrors(ctx, edits);
186
+ return edits;
187
+ }
188
+ //# sourceMappingURL=animate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate.js","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Arg, TextEdit } from "@meltemi/diagrams-language";
2
+ import type { Element } from "@meltemi/diagrams-model";
3
+ import { type EditContext, type TextContext } from "./context.js";
4
+ import type { OperationOf } from "./plan.js";
5
+ import type { Dependent } from "./types.js";
6
+ /** The words after the text of a note's declaration: `on` and the target that follows it. */
7
+ export interface AttachmentArgs {
8
+ /** The argument before `on`: the note's text (or its id when it has none). */
9
+ readonly before: Arg;
10
+ readonly word: Arg;
11
+ readonly target: Arg;
12
+ }
13
+ /** The `on <target>` clause of a note's statement, or undefined when it has none. */
14
+ export declare function attachmentArgs(note: Element): AttachmentArgs | undefined;
15
+ /** The edit that takes ` on <target>` out of a note's statement, keeping its block and comments. */
16
+ export declare function stripAttachment(note: Element): TextEdit | undefined;
17
+ /**
18
+ * A note attached to something about to go, as a dependent of the removal and the edit that
19
+ * leaves the note without its clause: a note's text is the person's words, so it stays.
20
+ */
21
+ export declare function attachmentDependent(ctx: TextContext, note: Element): {
22
+ dependent: Dependent;
23
+ edit: TextEdit;
24
+ } | undefined;
25
+ /**
26
+ * Writes, replaces or removes the `on <element>` clause of a note, in the same declaration and
27
+ * with the smallest edit: the clause follows the note's text and the block stays where it is.
28
+ */
29
+ export declare function attachNote(ctx: EditContext, op: OperationOf<"attachNote">): TextEdit[];
30
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAoB,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAA0B,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,6FAA6F;AAC7F,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;CACtB;AAID,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAOxE;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAGnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,GACZ;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,SAAS,CAatD;AAUD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,QAAQ,EAAE,CA+BtF"}
@@ -0,0 +1,85 @@
1
+ import { reject, requireElement } from "./context.js";
2
+ import { verifyNoNewErrors } from "./insert.js";
3
+ import { messages, reasons } from "./messages/index.js";
4
+ const isOn = (arg) => arg?.kind === "QualifiedRef" && arg.text === "on";
5
+ /** The `on <target>` clause of a note's statement, or undefined when it has none. */
6
+ export function attachmentArgs(note) {
7
+ const node = note.node;
8
+ if (note.kind !== "note" || node?.kind !== "KeywordStatement")
9
+ return undefined;
10
+ const args = node.args;
11
+ const at = args.findIndex((arg, i) => i >= 2 && isOn(arg));
12
+ const target = args[at + 1];
13
+ return at < 0 || !target ? undefined : { before: args[at - 1], word: args[at], target };
14
+ }
15
+ /** The edit that takes ` on <target>` out of a note's statement, keeping its block and comments. */
16
+ export function stripAttachment(note) {
17
+ const clause = attachmentArgs(note);
18
+ return clause && { start: clause.before.end, end: clause.target.end, newText: "" };
19
+ }
20
+ /**
21
+ * A note attached to something about to go, as a dependent of the removal and the edit that
22
+ * leaves the note without its clause: a note's text is the person's words, so it stays.
23
+ */
24
+ export function attachmentDependent(ctx, note) {
25
+ const edit = stripAttachment(note);
26
+ if (!edit || !note.node)
27
+ return undefined;
28
+ const lines = ctx.compilation.parse.lines;
29
+ return {
30
+ edit,
31
+ dependent: {
32
+ kind: "attachment",
33
+ name: note.id,
34
+ description: messages().dependents.attachment(note.id, lines.location(note.node.start).line),
35
+ range: lines.range(note.node),
36
+ },
37
+ };
38
+ }
39
+ /** Whether `path` is an element a note of the diagram may be attached to. */
40
+ function attachable(ctx, note, path) {
41
+ if (path === note.id)
42
+ return false;
43
+ const element = ctx.diagram.elementsById.get(path);
44
+ // A view draws entities, and notes attach to what it draws.
45
+ return ctx.diagram.type === "c4" ? element?.entity != null : element !== undefined;
46
+ }
47
+ /**
48
+ * Writes, replaces or removes the `on <element>` clause of a note, in the same declaration and
49
+ * with the smallest edit: the clause follows the note's text and the block stays where it is.
50
+ */
51
+ export function attachNote(ctx, op) {
52
+ const note = requireElement(ctx, op.note);
53
+ const r = reasons().attach;
54
+ if (note.kind !== "note" || note.node?.kind !== "KeywordStatement") {
55
+ reject("edit.invalid-value", r.onlyNotes(note.id, note.kind));
56
+ }
57
+ const clause = attachmentArgs(note);
58
+ const node = note.node;
59
+ if (op.element === null) {
60
+ const edit = stripAttachment(note);
61
+ return edit ? [edit] : [];
62
+ }
63
+ if (op.element === note.id)
64
+ reject("edit.invalid-value", r.self(note.id));
65
+ if (!attachable(ctx, note, op.element)) {
66
+ if (ctx.diagram.type === "c4") {
67
+ reject("edit.unsafe-target", r.notDrawn(op.element, ctx.diagram.id));
68
+ }
69
+ requireElement(ctx, op.element);
70
+ }
71
+ if (clause?.target.kind === "QualifiedRef" && clause.target.text === op.element)
72
+ return [];
73
+ const edits = clause
74
+ ? [{ start: clause.target.start, end: clause.target.end, newText: op.element }]
75
+ : [
76
+ {
77
+ start: (node.args[1] ?? node.args[0]).end,
78
+ end: (node.args[1] ?? node.args[0]).end,
79
+ newText: ` on ${op.element}`,
80
+ },
81
+ ];
82
+ verifyNoNewErrors(ctx, edits);
83
+ return edits;
84
+ }
85
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type TextEdit } from "@meltemi/diagrams-language";
2
+ import { type Compilation } from "@meltemi/diagrams-model";
3
+ import type { EditOperation, PlanOptions, PlanResult } from "./types.js";
4
+ /**
5
+ * One set of edits against `base` doing what `first` does and then `second`, given against the
6
+ * text `first` leaves.
7
+ */
8
+ export declare function composeEdits(base: string, first: readonly TextEdit[], second: readonly TextEdit[]): TextEdit[];
9
+ /**
10
+ * Plans several operations as one edit against the compiled text: each one is planned on the
11
+ * text left by the previous ones, and the results are composed back onto the base text. A
12
+ * refusal of any operation refuses the batch and names the operation.
13
+ */
14
+ export declare function planBatch(compilation: Compilation, operations: readonly EditOperation[], options: PlanOptions & {
15
+ /** Plans one operation; `planEdit`, passed in to keep the modules acyclic. */
16
+ readonly plan: (compilation: Compilation, operation: EditOperation) => PlanResult;
17
+ }): PlanResult;
18
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAY,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkFnF;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,MAAM,EAAE,SAAS,QAAQ,EAAE,GAC1B,QAAQ,EAAE,CAKZ;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,SAAS,aAAa,EAAE,EACpC,OAAO,EAAE,WAAW,GAAG;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,KAAK,UAAU,CAAC;CACnF,GACA,UAAU,CA0BZ"}
package/dist/batch.js ADDED
@@ -0,0 +1,120 @@
1
+ import { applyTextEdits, invertTextEdits, normalizeTextEdits, } from "@meltemi/diagrams-language";
2
+ import { compile } from "@meltemi/diagrams-model";
3
+ const pieceLength = (piece) => piece.kind === "base" ? piece.end - piece.start : piece.text.length;
4
+ /** Cuts `pieces` at `offset` of the text they spell, so that a piece boundary falls there. */
5
+ function splitAt(pieces, offset) {
6
+ let position = 0;
7
+ for (let i = 0; i < pieces.length; i++) {
8
+ const piece = pieces[i];
9
+ const length = pieceLength(piece);
10
+ if (offset === position)
11
+ return i;
12
+ if (offset < position + length) {
13
+ const cut = offset - position;
14
+ const [left, right] = piece.kind === "base"
15
+ ? [
16
+ { kind: "base", start: piece.start, end: piece.start + cut },
17
+ { kind: "base", start: piece.start + cut, end: piece.end },
18
+ ]
19
+ : [
20
+ { kind: "new", text: piece.text.slice(0, cut) },
21
+ { kind: "new", text: piece.text.slice(cut) },
22
+ ];
23
+ pieces.splice(i, 1, left, right);
24
+ return i + 1;
25
+ }
26
+ position += length;
27
+ }
28
+ return pieces.length;
29
+ }
30
+ /** Applies edits, given against the text the pieces spell, to the pieces. */
31
+ function applyToPieces(pieces, text, edits) {
32
+ // From the end, so earlier offsets stay valid.
33
+ const sorted = normalizeTextEdits(text, edits);
34
+ for (let k = sorted.length - 1; k >= 0; k--) {
35
+ const edit = sorted[k];
36
+ // Split at the start first: splitting at the end never moves the start's index.
37
+ const start = splitAt(pieces, edit.start);
38
+ const end = splitAt(pieces, edit.end);
39
+ const inserted = edit.newText === "" ? [] : [{ kind: "new", text: edit.newText }];
40
+ pieces.splice(start, end - start, ...inserted);
41
+ }
42
+ }
43
+ /**
44
+ * The edits against the base text that produce the text the pieces spell. Base text that
45
+ * survives in place is untouched; everything between two surviving runs becomes one edit.
46
+ */
47
+ function editsFromPieces(pieces, baseLength) {
48
+ const edits = [];
49
+ let cursor = 0;
50
+ let pending = "";
51
+ let pendingStart = null;
52
+ const flush = (end) => {
53
+ if (pendingStart !== null || end > cursor) {
54
+ const start = pendingStart ?? cursor;
55
+ edits.push({ start, end, newText: pending });
56
+ }
57
+ pending = "";
58
+ pendingStart = null;
59
+ };
60
+ for (const piece of pieces) {
61
+ if (piece.kind === "new") {
62
+ pendingStart ??= cursor;
63
+ pending += piece.text;
64
+ continue;
65
+ }
66
+ if (piece.start === piece.end)
67
+ continue;
68
+ if (piece.start !== cursor || pendingStart !== null)
69
+ flush(piece.start);
70
+ cursor = piece.end;
71
+ }
72
+ if (pendingStart !== null || cursor < baseLength)
73
+ flush(baseLength);
74
+ return edits;
75
+ }
76
+ /**
77
+ * One set of edits against `base` doing what `first` does and then `second`, given against the
78
+ * text `first` leaves.
79
+ */
80
+ export function composeEdits(base, first, second) {
81
+ const pieces = base.length > 0 ? [{ kind: "base", start: 0, end: base.length }] : [];
82
+ applyToPieces(pieces, base, first);
83
+ applyToPieces(pieces, applyTextEdits(base, first), second);
84
+ return editsFromPieces(pieces, base.length);
85
+ }
86
+ /**
87
+ * Plans several operations as one edit against the compiled text: each one is planned on the
88
+ * text left by the previous ones, and the results are composed back onto the base text. A
89
+ * refusal of any operation refuses the batch and names the operation.
90
+ */
91
+ export function planBatch(compilation, operations, options) {
92
+ const base = compilation.text;
93
+ const pieces = base.length > 0 ? [{ kind: "base", start: 0, end: base.length }] : [];
94
+ const notes = [];
95
+ let current = compilation;
96
+ let text = base;
97
+ for (let i = 0; i < operations.length; i++) {
98
+ const result = options.plan(current, operations[i]);
99
+ if (!result.ok) {
100
+ return { ok: false, rejection: { ...result.rejection, operationIndex: i } };
101
+ }
102
+ notes.push(...result.plan.notes);
103
+ if (result.plan.edits.length === 0)
104
+ continue;
105
+ applyToPieces(pieces, text, result.plan.edits);
106
+ text = applyTextEdits(text, result.plan.edits);
107
+ if (i < operations.length - 1)
108
+ current = compile(text, compilation.options);
109
+ }
110
+ const edits = editsFromPieces(pieces, base.length);
111
+ const plan = {
112
+ operation: operations.length === 1 ? operations[0] : { kind: "batch", operations },
113
+ baseRevision: options.revision ?? 0,
114
+ edits,
115
+ inverse: invertTextEdits(base, edits),
116
+ notes,
117
+ };
118
+ return { ok: true, plan };
119
+ }
120
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"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"}