@typespec/mutator-framework 0.12.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/mutation/index.d.ts +13 -0
  7. package/dist/src/mutation/index.d.ts.map +1 -0
  8. package/dist/src/mutation/index.js +13 -0
  9. package/dist/src/mutation/index.js.map +1 -0
  10. package/dist/src/mutation/interface.d.ts +11 -0
  11. package/dist/src/mutation/interface.d.ts.map +1 -0
  12. package/dist/src/mutation/interface.js +17 -0
  13. package/dist/src/mutation/interface.js.map +1 -0
  14. package/dist/src/mutation/intrinsic.d.ts +9 -0
  15. package/dist/src/mutation/intrinsic.d.ts.map +1 -0
  16. package/dist/src/mutation/intrinsic.js +11 -0
  17. package/dist/src/mutation/intrinsic.js.map +1 -0
  18. package/dist/src/mutation/literal.d.ts +9 -0
  19. package/dist/src/mutation/literal.d.ts.map +1 -0
  20. package/dist/src/mutation/literal.js +11 -0
  21. package/dist/src/mutation/literal.js.map +1 -0
  22. package/dist/src/mutation/model-property.d.ts +12 -0
  23. package/dist/src/mutation/model-property.d.ts.map +1 -0
  24. package/dist/src/mutation/model-property.js +18 -0
  25. package/dist/src/mutation/model-property.js.map +1 -0
  26. package/dist/src/mutation/model.d.ts +18 -0
  27. package/dist/src/mutation/model.d.ts.map +1 -0
  28. package/dist/src/mutation/model.js +34 -0
  29. package/dist/src/mutation/model.js.map +1 -0
  30. package/dist/src/mutation/mutation-engine.d.ts +80 -0
  31. package/dist/src/mutation/mutation-engine.d.ts.map +1 -0
  32. package/dist/src/mutation/mutation-engine.js +165 -0
  33. package/dist/src/mutation/mutation-engine.js.map +1 -0
  34. package/dist/src/mutation/mutation-engine.test.d.ts +2 -0
  35. package/dist/src/mutation/mutation-engine.test.d.ts.map +1 -0
  36. package/dist/src/mutation/mutation-engine.test.js +145 -0
  37. package/dist/src/mutation/mutation-engine.test.js.map +1 -0
  38. package/dist/src/mutation/mutation.d.ts +45 -0
  39. package/dist/src/mutation/mutation.d.ts.map +1 -0
  40. package/dist/src/mutation/mutation.js +29 -0
  41. package/dist/src/mutation/mutation.js.map +1 -0
  42. package/dist/src/mutation/operation.d.ts +13 -0
  43. package/dist/src/mutation/operation.d.ts.map +1 -0
  44. package/dist/src/mutation/operation.js +20 -0
  45. package/dist/src/mutation/operation.js.map +1 -0
  46. package/dist/src/mutation/scalar.d.ts +11 -0
  47. package/dist/src/mutation/scalar.d.ts.map +1 -0
  48. package/dist/src/mutation/scalar.js +17 -0
  49. package/dist/src/mutation/scalar.js.map +1 -0
  50. package/dist/src/mutation/simple-mutation-engine.d.ts +8 -0
  51. package/dist/src/mutation/simple-mutation-engine.d.ts.map +1 -0
  52. package/dist/src/mutation/simple-mutation-engine.js +11 -0
  53. package/dist/src/mutation/simple-mutation-engine.js.map +1 -0
  54. package/dist/src/mutation/union-variant.d.ts +10 -0
  55. package/dist/src/mutation/union-variant.d.ts.map +1 -0
  56. package/dist/src/mutation/union-variant.js +12 -0
  57. package/dist/src/mutation/union-variant.js.map +1 -0
  58. package/dist/src/mutation/union.d.ts +11 -0
  59. package/dist/src/mutation/union.d.ts.map +1 -0
  60. package/dist/src/mutation/union.js +18 -0
  61. package/dist/src/mutation/union.js.map +1 -0
  62. package/dist/src/mutation-node/enum-member.d.ts +7 -0
  63. package/dist/src/mutation-node/enum-member.d.ts.map +1 -0
  64. package/dist/src/mutation-node/enum-member.js +6 -0
  65. package/dist/src/mutation-node/enum-member.js.map +1 -0
  66. package/dist/src/mutation-node/enum-member.test.d.ts +2 -0
  67. package/dist/src/mutation-node/enum-member.test.d.ts.map +1 -0
  68. package/dist/src/mutation-node/enum-member.test.js +25 -0
  69. package/dist/src/mutation-node/enum-member.test.js.map +1 -0
  70. package/dist/src/mutation-node/enum.d.ts +8 -0
  71. package/dist/src/mutation-node/enum.d.ts.map +1 -0
  72. package/dist/src/mutation-node/enum.js +30 -0
  73. package/dist/src/mutation-node/enum.js.map +1 -0
  74. package/dist/src/mutation-node/enum.test.d.ts +2 -0
  75. package/dist/src/mutation-node/enum.test.d.ts.map +1 -0
  76. package/dist/src/mutation-node/enum.test.js +25 -0
  77. package/dist/src/mutation-node/enum.test.js.map +1 -0
  78. package/dist/src/mutation-node/factory.d.ts +17 -0
  79. package/dist/src/mutation-node/factory.d.ts.map +1 -0
  80. package/dist/src/mutation-node/factory.js +45 -0
  81. package/dist/src/mutation-node/factory.js.map +1 -0
  82. package/dist/src/mutation-node/index.d.ts +15 -0
  83. package/dist/src/mutation-node/index.d.ts.map +1 -0
  84. package/dist/src/mutation-node/index.js +16 -0
  85. package/dist/src/mutation-node/index.js.map +1 -0
  86. package/dist/src/mutation-node/interface.d.ts +8 -0
  87. package/dist/src/mutation-node/interface.d.ts.map +1 -0
  88. package/dist/src/mutation-node/interface.js +30 -0
  89. package/dist/src/mutation-node/interface.js.map +1 -0
  90. package/dist/src/mutation-node/intrinsic.d.ts +7 -0
  91. package/dist/src/mutation-node/intrinsic.d.ts.map +1 -0
  92. package/dist/src/mutation-node/intrinsic.js +6 -0
  93. package/dist/src/mutation-node/intrinsic.js.map +1 -0
  94. package/dist/src/mutation-node/literal.d.ts +7 -0
  95. package/dist/src/mutation-node/literal.d.ts.map +1 -0
  96. package/dist/src/mutation-node/literal.js +6 -0
  97. package/dist/src/mutation-node/literal.js.map +1 -0
  98. package/dist/src/mutation-node/model-property.d.ts +10 -0
  99. package/dist/src/mutation-node/model-property.d.ts.map +1 -0
  100. package/dist/src/mutation-node/model-property.js +48 -0
  101. package/dist/src/mutation-node/model-property.js.map +1 -0
  102. package/dist/src/mutation-node/model-property.test.d.ts +2 -0
  103. package/dist/src/mutation-node/model-property.test.d.ts.map +1 -0
  104. package/dist/src/mutation-node/model-property.test.js +108 -0
  105. package/dist/src/mutation-node/model-property.test.js.map +1 -0
  106. package/dist/src/mutation-node/model.d.ts +10 -0
  107. package/dist/src/mutation-node/model.d.ts.map +1 -0
  108. package/dist/src/mutation-node/model.js +82 -0
  109. package/dist/src/mutation-node/model.js.map +1 -0
  110. package/dist/src/mutation-node/model.test.d.ts +2 -0
  111. package/dist/src/mutation-node/model.test.d.ts.map +1 -0
  112. package/dist/src/mutation-node/model.test.js +133 -0
  113. package/dist/src/mutation-node/model.test.js.map +1 -0
  114. package/dist/src/mutation-node/mutation-edge.d.ts +18 -0
  115. package/dist/src/mutation-node/mutation-edge.d.ts.map +1 -0
  116. package/dist/src/mutation-node/mutation-edge.js +31 -0
  117. package/dist/src/mutation-node/mutation-edge.js.map +1 -0
  118. package/dist/src/mutation-node/mutation-node.d.ts +29 -0
  119. package/dist/src/mutation-node/mutation-node.d.ts.map +1 -0
  120. package/dist/src/mutation-node/mutation-node.js +82 -0
  121. package/dist/src/mutation-node/mutation-node.js.map +1 -0
  122. package/dist/src/mutation-node/mutation-node.test.d.ts +2 -0
  123. package/dist/src/mutation-node/mutation-node.test.d.ts.map +1 -0
  124. package/dist/src/mutation-node/mutation-node.test.js +88 -0
  125. package/dist/src/mutation-node/mutation-node.test.js.map +1 -0
  126. package/dist/src/mutation-node/mutation-subgraph.d.ts +17 -0
  127. package/dist/src/mutation-node/mutation-subgraph.d.ts.map +1 -0
  128. package/dist/src/mutation-node/mutation-subgraph.js +45 -0
  129. package/dist/src/mutation-node/mutation-subgraph.js.map +1 -0
  130. package/dist/src/mutation-node/operation.d.ts +9 -0
  131. package/dist/src/mutation-node/operation.d.ts.map +1 -0
  132. package/dist/src/mutation-node/operation.js +44 -0
  133. package/dist/src/mutation-node/operation.js.map +1 -0
  134. package/dist/src/mutation-node/scalar.d.ts +8 -0
  135. package/dist/src/mutation-node/scalar.d.ts.map +1 -0
  136. package/dist/src/mutation-node/scalar.js +28 -0
  137. package/dist/src/mutation-node/scalar.js.map +1 -0
  138. package/dist/src/mutation-node/scalar.test.d.ts +2 -0
  139. package/dist/src/mutation-node/scalar.test.d.ts.map +1 -0
  140. package/dist/src/mutation-node/scalar.test.js +40 -0
  141. package/dist/src/mutation-node/scalar.test.js.map +1 -0
  142. package/dist/src/mutation-node/tuple.d.ts +9 -0
  143. package/dist/src/mutation-node/tuple.d.ts.map +1 -0
  144. package/dist/src/mutation-node/tuple.js +32 -0
  145. package/dist/src/mutation-node/tuple.js.map +1 -0
  146. package/dist/src/mutation-node/tuple.test.d.ts +2 -0
  147. package/dist/src/mutation-node/tuple.test.d.ts.map +1 -0
  148. package/dist/src/mutation-node/tuple.test.js +29 -0
  149. package/dist/src/mutation-node/tuple.test.js.map +1 -0
  150. package/dist/src/mutation-node/union-variant.d.ts +8 -0
  151. package/dist/src/mutation-node/union-variant.d.ts.map +1 -0
  152. package/dist/src/mutation-node/union-variant.js +23 -0
  153. package/dist/src/mutation-node/union-variant.js.map +1 -0
  154. package/dist/src/mutation-node/union-variant.test.d.ts +2 -0
  155. package/dist/src/mutation-node/union-variant.test.d.ts.map +1 -0
  156. package/dist/src/mutation-node/union-variant.test.js +27 -0
  157. package/dist/src/mutation-node/union-variant.test.js.map +1 -0
  158. package/dist/src/mutation-node/union.d.ts +8 -0
  159. package/dist/src/mutation-node/union.d.ts.map +1 -0
  160. package/dist/src/mutation-node/union.js +30 -0
  161. package/dist/src/mutation-node/union.js.map +1 -0
  162. package/dist/src/mutation-node/union.test.d.ts +2 -0
  163. package/dist/src/mutation-node/union.test.d.ts.map +1 -0
  164. package/dist/src/mutation-node/union.test.js +25 -0
  165. package/dist/src/mutation-node/union.test.js.map +1 -0
  166. package/dist/test/test-host.d.ts +2 -0
  167. package/dist/test/test-host.d.ts.map +1 -0
  168. package/dist/test/test-host.js +6 -0
  169. package/dist/test/test-host.js.map +1 -0
  170. package/dist/test/utils.d.ts +4 -0
  171. package/dist/test/utils.d.ts.map +1 -0
  172. package/dist/test/utils.js +8 -0
  173. package/dist/test/utils.js.map +1 -0
  174. package/package.json +40 -0
  175. package/package.json.bak +42 -0
  176. package/readme.md +339 -0
  177. package/src/index.ts +4 -0
  178. package/src/mutation/index.ts +12 -0
  179. package/src/mutation/interface.ts +38 -0
  180. package/src/mutation/intrinsic.ts +23 -0
  181. package/src/mutation/literal.ts +29 -0
  182. package/src/mutation/model-property.ts +35 -0
  183. package/src/mutation/model.ts +58 -0
  184. package/src/mutation/mutation-engine.test.ts +202 -0
  185. package/src/mutation/mutation-engine.ts +288 -0
  186. package/src/mutation/mutation.ts +90 -0
  187. package/src/mutation/operation.ts +40 -0
  188. package/src/mutation/scalar.ts +36 -0
  189. package/src/mutation/simple-mutation-engine.ts +21 -0
  190. package/src/mutation/union-variant.ts +30 -0
  191. package/src/mutation/union.ts +39 -0
  192. package/src/mutation-node/enum-member.test.ts +26 -0
  193. package/src/mutation-node/enum-member.ts +8 -0
  194. package/src/mutation-node/enum.test.ts +26 -0
  195. package/src/mutation-node/enum.ts +33 -0
  196. package/src/mutation-node/factory.ts +95 -0
  197. package/src/mutation-node/index.ts +16 -0
  198. package/src/mutation-node/interface.ts +33 -0
  199. package/src/mutation-node/intrinsic.ts +8 -0
  200. package/src/mutation-node/literal.ts +10 -0
  201. package/src/mutation-node/model-property.test.ts +136 -0
  202. package/src/mutation-node/model-property.ts +53 -0
  203. package/src/mutation-node/model.test.ts +151 -0
  204. package/src/mutation-node/model.ts +89 -0
  205. package/src/mutation-node/mutation-edge.ts +43 -0
  206. package/src/mutation-node/mutation-node.test.ts +94 -0
  207. package/src/mutation-node/mutation-node.ts +110 -0
  208. package/src/mutation-node/mutation-subgraph.ts +59 -0
  209. package/src/mutation-node/operation.ts +49 -0
  210. package/src/mutation-node/scalar.test.ts +44 -0
  211. package/src/mutation-node/scalar.ts +32 -0
  212. package/src/mutation-node/tuple.test.ts +30 -0
  213. package/src/mutation-node/tuple.ts +35 -0
  214. package/src/mutation-node/union-variant.test.ts +28 -0
  215. package/src/mutation-node/union-variant.ts +26 -0
  216. package/src/mutation-node/union.test.ts +26 -0
  217. package/src/mutation-node/union.ts +33 -0
  218. package/test/test-host.ts +6 -0
  219. package/test/utils.ts +9 -0
  220. package/tsconfig.json +19 -0
  221. package/vitest.config.ts +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.test.js","sourceRoot":"","sources":["../../../src/mutation-node/model.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Type } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export interface MutationEdgeOptions {
4
+ onTailMutation: () => void;
5
+ onTailDeletion: () => void;
6
+ onTailReplaced: (newTail: MutationNode<Type>) => void;
7
+ }
8
+ export declare class MutationEdge<THead extends Type, TTail extends Type> {
9
+ #private;
10
+ head: MutationNode<THead>;
11
+ tail: MutationNode<TTail>;
12
+ constructor(head: MutationNode<THead>, tail: MutationNode<TTail>, options: MutationEdgeOptions);
13
+ static create(head: MutationNode<Type>, tail: MutationNode<Type>, options: MutationEdgeOptions): MutationEdge<Type, Type>;
14
+ tailMutated(): void;
15
+ tailDeleted(): void;
16
+ tailReplaced(newTail: MutationNode<TTail>): void;
17
+ }
18
+ //# sourceMappingURL=mutation-edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-edge.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/mutation-edge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;CACvD;AAED,qBAAa,YAAY,CAAC,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI;;IACvD,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAGrB,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mBAAmB;IAO9F,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB;IAI9F,WAAW,IAAI,IAAI;IAKnB,WAAW;IAKX,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC;CAO1C"}
@@ -0,0 +1,31 @@
1
+ import { MutationNode } from "./mutation-node.js";
2
+ export class MutationEdge {
3
+ head;
4
+ tail;
5
+ #options;
6
+ constructor(head, tail, options) {
7
+ this.head = head;
8
+ this.tail = tail;
9
+ this.#options = options;
10
+ this.tail.addInEdge(this);
11
+ }
12
+ static create(head, tail, options) {
13
+ return new MutationEdge(head, tail, options);
14
+ }
15
+ tailMutated() {
16
+ this.head.mutate();
17
+ this.#options.onTailMutation();
18
+ }
19
+ tailDeleted() {
20
+ this.head.mutate();
21
+ this.#options.onTailDeletion();
22
+ }
23
+ tailReplaced(newTail) {
24
+ this.head.mutate();
25
+ this.tail.deleteInEdge(this);
26
+ this.tail = newTail;
27
+ this.tail.addInEdge(this);
28
+ this.#options.onTailReplaced(newTail);
29
+ }
30
+ }
31
+ //# sourceMappingURL=mutation-edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-edge.js","sourceRoot":"","sources":["../../../src/mutation-node/mutation-edge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,OAAO,YAAY;IAChB,IAAI,CAAsB;IAC1B,IAAI,CAAsB;IACjC,QAAQ,CAAsB;IAE9B,YAAY,IAAyB,EAAE,IAAyB,EAAE,OAA4B;QAC5F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAwB,EAAE,IAAwB,EAAE,OAA4B;QAC5F,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,OAA4B;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type { MemberType, Type } from "@typespec/compiler";
2
+ import type { Typekit } from "@typespec/compiler/typekit";
3
+ import { type MutationNodeForType } from "./factory.js";
4
+ import type { MutationEdge } from "./mutation-edge.js";
5
+ import type { MutationSubgraph } from "./mutation-subgraph.js";
6
+ export declare abstract class MutationNode<T extends Type> {
7
+ #private;
8
+ abstract readonly kind: string;
9
+ id: number;
10
+ sourceType: T;
11
+ mutatedType: T;
12
+ isMutated: boolean;
13
+ isDeleted: boolean;
14
+ isReplaced: boolean;
15
+ replacementNode: MutationNodeForType<Type> | null;
16
+ inEdges: Set<MutationEdge<Type, Type>>;
17
+ subgraph: MutationSubgraph;
18
+ referenceType: MemberType | null;
19
+ $: Typekit;
20
+ constructor(subgraph: MutationSubgraph, sourceNode: T);
21
+ abstract traverse(): void;
22
+ addInEdge(edge: MutationEdge<Type, Type>): void;
23
+ deleteInEdge(edge: MutationEdge<Type, Type>): void;
24
+ whenMutated(cb: (mutatedType: T | null) => void): void;
25
+ mutate(initializeMutation?: (type: T) => void): void;
26
+ delete(): void;
27
+ replace(newType: Type): this | MutationNodeForType<Type>;
28
+ }
29
+ //# sourceMappingURL=mutation-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-node.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/mutation-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,8BAAsB,YAAY,CAAC,CAAC,SAAS,IAAI;;IAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,EAAE,SAAY;IACd,UAAU,EAAE,CAAC,CAAC;IACd,WAAW,EAAE,CAAC,CAAC;IACf,SAAS,EAAE,OAAO,CAAS;IAC3B,SAAS,EAAE,OAAO,CAAS;IAC3B,UAAU,EAAE,OAAO,CAAS;IAC5B,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAQ;IACzD,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAa;IACnD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAQ;IACxC,CAAC,EAAE,OAAO,CAAC;gBAIC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAOrD,QAAQ,CAAC,QAAQ,IAAI,IAAI;IAEzB,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;IAIxC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;IAI3C,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI;IAI/C,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI;IAmB7C,MAAM;IAkBN,OAAO,CAAC,OAAO,EAAE,IAAI;CA0BtB"}
@@ -0,0 +1,82 @@
1
+ import { mutationNodeFor } from "./factory.js";
2
+ let nextId = 0;
3
+ export class MutationNode {
4
+ id = nextId++;
5
+ sourceType;
6
+ mutatedType;
7
+ isMutated = false;
8
+ isDeleted = false;
9
+ isReplaced = false;
10
+ replacementNode = null;
11
+ inEdges = new Set();
12
+ subgraph;
13
+ referenceType = null;
14
+ $;
15
+ #whenMutatedCallbacks = [];
16
+ constructor(subgraph, sourceNode) {
17
+ this.subgraph = subgraph;
18
+ this.$ = this.subgraph.engine.$;
19
+ this.sourceType = sourceNode;
20
+ this.mutatedType = sourceNode;
21
+ }
22
+ addInEdge(edge) {
23
+ this.inEdges.add(edge);
24
+ }
25
+ deleteInEdge(edge) {
26
+ this.inEdges.delete(edge);
27
+ }
28
+ whenMutated(cb) {
29
+ this.#whenMutatedCallbacks.push(cb);
30
+ }
31
+ mutate(initializeMutation) {
32
+ if (this.isMutated || this.isDeleted || this.isReplaced) {
33
+ return;
34
+ }
35
+ this.mutatedType = this.$.type.clone(this.sourceType);
36
+ this.isMutated = true;
37
+ initializeMutation?.(this.mutatedType);
38
+ for (const cb of this.#whenMutatedCallbacks) {
39
+ cb(this.mutatedType);
40
+ }
41
+ for (const edge of this.inEdges) {
42
+ edge.tailMutated();
43
+ }
44
+ this.$.type.finishType(this.mutatedType);
45
+ }
46
+ delete() {
47
+ if (this.isMutated || this.isDeleted || this.isReplaced) {
48
+ return;
49
+ }
50
+ this.isDeleted = true;
51
+ for (const cb of this.#whenMutatedCallbacks) {
52
+ cb(null);
53
+ }
54
+ this.mutatedType = this.$.intrinsic.never;
55
+ for (const edge of this.inEdges) {
56
+ edge.tailDeleted();
57
+ }
58
+ }
59
+ replace(newType) {
60
+ if (this.isMutated || this.isDeleted || this.isReplaced) {
61
+ return this;
62
+ }
63
+ // We need to make a new node because different types need to handle edge mutations differently.
64
+ this.isReplaced = true;
65
+ this.replacementNode = mutationNodeFor(this.subgraph, newType);
66
+ this.replacementNode.traverse();
67
+ // we don't need to do the clone stuff with this node, but we mark it as
68
+ // mutated because we don't want to allow further mutations on it.
69
+ this.replacementNode.isMutated = true;
70
+ if (this.referenceType) {
71
+ this.subgraph.replaceReferenceNode(this.referenceType, this.replacementNode);
72
+ }
73
+ else {
74
+ this.subgraph.replaceNode(this, this.replacementNode);
75
+ }
76
+ for (const edge of this.inEdges) {
77
+ edge.tailReplaced(this.replacementNode);
78
+ }
79
+ return this.replacementNode;
80
+ }
81
+ }
82
+ //# sourceMappingURL=mutation-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-node.js","sourceRoot":"","sources":["../../../src/mutation-node/mutation-node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAA4B,MAAM,cAAc,CAAC;AAIzE,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf,MAAM,OAAgB,YAAY;IAGhC,EAAE,GAAG,MAAM,EAAE,CAAC;IACd,UAAU,CAAI;IACd,WAAW,CAAI;IACf,SAAS,GAAY,KAAK,CAAC;IAC3B,SAAS,GAAY,KAAK,CAAC;IAC3B,UAAU,GAAY,KAAK,CAAC;IAC5B,eAAe,GAAqC,IAAI,CAAC;IACzD,OAAO,GAAkC,IAAI,GAAG,EAAE,CAAC;IACnD,QAAQ,CAAmB;IAC3B,aAAa,GAAsB,IAAI,CAAC;IACxC,CAAC,CAAU;IAEX,qBAAqB,GAA2C,EAAE,CAAC;IAEnE,YAAY,QAA0B,EAAE,UAAa;QACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAID,SAAS,CAAC,IAA8B;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,YAAY,CAAC,IAA8B;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW,CAAC,EAAmC;QAC7C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAS,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,kBAAsC;QAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,kBAAkB,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5C,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5C,EAAE,CAAC,IAAI,CAAC,CAAC;QACX,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAU,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAa;QACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gGAAgG;QAEhG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;QAChC,wEAAwE;QACxE,kEAAkE;QAClE,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation-node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-node.test.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/mutation-node.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { t } from "@typespec/compiler/testing";
2
+ import { beforeEach, expect, it } from "vitest";
3
+ import { Tester } from "../../test/test-host.js";
4
+ import { getSubgraph } from "../../test/utils.js";
5
+ let runner;
6
+ beforeEach(async () => {
7
+ runner = await Tester.createInstance();
8
+ });
9
+ it("Subgraph#getNode returns the same node for the same type when called", async () => {
10
+ const { Foo, program } = await runner.compile(t.code `
11
+ model ${t.model("Foo")} {
12
+ prop: string;
13
+ }
14
+ `);
15
+ const subgraph = getSubgraph(program);
16
+ const fooNode1 = subgraph.getNode(Foo);
17
+ const fooNode2 = subgraph.getNode(Foo);
18
+ expect(fooNode1 === fooNode2).toBe(true);
19
+ });
20
+ it("Creates the same node when constructing the subgraph and coming back to the same type", async () => {
21
+ const { Foo, Bar, Baz, program } = await runner.compile(t.code `
22
+ model ${t.model("Foo")} {
23
+ prop: string;
24
+ }
25
+
26
+ model ${t.model("Bar")} {
27
+ foo: Foo;
28
+ }
29
+
30
+ model ${t.model("Baz")} {
31
+ foo: Foo;
32
+ }
33
+ `);
34
+ const subgraph = getSubgraph(program);
35
+ const fooNode = subgraph.getNode(Foo);
36
+ subgraph.getNode(Bar);
37
+ subgraph.getNode(Baz);
38
+ expect(fooNode.inEdges.size).toBe(2);
39
+ });
40
+ it("starts with the mutatedType and sourceType being the same", async () => {
41
+ const { Foo, program } = await runner.compile(t.code `
42
+ model ${t.model("Foo")} {
43
+ prop: string;
44
+ }
45
+ `);
46
+ const subgraph = getSubgraph(program);
47
+ const fooNode = subgraph.getNode(Foo);
48
+ expect(fooNode.isMutated).toBe(false);
49
+ expect(fooNode.sourceType === fooNode.mutatedType).toBe(true);
50
+ });
51
+ it("clones the source type when mutating and sets isMutated to true", async () => {
52
+ const { Foo, program } = await runner.compile(t.code `
53
+ model ${t.model("Foo")} {
54
+ prop: string;
55
+ }
56
+ `);
57
+ const subgraph = getSubgraph(program);
58
+ const fooNode = subgraph.getNode(Foo);
59
+ expect(fooNode.isMutated).toBe(false);
60
+ expect(fooNode.sourceType === fooNode.mutatedType).toBe(true);
61
+ fooNode.mutate();
62
+ expect(fooNode.isMutated).toBe(true);
63
+ expect(fooNode.sourceType === fooNode.mutatedType).toBe(false);
64
+ expect(fooNode.sourceType.name).toEqual(fooNode.mutatedType.name);
65
+ });
66
+ it("invokes whenMutated callbacks when mutating", async () => {
67
+ const { Foo, program } = await runner.compile(t.code `
68
+ model ${t.model("Foo")} {
69
+ prop: Bar;
70
+ }
71
+
72
+ model ${t.model("Bar")} {
73
+ prop: string;
74
+ }
75
+ `);
76
+ const subgraph = getSubgraph(program);
77
+ const fooNode = subgraph.getNode(Foo);
78
+ const barNode = subgraph.getNode(Foo);
79
+ let called = false;
80
+ fooNode.whenMutated((mutatedType) => {
81
+ called = true;
82
+ expect(mutatedType).toBe(fooNode.mutatedType);
83
+ });
84
+ expect(called).toBe(false);
85
+ barNode.mutate();
86
+ expect(called).toBe(true);
87
+ });
88
+ //# sourceMappingURL=mutation-node.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-node.test.js","sourceRoot":"","sources":["../../../src/mutation-node/mutation-node.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MemberType, Type } from "@typespec/compiler";
2
+ import type { MutationEngine } from "../mutation/mutation-engine.js";
3
+ import { type MutationNodeForType } from "./factory.js";
4
+ import type { MutationNode } from "./mutation-node.js";
5
+ /**
6
+ * A subgraph of mutation nodes such that there is one node per type in the graph.
7
+ */
8
+ export declare class MutationSubgraph {
9
+ #private;
10
+ engine: MutationEngine<any>;
11
+ constructor(engine: MutationEngine<any>);
12
+ getNode<T extends Type>(type: T, memberReferences?: MemberType[]): MutationNodeForType<T>;
13
+ getReferenceNode(memberType: MemberType): MutationNode<Type>;
14
+ replaceNode(oldNode: MutationNode<Type>, newNode: MutationNode<Type>): void;
15
+ replaceReferenceNode(referenceType: MemberType, newNode: MutationNode<Type>): void;
16
+ }
17
+ //# sourceMappingURL=mutation-subgraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-subgraph.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/mutation-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,qBAAa,gBAAgB;;IAI3B,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;gBAEhB,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC;IAIvC,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,gBAAgB,GAAE,UAAU,EAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAgB7F,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;IAiB5D,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;IAIpE,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;CAG5E"}
@@ -0,0 +1,45 @@
1
+ import { mutationNodeFor } from "./factory.js";
2
+ /**
3
+ * A subgraph of mutation nodes such that there is one node per type in the graph.
4
+ */
5
+ export class MutationSubgraph {
6
+ #seenNodes = new Map();
7
+ #seenReferenceNodes = new Map();
8
+ engine;
9
+ constructor(engine) {
10
+ this.engine = engine;
11
+ }
12
+ getNode(type, memberReferences = []) {
13
+ if (memberReferences.length > 0) {
14
+ return this.getReferenceNode(memberReferences[0]);
15
+ }
16
+ if (this.#seenNodes.has(type)) {
17
+ return this.#seenNodes.get(type);
18
+ }
19
+ const node = mutationNodeFor(this, type);
20
+ this.#seenNodes.set(type, node);
21
+ node.traverse();
22
+ return node;
23
+ }
24
+ getReferenceNode(memberType) {
25
+ if (this.#seenReferenceNodes.has(memberType)) {
26
+ return this.#seenReferenceNodes.get(memberType);
27
+ }
28
+ let referencedType = memberType;
29
+ while (referencedType.kind === "ModelProperty" || referencedType.kind === "UnionVariant") {
30
+ referencedType = referencedType.type;
31
+ }
32
+ const node = mutationNodeFor(this, referencedType);
33
+ node.referenceType = memberType;
34
+ this.#seenReferenceNodes.set(memberType, node);
35
+ node.traverse();
36
+ return node;
37
+ }
38
+ replaceNode(oldNode, newNode) {
39
+ this.#seenNodes.set(oldNode.sourceType, newNode);
40
+ }
41
+ replaceReferenceNode(referenceType, newNode) {
42
+ this.#seenReferenceNodes.set(referenceType, newNode);
43
+ }
44
+ }
45
+ //# sourceMappingURL=mutation-subgraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-subgraph.js","sourceRoot":"","sources":["../../../src/mutation-node/mutation-subgraph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAA4B,MAAM,cAAc,CAAC;AAGzE;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,mBAAmB,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEhE,MAAM,CAAsB;IAE5B,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,CAAiB,IAAO,EAAE,mBAAiC,EAAE;QAClE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAQ,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAA4B,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,UAAsB;QACrC,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACnD,CAAC;QAED,IAAI,cAAc,GAAS,UAAU,CAAC;QACtC,OAAO,cAAc,CAAC,IAAI,KAAK,eAAe,IAAI,cAAc,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzF,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC;QACvC,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;QAChC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,OAA2B,EAAE,OAA2B;QAClE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,oBAAoB,CAAC,aAAyB,EAAE,OAA2B;QACzE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { Model, Operation, Type } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export declare class OperationMutationNode extends MutationNode<Operation> {
4
+ readonly kind = "Operation";
5
+ traverse(): void;
6
+ connectParameters(baseNode: MutationNode<Model>): void;
7
+ connectReturnType(typeNode: MutationNode<Type>): void;
8
+ }
9
+ //# sourceMappingURL=operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,qBAAsB,SAAQ,YAAY,CAAC,SAAS,CAAC;IAChE,QAAQ,CAAC,IAAI,eAAe;IAE5B,QAAQ;IAQR,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;IAoB/C,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;CAa/C"}
@@ -0,0 +1,44 @@
1
+ import { MutationEdge } from "./mutation-edge.js";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export class OperationMutationNode extends MutationNode {
4
+ kind = "Operation";
5
+ traverse() {
6
+ const parameterNode = this.subgraph.getNode(this.sourceType.parameters);
7
+ this.connectParameters(parameterNode);
8
+ const returnTypeNode = this.subgraph.getNode(this.sourceType.returnType);
9
+ this.connectReturnType(returnTypeNode);
10
+ }
11
+ connectParameters(baseNode) {
12
+ MutationEdge.create(this, baseNode, {
13
+ onTailMutation: () => {
14
+ this.mutatedType.parameters = baseNode.mutatedType;
15
+ },
16
+ onTailDeletion: () => {
17
+ this.mutatedType.parameters = this.$.model.create({
18
+ name: "",
19
+ properties: {},
20
+ });
21
+ },
22
+ onTailReplaced: (newTail) => {
23
+ if (newTail.mutatedType.kind !== "Model") {
24
+ throw new Error("Cannot replace parameters with non-model type");
25
+ }
26
+ this.mutatedType.parameters = newTail.mutatedType;
27
+ },
28
+ });
29
+ }
30
+ connectReturnType(typeNode) {
31
+ MutationEdge.create(this, typeNode, {
32
+ onTailMutation: () => {
33
+ this.mutatedType.returnType = typeNode.mutatedType;
34
+ },
35
+ onTailDeletion: () => {
36
+ this.mutatedType.returnType = this.$.intrinsic.void;
37
+ },
38
+ onTailReplaced: (newTail) => {
39
+ this.mutatedType.returnType = newTail.mutatedType;
40
+ },
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../../../src/mutation-node/operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,qBAAsB,SAAQ,YAAuB;IACvD,IAAI,GAAG,WAAW,CAAC;IAE5B,QAAQ;QACN,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACxE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACzE,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED,iBAAiB,CAAC,QAA6B;QAC7C,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;YAClC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAY,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;YACtD,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;oBAChD,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC;YACL,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACnE,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;YACpD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,QAA4B;QAC5C,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;YAClC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAY,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;YACtD,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;YACtD,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;YACpD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { Scalar } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export declare class ScalarMutationNode extends MutationNode<Scalar> {
4
+ readonly kind = "Scalar";
5
+ traverse(): void;
6
+ connectBaseScalar(baseScalar: MutationNode<Scalar>): void;
7
+ }
8
+ //# sourceMappingURL=scalar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/scalar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC1D,QAAQ,CAAC,IAAI,YAAY;IAEzB,QAAQ;IAOR,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC;CAiBnD"}
@@ -0,0 +1,28 @@
1
+ import { MutationEdge } from "./mutation-edge.js";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export class ScalarMutationNode extends MutationNode {
4
+ kind = "Scalar";
5
+ traverse() {
6
+ if (this.sourceType.baseScalar) {
7
+ const baseScalarNode = this.subgraph.getNode(this.sourceType.baseScalar);
8
+ this.connectBaseScalar(baseScalarNode);
9
+ }
10
+ }
11
+ connectBaseScalar(baseScalar) {
12
+ MutationEdge.create(this, baseScalar, {
13
+ onTailReplaced: (newTail) => {
14
+ if (!this.$.scalar.is(newTail.mutatedType)) {
15
+ throw new Error("Cannot replace base scalar with non-scalar type");
16
+ }
17
+ this.mutatedType.baseScalar = newTail.mutatedType;
18
+ },
19
+ onTailMutation: () => {
20
+ this.mutatedType.baseScalar = baseScalar.mutatedType;
21
+ },
22
+ onTailDeletion: () => {
23
+ this.mutatedType.baseScalar = undefined;
24
+ },
25
+ });
26
+ }
27
+ }
28
+ //# sourceMappingURL=scalar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.js","sourceRoot":"","sources":["../../../src/mutation-node/scalar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,kBAAmB,SAAQ,YAAoB;IACjD,IAAI,GAAG,QAAQ,CAAC;IAEzB,QAAQ;QACN,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACzE,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,UAAgC;QAChD,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE;YACpC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrE,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;YACpD,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC;YACvD,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scalar.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.test.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/scalar.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { t } from "@typespec/compiler/testing";
2
+ import { $ } from "@typespec/compiler/typekit";
3
+ import { beforeEach, expect, it } from "vitest";
4
+ import { Tester } from "../../test/test-host.js";
5
+ import { getSubgraph } from "../../test/utils.js";
6
+ let runner;
7
+ beforeEach(async () => {
8
+ runner = await Tester.createInstance();
9
+ });
10
+ it("handles mutation of base scalars", async () => {
11
+ const { program, Base, Derived } = await runner.compile(t.code `
12
+ scalar ${t.scalar("Base")};
13
+ scalar ${t.scalar("Derived")} extends Base;
14
+ `);
15
+ const subgraph = getSubgraph(program);
16
+ const baseNode = subgraph.getNode(Base);
17
+ const derivedNode = subgraph.getNode(Derived);
18
+ baseNode.mutate();
19
+ expect(baseNode.isMutated).toBe(true);
20
+ expect(derivedNode.isMutated).toBe(true);
21
+ expect(derivedNode.mutatedType.baseScalar === baseNode.mutatedType).toBeTruthy();
22
+ });
23
+ it("handles replacement of scalars", async () => {
24
+ const { program, Base, Derived } = await runner.compile(t.code `
25
+ scalar ${t.scalar("Base")};
26
+ scalar ${t.scalar("Derived")} extends Base;
27
+ `);
28
+ const subgraph = getSubgraph(program);
29
+ const baseNode = subgraph.getNode(Base);
30
+ const derivedNode = subgraph.getNode(Derived);
31
+ const replacedNode = baseNode.replace($(program).builtin.string);
32
+ expect(replacedNode.isMutated).toBe(true);
33
+ expect(baseNode.isReplaced).toBe(true);
34
+ // subgraph is updated
35
+ expect(replacedNode === subgraph.getNode(Base)).toBe(true);
36
+ // derived node is updated
37
+ expect(derivedNode.isMutated).toBe(true);
38
+ expect(derivedNode.mutatedType.baseScalar === replacedNode.sourceType).toBe(true);
39
+ });
40
+ //# sourceMappingURL=scalar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.test.js","sourceRoot":"","sources":["../../../src/mutation-node/scalar.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAuB,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,4BAA4B,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,IAAI,MAAsB,CAAC;AAC3B,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;AACzC,CAAC,CAAC,CAAC;AACH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;IAChD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;eACjD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;eAChB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;KAC7B,CAAC,CAAC;IACL,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;IAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;eACjD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;eAChB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;KAC7B,CAAC,CAAC;IACL,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvC,sBAAsB;IACtB,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3D,0BAA0B;IAC1B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Tuple, Type } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export declare class TupleMutationNode extends MutationNode<Tuple> {
4
+ #private;
5
+ readonly kind = "Tuple";
6
+ traverse(): void;
7
+ connectElement(elemNode: MutationNode<Type>, index: number): void;
8
+ }
9
+ //# sourceMappingURL=tuple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,KAAK,CAAC;;IACxD,QAAQ,CAAC,IAAI,WAAW;IAGxB,QAAQ;IASR,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM;CAiB3D"}
@@ -0,0 +1,32 @@
1
+ import { MutationEdge } from "./mutation-edge.js";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export class TupleMutationNode extends MutationNode {
4
+ kind = "Tuple";
5
+ #indexMap = [];
6
+ traverse() {
7
+ for (let i = 0; i < this.sourceType.values.length; i++) {
8
+ const elemType = this.sourceType.values[i];
9
+ const elemNode = this.subgraph.getNode(elemType);
10
+ this.#indexMap[i] = i;
11
+ this.connectElement(elemNode, i);
12
+ }
13
+ }
14
+ connectElement(elemNode, index) {
15
+ MutationEdge.create(this, elemNode, {
16
+ onTailMutation: () => {
17
+ this.mutatedType.values[this.#indexMap[index]] = elemNode.mutatedType;
18
+ },
19
+ onTailDeletion: () => {
20
+ const spliceIndex = this.#indexMap[index];
21
+ this.mutatedType.values.splice(spliceIndex, 1);
22
+ for (let i = spliceIndex + 1; i < this.#indexMap.length; i++) {
23
+ this.#indexMap[i]--;
24
+ }
25
+ },
26
+ onTailReplaced: (newTail) => {
27
+ this.mutatedType.values[this.#indexMap[index]] = newTail.mutatedType;
28
+ },
29
+ });
30
+ }
31
+ }
32
+ //# sourceMappingURL=tuple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.js","sourceRoot":"","sources":["../../../src/mutation-node/tuple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,iBAAkB,SAAQ,YAAmB;IAC/C,IAAI,GAAG,OAAO,CAAC;IACxB,SAAS,GAAa,EAAE,CAAC;IAEzB,QAAQ;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,QAA4B,EAAE,KAAa;QACxD,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;YAClC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;YACxE,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC/C,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;YACvE,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tuple.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.test.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/tuple.test.ts"],"names":[],"mappings":""}