@typeonce/oxlint-plugin-effect-machine 0.26.1 → 0.27.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 (55) hide show
  1. package/README.md +151 -9
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/internal/ambient.d.ts +6 -0
  7. package/dist/internal/ambient.d.ts.map +1 -0
  8. package/dist/internal/ambient.js +118 -0
  9. package/dist/internal/ambient.js.map +1 -0
  10. package/dist/internal/ast.d.ts +7 -0
  11. package/dist/internal/ast.d.ts.map +1 -0
  12. package/dist/internal/ast.js +62 -0
  13. package/dist/internal/ast.js.map +1 -0
  14. package/dist/internal/imports.d.ts +1 -0
  15. package/dist/internal/imports.d.ts.map +1 -1
  16. package/dist/internal/imports.js +19 -9
  17. package/dist/internal/imports.js.map +1 -1
  18. package/dist/internal/planning.d.ts +3 -0
  19. package/dist/internal/planning.d.ts.map +1 -1
  20. package/dist/internal/planning.js +54 -7
  21. package/dist/internal/planning.js.map +1 -1
  22. package/dist/internal/rules/noAsyncPlanningCallback.d.ts.map +1 -1
  23. package/dist/internal/rules/noAsyncPlanningCallback.js +18 -3
  24. package/dist/internal/rules/noAsyncPlanningCallback.js.map +1 -1
  25. package/dist/internal/rules/noBrowserApiInPlanning.d.ts +3 -0
  26. package/dist/internal/rules/noBrowserApiInPlanning.d.ts.map +1 -0
  27. package/dist/internal/rules/noBrowserApiInPlanning.js +54 -0
  28. package/dist/internal/rules/noBrowserApiInPlanning.js.map +1 -0
  29. package/dist/internal/rules/noConflictingInvocationIdentity.d.ts +3 -0
  30. package/dist/internal/rules/noConflictingInvocationIdentity.d.ts.map +1 -0
  31. package/dist/internal/rules/noConflictingInvocationIdentity.js +289 -0
  32. package/dist/internal/rules/noConflictingInvocationIdentity.js.map +1 -0
  33. package/dist/internal/rules/noNondeterministicPlanning.d.ts +3 -0
  34. package/dist/internal/rules/noNondeterministicPlanning.d.ts.map +1 -0
  35. package/dist/internal/rules/noNondeterministicPlanning.js +33 -0
  36. package/dist/internal/rules/noNondeterministicPlanning.js.map +1 -0
  37. package/dist/internal/rules/noRedundantResolve.d.ts.map +1 -1
  38. package/dist/internal/rules/noRedundantResolve.js +41 -15
  39. package/dist/internal/rules/noRedundantResolve.js.map +1 -1
  40. package/dist/recommended.d.ts +3 -0
  41. package/dist/recommended.d.ts.map +1 -1
  42. package/dist/recommended.js +3 -0
  43. package/dist/recommended.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/index.ts +6 -0
  46. package/src/internal/ambient.ts +134 -0
  47. package/src/internal/ast.ts +83 -0
  48. package/src/internal/imports.ts +27 -8
  49. package/src/internal/planning.ts +69 -7
  50. package/src/internal/rules/noAsyncPlanningCallback.ts +21 -4
  51. package/src/internal/rules/noBrowserApiInPlanning.ts +57 -0
  52. package/src/internal/rules/noConflictingInvocationIdentity.ts +343 -0
  53. package/src/internal/rules/noNondeterministicPlanning.ts +39 -0
  54. package/src/internal/rules/noRedundantResolve.ts +48 -16
  55. package/src/recommended.ts +3 -0
@@ -1,3 +1,4 @@
1
+ import { unwrapExpression } from "./ast.js";
1
2
  import { isMachineHandleCall, isMachineMakeCall, staticMemberName } from "./imports.js";
