@meltemi/diagrams-edit 0.0.0-stage → 1.9.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 (99) 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/batch.d.ts +18 -0
  8. package/dist/batch.d.ts.map +1 -0
  9. package/dist/batch.js +120 -0
  10. package/dist/batch.js.map +1 -0
  11. package/dist/c4.d.ts +30 -0
  12. package/dist/c4.d.ts.map +1 -0
  13. package/dist/c4.js +676 -0
  14. package/dist/c4.js.map +1 -0
  15. package/dist/context.d.ts +36 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +133 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/create.d.ts +28 -0
  20. package/dist/create.d.ts.map +1 -0
  21. package/dist/create.js +200 -0
  22. package/dist/create.js.map +1 -0
  23. package/dist/delete.d.ts +10 -0
  24. package/dist/delete.d.ts.map +1 -0
  25. package/dist/delete.js +150 -0
  26. package/dist/delete.js.map +1 -0
  27. package/dist/diagrams.d.ts +19 -0
  28. package/dist/diagrams.d.ts.map +1 -0
  29. package/dist/diagrams.js +92 -0
  30. package/dist/diagrams.js.map +1 -0
  31. package/dist/free.d.ts +54 -0
  32. package/dist/free.d.ts.map +1 -0
  33. package/dist/free.js +596 -0
  34. package/dist/free.js.map +1 -0
  35. package/dist/index.d.ts +12 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +11 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/insert.d.ts +41 -0
  40. package/dist/insert.d.ts.map +1 -0
  41. package/dist/insert.js +165 -0
  42. package/dist/insert.js.map +1 -0
  43. package/dist/labels.d.ts +8 -0
  44. package/dist/labels.d.ts.map +1 -0
  45. package/dist/labels.js +186 -0
  46. package/dist/labels.js.map +1 -0
  47. package/dist/messages/en.d.ts +525 -0
  48. package/dist/messages/en.d.ts.map +1 -0
  49. package/dist/messages/en.js +519 -0
  50. package/dist/messages/en.js.map +1 -0
  51. package/dist/messages/es.d.ts +3 -0
  52. package/dist/messages/es.d.ts.map +1 -0
  53. package/dist/messages/es.js +366 -0
  54. package/dist/messages/es.js.map +1 -0
  55. package/dist/messages/index.d.ts +288 -0
  56. package/dist/messages/index.d.ts.map +1 -0
  57. package/dist/messages/index.js +15 -0
  58. package/dist/messages/index.js.map +1 -0
  59. package/dist/plan.d.ts +24 -0
  60. package/dist/plan.d.ts.map +1 -0
  61. package/dist/plan.js +881 -0
  62. package/dist/plan.js.map +1 -0
  63. package/dist/relations.d.ts +19 -0
  64. package/dist/relations.d.ts.map +1 -0
  65. package/dist/relations.js +167 -0
  66. package/dist/relations.js.map +1 -0
  67. package/dist/routes.d.ts +21 -0
  68. package/dist/routes.d.ts.map +1 -0
  69. package/dist/routes.js +37 -0
  70. package/dist/routes.js.map +1 -0
  71. package/dist/sequence.d.ts +44 -0
  72. package/dist/sequence.d.ts.map +1 -0
  73. package/dist/sequence.js +695 -0
  74. package/dist/sequence.js.map +1 -0
  75. package/dist/stories.d.ts +23 -0
  76. package/dist/stories.d.ts.map +1 -0
  77. package/dist/stories.js +238 -0
  78. package/dist/stories.js.map +1 -0
  79. package/dist/structure.d.ts +29 -0
  80. package/dist/structure.d.ts.map +1 -0
  81. package/dist/structure.js +541 -0
  82. package/dist/structure.js.map +1 -0
  83. package/dist/styles.d.ts +11 -0
  84. package/dist/styles.d.ts.map +1 -0
  85. package/dist/styles.js +219 -0
  86. package/dist/styles.js.map +1 -0
  87. package/dist/text.d.ts +26 -0
  88. package/dist/text.d.ts.map +1 -0
  89. package/dist/text.js +59 -0
  90. package/dist/text.js.map +1 -0
  91. package/dist/themes.d.ts +9 -0
  92. package/dist/themes.d.ts.map +1 -0
  93. package/dist/themes.js +110 -0
  94. package/dist/themes.js.map +1 -0
  95. package/dist/types.d.ts +639 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. 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,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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"}
