aifsmjs 0.5.3 → 0.5.6
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 +8 -4
- package/README_ZHTW.md +7 -5
- package/dist/chunk-2MME5V4F.cjs +384 -0
- package/dist/chunk-2MME5V4F.cjs.map +1 -0
- package/dist/chunk-3B2USJ3H.cjs +18 -0
- package/dist/chunk-3B2USJ3H.cjs.map +1 -0
- package/dist/chunk-A7U7QQL5.js +52 -0
- package/dist/chunk-A7U7QQL5.js.map +1 -0
- package/dist/chunk-CDK25FTD.cjs +59 -0
- package/dist/chunk-CDK25FTD.cjs.map +1 -0
- package/dist/chunk-FHTQ7LSQ.cjs +21 -0
- package/dist/chunk-FHTQ7LSQ.cjs.map +1 -0
- package/dist/chunk-I354FONA.cjs +153 -0
- package/dist/chunk-I354FONA.cjs.map +1 -0
- package/dist/chunk-JKZAOPQC.js +16 -0
- package/dist/chunk-JKZAOPQC.js.map +1 -0
- package/dist/chunk-NEJYZAKR.js +19 -0
- package/dist/chunk-NEJYZAKR.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +9 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-Q7SFCCGT.cjs +11 -0
- package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
- package/dist/chunk-VZCSHTOI.js +374 -0
- package/dist/chunk-VZCSHTOI.js.map +1 -0
- package/dist/chunk-ZLQ7HZCE.js +142 -0
- package/dist/chunk-ZLQ7HZCE.js.map +1 -0
- package/dist/effects/index.cjs +8 -14
- package/dist/effects/index.cjs.map +1 -1
- package/dist/effects/index.js +5 -14
- package/dist/effects/index.js.map +1 -1
- package/dist/guards/index.cjs +9 -13
- package/dist/guards/index.cjs.map +1 -1
- package/dist/guards/index.js +8 -12
- package/dist/guards/index.js.map +1 -1
- package/dist/index.cjs +101 -591
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -571
- package/dist/index.js.map +1 -1
- package/dist/inspect/index.cjs +2 -0
- package/dist/inspect/index.cjs.map +1 -1
- package/dist/inspect/index.js +2 -0
- package/dist/inspect/index.js.map +1 -1
- package/dist/pbt/index.cjs +26 -525
- package/dist/pbt/index.cjs.map +1 -1
- package/dist/pbt/index.d.cts +7 -3
- package/dist/pbt/index.d.ts +7 -3
- package/dist/pbt/index.js +12 -511
- package/dist/pbt/index.js.map +1 -1
- package/dist/replay/index.cjs +9 -195
- package/dist/replay/index.cjs.map +1 -1
- package/dist/replay/index.js +5 -198
- package/dist/replay/index.js.map +1 -1
- package/dist/timer/index.cjs +30 -9
- package/dist/timer/index.cjs.map +1 -1
- package/dist/timer/index.js +30 -9
- package/dist/timer/index.js.map +1 -1
- package/llms-full.txt +165 -8
- package/package.json +8 -6
package/llms-full.txt
CHANGED
|
@@ -14,14 +14,16 @@ The short index lives at `llms.txt` (see https://llmstxt.org/).
|
|
|
14
14
|
# aifsmjs
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/aifsmjs)
|
|
17
|
-
[](https://github.com/islumina/aifsmjs/actions/workflows/ci.yml)
|
|
18
18
|
[](LICENSE)
|
|
19
19
|
[](https://www.anthropic.com/claude-code)
|
|
20
20
|
[](README_ZHTW.md)
|
|
21
21
|
|
|
22
22
|
> A small, strict FSM library for any TypeScript/JS app that needs deterministic, replayable state transitions. Lifecycle is a pure `step()` function. Chain-of-Responsibility intuition is reserved for cross-cutting concerns (observe / persist / replay), never for the transition core.
|
|
23
23
|
|
|
24
|
-
Part of the [ai\*js micro-runtime ecosystem](https://github.com/
|
|
24
|
+
Part of the [ai\*js micro-runtime ecosystem](https://github.com/islumina) — see also [aibridgejs](https://github.com/islumina/aibridgejs) (cross-context RPC) and [aiecsjs](https://github.com/islumina/aiecsjs) (ECS).
|
|
25
|
+
|
|
26
|
+
> **Status: 0.5.6.** Core FSM, hierarchical sub-machines, guards & effects, scheduler, replay, inspect, and PBT helpers are all live. See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
25
27
|
|
|
26
28
|
**Primary audience**: developers building stateful flows — multi-step forms, checkout funnels, auth flows, tutorial sequences, document-status workflows, scene flow in interactive apps, and the same patterns in browser-based games (PixiJS / Svelte 5 / plain Canvas / WebGL). The core is **environment-neutral** (pure function + adapter boundary): browser, Node, Bun, Deno, Flutter WebView, and Web Workers all work. The Roadmap section keeps gaming-specific niceties (tick hook, ECS bridge) as opt-in subpaths, not core surface.
|
|
27
29
|
|
|
@@ -302,6 +304,8 @@ const runtime = createRuntime(def, impl, {
|
|
|
302
304
|
|
|
303
305
|
Koa-style `(ctx, next) => void` pipeline. `ctx` is `{ prev, next, event, effects, changed }`, all deep-frozen. **Cannot cancel a transition** — `next()` must be called; the return value carries no meaning.
|
|
304
306
|
|
|
307
|
+
Two boundaries to respect (both stable for 1.x, detailed in [STABILITY.md](STABILITY.md)): skipping `next()` is **not** enforced and silently drops every later middleware (and the `recorder` / `persist` sinks) for that event; and a synchronous throw from a middleware (e.g. `persist` on non-serialisable context) propagates to the caller but leaves the snapshot **committed yet unannounced** — `notify()` and `on('transition')` are skipped. Do **not** call `runtime.send()` from inside the pipeline: the inner event runs its full pipeline before the outer frame finishes, so the `recorder` log is reordered and `replay()` diverges.
|
|
308
|
+
|
|
305
309
|
### `aifsmjs/replay` — Pure event log replay
|
|
306
310
|
|
|
307
311
|
```typescript
|
|
@@ -506,8 +510,8 @@ Example-first, PBT-augmented. Lesson from jssm: "3000+ tests / 100% coverage" tu
|
|
|
506
510
|
|
|
507
511
|
- **Example tests** (vitest): for every src module, write happy path + edge + error-message triplets.
|
|
508
512
|
- **PBT smoke**: each generic property runs 50 iterations as an invariant guard, not as a coverage source.
|
|
509
|
-
- **CI-enforced thresholds**: `@vitest/coverage-v8` is wired to **100%
|
|
510
|
-
- **Size budget**: `scripts/check-size.mjs` enforces per-subpath gzip caps in CI
|
|
513
|
+
- **CI-enforced thresholds**: `@vitest/coverage-v8` is wired to **100% lines / 100% functions / ≥95% statements / ≥90% branches**. The few defensive invariant-guard branches (e.g. runtime determinism mismatch) carry `/* v8 ignore */` annotations with rationale.
|
|
514
|
+
- **Size budget**: `scripts/check-size.mjs` enforces per-subpath gzip caps in CI, measured as each entry's transitive closure (entry + shared chunks — the build code-splits so error classes keep cross-subpath identity) — core ≤6.5 KB, pbt ≤8.5 KB (transitively imports `createRuntime`), replay ≤3.3 KB, effects ≤1.7 KB, guards ≤1.5 KB, timer ≤1.2 KB, inspect ≤1 KB. Exceeding any cap fails the build.
|
|
511
515
|
|
|
512
516
|
### The 6 built-in generic properties
|
|
513
517
|
|
|
@@ -579,6 +583,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
579
583
|
|
|
580
584
|
## [Unreleased]
|
|
581
585
|
|
|
586
|
+
## [0.5.6] - 2026-06-10
|
|
587
|
+
|
|
588
|
+
### Fixed
|
|
589
|
+
|
|
590
|
+
- **Guard combinators route through the async-guard safety net** — `and()` / `or()` / `not()` now pass each resolved guard's return value through the same `isThenable` check as top-level guards, throwing `AsyncGuardError` instead of coercing a pending thenable to `true`/`false`. The 0.2.0 async-guard protection was bypassable through any combinator. (Review wave 2026-06-10, FSM-S-01.)
|
|
591
|
+
- **`reset()` captures the committed snapshot before notifying** (mirroring the 0.2.0 `send()` fix), so a listener that re-enters `send()` during reset can no longer make the `'transition'` payload report a state pair that never occurred. (FSM-B-01.)
|
|
592
|
+
- **Scheduler `pending` registry no longer leaks** on any of its three escape paths: signal-abort cancellation, scheduling on an already-aborted signal, and a custom scheduler that fires synchronously during `after()`. Signal handling is owned by the scheduler layer now; fire/cancel/abort all remove the tracked handle and detach the abort listener. (FSM-R-01.)
|
|
593
|
+
- PBT property #5 `guardsFalseNoTransition` actually asserts `changed === false` (its body was vacuous — it returned `true` unconditionally); the other five generic properties were audited and are non-vacuous. (FSM-B-02.)
|
|
594
|
+
- Hierarchical `sub.initial` is validated as a member of `sub.states` at definition time. (FSM-S-02.)
|
|
595
|
+
- Effect results are detected with `isThenable` instead of `instanceof Promise` at both dispatch sites, so cross-realm / userland PromiseLike values are awaited and error-routed correctly. (FSM-B-03.)
|
|
596
|
+
- `emit()` / `notify()` snapshot their listener sets before iterating (family-canonical), pinning unsubscribe/re-subscribe-during-dispatch semantics. (FAM-S-03.)
|
|
597
|
+
|
|
598
|
+
### Changed
|
|
599
|
+
|
|
600
|
+
- **Code splitting enabled (`tsup splitting: true`)** — the published 0.5.x dist inlined a private copy of the shared runtime (including every error class) into each subpath bundle, so an error raised through `aifsmjs/guards` failed `instanceof` checks against the root export. Shared chunks restore cross-subpath class identity; total dist JS shrank 50.7 KB → 31.1 KB. `check:size` now measures each entry's transitive chunk closure, with budgets recalibrated and the README size-budget bullet updated to match.
|
|
601
|
+
- Triplicated child init/wire logic extracted into a single `initChildFor()` helper (behaviour-preserving).
|
|
602
|
+
- Supply-chain and release hardening: CI/publish actions SHA-pinned, npm CLI pinned (`11.16.0`), `permissions: contents: read` on CI, job timeouts, `npm publish --ignore-scripts`, manual dispatch defaults to dry-run, new `verify:docs` banner gate, two-stage typecheck (tests are now type-checked), `llms-full.txt` embeds `STABILITY.md`, and a cross-subpath dist smoke (`verify:dist`).
|
|
603
|
+
|
|
604
|
+
### Docs
|
|
605
|
+
|
|
606
|
+
- README coverage claim corrected to the enforced thresholds (95% statements); middleware sync-throw commit/notify boundary and `next()`-skip behaviour documented (with characterisation tests); README status banner added (EN + ZHTW).
|
|
607
|
+
|
|
608
|
+
## [0.5.5] - 2026-06-08
|
|
609
|
+
|
|
610
|
+
### Changed
|
|
611
|
+
|
|
612
|
+
- Project home migrated to the [`islumina`](https://github.com/islumina) GitHub org; the package is now published from there via npm trusted publisher (OIDC + SLSA provenance). Family-wide version alignment at `0.5.5` — no runtime or API changes.
|
|
613
|
+
|
|
582
614
|
## [0.5.3] - 2026-06-05
|
|
583
615
|
|
|
584
616
|
### Added
|
|
@@ -918,6 +950,131 @@ Hierarchical / compound states, parallel state regions, actor invocation
|
|
|
918
950
|
|
|
919
951
|
---
|
|
920
952
|
|
|
953
|
+
# Stability tiers (`STABILITY.md`)
|
|
954
|
+
|
|
955
|
+
# Stability
|
|
956
|
+
|
|
957
|
+
This document defines the stability tier of every public symbol exported by
|
|
958
|
+
`aifsmjs`. Tiers govern what breaks may occur in future minor / major bumps.
|
|
959
|
+
|
|
960
|
+
## Stable (since 0.1.0)
|
|
961
|
+
|
|
962
|
+
Fully stable. Breaking changes only at a major version bump (1.0+).
|
|
963
|
+
|
|
964
|
+
- `createMachine`, `defineMachine`, `setup`, `createRuntime`, `initialSnapshot`
|
|
965
|
+
- `step`, `resolveTransitions`, `evalGuard`, `resolveGuard`, `isAsyncGuardFn`
|
|
966
|
+
- `assign`, `mergeContext`, `createSnapshot`, `deepFreeze`, `freezeSnapshot`
|
|
967
|
+
- `Runtime.send`, `Runtime.reset`, `Runtime.can`, `Runtime.getSnapshot`,
|
|
968
|
+
`Runtime.snapshot`, `Runtime.subscribe`, `Runtime.on`, `Runtime.dispose`,
|
|
969
|
+
`Runtime.signal`, `Runtime.disposed`
|
|
970
|
+
- All error classes from 0.1.0–0.2.1: `RuntimeDisposedError`,
|
|
971
|
+
`InvalidDefinitionError`, `UnknownActionError`, `UnknownGuardError`,
|
|
972
|
+
`AsyncGuardError`
|
|
973
|
+
- Types: `MachineDef`, `StateDef` (fields `on`, `entry`, `exit`, `final`),
|
|
974
|
+
`TransitionDef`, `Snapshot`, `Implementations`, `Guard`, `Action`,
|
|
975
|
+
`EffectHandler`, `Effect`, `Enqueuer`, `Middleware`, `MiddlewareContext`,
|
|
976
|
+
`RuntimeOptions`, `StepResult`, `ResetEvent`, `RESET_EVENT_TYPE`,
|
|
977
|
+
`RuntimeTransitionEvent`, `RuntimeErrorEvent`, `RuntimeEventMap`
|
|
978
|
+
- All subpath exports: `aifsmjs/guards`, `aifsmjs/effects`, `aifsmjs/inspect`,
|
|
979
|
+
`aifsmjs/replay`, `aifsmjs/pbt`, `aifsmjs/timer`
|
|
980
|
+
- `Runtime.onTransition` (added in 0.3.0) — pure sugar over the stable
|
|
981
|
+
`on('transition', ...)` API; listed under Stable because the underlying
|
|
982
|
+
contract is unchanged.
|
|
983
|
+
|
|
984
|
+
### Sub-machines (stable since 0.4.0)
|
|
985
|
+
|
|
986
|
+
The hierarchical sub-machine surface shipped experimentally in 0.3.0 is
|
|
987
|
+
stable as of 0.4.0. Signatures and runtime semantics — including the
|
|
988
|
+
init-failure quarantine behaviour described below — are frozen for the 1.x
|
|
989
|
+
line. The boundaries listed are intentional design trade-offs, not bugs or
|
|
990
|
+
pending instability.
|
|
991
|
+
|
|
992
|
+
- `StateDef.sub` (optional `SubMachineDef`) — when present, a child runtime
|
|
993
|
+
is lazily initialised on entry and disposed on exit. Per-transition
|
|
994
|
+
ordering is parent `step()` (exit / actions / entry) → child dispose →
|
|
995
|
+
child init → snapshot commit.
|
|
996
|
+
- `StateDef.subImpl` (optional `Implementations`) — paired with `sub`;
|
|
997
|
+
passed to the child `createRuntime`. Defaults to `{}`.
|
|
998
|
+
- `Runtime.subRuntime()` — returns the live child handle, or `undefined`.
|
|
999
|
+
Returned generic is `Runtime<unknown, { type: string }, string>`; caller
|
|
1000
|
+
narrows via cast if necessary.
|
|
1001
|
+
- `SubMachineError` — thrown by `send()` / `reset()` on child init/dispose
|
|
1002
|
+
failure. Fields: `parentState`, `phase ("init" | "dispose")`, `cause`.
|
|
1003
|
+
- `SubMachineDef` type alias.
|
|
1004
|
+
|
|
1005
|
+
#### Design boundaries
|
|
1006
|
+
|
|
1007
|
+
- **Replay / PBT do not see child state.** `replay()` and
|
|
1008
|
+
`commandsFromMachine` only inspect parent snapshots. If your business
|
|
1009
|
+
logic lives in the parent layer, replay is still deterministic.
|
|
1010
|
+
- **`subRuntime()` may return a disposed handle** if an external caller
|
|
1011
|
+
disposed it. The handle is not reinitialised until the parent leaves and
|
|
1012
|
+
re-enters the sub-bearing state. Detect with `child.disposed`.
|
|
1013
|
+
- **Self-targeting external (`A → A`) is treated as full exit/entry**:
|
|
1014
|
+
child is disposed and reinitialised. The dispatcher re-resolves guards to
|
|
1015
|
+
identify the chosen transition before deciding external vs internal, so
|
|
1016
|
+
guarded internal transitions on the same event do not trigger a reinit.
|
|
1017
|
+
- **Init-failure mid-transition leaves the parent without a live child.**
|
|
1018
|
+
If `applySubLifecycle` successfully disposes the old child and then the
|
|
1019
|
+
new child's `createRuntime` throws, the parent's snapshot is rolled back
|
|
1020
|
+
to `prev` but `subRuntime()` returns `undefined`. Callers catching
|
|
1021
|
+
`SubMachineError(phase: "init")` should treat the runtime as quarantined
|
|
1022
|
+
— call `runtime.dispose()` (idempotent) or `runtime.reset()` (which
|
|
1023
|
+
attempts re-init) before sending further events. This quarantine
|
|
1024
|
+
behaviour is part of the stable contract; a future **major** version may
|
|
1025
|
+
switch to a two-phase "init before dispose" commit strategy (a breaking
|
|
1026
|
+
change reserved for 1.0+), but the current semantics are frozen for the
|
|
1027
|
+
1.x line.
|
|
1028
|
+
|
|
1029
|
+
### Middleware, effects & notification ordering (documented boundaries)
|
|
1030
|
+
|
|
1031
|
+
These are intentional ordering boundaries of the read-only middleware /
|
|
1032
|
+
effect pipeline, not bugs. They are stable for the 1.x line.
|
|
1033
|
+
|
|
1034
|
+
- **A synchronous throw from a middleware or effect handler leaves the
|
|
1035
|
+
snapshot committed but unannounced.** Inside `send()` / `reset()` the new
|
|
1036
|
+
snapshot is committed (so `getSnapshot()` already reflects it) *before*
|
|
1037
|
+
`runMiddleware()` and effect dispatch run. If a middleware or effect
|
|
1038
|
+
handler throws synchronously, the throw propagates to the `send()` /
|
|
1039
|
+
`reset()` caller (as documented), but `notify()`, `on('transition')`
|
|
1040
|
+
listeners, and — for a middleware throw — the collected effects are
|
|
1041
|
+
skipped. Observers therefore desynchronise from `getSnapshot()`. The
|
|
1042
|
+
shipped `persist` middleware throws on non-serialisable context, making
|
|
1043
|
+
this reachable without exotic code. Wrap throwing middleware/effects in
|
|
1044
|
+
your own `try/catch` if you need observers to fire regardless. (Contrast:
|
|
1045
|
+
the sub-machine init/dispose failure path *rolls back* instead — see
|
|
1046
|
+
above.) A future **major** may move the commit after the pipeline; the
|
|
1047
|
+
current order is frozen for 1.x.
|
|
1048
|
+
- **`next()` must be called by every middleware; skipping it is not
|
|
1049
|
+
enforced.** Calling `next()` twice throws; calling it zero times is
|
|
1050
|
+
silently tolerated and drops every later middleware (and the recorder /
|
|
1051
|
+
persist sinks) for that event — no throw, no warning. The state transition
|
|
1052
|
+
itself is unaffected (the snapshot is committed before the pipeline). Treat
|
|
1053
|
+
`next()` as mandatory.
|
|
1054
|
+
- **Re-entrant `send()` from inside middleware reorders recorder logs.**
|
|
1055
|
+
Middleware is documented read-only; a middleware that re-entrantly calls
|
|
1056
|
+
`runtime.send()` runs the inner event's full pipeline (including the
|
|
1057
|
+
recorder push) before the outer frame reaches the recorder. The
|
|
1058
|
+
`recorder` sink — intended to feed `replay()` — then lists `[inner,
|
|
1059
|
+
outer]` for an application order of `[outer, inner]`, so replaying that log
|
|
1060
|
+
diverges. Do not `send()` from within the middleware pipeline.
|
|
1061
|
+
|
|
1062
|
+
## Experimental
|
|
1063
|
+
|
|
1064
|
+
No experimental APIs as of 0.4.0. The 0.3.0 sub-machine surface graduated to
|
|
1065
|
+
Stable in 0.4.0 — see "Sub-machines" above.
|
|
1066
|
+
|
|
1067
|
+
## Draft (planned, not implemented)
|
|
1068
|
+
|
|
1069
|
+
API sketched, not shipped. May change before release.
|
|
1070
|
+
|
|
1071
|
+
- `historyState` (candidate for a future minor) — opt-in pseudo-state that
|
|
1072
|
+
remembers the last active sub-state on re-entry. Workaround in 0.3.0:
|
|
1073
|
+
snapshot the sub-runtime's value on exit via `onTransition`, restore
|
|
1074
|
+
manually.
|
|
1075
|
+
|
|
1076
|
+
---
|
|
1077
|
+
|
|
921
1078
|
<!-- ===== CONTRIBUTING.md ===== -->
|
|
922
1079
|
|
|
923
1080
|
# Contributing to aifsmjs
|
|
@@ -1044,10 +1201,10 @@ pnpm example:form-wizard # 04-form-wizard
|
|
|
1044
1201
|
|
|
1045
1202
|
| # | Example | What it shows | Real-world pattern |
|
|
1046
1203
|
|---|---|---|---|
|
|
1047
|
-
| 01 | [traffic-light](https://github.com/
|
|
1048
|
-
| 02 | [approval-workflow](https://github.com/
|
|
1049
|
-
| 03 | [checkout-funnel](https://github.com/
|
|
1050
|
-
| 04 | [form-wizard](https://github.com/
|
|
1204
|
+
| 01 | [traffic-light](https://github.com/islumina/aifsmjs/blob/main/examples/01-traffic-light/index.ts) | Minimal `setup → defineMachine → createRuntime → send` loop with `assign` and a snapshot subscriber. | Cyclic scene flow (loading → menu → playing → result → loading) — or any 3-state cycle. |
|
|
1205
|
+
| 02 | [approval-workflow](https://github.com/islumina/aifsmjs/blob/main/examples/02-approval-workflow/index.ts) | Multi-candidate guarded transitions (`and([...])`), effects + handlers, `persist` + `recorder` middleware, and `replay()` to reproduce the final snapshot. | Document approval, ticket triage, turn-based games with branching outcomes + post-mortem replay. |
|
|
1206
|
+
| 03 | [checkout-funnel](https://github.com/islumina/aifsmjs/blob/main/examples/03-checkout-funnel/index.ts) | E-commerce checkout: cart → shipping → payment → review → confirmed. Per-stage validation as guards, payment + analytics as effects, full replay of the funnel. | Plain web app — no canvas, no game loop. Demonstrates that aifsmjs models classic UX funnels. |
|
|
1207
|
+
| 04 | [form-wizard](https://github.com/islumina/aifsmjs/blob/main/examples/04-form-wizard/index.ts) | Multi-step form wizard with back / next / jump-to-step navigation. Per-step validation, draft persistence via the `persist` middleware. | Account onboarding, settings editor, multi-page survey. |
|
|
1051
1208
|
|
|
1052
1209
|
## Notes
|
|
1053
1210
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aifsmjs",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.6",
|
|
4
4
|
"description": "Small, strict FSM library for deterministic, replayable state machines in any TypeScript/JS app — multi-step forms, checkout funnels, auth flows, tutorials, scene flow. Pure step() lifecycle, opt-in effects, inspect, replay, and a fast-check property-based testing adapter. Browser / Node / Bun / Deno / WebView / Worker friendly.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fsm",
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
],
|
|
21
21
|
"author": "yshengliao",
|
|
22
22
|
"license": "MIT",
|
|
23
|
-
"homepage": "https://github.com/
|
|
23
|
+
"homepage": "https://github.com/islumina/aifsmjs#readme",
|
|
24
24
|
"repository": {
|
|
25
25
|
"type": "git",
|
|
26
|
-
"url": "git+https://github.com/
|
|
26
|
+
"url": "git+https://github.com/islumina/aifsmjs.git"
|
|
27
27
|
},
|
|
28
28
|
"bugs": {
|
|
29
|
-
"url": "https://github.com/
|
|
29
|
+
"url": "https://github.com/islumina/aifsmjs/issues"
|
|
30
30
|
},
|
|
31
31
|
"type": "module",
|
|
32
32
|
"sideEffects": false,
|
|
@@ -84,7 +84,9 @@
|
|
|
84
84
|
"test:watch": "vitest",
|
|
85
85
|
"lint": "biome check src test",
|
|
86
86
|
"format": "biome format --write src test",
|
|
87
|
-
"typecheck": "tsc --noEmit",
|
|
87
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
88
|
+
"verify:docs": "node scripts/verify-docs.mjs",
|
|
89
|
+
"verify:dist": "node scripts/check-dist-subpaths.mjs",
|
|
88
90
|
"verify:exports": "node scripts/verify-exports.mjs",
|
|
89
91
|
"check:size": "node scripts/check-size.mjs",
|
|
90
92
|
"build:llms": "node scripts/build-llms-full.mjs",
|
|
@@ -94,7 +96,7 @@
|
|
|
94
96
|
"example:approval": "tsx examples/02-approval-workflow/index.ts",
|
|
95
97
|
"example:checkout-funnel": "tsx examples/03-checkout-funnel/index.ts",
|
|
96
98
|
"example:form-wizard": "tsx examples/04-form-wizard/index.ts",
|
|
97
|
-
"prepublishOnly": "pnpm typecheck && pnpm lint && pnpm coverage && pnpm build && pnpm verify:exports && pnpm verify:llms && pnpm check:size"
|
|
99
|
+
"prepublishOnly": "pnpm typecheck && pnpm lint && pnpm verify:docs && pnpm coverage && pnpm build && pnpm verify:dist && pnpm verify:exports && pnpm verify:llms && pnpm check:size"
|
|
98
100
|
},
|
|
99
101
|
"peerDependencies": {
|
|
100
102
|
"fast-check": "^3.20.0 || ^4.0.0"
|