@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,29 @@
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 element types", async () => {
11
+ const { program, Foo, prop, Bar } = await runner.compile(t.code `
12
+ model ${t.model("Foo")} {
13
+ ${t.modelProperty("prop")}: [Bar, string];
14
+ }
15
+ model ${t.model("Bar")} {}
16
+
17
+ `);
18
+ const subgraph = getSubgraph(program);
19
+ const fooNode = subgraph.getNode(Foo);
20
+ const propNode = subgraph.getNode(prop);
21
+ const barNode = subgraph.getNode(Bar);
22
+ barNode.mutate();
23
+ expect(barNode.isMutated).toBe(true);
24
+ expect(propNode.isMutated).toBe(true);
25
+ expect(fooNode.isMutated).toBe(true);
26
+ expect(propNode.mutatedType.type.values[0] === barNode.mutatedType).toBeTruthy();
27
+ expect(propNode.mutatedType.type.values[1] === $(program).builtin.string).toBeTruthy();
28
+ });
29
+ //# sourceMappingURL=tuple.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.test.js","sourceRoot":"","sources":["../../../src/mutation-node/tuple.test.ts"],"names":[],"mappings":"AACA,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;AAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;cACnD,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;UAClB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;;cAEnB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;;KAEvB,CAAC,CAAC;IACL,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAE,QAAQ,CAAC,WAAW,CAAC,IAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;IAC5F,MAAM,CAAE,QAAQ,CAAC,WAAW,CAAC,IAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;AACpG,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Type, UnionVariant } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export declare class UnionVariantMutationNode extends MutationNode<UnionVariant> {
4
+ readonly kind = "UnionVariant";
5
+ traverse(): void;
6
+ connectType(typeNode: MutationNode<Type>): void;
7
+ }
8
+ //# sourceMappingURL=union-variant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-variant.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/union-variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,wBAAyB,SAAQ,YAAY,CAAC,YAAY,CAAC;IACtE,QAAQ,CAAC,IAAI,kBAAkB;IAE/B,QAAQ;IAKR,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;CAazC"}
@@ -0,0 +1,23 @@
1
+ import { MutationEdge } from "./mutation-edge.js";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export class UnionVariantMutationNode extends MutationNode {
4
+ kind = "UnionVariant";
5
+ traverse() {
6
+ const typeNode = this.subgraph.getNode(this.sourceType.type);
7
+ this.connectType(typeNode);
8
+ }
9
+ connectType(typeNode) {
10
+ MutationEdge.create(this, typeNode, {
11
+ onTailMutation: () => {
12
+ this.mutatedType.type = typeNode.mutatedType;
13
+ },
14
+ onTailDeletion: () => {
15
+ this.mutatedType.type = this.$.intrinsic.any;
16
+ },
17
+ onTailReplaced: (newTail) => {
18
+ this.mutatedType.type = newTail.mutatedType;
19
+ },
20
+ });
21
+ }
22
+ }
23
+ //# sourceMappingURL=union-variant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-variant.js","sourceRoot":"","sources":["../../../src/mutation-node/union-variant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,wBAAyB,SAAQ,YAA0B;IAC7D,IAAI,GAAG,cAAc,CAAC;IAE/B,QAAQ;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,QAA4B;QACtC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;YAClC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC/C,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;YAC/C,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;YAC9C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=union-variant.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-variant.test.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/union-variant.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
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 variant types", async () => {
11
+ const { program, Foo, v1 } = await runner.compile(t.code `
12
+ union ${t.union("Foo")} {
13
+ ${t.unionVariant("v1")}: string;
14
+ v2: int32;
15
+ }
16
+ `);
17
+ const subgraph = getSubgraph(program);
18
+ const fooNode = subgraph.getNode(Foo);
19
+ const v1Node = subgraph.getNode(v1);
20
+ const stringNode = subgraph.getNode($(program).builtin.string);
21
+ stringNode.mutate();
22
+ expect(stringNode.isMutated).toBe(true);
23
+ expect(v1Node.isMutated).toBe(true);
24
+ expect(fooNode.isMutated).toBe(true);
25
+ expect(v1Node.mutatedType.type === stringNode.mutatedType).toBeTruthy();
26
+ });
27
+ //# sourceMappingURL=union-variant.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-variant.test.js","sourceRoot":"","sources":["../../../src/mutation-node/union-variant.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;AAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;cAC5C,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;UAClB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;;;KAGzB,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,UAAU,CAAC,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;AAC1E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Union, UnionVariant } from "@typespec/compiler";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export declare class UnionMutationNode extends MutationNode<Union> {
4
+ readonly kind = "Union";
5
+ traverse(): void;
6
+ connectVariant(variantNode: MutationNode<UnionVariant>, sourcePropName: string | symbol): void;
7
+ }
8
+ //# sourceMappingURL=union.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/union.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,KAAK,CAAC;IACxD,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,IAAI,IAAI;IAOhB,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM;CAkBxF"}
@@ -0,0 +1,30 @@
1
+ import { MutationEdge } from "./mutation-edge.js";
2
+ import { MutationNode } from "./mutation-node.js";
3
+ export class UnionMutationNode extends MutationNode {
4
+ kind = "Union";
5
+ traverse() {
6
+ for (const variant of this.sourceType.variants.values()) {
7
+ const variantNode = this.subgraph.getNode(variant);
8
+ this.connectVariant(variantNode, variant.name);
9
+ }
10
+ }
11
+ connectVariant(variantNode, sourcePropName) {
12
+ MutationEdge.create(this, variantNode, {
13
+ onTailMutation: () => {
14
+ this.mutatedType.variants.delete(sourcePropName);
15
+ this.mutatedType.variants.set(variantNode.mutatedType.name, variantNode.mutatedType);
16
+ },
17
+ onTailDeletion: () => {
18
+ this.mutatedType.variants.delete(sourcePropName);
19
+ },
20
+ onTailReplaced: (newTail) => {
21
+ if (newTail.mutatedType.kind !== "UnionVariant") {
22
+ throw new Error("Cannot replace union variant with non-union variant type");
23
+ }
24
+ this.mutatedType.variants.delete(sourcePropName);
25
+ this.mutatedType.variants.set(newTail.mutatedType.name, newTail.mutatedType);
26
+ },
27
+ });
28
+ }
29
+ }
30
+ //# sourceMappingURL=union.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/mutation-node/union.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;IAExB,QAAQ;QACN,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,cAAc,CAAC,WAAuC,EAAE,cAA+B;QACrF,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE;YACrC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;YACvF,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACnD,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC1B,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAChD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAC/E,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=union.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.test.d.ts","sourceRoot":"","sources":["../../../src/mutation-node/union.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
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("handles mutation of variants", async () => {
10
+ const { program, Foo, v1 } = await runner.compile(t.code `
11
+ union ${t.union("Foo")} {
12
+ ${t.unionVariant("v1")}: string;
13
+ v2: int32;
14
+ }
15
+ `);
16
+ const subgraph = getSubgraph(program);
17
+ const fooNode = subgraph.getNode(Foo);
18
+ const v1Node = subgraph.getNode(v1);
19
+ v1Node.mutate((clone) => (clone.name = "v1Renamed"));
20
+ expect(v1Node.isMutated).toBe(true);
21
+ expect(fooNode.isMutated).toBe(true);
22
+ expect(fooNode.mutatedType.variants.get("v1") === undefined).toBeTruthy();
23
+ expect(fooNode.mutatedType.variants.get("v1Renamed") === v1Node.mutatedType).toBeTruthy();
24
+ });
25
+ //# sourceMappingURL=union.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.test.js","sourceRoot":"","sources":["../../../src/mutation-node/union.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAuB,MAAM,4BAA4B,CAAC;AACpE,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;AAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;cAC5C,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;UAClB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;;;KAGzB,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;IAC1E,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;AAC5F,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const Tester: import("@typespec/compiler/testing").Tester;
2
+ //# sourceMappingURL=test-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-host.d.ts","sourceRoot":"","sources":["../../test/test-host.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,6CAEjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { resolvePath } from "@typespec/compiler";
2
+ import { createTester } from "@typespec/compiler/testing";
3
+ export const Tester = createTester(resolvePath(import.meta.dirname, ".."), {
4
+ libraries: [],
5
+ });
6
+ //# sourceMappingURL=test-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-host.js","sourceRoot":"","sources":["../../test/test-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAE,MAAM,CAAC,IAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;IAClF,SAAS,EAAE,EAAE;CACd,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Program } from "@typespec/compiler";
2
+ import { MutationSubgraph } from "../src/index.js";
3
+ export declare function getSubgraph(program: Program): MutationSubgraph;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,oBAI3C"}
@@ -0,0 +1,8 @@
1
+ import { $ } from "@typespec/compiler/typekit";
2
+ import { MutationEngine, MutationSubgraph } from "../src/index.js";
3
+ export function getSubgraph(program) {
4
+ const tk = $(program);
5
+ const engine = new MutationEngine(tk, {});
6
+ return new MutationSubgraph(engine);
7
+ }
8
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,4BAA4B,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@typespec/mutator-framework",
3
+ "version": "0.12.0",
4
+ "type": "module",
5
+ "main": "dist/src/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/microsoft/typespec.git"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/src/index.js"
13
+ }
14
+ },
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "MIT",
18
+ "description": "",
19
+ "peerDependencies": {
20
+ "@typespec/compiler": "^1.5.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "~24.3.0",
24
+ "concurrently": "^9.1.2",
25
+ "prettier": "~3.6.2",
26
+ "@typespec/compiler": "^1.5.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p .",
30
+ "clean": "rimraf ./dist",
31
+ "format": "prettier . --write",
32
+ "watch": "tsc -p . --watch",
33
+ "test": "vitest run",
34
+ "test:ui": "vitest --ui",
35
+ "test:watch": "vitest -w",
36
+ "test:ci": "vitest run --coverage --reporter=junit --reporter=default",
37
+ "lint": "eslint . --max-warnings=0",
38
+ "lint:fix": "eslint . --fix"
39
+ }
40
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@typespec/mutator-framework",
3
+ "version": "0.12.0",
4
+ "type": "module",
5
+ "main": "dist/src/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/microsoft/typespec.git"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc -p .",
12
+ "clean": "rimraf ./dist",
13
+ "format": "prettier . --write",
14
+ "watch": "tsc -p . --watch",
15
+ "test": "vitest run",
16
+ "test:ui": "vitest --ui",
17
+ "test:watch": "vitest -w",
18
+ "test:ci": "vitest run --coverage --reporter=junit --reporter=default",
19
+ "prepack": "tsx ../../eng/tsp-core/scripts/strip-dev-import-exports.ts",
20
+ "postpack": "tsx ../../eng/tsp-core/scripts/strip-dev-import-exports.ts --restore",
21
+ "lint": "eslint . --max-warnings=0",
22
+ "lint:fix": "eslint . --fix"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "import": "./dist/src/index.js"
27
+ }
28
+ },
29
+ "keywords": [],
30
+ "author": "",
31
+ "license": "MIT",
32
+ "description": "",
33
+ "peerDependencies": {
34
+ "@typespec/compiler": "workspace:^"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "~24.3.0",
38
+ "@typespec/compiler": "workspace:^",
39
+ "concurrently": "^9.1.2",
40
+ "prettier": "~3.6.2"
41
+ }
42
+ }