package/dist/c4.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { type Statement, type TextEdit } from "@meltemi/diagrams-language";
2
+ import { type Compilation, type EntityReference, type FlowDiagram, type ModelDefinition } from "@meltemi/diagrams-model";
3
+ import { type EditContext, type TextContext } from "./context.js";
4
+ import { type OperationOf } from "./plan.js";
5
+ /** Refuses an operation that does not apply to a C4 view, naming the ones that do. */
6
+ export declare function refuseInView(ctx: EditContext, kind: string): void;
7
+ /** Relations of the view that are combinations written in it, not model relations. */
8
+ export declare function isCombination(diagram: FlowDiagram, key: string): boolean;
9
+ export declare function includeEntity(ctx: EditContext, op: OperationOf<"includeEntity">): TextEdit[];
10
+ export declare function excludeEntity(ctx: EditContext, op: OperationOf<"excludeEntity">): TextEdit[];
11
+ export declare function setLocalLabel(ctx: EditContext, op: OperationOf<"setLocalLabel">): TextEdit[];
12
+ /** What model operations work on: the text and one model of it. */
13
+ export interface ModelContext extends TextContext {
14
+ readonly model: ModelDefinition;
15
+ }
16
+ export declare function createModelContext(ctx: TextContext, id: string): ModelContext;
17
+ /**
18
+ * Every reference of the file to entities of the model: in the model, its views, links and the
19
+ * stories of its views.
20
+ */
21
+ export declare function entityReferences(compilation: Compilation, model: ModelDefinition): EntityReference[];
22
+ export declare function renameEntity(ctx: ModelContext, op: OperationOf<"renameEntity">): TextEdit[];
23
+ export declare function removeEntity(ctx: ModelContext, op: OperationOf<"removeEntity">): TextEdit[];
24
+ export declare function setEntityProperty(ctx: ModelContext, op: OperationOf<"setEntityProperty">): TextEdit[];
25
+ export declare function createEntity(ctx: ModelContext, op: OperationOf<"createEntity">): TextEdit[];
26
+ export declare function createModelRelation(ctx: ModelContext, op: OperationOf<"createModelRelation">): TextEdit[];
27
+ export declare function removeModelRelation(ctx: ModelContext, op: OperationOf<"removeModelRelation">): TextEdit[];
28
+ export declare function setModelRelationProperty(ctx: ModelContext, op: OperationOf<"setModelRelationProperty">): TextEdit[];
29
+ export type { Statement };
30
+ //# sourceMappingURL=c4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4.d.ts","sourceRoot":"","sources":["../src/c4.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,QAAQ,EAEd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3F,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA0B9D,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGjE;AAQD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAExE;AAqCD,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,eAAe,CAAC,GAAG,QAAQ,EAAE,CAuB5F;AAyED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,eAAe,CAAC,GAAG,QAAQ,EAAE,CA+B5F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,eAAe,CAAC,GAAG,QAAQ,EAAE,CAgC5F;AAID,mEAAmE;AACnE,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;CACjC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAK7E;AAoBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,eAAe,GACrB,eAAe,EAAE,CAmBnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,QAAQ,EAAE,CAqB3F;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,QAAQ,EAAE,CAkH3F;AA0CD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,YAAY,EACjB,EAAE,EAAE,WAAW,CAAC,mBAAmB,CAAC,GACnC,QAAQ,EAAE,CAoDZ;AAUD,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,QAAQ,EAAE,CAyC3F;AAOD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,YAAY,EACjB,EAAE,EAAE,WAAW,CAAC,qBAAqB,CAAC,GACrC,QAAQ,EAAE,CAuBZ;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,YAAY,EACjB,EAAE,EAAE,WAAW,CAAC,qBAAqB,CAAC,GACrC,QAAQ,EAAE,CAwBZ;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,YAAY,EACjB,EAAE,EAAE,WAAW,CAAC,0BAA0B,CAAC,GAC1C,QAAQ,EAAE,CAiEZ;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}