modality-ts 0.0.8 → 0.0.10
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.
- package/README.md +9 -7
- package/dist/check/diagnostics/bounds.d.ts +4 -0
- package/dist/check/diagnostics/bounds.d.ts.map +1 -0
- package/dist/check/diagnostics/bounds.js +25 -0
- package/dist/check/diagnostics/bounds.js.map +1 -0
- package/dist/check/diagnostics/vacuity.d.ts +3 -0
- package/dist/check/diagnostics/vacuity.d.ts.map +1 -0
- package/dist/check/diagnostics/vacuity.js +22 -0
- package/dist/check/diagnostics/vacuity.js.map +1 -0
- package/dist/check/engine/check-model.d.ts +4 -0
- package/dist/check/engine/check-model.d.ts.map +1 -0
- package/dist/check/engine/check-model.js +162 -0
- package/dist/check/engine/check-model.js.map +1 -0
- package/dist/check/engine/initial-states.d.ts +3 -0
- package/dist/check/engine/initial-states.d.ts.map +1 -0
- package/dist/check/engine/initial-states.js +11 -0
- package/dist/check/engine/initial-states.js.map +1 -0
- package/dist/check/engine/model-api.d.ts +4 -0
- package/dist/check/engine/model-api.d.ts.map +1 -0
- package/dist/check/engine/model-api.js +15 -0
- package/dist/check/engine/model-api.js.map +1 -0
- package/dist/check/engine/mounts.d.ts +3 -0
- package/dist/check/engine/mounts.d.ts.map +1 -0
- package/dist/check/engine/mounts.js +13 -0
- package/dist/check/engine/mounts.js.map +1 -0
- package/dist/check/engine/stabilize.d.ts +3 -0
- package/dist/check/engine/stabilize.d.ts.map +1 -0
- package/dist/check/engine/stabilize.js +82 -0
- package/dist/check/engine/stabilize.js.map +1 -0
- package/dist/check/engine/state-utils.d.ts +12 -0
- package/dist/check/engine/state-utils.d.ts.map +1 -0
- package/dist/check/engine/state-utils.js +30 -0
- package/dist/check/engine/state-utils.js.map +1 -0
- package/dist/check/engine/transitions.d.ts +4 -0
- package/dist/check/engine/transitions.d.ts.map +1 -0
- package/dist/check/engine/transitions.js +15 -0
- package/dist/check/engine/transitions.js.map +1 -0
- package/dist/check/index.d.ts +14 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +13 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/properties/checked-state.d.ts +3 -0
- package/dist/check/properties/checked-state.d.ts.map +1 -0
- package/dist/check/properties/checked-state.js +21 -0
- package/dist/check/properties/checked-state.js.map +1 -0
- package/dist/check/properties/finalize.d.ts +4 -0
- package/dist/check/properties/finalize.d.ts.map +1 -0
- package/dist/check/properties/finalize.js +71 -0
- package/dist/check/properties/finalize.js.map +1 -0
- package/dist/check/properties/leads-to.d.ts +8 -0
- package/dist/check/properties/leads-to.d.ts.map +1 -0
- package/dist/check/properties/leads-to.js +69 -0
- package/dist/check/properties/leads-to.js.map +1 -0
- package/dist/check/properties/observe.d.ts +5 -0
- package/dist/check/properties/observe.d.ts.map +1 -0
- package/dist/check/properties/observe.js +56 -0
- package/dist/check/properties/observe.js.map +1 -0
- package/dist/check/properties/reachable-from.d.ts +8 -0
- package/dist/check/properties/reachable-from.d.ts.map +1 -0
- package/dist/check/properties/reachable-from.js +19 -0
- package/dist/check/properties/reachable-from.js.map +1 -0
- package/dist/check/runtime/domains.d.ts +5 -0
- package/dist/check/runtime/domains.d.ts.map +1 -0
- package/dist/check/runtime/domains.js +53 -0
- package/dist/check/runtime/domains.js.map +1 -0
- package/dist/check/runtime/effects.d.ts +9 -0
- package/dist/check/runtime/effects.d.ts.map +1 -0
- package/dist/check/runtime/effects.js +86 -0
- package/dist/check/runtime/effects.js.map +1 -0
- package/dist/check/runtime/expr.d.ts +7 -0
- package/dist/check/runtime/expr.d.ts.map +1 -0
- package/dist/check/runtime/expr.js +49 -0
- package/dist/check/runtime/expr.js.map +1 -0
- package/dist/check/runtime/navigation.d.ts +7 -0
- package/dist/check/runtime/navigation.d.ts.map +1 -0
- package/dist/check/runtime/navigation.js +60 -0
- package/dist/check/runtime/navigation.js.map +1 -0
- package/dist/check/runtime/opaque.d.ts +3 -0
- package/dist/check/runtime/opaque.d.ts.map +1 -0
- package/dist/check/runtime/opaque.js +72 -0
- package/dist/check/runtime/opaque.js.map +1 -0
- package/dist/check/runtime/paths.d.ts +4 -0
- package/dist/check/runtime/paths.d.ts.map +1 -0
- package/dist/check/runtime/paths.js +28 -0
- package/dist/check/runtime/paths.js.map +1 -0
- package/dist/check/runtime/pending.d.ts +9 -0
- package/dist/check/runtime/pending.d.ts.map +1 -0
- package/dist/check/runtime/pending.js +5 -0
- package/dist/check/runtime/pending.js.map +1 -0
- package/dist/check/runtime/tokens.d.ts +7 -0
- package/dist/check/runtime/tokens.d.ts.map +1 -0
- package/dist/check/runtime/tokens.js +36 -0
- package/dist/check/runtime/tokens.js.map +1 -0
- package/dist/check/slicing/slice-model.d.ts +5 -0
- package/dist/check/slicing/slice-model.d.ts.map +1 -0
- package/dist/check/slicing/slice-model.js +48 -0
- package/dist/check/slicing/slice-model.js.map +1 -0
- package/dist/check/traces/step-facts.d.ts +3 -0
- package/dist/check/traces/step-facts.d.ts.map +1 -0
- package/dist/check/traces/step-facts.js +35 -0
- package/dist/check/traces/step-facts.js.map +1 -0
- package/dist/check/traces/trace.d.ts +8 -0
- package/dist/check/traces/trace.d.ts.map +1 -0
- package/dist/check/traces/trace.js +42 -0
- package/dist/check/traces/trace.js.map +1 -0
- package/dist/{checker/search/index.d.ts → check/types.d.ts} +16 -6
- package/dist/check/types.d.ts.map +1 -0
- package/dist/{kernel/ir → check}/types.js.map +1 -1
- package/dist/cli/check.d.ts +3 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +2 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/ci.d.ts.map +1 -0
- package/dist/cli/ci.js.map +1 -0
- package/dist/{modality → cli}/cli.d.ts.map +1 -1
- package/dist/{modality → cli}/cli.js +183 -50
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/codegen/model.d.ts +3 -0
- package/dist/cli/codegen/model.d.ts.map +1 -0
- package/dist/{modality → cli}/codegen/model.js +18 -10
- package/dist/cli/codegen/model.js.map +1 -0
- package/dist/{modality → cli}/codegen/replay-test.d.ts +1 -1
- package/dist/cli/codegen/replay-test.d.ts.map +1 -0
- package/dist/{modality → cli}/codegen/replay-test.js +12 -12
- package/dist/cli/codegen/replay-test.js.map +1 -0
- package/dist/cli/conform.d.ts +3 -0
- package/dist/cli/conform.d.ts.map +1 -0
- package/dist/cli/conform.js +2 -0
- package/dist/cli/conform.js.map +1 -0
- package/dist/cli/defaults.d.ts +13 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +57 -0
- package/dist/cli/defaults.js.map +1 -0
- package/dist/cli/export-tla.d.ts +3 -0
- package/dist/cli/export-tla.d.ts.map +1 -0
- package/dist/cli/export-tla.js +2 -0
- package/dist/cli/export-tla.js.map +1 -0
- package/dist/{modality → cli}/extract.d.ts +1 -1
- package/dist/cli/extract.d.ts.map +1 -0
- package/dist/cli/extract.js.map +1 -0
- package/dist/{modality → cli}/features/check/command.d.ts +3 -2
- package/dist/cli/features/check/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/check/command.js +67 -27
- package/dist/cli/features/check/command.js.map +1 -0
- package/dist/cli/features/check/index.d.ts +3 -0
- package/dist/cli/features/check/index.d.ts.map +1 -0
- package/dist/cli/features/check/index.js +2 -0
- package/dist/cli/features/check/index.js.map +1 -0
- package/dist/cli/features/ci/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/ci/command.js +66 -26
- package/dist/cli/features/ci/command.js.map +1 -0
- package/dist/cli/features/ci/index.d.ts.map +1 -0
- package/dist/cli/features/ci/index.js.map +1 -0
- package/dist/{modality → cli}/features/conform/command.d.ts +1 -1
- package/dist/cli/features/conform/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/conform/command.js +67 -25
- package/dist/cli/features/conform/command.js.map +1 -0
- package/dist/cli/features/conform/index.d.ts.map +1 -0
- package/dist/cli/features/conform/index.js.map +1 -0
- package/dist/{modality → cli}/features/export/command.d.ts +1 -1
- package/dist/cli/features/export/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/export/command.js +72 -27
- package/dist/cli/features/export/command.js.map +1 -0
- package/dist/{modality → cli}/features/export/index.d.ts +2 -2
- package/dist/cli/features/export/index.d.ts.map +1 -0
- package/dist/cli/features/export/index.js +2 -0
- package/dist/cli/features/export/index.js.map +1 -0
- package/dist/{modality → cli}/features/extract/command.d.ts +5 -4
- package/dist/cli/features/extract/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/extract/command.js +295 -82
- package/dist/cli/features/extract/command.js.map +1 -0
- package/dist/{modality → cli}/features/extract/index.d.ts +1 -1
- package/dist/cli/features/extract/index.d.ts.map +1 -0
- package/dist/cli/features/extract/index.js.map +1 -0
- package/dist/cli/features/init/command.d.ts +9 -0
- package/dist/cli/features/init/command.d.ts.map +1 -0
- package/dist/cli/features/init/command.js +23 -0
- package/dist/cli/features/init/command.js.map +1 -0
- package/dist/cli/features/init/index.d.ts +3 -0
- package/dist/cli/features/init/index.d.ts.map +1 -0
- package/dist/cli/features/init/index.js +2 -0
- package/dist/cli/features/init/index.js.map +1 -0
- package/dist/{modality → cli}/features/replay/command.d.ts +1 -1
- package/dist/cli/features/replay/command.d.ts.map +1 -0
- package/dist/{modality → cli}/features/replay/command.js +42 -16
- package/dist/cli/features/replay/command.js.map +1 -0
- package/dist/cli/features/replay/index.d.ts.map +1 -0
- package/dist/cli/features/replay/index.js.map +1 -0
- package/dist/{harness → cli/harness}/index.d.ts +1 -1
- package/dist/cli/harness/index.d.ts.map +1 -0
- package/dist/{harness → cli/harness}/index.js +128 -37
- package/dist/cli/harness/index.js.map +1 -0
- package/dist/{modality → cli}/overlay.d.ts +1 -1
- package/dist/cli/overlay.d.ts.map +1 -0
- package/dist/{modality → cli}/overlay.js +1 -1
- package/dist/cli/overlay.js.map +1 -0
- package/dist/{modality → cli}/registry/index.d.ts +2 -2
- package/dist/cli/registry/index.d.ts.map +1 -0
- package/dist/{modality → cli}/registry/index.js +32 -17
- package/dist/cli/registry/index.js.map +1 -0
- package/dist/cli/replay.d.ts +3 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/{runtime → cli/runtime}/index.d.ts +1 -1
- package/dist/cli/runtime/index.d.ts.map +1 -0
- package/dist/{runtime → cli/runtime}/index.js +37 -10
- package/dist/cli/runtime/index.js.map +1 -0
- package/dist/core/artifacts/index.d.ts.map +1 -0
- package/dist/{kernel → core}/artifacts/index.js +7 -2
- package/dist/core/artifacts/index.js.map +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ir/canonical.d.ts.map +1 -0
- package/dist/{kernel → core}/ir/canonical.js +30 -7
- package/dist/core/ir/canonical.js.map +1 -0
- package/dist/core/ir/domains.d.ts.map +1 -0
- package/dist/{kernel → core}/ir/domains.js +18 -6
- package/dist/core/ir/domains.js.map +1 -0
- package/dist/core/ir/types.d.ts.map +1 -0
- package/dist/{kernel/trace → core/ir}/types.js.map +1 -1
- package/dist/core/ir/validator.d.ts.map +1 -0
- package/dist/{kernel → core}/ir/validator.js +48 -19
- package/dist/core/ir/validator.js.map +1 -0
- package/dist/core/overlay/index.d.ts.map +1 -0
- package/dist/{kernel → core}/overlay/index.js +35 -14
- package/dist/core/overlay/index.js.map +1 -0
- package/dist/core/props/index.d.ts.map +1 -0
- package/dist/{kernel → core}/props/index.js +69 -21
- package/dist/core/props/index.js.map +1 -0
- package/dist/{kernel → core}/report/types.d.ts.map +1 -1
- package/dist/{kernel → core}/report/types.js.map +1 -1
- package/dist/core/trace/types.d.ts.map +1 -0
- package/dist/core/trace/types.js +2 -0
- package/dist/core/trace/types.js.map +1 -0
- package/dist/extract/engine/index.d.ts +4 -0
- package/dist/extract/engine/index.d.ts.map +1 -0
- package/dist/extract/engine/index.js +4 -0
- package/dist/extract/engine/index.js.map +1 -0
- package/dist/{extraction → extract/engine}/pipeline/index.d.ts +1 -2
- package/dist/extract/engine/pipeline/index.d.ts.map +1 -0
- package/dist/{extraction → extract/engine}/pipeline/index.js +55 -18
- package/dist/extract/engine/pipeline/index.js.map +1 -0
- package/dist/{extraction → extract/engine}/spi/index.d.ts +17 -1
- package/dist/extract/engine/spi/index.d.ts.map +1 -0
- package/dist/extract/engine/spi/index.js.map +1 -0
- package/dist/extract/engine/ts/ast.d.ts +23 -0
- package/dist/extract/engine/ts/ast.d.ts.map +1 -0
- package/dist/extract/engine/ts/ast.js +97 -0
- package/dist/extract/engine/ts/ast.js.map +1 -0
- package/dist/extract/engine/ts/components.d.ts +21 -0
- package/dist/extract/engine/ts/components.d.ts.map +1 -0
- package/dist/extract/engine/ts/components.js +287 -0
- package/dist/extract/engine/ts/components.js.map +1 -0
- package/dist/extract/engine/ts/context.d.ts +10 -0
- package/dist/extract/engine/ts/context.d.ts.map +1 -0
- package/dist/extract/engine/ts/context.js +273 -0
- package/dist/extract/engine/ts/context.js.map +1 -0
- package/dist/extract/engine/ts/domains.d.ts +8 -0
- package/dist/extract/engine/ts/domains.d.ts.map +1 -0
- package/dist/extract/engine/ts/domains.js +262 -0
- package/dist/extract/engine/ts/domains.js.map +1 -0
- package/dist/extract/engine/ts/expressions.d.ts +2 -0
- package/dist/extract/engine/ts/expressions.d.ts.map +1 -0
- package/dist/extract/engine/ts/expressions.js +2 -0
- package/dist/extract/engine/ts/expressions.js.map +1 -0
- package/dist/extract/engine/ts/handlers.d.ts +4 -0
- package/dist/extract/engine/ts/handlers.d.ts.map +1 -0
- package/dist/extract/engine/ts/handlers.js +3 -0
- package/dist/extract/engine/ts/handlers.js.map +1 -0
- package/dist/extract/engine/ts/ids.d.ts +7 -0
- package/dist/extract/engine/ts/ids.d.ts.map +1 -0
- package/dist/extract/engine/ts/ids.js +63 -0
- package/dist/extract/engine/ts/ids.js.map +1 -0
- package/dist/extract/engine/ts/input-transitions.d.ts +5 -0
- package/dist/extract/engine/ts/input-transitions.d.ts.map +1 -0
- package/dist/extract/engine/ts/input-transitions.js +132 -0
- package/dist/extract/engine/ts/input-transitions.js.map +1 -0
- package/dist/extract/engine/ts/jsx.d.ts +3 -0
- package/dist/extract/engine/ts/jsx.d.ts.map +1 -0
- package/dist/extract/engine/ts/jsx.js +3 -0
- package/dist/extract/engine/ts/jsx.js.map +1 -0
- package/dist/extract/engine/ts/react-source-transitions.d.ts +24 -0
- package/dist/extract/engine/ts/react-source-transitions.d.ts.map +1 -0
- package/dist/extract/engine/ts/react-source-transitions.js +243 -0
- package/dist/extract/engine/ts/react-source-transitions.js.map +1 -0
- package/dist/extract/engine/ts/routes.d.ts +9 -0
- package/dist/extract/engine/ts/routes.d.ts.map +1 -0
- package/dist/extract/engine/ts/routes.js +94 -0
- package/dist/extract/engine/ts/routes.js.map +1 -0
- package/dist/extract/engine/ts/source.d.ts +3 -0
- package/dist/extract/engine/ts/source.d.ts.map +1 -0
- package/dist/extract/engine/ts/source.js +5 -0
- package/dist/extract/engine/ts/source.js.map +1 -0
- package/dist/extract/engine/ts/static-navigation.d.ts +5 -0
- package/dist/extract/engine/ts/static-navigation.d.ts.map +1 -0
- package/dist/extract/engine/ts/static-navigation.js +425 -0
- package/dist/extract/engine/ts/static-navigation.js.map +1 -0
- package/dist/extract/engine/ts/transition/async.d.ts +45 -0
- package/dist/extract/engine/ts/transition/async.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/async.js +578 -0
- package/dist/extract/engine/ts/transition/async.js.map +1 -0
- package/dist/extract/engine/ts/transition/component-props.d.ts +26 -0
- package/dist/extract/engine/ts/transition/component-props.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/component-props.js +200 -0
- package/dist/extract/engine/ts/transition/component-props.js.map +1 -0
- package/dist/extract/engine/ts/transition/effects.d.ts +12 -0
- package/dist/extract/engine/ts/transition/effects.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/effects.js +139 -0
- package/dist/extract/engine/ts/transition/effects.js.map +1 -0
- package/dist/extract/engine/ts/transition/expressions.d.ts +34 -0
- package/dist/extract/engine/ts/transition/expressions.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/expressions.js +374 -0
- package/dist/extract/engine/ts/transition/expressions.js.map +1 -0
- package/dist/extract/engine/ts/transition/guards.d.ts +21 -0
- package/dist/extract/engine/ts/transition/guards.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/guards.js +258 -0
- package/dist/extract/engine/ts/transition/guards.js.map +1 -0
- package/dist/extract/engine/ts/transition/handlers.d.ts +32 -0
- package/dist/extract/engine/ts/transition/handlers.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/handlers.js +294 -0
- package/dist/extract/engine/ts/transition/handlers.js.map +1 -0
- package/dist/extract/engine/ts/transition/locals.d.ts +20 -0
- package/dist/extract/engine/ts/transition/locals.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/locals.js +123 -0
- package/dist/extract/engine/ts/transition/locals.js.map +1 -0
- package/dist/extract/engine/ts/transition/navigation.d.ts +21 -0
- package/dist/extract/engine/ts/transition/navigation.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/navigation.js +129 -0
- package/dist/extract/engine/ts/transition/navigation.js.map +1 -0
- package/dist/extract/engine/ts/transition/plugin-calls.d.ts +10 -0
- package/dist/extract/engine/ts/transition/plugin-calls.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/plugin-calls.js +114 -0
- package/dist/extract/engine/ts/transition/plugin-calls.js.map +1 -0
- package/dist/extract/engine/ts/transition/statement-summary.d.ts +34 -0
- package/dist/extract/engine/ts/transition/statement-summary.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/statement-summary.js +502 -0
- package/dist/extract/engine/ts/transition/statement-summary.js.map +1 -0
- package/dist/extract/engine/ts/transition/timers.d.ts +15 -0
- package/dist/extract/engine/ts/transition/timers.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/timers.js +109 -0
- package/dist/extract/engine/ts/transition/timers.js.map +1 -0
- package/dist/extract/engine/ts/transition/ui.d.ts +12 -0
- package/dist/extract/engine/ts/transition/ui.d.ts.map +1 -0
- package/dist/extract/engine/ts/transition/ui.js +113 -0
- package/dist/extract/engine/ts/transition/ui.js.map +1 -0
- package/dist/extract/engine/ts/traversal.d.ts +3 -0
- package/dist/extract/engine/ts/traversal.d.ts.map +1 -0
- package/dist/extract/engine/ts/traversal.js +6 -0
- package/dist/extract/engine/ts/traversal.js.map +1 -0
- package/dist/extract/engine/ts/types.d.ts +46 -0
- package/dist/extract/engine/ts/types.d.ts.map +1 -0
- package/dist/extract/engine/ts/types.js +2 -0
- package/dist/extract/engine/ts/types.js.map +1 -0
- package/dist/extract/index.d.ts +2 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +2 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/extract/sources/jotai/discover.d.ts +3 -0
- package/dist/extract/sources/jotai/discover.d.ts.map +1 -0
- package/dist/extract/sources/jotai/discover.js +65 -0
- package/dist/extract/sources/jotai/discover.js.map +1 -0
- package/dist/extract/sources/jotai/domains.d.ts +6 -0
- package/dist/extract/sources/jotai/domains.d.ts.map +1 -0
- package/dist/extract/sources/jotai/domains.js +283 -0
- package/dist/extract/sources/jotai/domains.js.map +1 -0
- package/dist/{sources → extract/sources}/jotai/harness.d.ts +2 -2
- package/dist/extract/sources/jotai/harness.d.ts.map +1 -0
- package/dist/{sources → extract/sources}/jotai/harness.js +1 -1
- package/dist/extract/sources/jotai/harness.js.map +1 -0
- package/dist/extract/sources/jotai/index.d.ts +4 -0
- package/dist/extract/sources/jotai/index.d.ts.map +1 -0
- package/dist/extract/sources/jotai/index.js +3 -0
- package/dist/extract/sources/jotai/index.js.map +1 -0
- package/dist/extract/sources/jotai/plugin.d.ts +4 -0
- package/dist/extract/sources/jotai/plugin.d.ts.map +1 -0
- package/dist/extract/sources/jotai/plugin.js +19 -0
- package/dist/extract/sources/jotai/plugin.js.map +1 -0
- package/dist/extract/sources/jotai/transitions.d.ts +15 -0
- package/dist/extract/sources/jotai/transitions.d.ts.map +1 -0
- package/dist/extract/sources/jotai/transitions.js +44 -0
- package/dist/extract/sources/jotai/transitions.js.map +1 -0
- package/dist/extract/sources/jotai/writes.d.ts +8 -0
- package/dist/extract/sources/jotai/writes.d.ts.map +1 -0
- package/dist/extract/sources/jotai/writes.js +173 -0
- package/dist/extract/sources/jotai/writes.js.map +1 -0
- package/dist/{sources → extract/sources}/router/harness.d.ts +1 -1
- package/dist/extract/sources/router/harness.d.ts.map +1 -0
- package/dist/{sources → extract/sources}/router/harness.js +6 -2
- package/dist/extract/sources/router/harness.js.map +1 -0
- package/dist/extract/sources/router/index.d.ts +9 -0
- package/dist/extract/sources/router/index.d.ts.map +1 -0
- package/dist/extract/sources/router/index.js +22 -0
- package/dist/extract/sources/router/index.js.map +1 -0
- package/dist/extract/sources/router/navigation.d.ts +5 -0
- package/dist/extract/sources/router/navigation.d.ts.map +1 -0
- package/dist/extract/sources/router/navigation.js +16 -0
- package/dist/extract/sources/router/navigation.js.map +1 -0
- package/dist/extract/sources/router/routes.d.ts +4 -0
- package/dist/extract/sources/router/routes.d.ts.map +1 -0
- package/dist/extract/sources/router/routes.js +28 -0
- package/dist/extract/sources/router/routes.js.map +1 -0
- package/dist/extract/sources/shared/react-transition-extract.d.ts +13 -0
- package/dist/extract/sources/shared/react-transition-extract.d.ts.map +1 -0
- package/dist/extract/sources/shared/react-transition-extract.js +22 -0
- package/dist/extract/sources/shared/react-transition-extract.js.map +1 -0
- package/dist/extract/sources/swr/discover.d.ts +11 -0
- package/dist/extract/sources/swr/discover.d.ts.map +1 -0
- package/dist/extract/sources/swr/discover.js +175 -0
- package/dist/extract/sources/swr/discover.js.map +1 -0
- package/dist/extract/sources/swr/domains.d.ts +5 -0
- package/dist/extract/sources/swr/domains.d.ts.map +1 -0
- package/dist/extract/sources/swr/domains.js +99 -0
- package/dist/extract/sources/swr/domains.js.map +1 -0
- package/dist/{sources → extract/sources}/swr/harness.d.ts +2 -2
- package/dist/extract/sources/swr/harness.d.ts.map +1 -0
- package/dist/{sources → extract/sources}/swr/harness.js +3 -1
- package/dist/extract/sources/swr/harness.js.map +1 -0
- package/dist/extract/sources/swr/index.d.ts +6 -0
- package/dist/extract/sources/swr/index.d.ts.map +1 -0
- package/dist/extract/sources/swr/index.js +4 -0
- package/dist/extract/sources/swr/index.js.map +1 -0
- package/dist/extract/sources/swr/plugin.d.ts +4 -0
- package/dist/extract/sources/swr/plugin.d.ts.map +1 -0
- package/dist/extract/sources/swr/plugin.js +21 -0
- package/dist/extract/sources/swr/plugin.js.map +1 -0
- package/dist/{sources/swr/index.d.ts → extract/sources/swr/template.d.ts} +4 -6
- package/dist/extract/sources/swr/template.d.ts.map +1 -0
- package/dist/extract/sources/swr/template.js +331 -0
- package/dist/extract/sources/swr/template.js.map +1 -0
- package/dist/extract/sources/swr/transitions.d.ts +15 -0
- package/dist/extract/sources/swr/transitions.d.ts.map +1 -0
- package/dist/extract/sources/swr/transitions.js +43 -0
- package/dist/extract/sources/swr/transitions.js.map +1 -0
- package/dist/extract/sources/swr/writes.d.ts +3 -0
- package/dist/extract/sources/swr/writes.d.ts.map +1 -0
- package/dist/extract/sources/swr/writes.js +54 -0
- package/dist/extract/sources/swr/writes.js.map +1 -0
- package/dist/{sources → extract/sources}/use-state/harness.d.ts +2 -2
- package/dist/extract/sources/use-state/harness.d.ts.map +1 -0
- package/dist/{sources → extract/sources}/use-state/harness.js +1 -1
- package/dist/extract/sources/use-state/harness.js.map +1 -0
- package/dist/extract/sources/use-state/index.d.ts +4 -0
- package/dist/extract/sources/use-state/index.d.ts.map +1 -0
- package/dist/{sources → extract/sources}/use-state/index.js +84 -31
- package/dist/extract/sources/use-state/index.js.map +1 -0
- package/dist/extract/sources/use-state/transitions.d.ts +4 -0
- package/dist/extract/sources/use-state/transitions.d.ts.map +1 -0
- package/dist/extract/sources/use-state/transitions.js +27 -0
- package/dist/extract/sources/use-state/transitions.js.map +1 -0
- package/dist/extract/sources/use-state/types.d.ts +67 -0
- package/dist/extract/sources/use-state/types.d.ts.map +1 -0
- package/dist/extract/sources/use-state/types.js +2 -0
- package/dist/extract/sources/use-state/types.js.map +1 -0
- package/package.json +85 -71
- package/dist/checker/encode/index.d.ts +0 -2
- package/dist/checker/encode/index.d.ts.map +0 -1
- package/dist/checker/encode/index.js +0 -2
- package/dist/checker/encode/index.js.map +0 -1
- package/dist/checker/index.d.ts +0 -6
- package/dist/checker/index.d.ts.map +0 -1
- package/dist/checker/index.js +0 -6
- package/dist/checker/index.js.map +0 -1
- package/dist/checker/monitors/index.d.ts +0 -2
- package/dist/checker/monitors/index.d.ts.map +0 -1
- package/dist/checker/monitors/index.js.map +0 -1
- package/dist/checker/search/eval.d.ts +0 -16
- package/dist/checker/search/eval.d.ts.map +0 -1
- package/dist/checker/search/eval.js +0 -308
- package/dist/checker/search/eval.js.map +0 -1
- package/dist/checker/search/index.d.ts.map +0 -1
- package/dist/checker/search/index.js +0 -556
- package/dist/checker/search/index.js.map +0 -1
- package/dist/checker/slicing/index.d.ts +0 -2
- package/dist/checker/slicing/index.d.ts.map +0 -1
- package/dist/checker/slicing/index.js +0 -2
- package/dist/checker/slicing/index.js.map +0 -1
- package/dist/checker/traces/index.d.ts +0 -2
- package/dist/checker/traces/index.d.ts.map +0 -1
- package/dist/checker/traces/index.js +0 -2
- package/dist/checker/traces/index.js.map +0 -1
- package/dist/extraction/index.d.ts +0 -34
- package/dist/extraction/index.d.ts.map +0 -1
- package/dist/extraction/index.js +0 -2982
- package/dist/extraction/index.js.map +0 -1
- package/dist/extraction/pipeline/index.d.ts.map +0 -1
- package/dist/extraction/pipeline/index.js.map +0 -1
- package/dist/extraction/spi/index.d.ts.map +0 -1
- package/dist/extraction/spi/index.js +0 -2
- package/dist/extraction/spi/index.js.map +0 -1
- package/dist/harness/index.d.ts.map +0 -1
- package/dist/harness/index.js.map +0 -1
- package/dist/kernel/artifacts/index.d.ts.map +0 -1
- package/dist/kernel/artifacts/index.js.map +0 -1
- package/dist/kernel/index.d.ts.map +0 -1
- package/dist/kernel/index.js.map +0 -1
- package/dist/kernel/ir/canonical.d.ts.map +0 -1
- package/dist/kernel/ir/canonical.js.map +0 -1
- package/dist/kernel/ir/domains.d.ts.map +0 -1
- package/dist/kernel/ir/domains.js.map +0 -1
- package/dist/kernel/ir/types.d.ts.map +0 -1
- package/dist/kernel/ir/validator.d.ts.map +0 -1
- package/dist/kernel/ir/validator.js.map +0 -1
- package/dist/kernel/overlay/index.d.ts.map +0 -1
- package/dist/kernel/overlay/index.js.map +0 -1
- package/dist/kernel/props/index.d.ts.map +0 -1
- package/dist/kernel/props/index.js.map +0 -1
- package/dist/kernel/trace/types.d.ts.map +0 -1
- package/dist/modality/check.d.ts +0 -3
- package/dist/modality/check.d.ts.map +0 -1
- package/dist/modality/check.js +0 -2
- package/dist/modality/check.js.map +0 -1
- package/dist/modality/ci.d.ts.map +0 -1
- package/dist/modality/ci.js.map +0 -1
- package/dist/modality/cli.js.map +0 -1
- package/dist/modality/codegen/model.d.ts +0 -3
- package/dist/modality/codegen/model.d.ts.map +0 -1
- package/dist/modality/codegen/model.js.map +0 -1
- package/dist/modality/codegen/replay-test.d.ts.map +0 -1
- package/dist/modality/codegen/replay-test.js.map +0 -1
- package/dist/modality/conform.d.ts +0 -3
- package/dist/modality/conform.d.ts.map +0 -1
- package/dist/modality/conform.js +0 -2
- package/dist/modality/conform.js.map +0 -1
- package/dist/modality/export-tla.d.ts +0 -3
- package/dist/modality/export-tla.d.ts.map +0 -1
- package/dist/modality/export-tla.js +0 -2
- package/dist/modality/export-tla.js.map +0 -1
- package/dist/modality/extract.d.ts.map +0 -1
- package/dist/modality/extract.js.map +0 -1
- package/dist/modality/features/check/command.d.ts.map +0 -1
- package/dist/modality/features/check/command.js.map +0 -1
- package/dist/modality/features/check/index.d.ts +0 -3
- package/dist/modality/features/check/index.d.ts.map +0 -1
- package/dist/modality/features/check/index.js +0 -2
- package/dist/modality/features/check/index.js.map +0 -1
- package/dist/modality/features/ci/command.d.ts.map +0 -1
- package/dist/modality/features/ci/command.js.map +0 -1
- package/dist/modality/features/ci/index.d.ts.map +0 -1
- package/dist/modality/features/ci/index.js.map +0 -1
- package/dist/modality/features/conform/command.d.ts.map +0 -1
- package/dist/modality/features/conform/command.js.map +0 -1
- package/dist/modality/features/conform/index.d.ts.map +0 -1
- package/dist/modality/features/conform/index.js.map +0 -1
- package/dist/modality/features/export/command.d.ts.map +0 -1
- package/dist/modality/features/export/command.js.map +0 -1
- package/dist/modality/features/export/index.d.ts.map +0 -1
- package/dist/modality/features/export/index.js +0 -2
- package/dist/modality/features/export/index.js.map +0 -1
- package/dist/modality/features/extract/command.d.ts.map +0 -1
- package/dist/modality/features/extract/command.js.map +0 -1
- package/dist/modality/features/extract/index.d.ts.map +0 -1
- package/dist/modality/features/extract/index.js.map +0 -1
- package/dist/modality/features/replay/command.d.ts.map +0 -1
- package/dist/modality/features/replay/command.js.map +0 -1
- package/dist/modality/features/replay/index.d.ts.map +0 -1
- package/dist/modality/features/replay/index.js.map +0 -1
- package/dist/modality/overlay.d.ts.map +0 -1
- package/dist/modality/overlay.js.map +0 -1
- package/dist/modality/registry/index.d.ts.map +0 -1
- package/dist/modality/registry/index.js.map +0 -1
- package/dist/modality/replay.d.ts +0 -3
- package/dist/modality/replay.d.ts.map +0 -1
- package/dist/modality/replay.js.map +0 -1
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js.map +0 -1
- package/dist/sources/jotai/harness.d.ts.map +0 -1
- package/dist/sources/jotai/harness.js.map +0 -1
- package/dist/sources/jotai/index.d.ts +0 -11
- package/dist/sources/jotai/index.d.ts.map +0 -1
- package/dist/sources/jotai/index.js +0 -432
- package/dist/sources/jotai/index.js.map +0 -1
- package/dist/sources/router/harness.d.ts.map +0 -1
- package/dist/sources/router/harness.js.map +0 -1
- package/dist/sources/router/index.d.ts +0 -15
- package/dist/sources/router/index.d.ts.map +0 -1
- package/dist/sources/router/index.js +0 -41
- package/dist/sources/router/index.js.map +0 -1
- package/dist/sources/swr/harness.d.ts.map +0 -1
- package/dist/sources/swr/harness.js.map +0 -1
- package/dist/sources/swr/index.d.ts.map +0 -1
- package/dist/sources/swr/index.js +0 -528
- package/dist/sources/swr/index.js.map +0 -1
- package/dist/sources/use-state/harness.d.ts.map +0 -1
- package/dist/sources/use-state/harness.js.map +0 -1
- package/dist/sources/use-state/index.d.ts +0 -9
- package/dist/sources/use-state/index.d.ts.map +0 -1
- package/dist/sources/use-state/index.js.map +0 -1
- /package/dist/{kernel/ir → check}/types.js +0 -0
- /package/dist/{modality → cli}/ci.d.ts +0 -0
- /package/dist/{modality → cli}/ci.js +0 -0
- /package/dist/{modality → cli}/cli.d.ts +0 -0
- /package/dist/{modality → cli}/extract.js +0 -0
- /package/dist/{modality → cli}/features/ci/command.d.ts +0 -0
- /package/dist/{modality → cli}/features/ci/index.d.ts +0 -0
- /package/dist/{modality → cli}/features/ci/index.js +0 -0
- /package/dist/{modality → cli}/features/conform/index.d.ts +0 -0
- /package/dist/{modality → cli}/features/conform/index.js +0 -0
- /package/dist/{modality → cli}/features/extract/index.js +0 -0
- /package/dist/{modality → cli}/features/replay/index.d.ts +0 -0
- /package/dist/{modality → cli}/features/replay/index.js +0 -0
- /package/dist/{modality → cli}/replay.js +0 -0
- /package/dist/{kernel → core}/artifacts/index.d.ts +0 -0
- /package/dist/{kernel → core}/index.d.ts +0 -0
- /package/dist/{kernel → core}/index.js +0 -0
- /package/dist/{kernel → core}/ir/canonical.d.ts +0 -0
- /package/dist/{kernel → core}/ir/domains.d.ts +0 -0
- /package/dist/{kernel → core}/ir/types.d.ts +0 -0
- /package/dist/{kernel/report → core/ir}/types.js +0 -0
- /package/dist/{kernel → core}/ir/validator.d.ts +0 -0
- /package/dist/{kernel → core}/overlay/index.d.ts +0 -0
- /package/dist/{kernel → core}/props/index.d.ts +0 -0
- /package/dist/{kernel → core}/report/types.d.ts +0 -0
- /package/dist/{kernel/trace → core/report}/types.js +0 -0
- /package/dist/{kernel → core}/trace/types.d.ts +0 -0
- /package/dist/{checker/monitors → extract/engine/spi}/index.js +0 -0
|
@@ -1,71 +1,115 @@
|
|
|
1
1
|
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { dirname, join, parse, resolve } from "node:path";
|
|
3
|
+
import { dirname, extname, join, parse, resolve } from "node:path";
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
5
5
|
import * as ts from "typescript";
|
|
6
|
-
import {
|
|
7
|
-
import { canonicalJson, parseModelArtifact } from "modality-ts/
|
|
8
|
-
import {
|
|
6
|
+
import { runExtractionPipeline } from "modality-ts/extract";
|
|
7
|
+
import { canonicalJson, parseModelArtifact, } from "modality-ts/core";
|
|
8
|
+
import { routerSource } from "modality-ts/extract/sources/router";
|
|
9
9
|
import { emitAppModel } from "../../codegen/model.js";
|
|
10
10
|
import { loadAndApplyOverlay, loadOverlaySpec } from "../../overlay.js";
|
|
11
11
|
import { createBuiltinModalityRegistry } from "../../registry/index.js";
|
|
12
12
|
export async function runExtractCommand(options) {
|
|
13
|
-
const
|
|
14
|
-
const
|
|
13
|
+
const sourcePaths = normalizedSourcePaths(options);
|
|
14
|
+
const project = await loadExtractionProject(sourcePaths);
|
|
15
|
+
const config = await loadModalityConfig(options.configPath ?? (await findNearestConfig(project.configStartDir)));
|
|
15
16
|
const route = options.route ?? config.route ?? "/";
|
|
16
17
|
const appModelPath = options.appModelPath ?? `${dirname(options.modelPath)}/app.model.ts`;
|
|
17
|
-
const packageJsonPath = options.packageJsonPath ??
|
|
18
|
+
const packageJsonPath = options.packageJsonPath ??
|
|
19
|
+
config.packageJsonPath ??
|
|
20
|
+
(await findNearestPackageJson(project.configStartDir));
|
|
18
21
|
const dependencies = await readPackageDependencies(packageJsonPath);
|
|
19
22
|
const registry = createBuiltinModalityRegistry({
|
|
20
23
|
dependencies,
|
|
21
|
-
disabledPlugins: [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
disabledPlugins: [
|
|
25
|
+
...(config.disabledPlugins ?? []),
|
|
26
|
+
...(options.disabledPlugins ?? []),
|
|
27
|
+
],
|
|
28
|
+
extraSourcePlugins: [
|
|
29
|
+
...(config.plugins ?? []),
|
|
30
|
+
...(options.sourcePlugins ?? []),
|
|
31
|
+
],
|
|
32
|
+
routerPlugin: options.routerPlugin ?? config.routerPlugin,
|
|
24
33
|
});
|
|
25
|
-
const effectApis = uniqueStrings([
|
|
26
|
-
|
|
34
|
+
const effectApis = uniqueStrings([
|
|
35
|
+
...(config.effectApis ?? []),
|
|
36
|
+
...(options.effectApis ?? []),
|
|
37
|
+
...project.effectApis,
|
|
38
|
+
]);
|
|
39
|
+
const bounds = {
|
|
40
|
+
maxDepth: 12,
|
|
41
|
+
maxPending: 3,
|
|
42
|
+
maxInternalSteps: 16,
|
|
43
|
+
...(config.bounds ?? {}),
|
|
44
|
+
...(options.bounds ?? {}),
|
|
45
|
+
};
|
|
27
46
|
const pipeline = runExtractionPipeline({
|
|
28
47
|
sourceText: project.sourceText,
|
|
29
48
|
fileName: project.entryFile,
|
|
30
49
|
route,
|
|
50
|
+
routePatterns: project.routes,
|
|
31
51
|
effectApis,
|
|
32
52
|
sourcePlugins: registry.sourcePlugins,
|
|
33
53
|
routerPlugin: registry.routerPlugin,
|
|
34
|
-
extractHandlers: (sourceText, handlerOptions) => extractUseStateSkeleton(sourceText, { ...handlerOptions, routePatterns: project.routes })
|
|
35
54
|
});
|
|
36
55
|
const transitions = [...pipeline.transitions];
|
|
37
|
-
const discoveredRoutes = uniqueStrings([
|
|
56
|
+
const discoveredRoutes = uniqueStrings([
|
|
57
|
+
route,
|
|
58
|
+
...project.routes,
|
|
59
|
+
...transitionNavigatedRoutes(transitions),
|
|
60
|
+
]);
|
|
61
|
+
const defaultRouter = routerSource();
|
|
38
62
|
const routeVars = registry.routerPlugin
|
|
39
|
-
? registry.routerPlugin.routeVars(discoveredRoutes, {
|
|
40
|
-
|
|
63
|
+
? registry.routerPlugin.routeVars(discoveredRoutes, {
|
|
64
|
+
route,
|
|
65
|
+
bounds: { maxHistory: 4 },
|
|
66
|
+
})
|
|
67
|
+
: defaultRouter.routeVars(discoveredRoutes, {
|
|
68
|
+
route,
|
|
69
|
+
bounds: { maxHistory: 4 },
|
|
70
|
+
});
|
|
41
71
|
const templateVars = pipeline.templateFragments.flatMap((fragment) => fragment.vars);
|
|
42
72
|
const stateVars = refineAssignedLiteralDomains([...pipeline.stateVars, ...templateVars], transitions);
|
|
43
73
|
const extractedModel = {
|
|
44
74
|
schemaVersion: 1,
|
|
45
75
|
id: "extracted-model",
|
|
46
76
|
bounds,
|
|
47
|
-
metadata: {
|
|
48
|
-
|
|
49
|
-
|
|
77
|
+
metadata: {
|
|
78
|
+
sourceHashes: sourceHashes(project.sources),
|
|
79
|
+
plugins: pluginProvenance(pipeline.plugins),
|
|
80
|
+
},
|
|
81
|
+
vars: [
|
|
82
|
+
...routeVars,
|
|
83
|
+
...pendingVars(effectApis, transitions, [...routeVars, ...stateVars], bounds.maxPending),
|
|
84
|
+
...stateVars,
|
|
85
|
+
],
|
|
86
|
+
transitions,
|
|
50
87
|
};
|
|
51
|
-
const overlaySpec = options.explainDrift && options.overlayPath
|
|
52
|
-
|
|
88
|
+
const overlaySpec = options.explainDrift && options.overlayPath
|
|
89
|
+
? await readOverlaySpec(extractedModel, options.overlayPath)
|
|
90
|
+
: undefined;
|
|
91
|
+
const driftLines = overlaySpec
|
|
92
|
+
? explainOverlayDrift(extractedModel, overlaySpec)
|
|
93
|
+
: [];
|
|
53
94
|
const overlay = await loadAndApplyOverlay(extractedModel, options.overlayPath);
|
|
54
95
|
if (overlay.errors.length > 0) {
|
|
55
|
-
throw new Error([
|
|
96
|
+
throw new Error([
|
|
97
|
+
`Overlay merge failed: ${overlay.errors.join("; ")}`,
|
|
98
|
+
...driftLines,
|
|
99
|
+
].join("\n"));
|
|
56
100
|
}
|
|
57
101
|
const warnings = [
|
|
58
102
|
...pipeline.warnings,
|
|
59
103
|
...overlay.warnings,
|
|
60
|
-
...pluginConformanceWarnings(registry.sourcePlugins, dependencies)
|
|
104
|
+
...pluginConformanceWarnings(registry.sourcePlugins, dependencies),
|
|
61
105
|
];
|
|
62
106
|
const extractionCaveats = createExtractionCaveats(warnings);
|
|
63
107
|
const model = {
|
|
64
108
|
...overlay.model,
|
|
65
109
|
metadata: {
|
|
66
110
|
...overlay.model.metadata,
|
|
67
|
-
extractionCaveats
|
|
68
|
-
}
|
|
111
|
+
extractionCaveats,
|
|
112
|
+
},
|
|
69
113
|
};
|
|
70
114
|
const report = createExtractionReport(project.sourceFiles, model, warnings, overlay.ignoredVars, options.now ?? new Date());
|
|
71
115
|
await mkdir(dirname(options.modelPath), { recursive: true });
|
|
@@ -88,15 +132,33 @@ export async function runExtractCommand(options) {
|
|
|
88
132
|
`model=${options.modelPath}`,
|
|
89
133
|
`appModel=${appModelPath}`,
|
|
90
134
|
...(options.overlayPath ? [`overlay=${options.overlayPath}`] : []),
|
|
91
|
-
...(options.explainDrift
|
|
135
|
+
...(options.explainDrift
|
|
136
|
+
? driftLines.length > 0
|
|
137
|
+
? driftLines
|
|
138
|
+
: ["overlay-drift=none"]
|
|
139
|
+
: []),
|
|
92
140
|
...(options.configPath ? [`config=${options.configPath}`] : []),
|
|
93
|
-
...(options.expectModelPath
|
|
94
|
-
|
|
95
|
-
|
|
141
|
+
...(options.expectModelPath
|
|
142
|
+
? [`expectedModel=${options.expectModelPath}`]
|
|
143
|
+
: []),
|
|
144
|
+
...(options.reportPath ? [`report=${options.reportPath}`] : []),
|
|
145
|
+
],
|
|
96
146
|
};
|
|
97
147
|
}
|
|
98
|
-
|
|
99
|
-
const
|
|
148
|
+
function normalizedSourcePaths(options) {
|
|
149
|
+
const sourcePaths = options.sourcePaths ?? [];
|
|
150
|
+
const paths = [
|
|
151
|
+
...sourcePaths,
|
|
152
|
+
...(options.sourcePath ? [options.sourcePath] : []),
|
|
153
|
+
];
|
|
154
|
+
if (paths.length === 0)
|
|
155
|
+
throw new Error("Missing source.tsx path");
|
|
156
|
+
return uniqueStrings(paths.map((path) => resolve(path)));
|
|
157
|
+
}
|
|
158
|
+
async function loadExtractionProject(sourcePaths) {
|
|
159
|
+
if (sourcePaths.length > 1)
|
|
160
|
+
return loadMultiFileExtractionProject(sourcePaths);
|
|
161
|
+
const resolved = sourcePaths[0];
|
|
100
162
|
const info = await stat(resolved);
|
|
101
163
|
if (!info.isDirectory()) {
|
|
102
164
|
const source = await readFile(resolved, "utf8");
|
|
@@ -109,7 +171,7 @@ async function loadExtractionProject(sourcePath) {
|
|
|
109
171
|
sources: imported.sources,
|
|
110
172
|
routes: [],
|
|
111
173
|
effectApis: fetchEffectApis(imported.sources.map((entry) => entry.text).join("\n")),
|
|
112
|
-
configStartDir: dirname(resolved)
|
|
174
|
+
configStartDir: dirname(resolved),
|
|
113
175
|
};
|
|
114
176
|
}
|
|
115
177
|
const routesPath = join(resolved, "app", "routes.ts");
|
|
@@ -117,8 +179,11 @@ async function loadExtractionProject(sourcePath) {
|
|
|
117
179
|
const rootPath = join(resolved, "app", "root.tsx");
|
|
118
180
|
const roots = await existingFiles([rootPath]);
|
|
119
181
|
const entries = [
|
|
120
|
-
...await Promise.all(roots.map(async (path) => ({ path, text: await readFile(path, "utf8") }))),
|
|
121
|
-
...await Promise.all(routeEntries.map(async (entry) => ({
|
|
182
|
+
...(await Promise.all(roots.map(async (path) => ({ path, text: await readFile(path, "utf8") })))),
|
|
183
|
+
...(await Promise.all(routeEntries.map(async (entry) => ({
|
|
184
|
+
path: resolve(dirname(routesPath), entry.file),
|
|
185
|
+
text: await readFile(resolve(dirname(routesPath), entry.file), "utf8"),
|
|
186
|
+
})))),
|
|
122
187
|
];
|
|
123
188
|
const tsconfig = await readTsConfigResolution(resolved);
|
|
124
189
|
const imported = await sourceWithLocalImports(entries, tsconfig);
|
|
@@ -130,7 +195,30 @@ async function loadExtractionProject(sourcePath) {
|
|
|
130
195
|
sources: imported.sources,
|
|
131
196
|
routes: uniqueStrings(routeEntries.map((entry) => entry.pattern)),
|
|
132
197
|
effectApis: fetchEffectApis(sourceText),
|
|
133
|
-
configStartDir: resolved
|
|
198
|
+
configStartDir: resolved,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async function loadMultiFileExtractionProject(sourcePaths) {
|
|
202
|
+
const projects = await Promise.all(sourcePaths.map((sourcePath) => loadExtractionProject([sourcePath])));
|
|
203
|
+
const sourcesByPath = new Map();
|
|
204
|
+
for (const project of projects) {
|
|
205
|
+
for (const source of project.sources) {
|
|
206
|
+
sourcesByPath.set(source.path, source);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const sources = [...sourcesByPath.values()].sort((left, right) => left.path.localeCompare(right.path));
|
|
210
|
+
const sourceText = sources.map((entry) => entry.text).join("\n");
|
|
211
|
+
return {
|
|
212
|
+
entryFile: projects.map((project) => project.entryFile).join(","),
|
|
213
|
+
sourceText,
|
|
214
|
+
sourceFiles: sources.map((entry) => entry.path),
|
|
215
|
+
sources,
|
|
216
|
+
routes: uniqueStrings(projects.flatMap((project) => project.routes)),
|
|
217
|
+
effectApis: uniqueStrings([
|
|
218
|
+
...projects.flatMap((project) => project.effectApis),
|
|
219
|
+
...fetchEffectApis(sourceText),
|
|
220
|
+
]),
|
|
221
|
+
configStartDir: commonAncestor(projects.map((project) => project.configStartDir)),
|
|
134
222
|
};
|
|
135
223
|
}
|
|
136
224
|
async function sourceWithLocalImports(entries, tsconfig) {
|
|
@@ -156,7 +244,9 @@ function localImportSpecifiers(source) {
|
|
|
156
244
|
const specs = [];
|
|
157
245
|
const parsed = tsCreateSourceFile(source);
|
|
158
246
|
const visit = (node) => {
|
|
159
|
-
if (tsIsImportDeclaration(node) &&
|
|
247
|
+
if (tsIsImportDeclaration(node) &&
|
|
248
|
+
tsIsStringLiteral(node.moduleSpecifier) &&
|
|
249
|
+
isLocalImportSpecifier(node.moduleSpecifier.text)) {
|
|
160
250
|
specs.push(node.moduleSpecifier.text);
|
|
161
251
|
}
|
|
162
252
|
tsForEachChild(node, visit);
|
|
@@ -194,7 +284,8 @@ function importBases(baseDir, specifier, tsconfig) {
|
|
|
194
284
|
if (specifier.startsWith("."))
|
|
195
285
|
return [resolve(baseDir, specifier)];
|
|
196
286
|
const matches = tsconfig.paths.flatMap((entry) => {
|
|
197
|
-
if (!specifier.startsWith(entry.prefix) ||
|
|
287
|
+
if (!specifier.startsWith(entry.prefix) ||
|
|
288
|
+
!specifier.endsWith(entry.suffix))
|
|
198
289
|
return [];
|
|
199
290
|
const star = specifier.slice(entry.prefix.length, specifier.length - entry.suffix.length);
|
|
200
291
|
return entry.targets.map((target) => resolve(target.replace("*", star)));
|
|
@@ -206,7 +297,14 @@ function importBases(baseDir, specifier, tsconfig) {
|
|
|
206
297
|
async function firstExistingModulePath(base) {
|
|
207
298
|
const candidates = /\.[cm]?[jt]sx?$/.test(base)
|
|
208
299
|
? [base]
|
|
209
|
-
: [
|
|
300
|
+
: [
|
|
301
|
+
`${base}.ts`,
|
|
302
|
+
`${base}.tsx`,
|
|
303
|
+
`${base}.mts`,
|
|
304
|
+
`${base}.cts`,
|
|
305
|
+
join(base, "index.ts"),
|
|
306
|
+
join(base, "index.tsx"),
|
|
307
|
+
];
|
|
210
308
|
for (const candidate of candidates) {
|
|
211
309
|
try {
|
|
212
310
|
const candidateStat = await stat(candidate);
|
|
@@ -226,12 +324,18 @@ async function readTsConfigResolution(startDir) {
|
|
|
226
324
|
return { paths: [] };
|
|
227
325
|
const parsed = JSON.parse(await readFile(tsconfigPath, "utf8"));
|
|
228
326
|
const configDir = dirname(tsconfigPath);
|
|
229
|
-
const baseUrl = parsed.compilerOptions?.baseUrl
|
|
327
|
+
const baseUrl = parsed.compilerOptions?.baseUrl
|
|
328
|
+
? resolve(configDir, parsed.compilerOptions.baseUrl)
|
|
329
|
+
: configDir;
|
|
230
330
|
const paths = Object.entries(parsed.compilerOptions?.paths ?? {}).map(([key, targets]) => {
|
|
231
331
|
const star = key.indexOf("*");
|
|
232
332
|
const prefix = star >= 0 ? key.slice(0, star) : key;
|
|
233
333
|
const suffix = star >= 0 ? key.slice(star + 1) : "";
|
|
234
|
-
return {
|
|
334
|
+
return {
|
|
335
|
+
prefix,
|
|
336
|
+
suffix,
|
|
337
|
+
targets: targets.map((target) => resolve(baseUrl, target)),
|
|
338
|
+
};
|
|
235
339
|
});
|
|
236
340
|
return { baseUrl, paths };
|
|
237
341
|
}
|
|
@@ -273,11 +377,17 @@ function parseReactRouterRoutes(source) {
|
|
|
273
377
|
const parsed = tsCreateSourceFile(source);
|
|
274
378
|
const visit = (node) => {
|
|
275
379
|
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
276
|
-
if (node.expression.text === "index" &&
|
|
380
|
+
if (node.expression.text === "index" &&
|
|
381
|
+
ts.isStringLiteral(node.arguments[0])) {
|
|
277
382
|
routes.push({ pattern: "/", file: node.arguments[0].text });
|
|
278
383
|
}
|
|
279
|
-
if (node.expression.text === "route" &&
|
|
280
|
-
|
|
384
|
+
if (node.expression.text === "route" &&
|
|
385
|
+
ts.isStringLiteral(node.arguments[0]) &&
|
|
386
|
+
ts.isStringLiteral(node.arguments[1])) {
|
|
387
|
+
routes.push({
|
|
388
|
+
pattern: reactRouterPathPattern(node.arguments[0].text),
|
|
389
|
+
file: node.arguments[1].text,
|
|
390
|
+
});
|
|
281
391
|
}
|
|
282
392
|
}
|
|
283
393
|
tsForEachChild(node, visit);
|
|
@@ -296,7 +406,9 @@ function fetchEffectApis(sourceText) {
|
|
|
296
406
|
const source = tsCreateSourceFile(sourceText);
|
|
297
407
|
const ops = new Set();
|
|
298
408
|
const visit = (node) => {
|
|
299
|
-
if (ts.isCallExpression(node) &&
|
|
409
|
+
if (ts.isCallExpression(node) &&
|
|
410
|
+
ts.isIdentifier(node.expression) &&
|
|
411
|
+
node.expression.text === "fetch") {
|
|
300
412
|
const op = fetchOpId(node);
|
|
301
413
|
if (op)
|
|
302
414
|
ops.add(op);
|
|
@@ -317,12 +429,13 @@ function fetchOpId(call) {
|
|
|
317
429
|
return `${method} ${path}`;
|
|
318
430
|
}
|
|
319
431
|
function fetchPathValue(expression) {
|
|
320
|
-
if (ts.isStringLiteral(expression) ||
|
|
432
|
+
if (ts.isStringLiteral(expression) ||
|
|
433
|
+
ts.isNoSubstitutionTemplateLiteral(expression))
|
|
321
434
|
return normalizeFetchPath(expression.text);
|
|
322
435
|
if (ts.isTemplateExpression(expression)) {
|
|
323
436
|
let value = expression.head.text;
|
|
324
437
|
for (const span of expression.templateSpans)
|
|
325
|
-
value +=
|
|
438
|
+
value += `:id${span.literal.text}`;
|
|
326
439
|
return normalizeFetchPath(value);
|
|
327
440
|
}
|
|
328
441
|
return undefined;
|
|
@@ -333,15 +446,21 @@ function normalizeFetchPath(path) {
|
|
|
333
446
|
function fetchMethodValue(expression) {
|
|
334
447
|
if (!expression || !ts.isObjectLiteralExpression(expression))
|
|
335
448
|
return undefined;
|
|
336
|
-
const method = expression.properties.find((property) => ts.isPropertyAssignment(property) &&
|
|
449
|
+
const method = expression.properties.find((property) => ts.isPropertyAssignment(property) &&
|
|
450
|
+
propertyName(property.name) === "method");
|
|
337
451
|
const value = method ? literalString(method.initializer) : undefined;
|
|
338
452
|
return value?.toUpperCase();
|
|
339
453
|
}
|
|
340
454
|
function literalString(expression) {
|
|
341
|
-
return ts.isStringLiteral(expression) ||
|
|
455
|
+
return ts.isStringLiteral(expression) ||
|
|
456
|
+
ts.isNoSubstitutionTemplateLiteral(expression)
|
|
457
|
+
? expression.text
|
|
458
|
+
: undefined;
|
|
342
459
|
}
|
|
343
460
|
function propertyName(name) {
|
|
344
|
-
if (ts.isIdentifier(name) ||
|
|
461
|
+
if (ts.isIdentifier(name) ||
|
|
462
|
+
ts.isStringLiteral(name) ||
|
|
463
|
+
ts.isNumericLiteral(name))
|
|
345
464
|
return name.text;
|
|
346
465
|
return undefined;
|
|
347
466
|
}
|
|
@@ -351,12 +470,33 @@ async function readOverlaySpec(model, overlayPath) {
|
|
|
351
470
|
async function loadModalityConfig(configPath) {
|
|
352
471
|
if (!configPath)
|
|
353
472
|
return {};
|
|
354
|
-
const module = (await
|
|
473
|
+
const module = (await importConfigModule(configPath));
|
|
355
474
|
const exported = module.default ?? module.config ?? {};
|
|
356
475
|
return typeof exported === "function" ? await exported() : exported;
|
|
357
476
|
}
|
|
477
|
+
async function importConfigModule(configPath) {
|
|
478
|
+
if (extname(configPath) === ".ts" || extname(configPath) === ".mts") {
|
|
479
|
+
const source = await readFile(configPath, "utf8");
|
|
480
|
+
const transpiled = ts.transpileModule(source, {
|
|
481
|
+
compilerOptions: {
|
|
482
|
+
module: ts.ModuleKind.ESNext,
|
|
483
|
+
target: ts.ScriptTarget.ES2022,
|
|
484
|
+
importsNotUsedAsValues: ts.ImportsNotUsedAsValues.Remove,
|
|
485
|
+
},
|
|
486
|
+
}).outputText;
|
|
487
|
+
const encoded = Buffer.from(transpiled).toString("base64");
|
|
488
|
+
const url = `data:text/javascript;base64,${encoded}`;
|
|
489
|
+
return import(url);
|
|
490
|
+
}
|
|
491
|
+
return import(`${pathToFileURL(configPath).href}?t=${Date.now()}`);
|
|
492
|
+
}
|
|
358
493
|
async function findNearestConfig(startDir) {
|
|
359
|
-
const names = [
|
|
494
|
+
const names = [
|
|
495
|
+
"modality.config.ts",
|
|
496
|
+
"modality.config.mts",
|
|
497
|
+
"modality.config.js",
|
|
498
|
+
"modality.config.mjs",
|
|
499
|
+
];
|
|
360
500
|
let dir = startDir;
|
|
361
501
|
while (true) {
|
|
362
502
|
for (const name of names) {
|
|
@@ -379,6 +519,25 @@ async function findNearestConfig(startDir) {
|
|
|
379
519
|
function uniqueStrings(values) {
|
|
380
520
|
return [...new Set(values)].sort();
|
|
381
521
|
}
|
|
522
|
+
function commonAncestor(paths) {
|
|
523
|
+
if (paths.length === 0)
|
|
524
|
+
return process.cwd();
|
|
525
|
+
const [first, ...rest] = paths.map((path) => resolve(path).split(/[\\/]+/));
|
|
526
|
+
if (!first)
|
|
527
|
+
return process.cwd();
|
|
528
|
+
let length = first.length;
|
|
529
|
+
for (const parts of rest) {
|
|
530
|
+
length = Math.min(length, parts.length);
|
|
531
|
+
for (let index = 0; index < length; index += 1) {
|
|
532
|
+
if (first[index] !== parts[index]) {
|
|
533
|
+
length = index;
|
|
534
|
+
break;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
const prefix = first.slice(0, length).join("/");
|
|
539
|
+
return prefix === "" ? parse(paths[0]).root : prefix;
|
|
540
|
+
}
|
|
382
541
|
async function findNearestPackageJson(startDir) {
|
|
383
542
|
let dir = startDir;
|
|
384
543
|
while (true) {
|
|
@@ -404,7 +563,7 @@ async function readPackageDependencies(packageJsonPath) {
|
|
|
404
563
|
return {
|
|
405
564
|
...(manifest.peerDependencies ?? {}),
|
|
406
565
|
...(manifest.devDependencies ?? {}),
|
|
407
|
-
...(manifest.dependencies ?? {})
|
|
566
|
+
...(manifest.dependencies ?? {}),
|
|
408
567
|
};
|
|
409
568
|
}
|
|
410
569
|
function sha256(value) {
|
|
@@ -422,8 +581,12 @@ function createExtractionReport(sourceFiles, model, warnings, ignoredVars, now)
|
|
|
422
581
|
const caveats = model.metadata?.extractionCaveats ?? emptyExtractionCaveats();
|
|
423
582
|
const transitionHandlers = model.transitions.map((transition) => ({
|
|
424
583
|
id: transition.id,
|
|
425
|
-
classification: transition.confidence === "manual"
|
|
426
|
-
|
|
584
|
+
classification: transition.confidence === "manual"
|
|
585
|
+
? "overlay"
|
|
586
|
+
: transition.confidence,
|
|
587
|
+
reasons: transition.confidence === "over-approx"
|
|
588
|
+
? overApproxReasons(transition)
|
|
589
|
+
: [],
|
|
427
590
|
}));
|
|
428
591
|
const transitionIds = new Set(transitionHandlers.map((handler) => handler.id));
|
|
429
592
|
const unextractableHandlers = warnings
|
|
@@ -433,10 +596,11 @@ function createExtractionReport(sourceFiles, model, warnings, ignoredVars, now)
|
|
|
433
596
|
.map((handler) => ({
|
|
434
597
|
id: handler.id,
|
|
435
598
|
classification: "unextractable",
|
|
436
|
-
reasons: [handler.reason]
|
|
599
|
+
reasons: [handler.reason],
|
|
437
600
|
}));
|
|
438
601
|
const handlers = [...transitionHandlers, ...unextractableHandlers];
|
|
439
|
-
const exactOrOverlay = handlers.filter((handler) => handler.classification === "exact" ||
|
|
602
|
+
const exactOrOverlay = handlers.filter((handler) => handler.classification === "exact" ||
|
|
603
|
+
handler.classification === "overlay").length;
|
|
440
604
|
const unextractable = handlers.filter((handler) => handler.classification === "unextractable").length;
|
|
441
605
|
return {
|
|
442
606
|
schemaVersion: 1,
|
|
@@ -451,27 +615,51 @@ function createExtractionReport(sourceFiles, model, warnings, ignoredVars, now)
|
|
|
451
615
|
domains: model.vars.map((decl) => ({
|
|
452
616
|
varId: decl.id,
|
|
453
617
|
domainKind: decl.domain.kind,
|
|
454
|
-
provenance: model.metadata?.domainProvenance?.[decl.id] ??
|
|
618
|
+
provenance: model.metadata?.domainProvenance?.[decl.id] ??
|
|
619
|
+
(decl.origin === "system"
|
|
620
|
+
? "system"
|
|
621
|
+
: decl.origin === "library-template"
|
|
622
|
+
? "template"
|
|
623
|
+
: decl.domain.kind === "tokens"
|
|
624
|
+
? "default-token"
|
|
625
|
+
: "type-derived"),
|
|
455
626
|
})),
|
|
456
627
|
coverage: {
|
|
457
628
|
handlersTotal: handlers.length,
|
|
458
629
|
exactOrOverlay,
|
|
459
630
|
unextractable,
|
|
460
631
|
ignoredVars: ignoredVars.length,
|
|
461
|
-
percentExactOrOverlay: handlers.length === 0 ? 1 : exactOrOverlay / handlers.length
|
|
632
|
+
percentExactOrOverlay: handlers.length === 0 ? 1 : exactOrOverlay / handlers.length,
|
|
462
633
|
},
|
|
463
|
-
warnings
|
|
634
|
+
warnings,
|
|
464
635
|
};
|
|
465
636
|
}
|
|
466
637
|
function emptyExtractionCaveats() {
|
|
467
|
-
return {
|
|
638
|
+
return {
|
|
639
|
+
globalTaints: [],
|
|
640
|
+
staleReads: [],
|
|
641
|
+
unhandledRejections: [],
|
|
642
|
+
unextractableHandlers: [],
|
|
643
|
+
};
|
|
468
644
|
}
|
|
469
645
|
function createExtractionCaveats(warnings) {
|
|
470
646
|
return {
|
|
471
|
-
globalTaints: warnings
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
647
|
+
globalTaints: warnings
|
|
648
|
+
.map(globalTaintFromWarning)
|
|
649
|
+
.filter(isCaveat)
|
|
650
|
+
.sort(compareCaveats),
|
|
651
|
+
staleReads: warnings
|
|
652
|
+
.map(staleReadFromWarning)
|
|
653
|
+
.filter(isCaveat)
|
|
654
|
+
.sort(compareCaveats),
|
|
655
|
+
unhandledRejections: warnings
|
|
656
|
+
.map(unhandledRejectionFromWarning)
|
|
657
|
+
.filter(isCaveat)
|
|
658
|
+
.sort(compareCaveats),
|
|
659
|
+
unextractableHandlers: warnings
|
|
660
|
+
.map(unextractableHandlerFromWarning)
|
|
661
|
+
.filter(isCaveat)
|
|
662
|
+
.sort(compareCaveats),
|
|
475
663
|
};
|
|
476
664
|
}
|
|
477
665
|
function globalTaintFromWarning(warning) {
|
|
@@ -490,7 +678,7 @@ function isCaveat(value) {
|
|
|
490
678
|
return Boolean(value);
|
|
491
679
|
}
|
|
492
680
|
function compareCaveats(left, right) {
|
|
493
|
-
return left.id.localeCompare(right.id) || left.reason.localeCompare(right.reason);
|
|
681
|
+
return (left.id.localeCompare(right.id) || left.reason.localeCompare(right.reason));
|
|
494
682
|
}
|
|
495
683
|
function pluginConformanceWarnings(sourcePlugins, dependencies) {
|
|
496
684
|
if (!dependencies)
|
|
@@ -538,16 +726,21 @@ function pluginProvenance(plugins) {
|
|
|
538
726
|
function transitionNavigatedRoutes(transitions) {
|
|
539
727
|
const routes = new Set();
|
|
540
728
|
const visit = (effect) => {
|
|
541
|
-
if (effect.kind === "navigate" &&
|
|
729
|
+
if (effect.kind === "navigate" &&
|
|
730
|
+
effect.to?.kind === "lit" &&
|
|
731
|
+
typeof effect.to.value === "string")
|
|
542
732
|
routes.add(effect.to.value);
|
|
543
|
-
if (effect.kind === "seq")
|
|
544
|
-
effect.effects
|
|
733
|
+
if (effect.kind === "seq") {
|
|
734
|
+
for (const child of effect.effects)
|
|
735
|
+
visit(child);
|
|
736
|
+
}
|
|
545
737
|
if (effect.kind === "if") {
|
|
546
738
|
visit(effect.then);
|
|
547
739
|
visit(effect.else);
|
|
548
740
|
}
|
|
549
741
|
};
|
|
550
|
-
|
|
742
|
+
for (const transition of transitions)
|
|
743
|
+
visit(transition.effect);
|
|
551
744
|
return [...routes].sort();
|
|
552
745
|
}
|
|
553
746
|
function overApproxReasons(transition) {
|
|
@@ -561,7 +754,9 @@ function overApproxReasons(transition) {
|
|
|
561
754
|
return [...reasons].sort();
|
|
562
755
|
}
|
|
563
756
|
function explainOverlayDrift(model, overlay) {
|
|
564
|
-
const transitionIds = model.transitions
|
|
757
|
+
const transitionIds = model.transitions
|
|
758
|
+
.map((transition) => transition.id)
|
|
759
|
+
.sort();
|
|
565
760
|
const varIds = model.vars.map((decl) => decl.id).sort();
|
|
566
761
|
const lines = [];
|
|
567
762
|
for (const transition of overlay.transitions ?? []) {
|
|
@@ -589,8 +784,12 @@ function formatDrift(kind, id, candidates) {
|
|
|
589
784
|
}
|
|
590
785
|
function nearestCandidates(id, candidates) {
|
|
591
786
|
return candidates
|
|
592
|
-
.map((candidate) => ({
|
|
593
|
-
|
|
787
|
+
.map((candidate) => ({
|
|
788
|
+
candidate,
|
|
789
|
+
distance: editDistance(normalizeId(id), normalizeId(candidate)),
|
|
790
|
+
}))
|
|
791
|
+
.sort((left, right) => left.distance - right.distance ||
|
|
792
|
+
left.candidate.localeCompare(right.candidate))
|
|
594
793
|
.slice(0, 3)
|
|
595
794
|
.map(({ candidate, distance }) => `${candidate}(${distance})`);
|
|
596
795
|
}
|
|
@@ -661,20 +860,22 @@ function pendingVars(effectApis, transitions = [], vars = [], maxPending = 3) {
|
|
|
661
860
|
fields: {
|
|
662
861
|
opId: { kind: "enum", values: ops },
|
|
663
862
|
continuation: { kind: "enum", values: continuations },
|
|
664
|
-
args: { kind: "record", fields: argFields }
|
|
665
|
-
}
|
|
863
|
+
args: { kind: "record", fields: argFields },
|
|
864
|
+
},
|
|
666
865
|
},
|
|
667
|
-
maxLen: maxPending
|
|
866
|
+
maxLen: maxPending,
|
|
668
867
|
},
|
|
669
868
|
origin: "system",
|
|
670
869
|
scope: { kind: "global" },
|
|
671
|
-
initial: []
|
|
672
|
-
}
|
|
870
|
+
initial: [],
|
|
871
|
+
},
|
|
673
872
|
];
|
|
674
873
|
}
|
|
675
874
|
function enqueueOps(effect) {
|
|
676
875
|
if (effect.kind === "enqueue")
|
|
677
|
-
return [
|
|
876
|
+
return [
|
|
877
|
+
{ op: effect.op, continuation: effect.continuation, args: effect.args },
|
|
878
|
+
];
|
|
678
879
|
if (effect.kind === "seq")
|
|
679
880
|
return effect.effects.flatMap(enqueueOps);
|
|
680
881
|
if (effect.kind === "if")
|
|
@@ -702,7 +903,9 @@ function refineAssignedLiteralDomains(vars, transitions) {
|
|
|
702
903
|
if (decl.origin === "library-template")
|
|
703
904
|
return decl;
|
|
704
905
|
const refinement = refinements.get(decl.id);
|
|
705
|
-
return refinement
|
|
906
|
+
return refinement
|
|
907
|
+
? { ...decl, domain: mergeAssignedDomain(decl.domain, refinement) }
|
|
908
|
+
: decl;
|
|
706
909
|
});
|
|
707
910
|
}
|
|
708
911
|
function mergeAssignedDomain(left, right) {
|
|
@@ -725,7 +928,10 @@ function assignedLiteralDomains(effect) {
|
|
|
725
928
|
if (effect.kind === "seq")
|
|
726
929
|
return effect.effects.flatMap(assignedLiteralDomains);
|
|
727
930
|
if (effect.kind === "if")
|
|
728
|
-
return [
|
|
931
|
+
return [
|
|
932
|
+
...assignedLiteralDomains(effect.then),
|
|
933
|
+
...assignedLiteralDomains(effect.else),
|
|
934
|
+
];
|
|
729
935
|
return [];
|
|
730
936
|
}
|
|
731
937
|
function domainForLiteral(value) {
|
|
@@ -743,9 +949,16 @@ function mergeArgDomains(left, right) {
|
|
|
743
949
|
if (!left)
|
|
744
950
|
return right;
|
|
745
951
|
if (left.kind === "enum" && right.kind === "enum")
|
|
746
|
-
return {
|
|
952
|
+
return {
|
|
953
|
+
kind: "enum",
|
|
954
|
+
values: [...new Set([...left.values, ...right.values])].sort(),
|
|
955
|
+
};
|
|
747
956
|
if (left.kind === "boundedInt" && right.kind === "boundedInt")
|
|
748
|
-
return {
|
|
957
|
+
return {
|
|
958
|
+
kind: "boundedInt",
|
|
959
|
+
min: Math.min(left.min, right.min),
|
|
960
|
+
max: Math.max(left.max, right.max),
|
|
961
|
+
};
|
|
749
962
|
if (left.kind === right.kind)
|
|
750
963
|
return left;
|
|
751
964
|
return { kind: "tokens", count: 1 };
|