2
3
  const directPlanningMethods = new Set([
3
4
  "onDone",
@@ -11,7 +12,10 @@ const statePlanningProperties = new Set([
11
12
  "choice",
12
13
  "entry",
13
14
  "exit",
14
- "invoke"
15
+ "initialize",
16
+ "invoke",
17
+ "onDone",
18
+ "output"
15
19
  ]);
16
20
  const propertyName = (node) => {
17
21
  if (node.type !== "Property" || node.computed)
@@ -47,6 +51,21 @@ const isEventHandlerProperty = (node, bindings) => {
47
51
  onProperty.parent.type === "ObjectExpression" &&
48
52
  isStateConfig(onProperty.parent, bindings);
49
53
  };
54
+ const isHistoryDefaultProperty = (node, bindings) => {
55
+ if (node.type !== "Property" || propertyName(node) !== "default")
56
+ return false;
57
+ const historyEntry = node.parent;
58
+ if (historyEntry.type !== "ObjectExpression" ||
59
+ historyEntry.parent.type !== "Property" ||
60
+ historyEntry.parent.parent.type !== "ObjectExpression")
61
+ return false;
62
+ const historyEntries = historyEntry.parent.parent;
63
+ if (historyEntries.parent.type !== "Property" ||
64
+ propertyName(historyEntries.parent) !== "history" ||
65
+ historyEntries.parent.parent.type !== "ObjectExpression")
66
+ return false;
67
+ return isStateConfig(historyEntries.parent.parent, bindings);
68
+ };
50
69
  const isPropertyPlanningCallback = (node, bindings) => {
51
70
  const property = node.parent;
52
71
  if (property.type !== "Property" ||
@@ -57,9 +76,10 @@ const isPropertyPlanningCallback = (node, bindings) => {
57
76
  return name === "initial"
58
77
  ? isMachineMakeConfig(property.parent, bindings)
59
78
  : (name !== undefined && statePlanningProperties.has(name) && isStateConfig(property.parent, bindings)) ||
60
- isEventHandlerProperty(property, bindings);
79
+ isEventHandlerProperty(property, bindings) ||
80
+ isHistoryDefaultProperty(property, bindings);
61
81
  };
62
- const enclosingFunction = (node) => {
82
+ export const enclosingFunction = (node) => {
63
83
  let current = node.parent;
64
84
  while (current !== null && current.type !== "Program") {
65
85
  if (current.type === "ArrowFunctionExpression" ||
@@ -69,17 +89,44 @@ const enclosingFunction = (node) => {
69
89
  }
70
90
  return undefined;
71
91
  };
92
+ const selectorRoot = (node) => {
93
+ let expression = unwrapExpression(node);
94
+ while (expression.type === "CallExpression" || expression.type === "MemberExpression") {
95
+ expression = unwrapExpression(expression.type === "CallExpression"
96
+ ? expression.callee
97
+ : expression.object);
98
+ }
99
+ return expression.type === "Identifier" ? expression.name : undefined;
100
+ };
101
+ export const enclosingPlanningCallback = (node, bindings) => {
102
+ const callback = enclosingFunction(node);
103
+ return callback !== undefined && isPlanningCallback(callback, bindings)
104
+ ? callback
105
+ : undefined;
106
+ };
107
+ export const isInvokePlanningCallback = (node, bindings) => {
108
+ const property = node.parent;
109
+ return property.type === "Property" &&
110
+ property.value === node &&
111
+ propertyName(property) === "invoke" &&
112
+ property.parent.type === "ObjectExpression" &&
113
+ isStateConfig(property.parent, bindings);
114
+ };
72
115
  export const isPlanningCallback = (node, bindings) => {
73
116
  if (isPropertyPlanningCallback(node, bindings))
74
117
  return true;
75
118
  const parent = node.parent;
76
119
  if (parent.type === "CallExpression" && parent.arguments.includes(node)) {
77
- const method = parent.callee.type === "MemberExpression"
78
- ? staticMemberName(parent.callee)
79
- : undefined;
120
+ if (parent.callee.type !== "MemberExpression")
121
+ return false;
122
+ const method = staticMemberName(parent.callee);
80
123
  if (method !== undefined && directPlanningMethods.has(method)) {
81
124
  const owner = enclosingFunction(parent);
82
- return owner !== undefined && isPlanningCallback(owner, bindings);
125
+ const selector = owner?.params[0];
126
+ return owner !== undefined &&
127
+ selector?.type === "Identifier" &&
128
+ selectorRoot(parent.callee.object) === selector.name &&
129
+ isPlanningCallback(owner, bindings);
83
130
  }
84
131
  }
85
132
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/internal/planning.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/internal/planning.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"noAsyncPlanningCallback.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noAsyncPlanningCallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAI3C,eAAO,MAAM,uBAAuB,EAAE,IA8BrC,CAAA"}
1
+ {"version":3,"file":"noAsyncPlanningCallback.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noAsyncPlanningCallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKnD,eAAO,MAAM,uBAAuB,EAAE,IA8CrC,CAAA"}
@@ -1,5 +1,6 @@
1
+ import { asyncOperation } from "../ambient.js";
1
2
  import { hasMachineImport, makeMachineBindings, recordMachineDefinition, recordMachineImport } from "../imports.js";
2
- import { isPlanningCallback } from "../planning.js";
3
+ import { enclosingPlanningCallback, isPlanningCallback } from "../planning.js";
3
4
  export const noAsyncPlanningCallback = {
4
5
  meta: {
5
6
  type: "problem",
@@ -9,7 +10,8 @@ export const noAsyncPlanningCallback = {
9
10
  },
10
11
  schema: [],
11
12
  messages: {
12
- asyncPlanning: "Planning callbacks must be synchronous. Move asynchronous work into state-owned invocation."
13
+ asyncOperation: "{{operation}} starts asynchronous work during synchronous planning. Move it into the owning state's invoke declaration using from.effect(...), from.stream(...), or from.timer(...), then handle completion or failure with onDone/onFailure.",
14
+ asyncPlanning: "Planning callbacks must be synchronous. Remove async and move the asynchronous work into the owning state's invoke declaration, then transition from onDone/onFailure."
13
15
  }
14
16
  },
15
17
  create(context) {
@@ -21,11 +23,24 @@ export const noAsyncPlanningCallback = {
21
23
  context.report({ node, messageId: "asyncPlanning" });
22
24
  }
23
25
  };
26
+ const inspectOperation = (node) => {
27
+ if (!hasMachineImport(bindings))
28
+ return;
29
+ const callback = enclosingPlanningCallback(node, bindings);
30
+ if (callback === undefined || callback.async)
31
+ return;
32
+ const operation = asyncOperation(context, node);
33
+ if (operation !== undefined) {
34
+ context.report({ node, messageId: "asyncOperation", data: { operation } });
35
+ }
36
+ };
24
37
  return {
25
38
  ImportDeclaration: (node) => recordMachineImport(bindings, node),
26
39
  VariableDeclarator: (node) => recordMachineDefinition(bindings, node),
27
40
  ArrowFunctionExpression: inspect,
28
- FunctionExpression: inspect
41
+ FunctionExpression: inspect,
42
+ CallExpression: inspectOperation,
43
+ NewExpression: inspectOperation
29
44
  };
30
45
  }
31
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"noAsyncPlanningCallback.js","sourceRoot":"","sources":["../../../src/internal/rules/noAsyncPlanningCallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EAAE,kBAAkB,EAAyB,MAAM,gBAAgB,CAAA;AAE1E,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,aAAa,EAAE,6FAA6F;SAC7G;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,CAAC,IAAsB,EAAQ,EAAE;YAC/C,IACE,gBAAgB,CAAC,QAAQ,CAAC;gBAC1B,IAAI,CAAC,KAAK;gBACV,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAClC,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAA;YACtD,CAAC;QACH,CAAC,CAAA;QACD,OAAO;YACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChE,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACrE,uBAAuB,EAAE,OAAO;YAChC,kBAAkB,EAAE,OAAO;SAC5B,CAAA;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"noAsyncPlanningCallback.js","sourceRoot":"","sources":["../../../src/internal/rules/noAsyncPlanningCallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAyB,MAAM,gBAAgB,CAAA;AAErG,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,cAAc,EACZ,+OAA+O;YACjP,aAAa,EACX,wKAAwK;SAC3K;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,CAAC,IAAsB,EAAQ,EAAE;YAC/C,IACE,gBAAgB,CAAC,QAAQ,CAAC;gBAC1B,IAAI,CAAC,KAAK;gBACV,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAClC,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAA;YACtD,CAAC;QACH,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,CACvB,IAAkD,EAC5C,EAAE;YACR,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBAAE,OAAM;YACvC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK;gBAAE,OAAM;YACpD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC/C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC,CAAA;QACD,OAAO;YACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChE,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACrE,uBAAuB,EAAE,OAAO;YAChC,kBAAkB,EAAE,OAAO;YAC3B,cAAc,EAAE,gBAAgB;YAChC,aAAa,EAAE,gBAAgB;SAChC,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "@oxlint/plugins";
2
+ export declare const noBrowserApiInPlanning: Rule;
3
+ //# sourceMappingURL=noBrowserApiInPlanning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noBrowserApiInPlanning.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noBrowserApiInPlanning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAenD,eAAO,MAAM,sBAAsB,EAAE,IAyCpC,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { browserApi } from "../ambient.js";
2
+ import { hasMachineImport, makeMachineBindings, recordMachineDefinition, recordMachineImport } from "../imports.js";
3
+ import { enclosingPlanningCallback } from "../planning.js";
4
+ const isOutermostAccess = (node) => {
5
+ const parent = node.parent;
6
+ if (parent.type === "MemberExpression" && parent.object === node)
7
+ return false;
8
+ if ((parent.type === "CallExpression" || parent.type === "NewExpression") &&
9
+ parent.callee === node)
10
+ return false;
11
+ return true;
12
+ };
13
+ export const noBrowserApiInPlanning = {
14
+ meta: {
15
+ type: "problem",
16
+ docs: {
17
+ description: "Keep browser state and side effects out of Effect Machine planning.",
18
+ recommended: true
19
+ },
20
+ schema: [],
21
+ messages: {
22
+ browserApi: "{{api}} reads browser state or performs a browser side effect during synchronous planning. If it affects the workflow, run it in a state-owned invocation and transition from its outcome. If it only affects presentation, keep it in the UI adapter."
23
+ }
24
+ },
25
+ create(context) {
26
+ const bindings = makeMachineBindings();
27
+ const inspect = (node) => {
28
+ if (!hasMachineImport(bindings) ||
29
+ !isOutermostAccess(node) ||
30
+ enclosingPlanningCallback(node, bindings) === undefined)
31
+ return;
32
+ const api = browserApi(context, node);
33
+ if (api !== undefined)
34
+ context.report({ node, messageId: "browserApi", data: { api } });
35
+ };
36
+ const inspectOperation = (node) => {
37
+ if (!hasMachineImport(bindings) ||
38
+ enclosingPlanningCallback(node, bindings) === undefined)
39
+ return;
40
+ const api = browserApi(context, node.callee);
41
+ if (api !== undefined)
42
+ context.report({ node, messageId: "browserApi", data: { api } });
43
+ };
44
+ return {
45
+ ImportDeclaration: (node) => recordMachineImport(bindings, node),
46
+ Identifier: (node) => inspect(node),
47
+ MemberExpression: inspect,
48
+ CallExpression: inspectOperation,
49
+ NewExpression: inspectOperation,
50
+ VariableDeclarator: (node) => recordMachineDefinition(bindings, node)
51
+ };
52
+ }
53
+ };
54
+ //# sourceMappingURL=noBrowserApiInPlanning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noBrowserApiInPlanning.js","sourceRoot":"","sources":["../../../src/internal/rules/noBrowserApiInPlanning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,iBAAiB,GAAG,CAAC,IAAuB,EAAW,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC9E,IACE,CAAC,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC;QACrE,MAAM,CAAC,MAAM,KAAK,IAAI;QACtB,OAAO,KAAK,CAAA;IACd,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qEAAqE;YAClF,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,UAAU,EACR,wPAAwP;SAC3P;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,CAAC,IAAuB,EAAQ,EAAE;YAChD,IACE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBAC3B,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBACxB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS;gBACvD,OAAM;YACR,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACrC,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACzF,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,CAAC,IAAkD,EAAQ,EAAE;YACpF,IACE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBAC3B,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS;gBACvD,OAAM;YACR,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5C,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACzF,CAAC,CAAA;QACD,OAAO;YACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChE,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAkC,CAAC;YACjE,gBAAgB,EAAE,OAAO;YACzB,cAAc,EAAE,gBAAgB;YAChC,aAAa,EAAE,gBAAgB;YAC/B,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;SACtE,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "@oxlint/plugins";
2
+ export declare const noConflictingInvocationIdentity: Rule;
3
+ //# sourceMappingURL=noConflictingInvocationIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noConflictingInvocationIdentity.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noConflictingInvocationIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,IAAI,EAAY,MAAM,iBAAiB,CAAA;AA8QtE,eAAO,MAAM,+BAA+B,EAAE,IAwE7C,CAAA"}
@@ -0,0 +1,289 @@
1
+ import { resolvedVariable, unwrapExpression } from "../ast.js";
2
+ import { hasMachineImport, isMachineMemberCall, makeMachineBindings, recordMachineDefinition, recordMachineImport, staticMemberName } from "../imports.js";
3
+ import { isInvokePlanningCallback } from "../planning.js";
4
+ const completionMethods = new Set(["onDone", "onElement", "onFailure", "onSnapshot"]);
5
+ const sourceMethods = new Set(["effect", "logic", "stream", "timer"]);
6
+ const variableKey = (variable) => {
7
+ const identifier = variable.identifiers[0];
8
+ return identifier === undefined ? undefined : `binding:${identifier.range[0]}:${identifier.range[1]}`;
9
+ };
10
+ const isStableVariable = (variable) => variable.defs.some((definition) => definition.type === "ImportBinding" ||
11
+ (definition.type === "Variable" &&
12
+ definition.node.type === "VariableDeclarator" &&
13
+ definition.node.parent.type === "VariableDeclaration" &&
14
+ definition.node.parent.kind === "const"));
15
+ const constInitializer = (variable) => {
16
+ const definition = variable.defs.find((candidate) => candidate.type === "Variable");
17
+ const declaration = definition?.node;
18
+ if (declaration?.type !== "VariableDeclarator" ||
19
+ declaration.parent.type !== "VariableDeclaration" ||
20
+ declaration.parent.kind !== "const" ||
21
+ declaration.init === null)
22
+ return undefined;
23
+ return declaration.init;
24
+ };
25
+ const staticIdentity = (context, node, bindings, seen = new Set()) => {
26
+ const expression = unwrapExpression(node);
27
+ if (expression.type === "Literal" &&
28
+ (typeof expression.value === "string" || typeof expression.value === "number")) {
29
+ return {
30
+ key: `value:${String(expression.value)}`,
31
+ label: JSON.stringify(expression.value),
32
+ node: expression
33
+ };
34
+ }
35
+ if (expression.type === "TemplateLiteral" && expression.expressions.length === 0) {
36
+ const value = expression.quasis[0]?.value.cooked;
37
+ return value === null || value === undefined
38
+ ? undefined
39
+ : { key: `value:${value}`, label: JSON.stringify(value), node: expression };
40
+ }
41
+ if (expression.type === "Identifier") {
42
+ const variable = resolvedVariable(context, expression);
43
+ if (variable === undefined || !isStableVariable(variable))
44
+ return undefined;
45
+ const key = variableKey(variable);
46
+ if (key === undefined || seen.has(key))
47
+ return undefined;
48
+ const initializer = constInitializer(variable);
49
+ if (initializer !== undefined) {
50
+ const nextSeen = new Set(seen);
51
+ nextSeen.add(key);
52
+ const initialized = staticIdentity(context, initializer, bindings, nextSeen);
53
+ if (initialized !== undefined)
54
+ return { ...initialized, node: expression };
55
+ }
56
+ return { key, label: expression.name, node: expression };
57
+ }
58
+ if (isMachineMemberCall(expression, "childAddress", bindings)) {
59
+ const argument = expression.arguments[0];
60
+ if (expression.arguments.length === 1 && argument !== undefined && argument.type !== "SpreadElement") {
61
+ return staticIdentity(context, argument, bindings, seen);
62
+ }
63
+ }
64
+ return undefined;
65
+ };
66
+ const descriptorIdentity = (context, node, bindings, seen = new Set()) => {
67
+ const expression = unwrapExpression(node);
68
+ if (expression.type === "Identifier") {
69
+ const variable = resolvedVariable(context, expression);
70
+ if (variable === undefined || !isStableVariable(variable))
71
+ return undefined;
72
+ const key = variableKey(variable);
73
+ if (key === undefined || seen.has(key))
74
+ return undefined;
75
+ const initializer = constInitializer(variable);
76
+ if (initializer !== undefined) {
77
+ const nextSeen = new Set(seen);
78
+ nextSeen.add(key);
79
+ const initialized = descriptorIdentity(context, initializer, bindings, nextSeen);
80
+ if (initialized !== undefined)
81
+ return { ...initialized, node: expression };
82
+ }
83
+ return { key: `descriptor:${key}`, label: expression.name, node: expression };
84
+ }
85
+ if (isMachineMemberCall(expression, "child", bindings)) {
86
+ const argument = expression.arguments[0];
87
+ if (argument !== undefined && argument.type !== "SpreadElement") {
88
+ return staticIdentity(context, argument, bindings);
89
+ }
90
+ }
91
+ return undefined;
92
+ };
93
+ const objectProperty = (object, name) => {
94
+ for (const property of object.properties) {
95
+ if (property.type !== "Property" || property.kind !== "init")
96
+ continue;
97
+ const propertyName = property.computed
98
+ ? property.key.type === "Literal" && typeof property.key.value === "string"
99
+ ? property.key.value
100
+ : undefined
101
+ : property.key.type === "Identifier" || property.key.type === "Literal"
102
+ ? String(property.key.type === "Identifier" ? property.key.name : property.key.value)
103
+ : undefined;
104
+ if (propertyName === name)
105
+ return property.value;
106
+ }
107
+ return undefined;
108
+ };
109
+ const resolvedObject = (context, node, seen = new Set()) => {
110
+ const expression = unwrapExpression(node);
111
+ if (expression.type === "ObjectExpression")
112
+ return expression;
113
+ if (expression.type !== "Identifier")
114
+ return undefined;
115
+ const variable = resolvedVariable(context, expression);
116
+ if (variable === undefined)
117
+ return undefined;
118
+ const key = variableKey(variable);
119
+ if (key === undefined || seen.has(key))
120
+ return undefined;
121
+ const initializer = constInitializer(variable);
122
+ if (initializer === undefined)
123
+ return undefined;
124
+ const nextSeen = new Set(seen);
125
+ nextSeen.add(key);
126
+ return resolvedObject(context, initializer, nextSeen);
127
+ };
128
+ const sourceCall = (node) => {
129
+ let expression = unwrapExpression(node);
130
+ while (expression.type === "CallExpression" &&
131
+ expression.callee.type === "MemberExpression" &&
132
+ completionMethods.has(staticMemberName(expression.callee) ?? ""))
133
+ expression = unwrapExpression(expression.callee.object);
134
+ return expression.type === "CallExpression" ? expression : undefined;
135
+ };
136
+ const invocationIdentity = (context, node, from, bindings) => {
137
+ const call = sourceCall(node);
138
+ if (call?.callee.type !== "MemberExpression" ||
139
+ call.callee.object.type !== "Identifier" ||
140
+ call.callee.object.name !== from)
141
+ return undefined;
142
+ const method = staticMemberName(call.callee);
143
+ if (method === "child") {
144
+ const child = call.arguments[0];
145
+ if (child === undefined || child.type === "SpreadElement")
146
+ return undefined;
147
+ const identity = descriptorIdentity(context, child, bindings);
148
+ return identity === undefined ? undefined : { lifecycle: identity, address: identity };
149
+ }
150
+ if (method === undefined || !sourceMethods.has(method))
151
+ return undefined;
152
+ const id = call.arguments[0];
153
+ if (id === undefined || id.type === "SpreadElement")
154
+ return undefined;
155
+ const lifecycle = staticIdentity(context, id, bindings);
156
+ if (lifecycle === undefined)
157
+ return undefined;
158
+ if (method !== "logic")
159
+ return { lifecycle };
160
+ const options = call.arguments[1];
161
+ if (options === undefined || options.type === "SpreadElement")
162
+ return { lifecycle };
163
+ const object = resolvedObject(context, options);
164
+ const addressNode = object === undefined ? undefined : objectProperty(object, "address");
165
+ const address = addressNode === undefined
166
+ ? undefined
167
+ : staticIdentity(context, addressNode, bindings);
168
+ return address === undefined ? { lifecycle } : { lifecycle, address };
169
+ };
170
+ const returnedExpression = (node) => {
171
+ if (node.body === null)
172
+ return undefined;
173
+ if (node.body.type !== "BlockStatement")
174
+ return node.body;
175
+ const returns = node.body.body.filter((statement) => statement.type === "ReturnStatement");
176
+ if (returns.length !== 1)
177
+ return undefined;
178
+ return returns[0].argument ?? undefined;
179
+ };
180
+ const returnedEntries = (context, node) => {
181
+ const returned = returnedExpression(node);
182
+ if (returned === undefined)
183
+ return [];
184
+ const array = resolvedObjectOrArray(context, returned);
185
+ if (array?.type !== "ArrayExpression")
186
+ return [returned];
187
+ return array.elements.filter((entry) => entry !== null && entry.type !== "SpreadElement");
188
+ };
189
+ const resolvedObjectOrArray = (context, node, seen = new Set()) => {
190
+ const expression = unwrapExpression(node);
191
+ if (expression.type === "ObjectExpression" || expression.type === "ArrayExpression")
192
+ return expression;
193
+ if (expression.type !== "Identifier")
194
+ return undefined;
195
+ const variable = resolvedVariable(context, expression);
196
+ if (variable === undefined)
197
+ return undefined;
198
+ const key = variableKey(variable);
199
+ if (key === undefined || seen.has(key))
200
+ return undefined;
201
+ const initializer = constInitializer(variable);
202
+ if (initializer === undefined)
203
+ return undefined;
204
+ const nextSeen = new Set(seen);
205
+ nextSeen.add(key);
206
+ return resolvedObjectOrArray(context, initializer, nextSeen);
207
+ };
208
+ const resolvedEntry = (context, node) => {
209
+ const expression = unwrapExpression(node);
210
+ if (expression.type !== "Identifier")
211
+ return expression;
212
+ const variable = resolvedVariable(context, expression);
213
+ const initializer = variable === undefined ? undefined : constInitializer(variable);
214
+ return initializer === undefined ? expression : unwrapExpression(initializer);
215
+ };
216
+ export const noConflictingInvocationIdentity = {
217
+ meta: {
218
+ type: "problem",
219
+ docs: {
220
+ description: "Require unique invocation lifecycle IDs and runtime addresses within a state.",
221
+ recommended: true
222
+ },
223
+ schema: [],
224
+ messages: {
225
+ conflictingAddress: "Invocation runtime address {{identity}} is reused in this state. Concurrent children cannot own the same address. Give each from.logic(...) invocation a distinct Machine.childAddress(...), or put sequential work in separate states.",
226
+ conflictingBoth: "Invocation identity {{identity}} is reused as both lifecycle ID and runtime address in this state. Outcomes become ambiguous and overlapping starts fail. Give each invocation a unique ID/address, or put sequential work in separate states.",
227
+ conflictingLifecycle: "Invocation lifecycle ID {{identity}} is reused in this state. Outcomes are routed by state path and ID, so duplicate IDs are ambiguous and overlapping starts fail. Give each invocation a unique ID, or put sequential work in separate states."
228
+ }
229
+ },
230
+ create(context) {
231
+ const bindings = makeMachineBindings();
232
+ const inspect = (node) => {
233
+ if (!hasMachineImport(bindings) || !isInvokePlanningCallback(node, bindings))
234
+ return;
235
+ const parameter = node.params[0];
236
+ if (parameter?.type !== "Identifier")
237
+ return;
238
+ const lifecycle = new Map();
239
+ const addresses = new Map();
240
+ const entries = returnedEntries(context, node);
241
+ entries.forEach((entry, index) => {
242
+ const identity = invocationIdentity(context, resolvedEntry(context, entry), parameter.name, bindings);
243
+ if (identity === undefined)
244
+ return;
245
+ const lifecycleConflict = lifecycle.get(identity.lifecycle.key);
246
+ const addressConflict = identity.address === undefined
247
+ ? undefined
248
+ : addresses.get(identity.address.key);
249
+ if (lifecycleConflict !== undefined &&
250
+ addressConflict !== undefined &&
251
+ lifecycleConflict === addressConflict) {
252
+ context.report({
253
+ node: identity.lifecycle.node,
254
+ messageId: "conflictingBoth",
255
+ data: { identity: identity.lifecycle.label }
256
+ });
257
+ }
258
+ else {
259
+ if (lifecycleConflict !== undefined) {
260
+ context.report({
261
+ node: identity.lifecycle.node,
262
+ messageId: "conflictingLifecycle",
263
+ data: { identity: identity.lifecycle.label }
264
+ });
265
+ }
266
+ if (addressConflict !== undefined && identity.address !== undefined) {
267
+ context.report({
268
+ node: identity.address.node,
269
+ messageId: "conflictingAddress",
270
+ data: { identity: identity.address.label }
271
+ });
272
+ }
273
+ }
274
+ if (!lifecycle.has(identity.lifecycle.key))
275
+ lifecycle.set(identity.lifecycle.key, index);
276
+ if (identity.address !== undefined && !addresses.has(identity.address.key)) {
277
+ addresses.set(identity.address.key, index);
278
+ }
279
+ });
280
+ };
281
+ return {
282
+ ImportDeclaration: (node) => recordMachineImport(bindings, node),
283
+ VariableDeclarator: (node) => recordMachineDefinition(bindings, node),
284
+ ArrowFunctionExpression: inspect,
285
+ FunctionExpression: inspect
286
+ };
287
+ }
288
+ };
289
+ //# sourceMappingURL=noConflictingInvocationIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noConflictingInvocationIdentity.js","sourceRoot":"","sources":["../../../src/internal/rules/noConflictingInvocationIdentity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "@oxlint/plugins";
2
+ export declare const noNondeterministicPlanning: Rule;
3
+ //# sourceMappingURL=noNondeterministicPlanning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noNondeterministicPlanning.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noNondeterministicPlanning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKnD,eAAO,MAAM,0BAA0B,EAAE,IAiCxC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { nondeterministicOperation, nondeterministicProperty } from "../ambient.js";
2
+ import { hasMachineImport, makeMachineBindings, recordMachineDefinition, recordMachineImport } from "../imports.js";
3
+ import { enclosingPlanningCallback } from "../planning.js";
4
+ export const noNondeterministicPlanning = {
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Keep ambient time and randomness out of Effect Machine planning.",
9
+ recommended: true
10
+ },
11
+ schema: [],
12
+ messages: {
13
+ nondeterministic: "{{operation}} produces a different result without a machine event or state change. Pass the value through machine input or an event, or produce it in a state-owned invocation and transition from its outcome."
14
+ }
15
+ },
16
+ create(context) {
17
+ const bindings = makeMachineBindings();
18
+ const report = (node, operation) => {
19
+ if (operation !== undefined &&
20
+ hasMachineImport(bindings) &&
21
+ enclosingPlanningCallback(node, bindings) !== undefined)
22
+ context.report({ node, messageId: "nondeterministic", data: { operation } });
23
+ };
24
+ return {
25
+ ImportDeclaration: (node) => recordMachineImport(bindings, node),
26
+ CallExpression: (node) => report(node, nondeterministicOperation(context, node)),
27
+ MemberExpression: (node) => report(node, nondeterministicProperty(context, node)),
28
+ NewExpression: (node) => report(node, nondeterministicOperation(context, node)),
29
+ VariableDeclarator: (node) => recordMachineDefinition(bindings, node)
30
+ };
31
+ }
32
+ };
33
+ //# sourceMappingURL=noNondeterministicPlanning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noNondeterministicPlanning.js","sourceRoot":"","sources":["../../../src/internal/rules/noNondeterministicPlanning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,CAAC,MAAM,0BAA0B,GAAS;IAC9C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,kEAAkE;YAC/E,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,gBAAgB,EACd,iNAAiN;SACpN;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,CACb,IAA4E,EAC5E,SAA6B,EACvB,EAAE;YACR,IACE,SAAS,KAAK,SAAS;gBACvB,gBAAgB,CAAC,QAAQ,CAAC;gBAC1B,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS;gBACvD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAChF,CAAC,CAAA;QACD,OAAO;YACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChE,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAChF,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjF,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/E,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;SACtE,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"noRedundantResolve.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noRedundantResolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAmDnD,eAAO,MAAM,kBAAkB,EAAE,IAqDhC,CAAA"}
1
+ {"version":3,"file":"noRedundantResolve.d.ts","sourceRoot":"","sources":["../../../src/internal/rules/noRedundantResolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAqEnD,eAAO,MAAM,kBAAkB,EAAE,IAmEhC,CAAA"}