@earendil-works/chord 1.4.0 → 1.5.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.
- package/CHANGELOG.md +41 -0
- package/README.md +79 -14
- package/dist/cell.d.ts +7 -7
- package/dist/cell.d.ts.map +1 -1
- package/dist/cell.js.map +1 -1
- package/dist/context/index.d.ts +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +51 -52
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +19 -24
- package/dist/contract.js.map +1 -1
- package/dist/delta/apply-immutable-trusted.js +3 -4
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js +5 -3
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +9 -1
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +15 -11
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/pending.d.ts +36 -0
- package/dist/delta/pending.d.ts.map +1 -0
- package/dist/delta/pending.js +143 -0
- package/dist/delta/pending.js.map +1 -0
- package/dist/delta/tracker.d.ts +12 -0
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +109 -39
- package/dist/delta/tracker.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +9 -7
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/next/contracts/accepts.d.ts +81 -0
- package/dist/next/contracts/accepts.d.ts.map +1 -0
- package/dist/next/contracts/accepts.js +123 -0
- package/dist/next/contracts/accepts.js.map +1 -0
- package/dist/next/contracts/contract.d.ts +121 -0
- package/dist/next/contracts/contract.d.ts.map +1 -0
- package/dist/next/contracts/contract.js +50 -0
- package/dist/next/contracts/contract.js.map +1 -0
- package/dist/next/contracts/declare.d.ts +107 -0
- package/dist/next/contracts/declare.d.ts.map +1 -0
- package/dist/next/contracts/declare.js +136 -0
- package/dist/next/contracts/declare.js.map +1 -0
- package/dist/next/contracts/evolve.d.ts +92 -0
- package/dist/next/contracts/evolve.d.ts.map +1 -0
- package/dist/next/contracts/evolve.js +179 -0
- package/dist/next/contracts/evolve.js.map +1 -0
- package/dist/next/contracts/fingerprint.d.ts +16 -0
- package/dist/next/contracts/fingerprint.d.ts.map +1 -0
- package/dist/next/contracts/fingerprint.js +50 -0
- package/dist/next/contracts/fingerprint.js.map +1 -0
- package/dist/next/contracts/history.d.ts +71 -0
- package/dist/next/contracts/history.d.ts.map +1 -0
- package/dist/next/contracts/history.js +3 -0
- package/dist/next/contracts/history.js.map +1 -0
- package/dist/next/contracts/host-kind.d.ts +40 -0
- package/dist/next/contracts/host-kind.d.ts.map +1 -0
- package/dist/next/contracts/host-kind.js +37 -0
- package/dist/next/contracts/host-kind.js.map +1 -0
- package/dist/next/contracts/index.d.ts +7 -0
- package/dist/next/contracts/index.d.ts.map +1 -0
- package/dist/next/contracts/index.js +6 -0
- package/dist/next/contracts/index.js.map +1 -0
- package/dist/next/contracts/internal.d.ts +10 -0
- package/dist/next/contracts/internal.d.ts.map +1 -0
- package/dist/next/contracts/internal.js +9 -0
- package/dist/next/contracts/internal.js.map +1 -0
- package/dist/next/contracts/names.d.ts +3 -0
- package/dist/next/contracts/names.d.ts.map +1 -0
- package/dist/next/contracts/names.js +13 -0
- package/dist/next/contracts/names.js.map +1 -0
- package/dist/next/contracts/params.d.ts +28 -0
- package/dist/next/contracts/params.d.ts.map +1 -0
- package/dist/next/contracts/params.js +50 -0
- package/dist/next/contracts/params.js.map +1 -0
- package/dist/next/contracts/schema.d.ts +102 -0
- package/dist/next/contracts/schema.d.ts.map +1 -0
- package/dist/next/contracts/schema.js +103 -0
- package/dist/next/contracts/schema.js.map +1 -0
- package/dist/next/contracts/snapshot.d.ts +16 -0
- package/dist/next/contracts/snapshot.d.ts.map +1 -0
- package/dist/next/contracts/snapshot.js +167 -0
- package/dist/next/contracts/snapshot.js.map +1 -0
- package/dist/next/data/args.d.ts +50 -0
- package/dist/next/data/args.d.ts.map +1 -0
- package/dist/next/data/args.js +83 -0
- package/dist/next/data/args.js.map +1 -0
- package/dist/next/data/errors.d.ts +73 -0
- package/dist/next/data/errors.d.ts.map +1 -0
- package/dist/next/data/errors.js +107 -0
- package/dist/next/data/errors.js.map +1 -0
- package/dist/next/data/failure.d.ts +26 -0
- package/dist/next/data/failure.d.ts.map +1 -0
- package/dist/next/data/failure.js +72 -0
- package/dist/next/data/failure.js.map +1 -0
- package/dist/next/data/index.d.ts +4 -0
- package/dist/next/data/index.d.ts.map +1 -0
- package/dist/next/data/index.js +4 -0
- package/dist/next/data/index.js.map +1 -0
- package/dist/next/data/internal.d.ts +7 -0
- package/dist/next/data/internal.d.ts.map +1 -0
- package/dist/next/data/internal.js +8 -0
- package/dist/next/data/internal.js.map +1 -0
- package/dist/next/data/params.d.ts +20 -0
- package/dist/next/data/params.d.ts.map +1 -0
- package/dist/next/data/params.js +31 -0
- package/dist/next/data/params.js.map +1 -0
- package/dist/next/data/principal.d.ts +17 -0
- package/dist/next/data/principal.d.ts.map +1 -0
- package/dist/next/data/principal.js +41 -0
- package/dist/next/data/principal.js.map +1 -0
- package/dist/next/data/validator.d.ts +12 -0
- package/dist/next/data/validator.d.ts.map +1 -0
- package/dist/next/data/validator.js +34 -0
- package/dist/next/data/validator.js.map +1 -0
- package/dist/next/documents/address-source.d.ts +20 -0
- package/dist/next/documents/address-source.d.ts.map +1 -0
- package/dist/next/documents/address-source.js +44 -0
- package/dist/next/documents/address-source.js.map +1 -0
- package/dist/next/documents/definition.d.ts +84 -0
- package/dist/next/documents/definition.d.ts.map +1 -0
- package/dist/next/documents/definition.js +73 -0
- package/dist/next/documents/definition.js.map +1 -0
- package/dist/next/documents/documents.d.ts +106 -0
- package/dist/next/documents/documents.d.ts.map +1 -0
- package/dist/next/documents/documents.js +224 -0
- package/dist/next/documents/documents.js.map +1 -0
- package/dist/next/documents/fence.d.ts +9 -0
- package/dist/next/documents/fence.d.ts.map +1 -0
- package/dist/next/documents/fence.js +15 -0
- package/dist/next/documents/fence.js.map +1 -0
- package/dist/next/documents/handles.d.ts +76 -0
- package/dist/next/documents/handles.d.ts.map +1 -0
- package/dist/next/documents/handles.js +66 -0
- package/dist/next/documents/handles.js.map +1 -0
- package/dist/next/documents/index.d.ts +4 -0
- package/dist/next/documents/index.d.ts.map +1 -0
- package/dist/next/documents/index.js +3 -0
- package/dist/next/documents/index.js.map +1 -0
- package/dist/next/documents/internal.d.ts +9 -0
- package/dist/next/documents/internal.d.ts.map +1 -0
- package/dist/next/documents/internal.js +9 -0
- package/dist/next/documents/internal.js.map +1 -0
- package/dist/next/documents/keyed-slot.d.ts +103 -0
- package/dist/next/documents/keyed-slot.d.ts.map +1 -0
- package/dist/next/documents/keyed-slot.js +395 -0
- package/dist/next/documents/keyed-slot.js.map +1 -0
- package/dist/next/documents/line.d.ts +7 -0
- package/dist/next/documents/line.d.ts.map +1 -0
- package/dist/next/documents/line.js +14 -0
- package/dist/next/documents/line.js.map +1 -0
- package/dist/next/documents/persistence.d.ts +104 -0
- package/dist/next/documents/persistence.d.ts.map +1 -0
- package/dist/next/documents/persistence.js +128 -0
- package/dist/next/documents/persistence.js.map +1 -0
- package/dist/next/documents/residency.d.ts +31 -0
- package/dist/next/documents/residency.d.ts.map +1 -0
- package/dist/next/documents/residency.js +93 -0
- package/dist/next/documents/residency.js.map +1 -0
- package/dist/next/documents/slot.d.ts +109 -0
- package/dist/next/documents/slot.d.ts.map +1 -0
- package/dist/next/documents/slot.js +181 -0
- package/dist/next/documents/slot.js.map +1 -0
- package/dist/next/documents/transaction.d.ts +133 -0
- package/dist/next/documents/transaction.d.ts.map +1 -0
- package/dist/next/documents/transaction.js +409 -0
- package/dist/next/documents/transaction.js.map +1 -0
- package/dist/next/host/activity.d.ts +31 -0
- package/dist/next/host/activity.d.ts.map +1 -0
- package/dist/next/host/activity.js +40 -0
- package/dist/next/host/activity.js.map +1 -0
- package/dist/next/host/adapted.d.ts +49 -0
- package/dist/next/host/adapted.d.ts.map +1 -0
- package/dist/next/host/adapted.js +214 -0
- package/dist/next/host/adapted.js.map +1 -0
- package/dist/next/host/attempt.d.ts +278 -0
- package/dist/next/host/attempt.d.ts.map +1 -0
- package/dist/next/host/attempt.js +1072 -0
- package/dist/next/host/attempt.js.map +1 -0
- package/dist/next/host/backoff.d.ts +29 -0
- package/dist/next/host/backoff.d.ts.map +1 -0
- package/dist/next/host/backoff.js +69 -0
- package/dist/next/host/backoff.js.map +1 -0
- package/dist/next/host/ctx.d.ts +47 -0
- package/dist/next/host/ctx.d.ts.map +1 -0
- package/dist/next/host/ctx.js +108 -0
- package/dist/next/host/ctx.js.map +1 -0
- package/dist/next/host/deadline.d.ts +12 -0
- package/dist/next/host/deadline.d.ts.map +1 -0
- package/dist/next/host/deadline.js +40 -0
- package/dist/next/host/deadline.js.map +1 -0
- package/dist/next/host/dependencies.d.ts +65 -0
- package/dist/next/host/dependencies.d.ts.map +1 -0
- package/dist/next/host/dependencies.js +115 -0
- package/dist/next/host/dependencies.js.map +1 -0
- package/dist/next/host/destination.d.ts +48 -0
- package/dist/next/host/destination.d.ts.map +1 -0
- package/dist/next/host/destination.js +101 -0
- package/dist/next/host/destination.js.map +1 -0
- package/dist/next/host/facet.d.ts +79 -0
- package/dist/next/host/facet.d.ts.map +1 -0
- package/dist/next/host/facet.js +55 -0
- package/dist/next/host/facet.js.map +1 -0
- package/dist/next/host/follow.d.ts +52 -0
- package/dist/next/host/follow.d.ts.map +1 -0
- package/dist/next/host/follow.js +207 -0
- package/dist/next/host/follow.js.map +1 -0
- package/dist/next/host/host.d.ts +495 -0
- package/dist/next/host/host.d.ts.map +1 -0
- package/dist/next/host/host.js +1075 -0
- package/dist/next/host/host.js.map +1 -0
- package/dist/next/host/index.d.ts +17 -0
- package/dist/next/host/index.d.ts.map +1 -0
- package/dist/next/host/index.js +6 -0
- package/dist/next/host/index.js.map +1 -0
- package/dist/next/host/internal.d.ts +10 -0
- package/dist/next/host/internal.d.ts.map +1 -0
- package/dist/next/host/internal.js +8 -0
- package/dist/next/host/internal.js.map +1 -0
- package/dist/next/host/members.d.ts +50 -0
- package/dist/next/host/members.d.ts.map +1 -0
- package/dist/next/host/members.js +107 -0
- package/dist/next/host/members.js.map +1 -0
- package/dist/next/host/native.d.ts +55 -0
- package/dist/next/host/native.d.ts.map +1 -0
- package/dist/next/host/native.js +92 -0
- package/dist/next/host/native.js.map +1 -0
- package/dist/next/host/object.d.ts +290 -0
- package/dist/next/host/object.d.ts.map +1 -0
- package/dist/next/host/object.js +1127 -0
- package/dist/next/host/object.js.map +1 -0
- package/dist/next/host/parked.d.ts +23 -0
- package/dist/next/host/parked.d.ts.map +1 -0
- package/dist/next/host/parked.js +79 -0
- package/dist/next/host/parked.js.map +1 -0
- package/dist/next/host/presence.d.ts +34 -0
- package/dist/next/host/presence.d.ts.map +1 -0
- package/dist/next/host/presence.js +117 -0
- package/dist/next/host/presence.js.map +1 -0
- package/dist/next/host/ref-state.d.ts +53 -0
- package/dist/next/host/ref-state.d.ts.map +1 -0
- package/dist/next/host/ref-state.js +83 -0
- package/dist/next/host/ref-state.js.map +1 -0
- package/dist/next/host/reference-keys.d.ts +36 -0
- package/dist/next/host/reference-keys.d.ts.map +1 -0
- package/dist/next/host/reference-keys.js +168 -0
- package/dist/next/host/reference-keys.js.map +1 -0
- package/dist/next/host/reference-source.d.ts +65 -0
- package/dist/next/host/reference-source.d.ts.map +1 -0
- package/dist/next/host/reference-source.js +285 -0
- package/dist/next/host/reference-source.js.map +1 -0
- package/dist/next/host/reference.d.ts +308 -0
- package/dist/next/host/reference.d.ts.map +1 -0
- package/dist/next/host/reference.js +775 -0
- package/dist/next/host/reference.js.map +1 -0
- package/dist/next/host/retry-on.d.ts +28 -0
- package/dist/next/host/retry-on.d.ts.map +1 -0
- package/dist/next/host/retry-on.js +52 -0
- package/dist/next/host/retry-on.js.map +1 -0
- package/dist/next/host/revocation.d.ts +16 -0
- package/dist/next/host/revocation.d.ts.map +1 -0
- package/dist/next/host/revocation.js +27 -0
- package/dist/next/host/revocation.js.map +1 -0
- package/dist/next/host/root.d.ts +27 -0
- package/dist/next/host/root.d.ts.map +1 -0
- package/dist/next/host/root.js +68 -0
- package/dist/next/host/root.js.map +1 -0
- package/dist/next/host/route.d.ts +64 -0
- package/dist/next/host/route.d.ts.map +1 -0
- package/dist/next/host/route.js +190 -0
- package/dist/next/host/route.js.map +1 -0
- package/dist/next/host/routines.d.ts +76 -0
- package/dist/next/host/routines.d.ts.map +1 -0
- package/dist/next/host/routines.js +350 -0
- package/dist/next/host/routines.js.map +1 -0
- package/dist/next/host/sleep.d.ts +9 -0
- package/dist/next/host/sleep.d.ts.map +1 -0
- package/dist/next/host/sleep.js +40 -0
- package/dist/next/host/sleep.js.map +1 -0
- package/dist/next/host/staging.d.ts +94 -0
- package/dist/next/host/staging.d.ts.map +1 -0
- package/dist/next/host/staging.js +302 -0
- package/dist/next/host/staging.js.map +1 -0
- package/dist/next/host/unbound.d.ts +30 -0
- package/dist/next/host/unbound.d.ts.map +1 -0
- package/dist/next/host/unbound.js +67 -0
- package/dist/next/host/unbound.js.map +1 -0
- package/dist/next/host/uuid.d.ts +3 -0
- package/dist/next/host/uuid.d.ts.map +1 -0
- package/dist/next/host/uuid.js +38 -0
- package/dist/next/host/uuid.js.map +1 -0
- package/dist/next/index.d.ts +28 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +18 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/jobs/definition.d.ts +96 -0
- package/dist/next/jobs/definition.d.ts.map +1 -0
- package/dist/next/jobs/definition.js +83 -0
- package/dist/next/jobs/definition.js.map +1 -0
- package/dist/next/jobs/index.d.ts +5 -0
- package/dist/next/jobs/index.d.ts.map +1 -0
- package/dist/next/jobs/index.js +3 -0
- package/dist/next/jobs/index.js.map +1 -0
- package/dist/next/jobs/internal.d.ts +3 -0
- package/dist/next/jobs/internal.d.ts.map +1 -0
- package/dist/next/jobs/internal.js +4 -0
- package/dist/next/jobs/internal.js.map +1 -0
- package/dist/next/jobs/job.d.ts +152 -0
- package/dist/next/jobs/job.d.ts.map +1 -0
- package/dist/next/jobs/job.js +320 -0
- package/dist/next/jobs/job.js.map +1 -0
- package/dist/next/jobs/persisted.d.ts +38 -0
- package/dist/next/jobs/persisted.d.ts.map +1 -0
- package/dist/next/jobs/persisted.js +95 -0
- package/dist/next/jobs/persisted.js.map +1 -0
- package/dist/next/jobs/records.d.ts +231 -0
- package/dist/next/jobs/records.d.ts.map +1 -0
- package/dist/next/jobs/records.js +869 -0
- package/dist/next/jobs/records.js.map +1 -0
- package/dist/next/jobs/run-states.d.ts +69 -0
- package/dist/next/jobs/run-states.d.ts.map +1 -0
- package/dist/next/jobs/run-states.js +228 -0
- package/dist/next/jobs/run-states.js.map +1 -0
- package/dist/next/jobs/run.d.ts +113 -0
- package/dist/next/jobs/run.d.ts.map +1 -0
- package/dist/next/jobs/run.js +200 -0
- package/dist/next/jobs/run.js.map +1 -0
- package/dist/next/jobs/running.d.ts +44 -0
- package/dist/next/jobs/running.d.ts.map +1 -0
- package/dist/next/jobs/running.js +117 -0
- package/dist/next/jobs/running.js.map +1 -0
- package/dist/next/jobs/stored.d.ts +63 -0
- package/dist/next/jobs/stored.d.ts.map +1 -0
- package/dist/next/jobs/stored.js +55 -0
- package/dist/next/jobs/stored.js.map +1 -0
- package/dist/next/link/binary.d.ts +4 -0
- package/dist/next/link/binary.d.ts.map +1 -0
- package/dist/next/link/binary.js +534 -0
- package/dist/next/link/binary.js.map +1 -0
- package/dist/next/link/channel.d.ts +63 -0
- package/dist/next/link/channel.d.ts.map +1 -0
- package/dist/next/link/channel.js +202 -0
- package/dist/next/link/channel.js.map +1 -0
- package/dist/next/link/errors.d.ts +7 -0
- package/dist/next/link/errors.d.ts.map +1 -0
- package/dist/next/link/errors.js +21 -0
- package/dist/next/link/errors.js.map +1 -0
- package/dist/next/link/index.d.ts +8 -0
- package/dist/next/link/index.d.ts.map +1 -0
- package/dist/next/link/index.js +8 -0
- package/dist/next/link/index.js.map +1 -0
- package/dist/next/link/internal.d.ts +9 -0
- package/dist/next/link/internal.d.ts.map +1 -0
- package/dist/next/link/internal.js +10 -0
- package/dist/next/link/internal.js.map +1 -0
- package/dist/next/link/ipc.d.ts +22 -0
- package/dist/next/link/ipc.d.ts.map +1 -0
- package/dist/next/link/ipc.js +64 -0
- package/dist/next/link/ipc.js.map +1 -0
- package/dist/next/link/link.d.ts +34 -0
- package/dist/next/link/link.d.ts.map +1 -0
- package/dist/next/link/link.js +87 -0
- package/dist/next/link/link.js.map +1 -0
- package/dist/next/link/message.d.ts +249 -0
- package/dist/next/link/message.d.ts.map +1 -0
- package/dist/next/link/message.js +123 -0
- package/dist/next/link/message.js.map +1 -0
- package/dist/next/link/part.d.ts +80 -0
- package/dist/next/link/part.d.ts.map +1 -0
- package/dist/next/link/part.js +164 -0
- package/dist/next/link/part.js.map +1 -0
- package/dist/next/link/text.d.ts +6 -0
- package/dist/next/link/text.d.ts.map +1 -0
- package/dist/next/link/text.js +335 -0
- package/dist/next/link/text.js.map +1 -0
- package/dist/next/link/values.d.ts +40 -0
- package/dist/next/link/values.d.ts.map +1 -0
- package/dist/next/link/values.js +117 -0
- package/dist/next/link/values.js.map +1 -0
- package/dist/next/link/websocket.d.ts +26 -0
- package/dist/next/link/websocket.d.ts.map +1 -0
- package/dist/next/link/websocket.js +91 -0
- package/dist/next/link/websocket.js.map +1 -0
- package/dist/next/registries/contribution.d.ts +50 -0
- package/dist/next/registries/contribution.d.ts.map +1 -0
- package/dist/next/registries/contribution.js +129 -0
- package/dist/next/registries/contribution.js.map +1 -0
- package/dist/next/registries/entries.d.ts +18 -0
- package/dist/next/registries/entries.d.ts.map +1 -0
- package/dist/next/registries/entries.js +42 -0
- package/dist/next/registries/entries.js.map +1 -0
- package/dist/next/registries/index.d.ts +3 -0
- package/dist/next/registries/index.d.ts.map +1 -0
- package/dist/next/registries/index.js +5 -0
- package/dist/next/registries/index.js.map +1 -0
- package/dist/next/registries/internal.d.ts +4 -0
- package/dist/next/registries/internal.d.ts.map +1 -0
- package/dist/next/registries/internal.js +5 -0
- package/dist/next/registries/internal.js.map +1 -0
- package/dist/next/registries/record.d.ts +94 -0
- package/dist/next/registries/record.d.ts.map +1 -0
- package/dist/next/registries/record.js +253 -0
- package/dist/next/registries/record.js.map +1 -0
- package/dist/next/registries/registry.d.ts +74 -0
- package/dist/next/registries/registry.d.ts.map +1 -0
- package/dist/next/registries/registry.js +14 -0
- package/dist/next/registries/registry.js.map +1 -0
- package/dist/next/registries/value.d.ts +48 -0
- package/dist/next/registries/value.d.ts.map +1 -0
- package/dist/next/registries/value.js +199 -0
- package/dist/next/registries/value.js.map +1 -0
- package/dist/next/remote/calls.d.ts +25 -0
- package/dist/next/remote/calls.d.ts.map +1 -0
- package/dist/next/remote/calls.js +62 -0
- package/dist/next/remote/calls.js.map +1 -0
- package/dist/next/remote/consumer.d.ts +42 -0
- package/dist/next/remote/consumer.d.ts.map +1 -0
- package/dist/next/remote/consumer.js +343 -0
- package/dist/next/remote/consumer.js.map +1 -0
- package/dist/next/remote/hold.d.ts +130 -0
- package/dist/next/remote/hold.d.ts.map +1 -0
- package/dist/next/remote/hold.js +537 -0
- package/dist/next/remote/hold.js.map +1 -0
- package/dist/next/remote/host-link.d.ts +77 -0
- package/dist/next/remote/host-link.d.ts.map +1 -0
- package/dist/next/remote/host-link.js +182 -0
- package/dist/next/remote/host-link.js.map +1 -0
- package/dist/next/remote/internal.d.ts +6 -0
- package/dist/next/remote/internal.d.ts.map +1 -0
- package/dist/next/remote/internal.js +6 -0
- package/dist/next/remote/internal.js.map +1 -0
- package/dist/next/remote/path.d.ts +46 -0
- package/dist/next/remote/path.d.ts.map +1 -0
- package/dist/next/remote/path.js +73 -0
- package/dist/next/remote/path.js.map +1 -0
- package/dist/next/remote/provider.d.ts +76 -0
- package/dist/next/remote/provider.d.ts.map +1 -0
- package/dist/next/remote/provider.js +506 -0
- package/dist/next/remote/provider.js.map +1 -0
- package/dist/next/remote/relay.d.ts +58 -0
- package/dist/next/remote/relay.d.ts.map +1 -0
- package/dist/next/remote/relay.js +117 -0
- package/dist/next/remote/relay.js.map +1 -0
- package/dist/next/remote/remote-object.d.ts +133 -0
- package/dist/next/remote/remote-object.d.ts.map +1 -0
- package/dist/next/remote/remote-object.js +411 -0
- package/dist/next/remote/remote-object.js.map +1 -0
- package/dist/next/remote/replica.d.ts +59 -0
- package/dist/next/remote/replica.d.ts.map +1 -0
- package/dist/next/remote/replica.js +125 -0
- package/dist/next/remote/replica.js.map +1 -0
- package/dist/next/state/batch.d.ts +64 -0
- package/dist/next/state/batch.d.ts.map +1 -0
- package/dist/next/state/batch.js +163 -0
- package/dist/next/state/batch.js.map +1 -0
- package/dist/next/state/derive.d.ts +52 -0
- package/dist/next/state/derive.d.ts.map +1 -0
- package/dist/next/state/derive.js +182 -0
- package/dist/next/state/derive.js.map +1 -0
- package/dist/next/state/index.d.ts +6 -0
- package/dist/next/state/index.d.ts.map +1 -0
- package/dist/next/state/index.js +4 -0
- package/dist/next/state/index.js.map +1 -0
- package/dist/next/state/internal.d.ts +6 -0
- package/dist/next/state/internal.d.ts.map +1 -0
- package/dist/next/state/internal.js +8 -0
- package/dist/next/state/internal.js.map +1 -0
- package/dist/next/state/native-source.d.ts +106 -0
- package/dist/next/state/native-source.d.ts.map +1 -0
- package/dist/next/state/native-source.js +240 -0
- package/dist/next/state/native-source.js.map +1 -0
- package/dist/next/state/watchable.d.ts +114 -0
- package/dist/next/state/watchable.d.ts.map +1 -0
- package/dist/next/state/watchable.js +156 -0
- package/dist/next/state/watchable.js.map +1 -0
- package/dist/next/state/writable.d.ts +32 -0
- package/dist/next/state/writable.d.ts.map +1 -0
- package/dist/next/state/writable.js +49 -0
- package/dist/next/state/writable.js.map +1 -0
- package/dist/next/store/adapter.d.ts +67 -0
- package/dist/next/store/adapter.d.ts.map +1 -0
- package/dist/next/store/adapter.js +118 -0
- package/dist/next/store/adapter.js.map +1 -0
- package/dist/next/store/allocator.d.ts +17 -0
- package/dist/next/store/allocator.d.ts.map +1 -0
- package/dist/next/store/allocator.js +30 -0
- package/dist/next/store/allocator.js.map +1 -0
- package/dist/next/store/applier.d.ts +8 -0
- package/dist/next/store/applier.d.ts.map +1 -0
- package/dist/next/store/applier.js +375 -0
- package/dist/next/store/applier.js.map +1 -0
- package/dist/next/store/apply-batch.d.ts +12 -0
- package/dist/next/store/apply-batch.d.ts.map +1 -0
- package/dist/next/store/apply-batch.js +83 -0
- package/dist/next/store/apply-batch.js.map +1 -0
- package/dist/next/store/archive.d.ts +32 -0
- package/dist/next/store/archive.d.ts.map +1 -0
- package/dist/next/store/archive.js +129 -0
- package/dist/next/store/archive.js.map +1 -0
- package/dist/next/store/backend.d.ts +10 -0
- package/dist/next/store/backend.d.ts.map +1 -0
- package/dist/next/store/backend.js +15 -0
- package/dist/next/store/backend.js.map +1 -0
- package/dist/next/store/catalog.d.ts +24 -0
- package/dist/next/store/catalog.d.ts.map +1 -0
- package/dist/next/store/catalog.js +17 -0
- package/dist/next/store/catalog.js.map +1 -0
- package/dist/next/store/claims.d.ts +23 -0
- package/dist/next/store/claims.d.ts.map +1 -0
- package/dist/next/store/claims.js +65 -0
- package/dist/next/store/claims.js.map +1 -0
- package/dist/next/store/columns.d.ts +77 -0
- package/dist/next/store/columns.d.ts.map +1 -0
- package/dist/next/store/columns.js +77 -0
- package/dist/next/store/columns.js.map +1 -0
- package/dist/next/store/engine.d.ts +176 -0
- package/dist/next/store/engine.d.ts.map +1 -0
- package/dist/next/store/engine.js +283 -0
- package/dist/next/store/engine.js.map +1 -0
- package/dist/next/store/evaluate.d.ts +17 -0
- package/dist/next/store/evaluate.d.ts.map +1 -0
- package/dist/next/store/evaluate.js +128 -0
- package/dist/next/store/evaluate.js.map +1 -0
- package/dist/next/store/export.d.ts +17 -0
- package/dist/next/store/export.d.ts.map +1 -0
- package/dist/next/store/export.js +200 -0
- package/dist/next/store/export.js.map +1 -0
- package/dist/next/store/expression.d.ts +150 -0
- package/dist/next/store/expression.d.ts.map +1 -0
- package/dist/next/store/expression.js +268 -0
- package/dist/next/store/expression.js.map +1 -0
- package/dist/next/store/import.d.ts +10 -0
- package/dist/next/store/import.d.ts.map +1 -0
- package/dist/next/store/import.js +276 -0
- package/dist/next/store/import.js.map +1 -0
- package/dist/next/store/index.d.ts +16 -0
- package/dist/next/store/index.d.ts.map +1 -0
- package/dist/next/store/index.js +13 -0
- package/dist/next/store/index.js.map +1 -0
- package/dist/next/store/json-column.d.ts +33 -0
- package/dist/next/store/json-column.d.ts.map +1 -0
- package/dist/next/store/json-column.js +61 -0
- package/dist/next/store/json-column.js.map +1 -0
- package/dist/next/store/jsonl.d.ts +9 -0
- package/dist/next/store/jsonl.d.ts.map +1 -0
- package/dist/next/store/jsonl.js +61 -0
- package/dist/next/store/jsonl.js.map +1 -0
- package/dist/next/store/outbox.d.ts +26 -0
- package/dist/next/store/outbox.d.ts.map +1 -0
- package/dist/next/store/outbox.js +80 -0
- package/dist/next/store/outbox.js.map +1 -0
- package/dist/next/store/query.d.ts +39 -0
- package/dist/next/store/query.d.ts.map +1 -0
- package/dist/next/store/query.js +97 -0
- package/dist/next/store/query.js.map +1 -0
- package/dist/next/store/refusal.d.ts +15 -0
- package/dist/next/store/refusal.d.ts.map +1 -0
- package/dist/next/store/refusal.js +36 -0
- package/dist/next/store/refusal.js.map +1 -0
- package/dist/next/store/rows.d.ts +80 -0
- package/dist/next/store/rows.d.ts.map +1 -0
- package/dist/next/store/rows.js +183 -0
- package/dist/next/store/rows.js.map +1 -0
- package/dist/next/store/schema.d.ts +25 -0
- package/dist/next/store/schema.d.ts.map +1 -0
- package/dist/next/store/schema.js +115 -0
- package/dist/next/store/schema.js.map +1 -0
- package/dist/next/store/sql.d.ts +73 -0
- package/dist/next/store/sql.d.ts.map +1 -0
- package/dist/next/store/sql.js +234 -0
- package/dist/next/store/sql.js.map +1 -0
- package/dist/next/store/step.d.ts +48 -0
- package/dist/next/store/step.d.ts.map +1 -0
- package/dist/next/store/step.js +50 -0
- package/dist/next/store/step.js.map +1 -0
- package/dist/next/store/store.d.ts +161 -0
- package/dist/next/store/store.d.ts.map +1 -0
- package/dist/next/store/store.js +627 -0
- package/dist/next/store/store.js.map +1 -0
- package/dist/next/store/table-changes.d.ts +29 -0
- package/dist/next/store/table-changes.d.ts.map +1 -0
- package/dist/next/store/table-changes.js +102 -0
- package/dist/next/store/table-changes.js.map +1 -0
- package/dist/next/store/table-evolve.d.ts +74 -0
- package/dist/next/store/table-evolve.d.ts.map +1 -0
- package/dist/next/store/table-evolve.js +201 -0
- package/dist/next/store/table-evolve.js.map +1 -0
- package/dist/next/store/table-handle.d.ts +67 -0
- package/dist/next/store/table-handle.d.ts.map +1 -0
- package/dist/next/store/table-handle.js +101 -0
- package/dist/next/store/table-handle.js.map +1 -0
- package/dist/next/store/table-history.d.ts +75 -0
- package/dist/next/store/table-history.d.ts.map +1 -0
- package/dist/next/store/table-history.js +42 -0
- package/dist/next/store/table-history.js.map +1 -0
- package/dist/next/store/table-migration.d.ts +16 -0
- package/dist/next/store/table-migration.d.ts.map +1 -0
- package/dist/next/store/table-migration.js +202 -0
- package/dist/next/store/table-migration.js.map +1 -0
- package/dist/next/store/table-writes.d.ts +125 -0
- package/dist/next/store/table-writes.d.ts.map +1 -0
- package/dist/next/store/table-writes.js +165 -0
- package/dist/next/store/table-writes.js.map +1 -0
- package/dist/next/store/table.d.ts +80 -0
- package/dist/next/store/table.d.ts.map +1 -0
- package/dist/next/store/table.js +103 -0
- package/dist/next/store/table.js.map +1 -0
- package/dist/next/store/text.d.ts +14 -0
- package/dist/next/store/text.d.ts.map +1 -0
- package/dist/next/store/text.js +51 -0
- package/dist/next/store/text.js.map +1 -0
- package/dist/next/store/writes.d.ts +5 -0
- package/dist/next/store/writes.d.ts.map +1 -0
- package/dist/next/store/writes.js +4 -0
- package/dist/next/store/writes.js.map +1 -0
- package/dist/next-node/compression.d.ts +7 -0
- package/dist/next-node/compression.d.ts.map +1 -0
- package/dist/next-node/compression.js +24 -0
- package/dist/next-node/compression.js.map +1 -0
- package/dist/next-node/http/admission.d.ts +63 -0
- package/dist/next-node/http/admission.d.ts.map +1 -0
- package/dist/next-node/http/admission.js +134 -0
- package/dist/next-node/http/admission.js.map +1 -0
- package/dist/next-node/http/authenticate.d.ts +21 -0
- package/dist/next-node/http/authenticate.d.ts.map +1 -0
- package/dist/next-node/http/authenticate.js +34 -0
- package/dist/next-node/http/authenticate.js.map +1 -0
- package/dist/next-node/http/cookies.d.ts +24 -0
- package/dist/next-node/http/cookies.d.ts.map +1 -0
- package/dist/next-node/http/cookies.js +62 -0
- package/dist/next-node/http/cookies.js.map +1 -0
- package/dist/next-node/http/file.d.ts +23 -0
- package/dist/next-node/http/file.d.ts.map +1 -0
- package/dist/next-node/http/file.js +94 -0
- package/dist/next-node/http/file.js.map +1 -0
- package/dist/next-node/http/headers.d.ts +37 -0
- package/dist/next-node/http/headers.d.ts.map +1 -0
- package/dist/next-node/http/headers.js +129 -0
- package/dist/next-node/http/headers.js.map +1 -0
- package/dist/next-node/http/http.d.ts +100 -0
- package/dist/next-node/http/http.d.ts.map +1 -0
- package/dist/next-node/http/http.js +462 -0
- package/dist/next-node/http/http.js.map +1 -0
- package/dist/next-node/http/incoming.d.ts +19 -0
- package/dist/next-node/http/incoming.d.ts.map +1 -0
- package/dist/next-node/http/incoming.js +31 -0
- package/dist/next-node/http/incoming.js.map +1 -0
- package/dist/next-node/http/index.d.ts +11 -0
- package/dist/next-node/http/index.d.ts.map +1 -0
- package/dist/next-node/http/index.js +12 -0
- package/dist/next-node/http/index.js.map +1 -0
- package/dist/next-node/http/node.d.ts +78 -0
- package/dist/next-node/http/node.d.ts.map +1 -0
- package/dist/next-node/http/node.js +291 -0
- package/dist/next-node/http/node.js.map +1 -0
- package/dist/next-node/http/request.d.ts +54 -0
- package/dist/next-node/http/request.d.ts.map +1 -0
- package/dist/next-node/http/request.js +116 -0
- package/dist/next-node/http/request.js.map +1 -0
- package/dist/next-node/http/response.d.ts +63 -0
- package/dist/next-node/http/response.d.ts.map +1 -0
- package/dist/next-node/http/response.js +202 -0
- package/dist/next-node/http/response.js.map +1 -0
- package/dist/next-node/http/router.d.ts +114 -0
- package/dist/next-node/http/router.d.ts.map +1 -0
- package/dist/next-node/http/router.js +261 -0
- package/dist/next-node/http/router.js.map +1 -0
- package/dist/next-node/http/upgrades.d.ts +58 -0
- package/dist/next-node/http/upgrades.d.ts.map +1 -0
- package/dist/next-node/http/upgrades.js +184 -0
- package/dist/next-node/http/upgrades.js.map +1 -0
- package/dist/next-node/plugins/build.d.ts +57 -0
- package/dist/next-node/plugins/build.d.ts.map +1 -0
- package/dist/next-node/plugins/build.js +334 -0
- package/dist/next-node/plugins/build.js.map +1 -0
- package/dist/next-node/plugins/discover.d.ts +36 -0
- package/dist/next-node/plugins/discover.d.ts.map +1 -0
- package/dist/next-node/plugins/discover.js +91 -0
- package/dist/next-node/plugins/discover.js.map +1 -0
- package/dist/next-node/plugins/evaluate.d.ts +33 -0
- package/dist/next-node/plugins/evaluate.d.ts.map +1 -0
- package/dist/next-node/plugins/evaluate.js +98 -0
- package/dist/next-node/plugins/evaluate.js.map +1 -0
- package/dist/next-node/plugins/index.d.ts +9 -0
- package/dist/next-node/plugins/index.d.ts.map +1 -0
- package/dist/next-node/plugins/index.js +11 -0
- package/dist/next-node/plugins/index.js.map +1 -0
- package/dist/next-node/plugins/install.d.ts +13 -0
- package/dist/next-node/plugins/install.d.ts.map +1 -0
- package/dist/next-node/plugins/install.js +37 -0
- package/dist/next-node/plugins/install.js.map +1 -0
- package/dist/next-node/plugins/plugins.d.ts +135 -0
- package/dist/next-node/plugins/plugins.d.ts.map +1 -0
- package/dist/next-node/plugins/plugins.js +206 -0
- package/dist/next-node/plugins/plugins.js.map +1 -0
- package/dist/next-node/plugins/runtime.d.ts +41 -0
- package/dist/next-node/plugins/runtime.d.ts.map +1 -0
- package/dist/next-node/plugins/runtime.js +136 -0
- package/dist/next-node/plugins/runtime.js.map +1 -0
- package/dist/next-node/plugins/stack.d.ts +16 -0
- package/dist/next-node/plugins/stack.d.ts.map +1 -0
- package/dist/next-node/plugins/stack.js +61 -0
- package/dist/next-node/plugins/stack.js.map +1 -0
- package/dist/next-node/plugins/watcher.d.ts +58 -0
- package/dist/next-node/plugins/watcher.d.ts.map +1 -0
- package/dist/next-node/plugins/watcher.js +281 -0
- package/dist/next-node/plugins/watcher.js.map +1 -0
- package/dist/next-node/workers/control.d.ts +83 -0
- package/dist/next-node/workers/control.d.ts.map +1 -0
- package/dist/next-node/workers/control.js +77 -0
- package/dist/next-node/workers/control.js.map +1 -0
- package/dist/next-node/workers/index.d.ts +5 -0
- package/dist/next-node/workers/index.d.ts.map +1 -0
- package/dist/next-node/workers/index.js +7 -0
- package/dist/next-node/workers/index.js.map +1 -0
- package/dist/next-node/workers/lock.d.ts +21 -0
- package/dist/next-node/workers/lock.d.ts.map +1 -0
- package/dist/next-node/workers/lock.js +137 -0
- package/dist/next-node/workers/lock.js.map +1 -0
- package/dist/next-node/workers/main.d.ts +46 -0
- package/dist/next-node/workers/main.d.ts.map +1 -0
- package/dist/next-node/workers/main.js +230 -0
- package/dist/next-node/workers/main.js.map +1 -0
- package/dist/next-node/workers/process.d.ts +42 -0
- package/dist/next-node/workers/process.d.ts.map +1 -0
- package/dist/next-node/workers/process.js +125 -0
- package/dist/next-node/workers/process.js.map +1 -0
- package/dist/next-node/workers/workers.d.ts +80 -0
- package/dist/next-node/workers/workers.d.ts.map +1 -0
- package/dist/next-node/workers/workers.js +572 -0
- package/dist/next-node/workers/workers.js.map +1 -0
- package/dist/object.d.ts +4 -4
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +3 -4
- package/dist/object.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +4 -2
- package/dist/output.js.map +1 -1
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +2 -2
- package/dist/remote.js.map +1 -1
- package/dist/schema.d.ts +8 -4
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +180 -5
- package/dist/schema.js.map +1 -1
- package/dist/sqlite/cloudflare.d.ts +2 -0
- package/dist/sqlite/cloudflare.d.ts.map +1 -1
- package/dist/sqlite/cloudflare.js +10 -0
- package/dist/sqlite/cloudflare.js.map +1 -1
- package/dist/sqlite/database.d.ts +5 -2
- package/dist/sqlite/database.d.ts.map +1 -1
- package/dist/sqlite/database.js.map +1 -1
- package/dist/sqlite/node.d.ts +4 -1
- package/dist/sqlite/node.d.ts.map +1 -1
- package/dist/sqlite/node.js +22 -5
- package/dist/sqlite/node.js.map +1 -1
- package/dist/watch.d.ts +194 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +383 -0
- package/dist/watch.js.map +1 -0
- package/dist/wire.d.ts +174 -193
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +81 -80
- package/dist/wire.js.map +1 -1
- package/docs/guide.md +15 -15
- package/docs/next/benchmarks.md +959 -0
- package/docs/next/decisions.md +2957 -0
- package/docs/next/dependencies/book.md +1671 -0
- package/docs/next/dependencies/index.html +2641 -0
- package/docs/next/dependencies/model.md +330 -0
- package/docs/next/design.md +2554 -0
- package/docs/next/durable-observers/book.md +432 -0
- package/docs/next/durable-observers/index.html +517 -0
- package/docs/next/flow-control/book.md +333 -0
- package/docs/next/flow-control/fold/index.html +265 -0
- package/docs/next/flow-control/index.html +548 -0
- package/docs/next/flow-control/window/index.html +228 -0
- package/docs/next/guide-plugins-hosts/book.md +607 -0
- package/docs/next/guide-plugins-hosts/index.html +652 -0
- package/docs/next/http-workers/book.md +378 -0
- package/docs/next/http-workers/index.html +515 -0
- package/docs/next/layer-1.md +311 -0
- package/docs/next/layer-2.md +216 -0
- package/docs/next/plugin-model/book.md +186 -0
- package/docs/next/plugin-model/index.html +310 -0
- package/docs/next/plugin-primer/book.md +273 -0
- package/docs/next/plugin-primer/index.html +430 -0
- package/docs/next/slice-1.md +236 -0
- package/docs/next/slice-10.md +285 -0
- package/docs/next/slice-11.md +93 -0
- package/docs/next/slice-2.md +174 -0
- package/docs/next/slice-3a.md +296 -0
- package/docs/next/slice-3b.md +197 -0
- package/docs/next/slice-4.md +146 -0
- package/docs/next/slice-4a.md +418 -0
- package/docs/next/slice-4b.md +208 -0
- package/docs/next/slice-5.md +281 -0
- package/docs/next/slice-6a.md +676 -0
- package/docs/next/slice-6b.md +332 -0
- package/docs/next/slice-7a.md +130 -0
- package/docs/next/slice-7b/book.md +608 -0
- package/docs/next/slice-7b/index.html +842 -0
- package/docs/next/slice-7b.md +255 -0
- package/docs/next/slice-7c.md +165 -0
- package/docs/next/slice-8.md +194 -0
- package/docs/next/slices.md +230 -0
- package/docs/next/store/book.md +665 -0
- package/docs/next/store/index.html +861 -0
- package/docs/next/store/walkthrough.md +193 -0
- package/docs/spec.md +9 -9
- package/docs/tutorial.md +26 -25
- package/package.json +22 -6
- package/src/delta/README.md +69 -0
package/dist/schema.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compile } from "@earendil-works/pi-schema";
|
|
2
2
|
import { invalid } from "./errors.js";
|
|
3
3
|
const asSchema = (schema) => schema !== null && typeof schema === "object" ? schema : schema === false ? { not: {} } : {};
|
|
4
4
|
/** Canonical JSON: sorted object keys, `undefined` members dropped. */
|
|
@@ -26,20 +26,195 @@ export function hash64(text) {
|
|
|
26
26
|
export function deepEqual(a, b) {
|
|
27
27
|
return a === b || canonicalJson(a) === canonicalJson(b);
|
|
28
28
|
}
|
|
29
|
+
const validators = new WeakMap();
|
|
30
|
+
/** The compiled validator of `schema`, compiled once per schema object; `format` is an annotation. */
|
|
31
|
+
function validatorOf(schema) {
|
|
32
|
+
if (typeof schema === "boolean")
|
|
33
|
+
return compile(schema);
|
|
34
|
+
let validator = validators.get(schema);
|
|
35
|
+
if (validator === undefined) {
|
|
36
|
+
validator = compile(schema);
|
|
37
|
+
validators.set(schema, validator);
|
|
38
|
+
}
|
|
39
|
+
return validator;
|
|
40
|
+
}
|
|
41
|
+
/** Whether `value` matches `schema`. */
|
|
42
|
+
export function isValid(schema, value) {
|
|
43
|
+
return validatorOf(schema).check(value);
|
|
44
|
+
}
|
|
29
45
|
/** Throws `invalid` (with `reason`) and the first schema errors when `value` does not match. */
|
|
30
46
|
export function assertValid(reason, what, schema, value) {
|
|
31
|
-
|
|
47
|
+
const validator = validatorOf(schema);
|
|
48
|
+
if (validator.check(value))
|
|
32
49
|
return;
|
|
33
|
-
const errors =
|
|
34
|
-
const summary = errors.map((error) => `${error.
|
|
50
|
+
const errors = validator.errors(value).slice(0, 3);
|
|
51
|
+
const summary = errors.map((error) => `${error.path || "/"} ${error.message}`).join("; ");
|
|
35
52
|
throw invalid(reason, `${what}: ${summary}`, errors);
|
|
36
53
|
}
|
|
37
54
|
/** Applies defaults, strips unknown fields, validates. Returns a fresh value. */
|
|
38
55
|
export function normalize(schema, value, what) {
|
|
39
|
-
const normalized =
|
|
56
|
+
const normalized = cleanFrom(asSchema(schema), withDefaults(asSchema(schema), cloneData(value ?? {})));
|
|
40
57
|
assertValid("input", what, schema, normalized);
|
|
41
58
|
return normalized;
|
|
42
59
|
}
|
|
60
|
+
/** A copy of `value` with only what `schema` knows: unknown object fields dropped, recursively (TypeBox's `Clean`). */
|
|
61
|
+
export function cleaned(schema, value) {
|
|
62
|
+
return cleanFrom(asSchema(schema), cloneData(value));
|
|
63
|
+
}
|
|
64
|
+
/** A deep copy of plain data: arrays, plain objects and bytes are copied, any other value is kept. */
|
|
65
|
+
function cloneData(value) {
|
|
66
|
+
if (Array.isArray(value))
|
|
67
|
+
return value.map(cloneData);
|
|
68
|
+
if (value instanceof Uint8Array)
|
|
69
|
+
return value.slice();
|
|
70
|
+
if (value === null || typeof value !== "object")
|
|
71
|
+
return value;
|
|
72
|
+
const prototype = Object.getPrototypeOf(value);
|
|
73
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
74
|
+
return value;
|
|
75
|
+
const copy = {};
|
|
76
|
+
for (const [key, item] of Object.entries(value))
|
|
77
|
+
copy[key] = cloneData(item);
|
|
78
|
+
return copy;
|
|
79
|
+
}
|
|
80
|
+
const isPlainObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value) && !(value instanceof Uint8Array);
|
|
81
|
+
const isSchemaObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
82
|
+
/** The object an `allOf` of object schemas evaluates to (TypeBox's `Evaluate`), or undefined for any other `allOf`. */
|
|
83
|
+
function mergedAllOf(schema) {
|
|
84
|
+
if (!Array.isArray(schema.allOf) || !schema.allOf.every((branch) => isSchemaObject(branch.properties)))
|
|
85
|
+
return undefined;
|
|
86
|
+
const properties = {};
|
|
87
|
+
const required = new Set();
|
|
88
|
+
for (const branch of schema.allOf) {
|
|
89
|
+
Object.assign(properties, branch.properties);
|
|
90
|
+
for (const key of branch.required ?? [])
|
|
91
|
+
required.add(key);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
type: "object",
|
|
95
|
+
properties,
|
|
96
|
+
required: [...required],
|
|
97
|
+
...(schema.unevaluatedProperties === undefined ? {} : { additionalProperties: schema.unevaluatedProperties }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** The pattern and value schema of a record (`patternProperties` with one pattern). */
|
|
101
|
+
function recordOf(schema) {
|
|
102
|
+
if (!isSchemaObject(schema.patternProperties) || isSchemaObject(schema.properties))
|
|
103
|
+
return undefined;
|
|
104
|
+
const [entry] = Object.entries(schema.patternProperties);
|
|
105
|
+
return entry === undefined ? undefined : [new RegExp(entry[0], "u"), entry[1]];
|
|
106
|
+
}
|
|
107
|
+
/** Whether `additional` (an object's `additionalProperties`) keeps an unknown field holding `value`. */
|
|
108
|
+
const keepsUnknown = (additional, value) => additional === true || (isSchemaObject(additional) && isValid(additional, value));
|
|
109
|
+
// Mutates `value` (a fresh copy), as TypeBox's `Clean` does.
|
|
110
|
+
function cleanFrom(schema, value) {
|
|
111
|
+
const merged = mergedAllOf(schema);
|
|
112
|
+
if (merged !== undefined)
|
|
113
|
+
return cleanFrom(merged, value);
|
|
114
|
+
if (Array.isArray(schema.anyOf)) {
|
|
115
|
+
for (const branch of schema.anyOf) {
|
|
116
|
+
const candidate = cleanFrom(asSchema(branch), cloneData(value));
|
|
117
|
+
if (isValid(asSchema(branch), candidate))
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(value)) {
|
|
123
|
+
const prefix = Array.isArray(schema.items)
|
|
124
|
+
? schema.items
|
|
125
|
+
: Array.isArray(schema.prefixItems)
|
|
126
|
+
? schema.prefixItems
|
|
127
|
+
: undefined;
|
|
128
|
+
if (prefix !== undefined) {
|
|
129
|
+
const length = Math.min(value.length, prefix.length);
|
|
130
|
+
for (let index = 0; index < length; index++)
|
|
131
|
+
value[index] = cleanFrom(asSchema(prefix[index]), value[index]);
|
|
132
|
+
return value.length > length ? value.slice(0, length) : value;
|
|
133
|
+
}
|
|
134
|
+
if (isSchemaObject(schema.items))
|
|
135
|
+
return value.map((item) => cleanFrom(schema.items, item));
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
if (!isPlainObject(value))
|
|
139
|
+
return value;
|
|
140
|
+
const record = recordOf(schema);
|
|
141
|
+
const properties = isSchemaObject(schema.properties) ? schema.properties : undefined;
|
|
142
|
+
// An object schema names its fields, a record its key pattern, a map (pi-schema's) its value schema.
|
|
143
|
+
if (properties === undefined && record === undefined && !isSchemaObject(schema.additionalProperties))
|
|
144
|
+
return value;
|
|
145
|
+
for (const key of Object.keys(value)) {
|
|
146
|
+
const known = properties !== undefined && Object.hasOwn(properties, key) ? properties[key] : undefined;
|
|
147
|
+
const matched = known ?? (record?.[0].test(key) ? record[1] : undefined);
|
|
148
|
+
if (matched !== undefined)
|
|
149
|
+
value[key] = cleanFrom(asSchema(matched), value[key]);
|
|
150
|
+
else if (keepsUnknown(schema.additionalProperties, value[key]))
|
|
151
|
+
value[key] = cleanFrom(asSchema(schema.additionalProperties), value[key]);
|
|
152
|
+
else
|
|
153
|
+
delete value[key];
|
|
154
|
+
}
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
// Mutates `value` (a fresh copy), as TypeBox's `Default` does: a missing value takes its schema's default, a
|
|
158
|
+
// missing optional field never does.
|
|
159
|
+
function withDefaults(schema, value) {
|
|
160
|
+
const defaulted = value === undefined && "default" in schema ? cloneData(schema.default) : value;
|
|
161
|
+
const merged = mergedAllOf(schema);
|
|
162
|
+
if (merged !== undefined)
|
|
163
|
+
return withDefaults(merged, defaulted);
|
|
164
|
+
if (Array.isArray(schema.anyOf)) {
|
|
165
|
+
for (const branch of schema.anyOf) {
|
|
166
|
+
const candidate = withDefaults(asSchema(branch), cloneData(defaulted));
|
|
167
|
+
if (isValid(asSchema(branch), candidate))
|
|
168
|
+
return candidate;
|
|
169
|
+
}
|
|
170
|
+
return defaulted;
|
|
171
|
+
}
|
|
172
|
+
if (Array.isArray(defaulted)) {
|
|
173
|
+
const prefix = Array.isArray(schema.items)
|
|
174
|
+
? schema.items
|
|
175
|
+
: Array.isArray(schema.prefixItems)
|
|
176
|
+
? schema.prefixItems
|
|
177
|
+
: undefined;
|
|
178
|
+
if (prefix !== undefined) {
|
|
179
|
+
for (let index = 0; index < prefix.length; index++) {
|
|
180
|
+
const item = withDefaults(asSchema(prefix[index]), defaulted[index]);
|
|
181
|
+
if (index < defaulted.length || item !== undefined)
|
|
182
|
+
defaulted[index] = item;
|
|
183
|
+
}
|
|
184
|
+
return defaulted;
|
|
185
|
+
}
|
|
186
|
+
if (isSchemaObject(schema.items))
|
|
187
|
+
return defaulted.map((item) => withDefaults(schema.items, item));
|
|
188
|
+
return defaulted;
|
|
189
|
+
}
|
|
190
|
+
if (!isPlainObject(defaulted))
|
|
191
|
+
return defaulted;
|
|
192
|
+
const properties = isSchemaObject(schema.properties) ? schema.properties : undefined;
|
|
193
|
+
const record = recordOf(schema);
|
|
194
|
+
if (properties !== undefined) {
|
|
195
|
+
const required = schema.required ?? [];
|
|
196
|
+
for (const [key, property] of Object.entries(properties)) {
|
|
197
|
+
const item = withDefaults(asSchema(property), defaulted[key]);
|
|
198
|
+
if (item === undefined && (!required.includes(key) || !("default" in asSchema(property))))
|
|
199
|
+
continue;
|
|
200
|
+
defaulted[key] = item;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else if (record !== undefined && isSchemaObject(record[1]) && "default" in record[1]) {
|
|
204
|
+
for (const key of Object.keys(defaulted)) {
|
|
205
|
+
if (record[0].test(key))
|
|
206
|
+
defaulted[key] = withDefaults(record[1], defaulted[key]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (!isSchemaObject(schema.additionalProperties))
|
|
210
|
+
return defaulted;
|
|
211
|
+
for (const key of Object.keys(defaulted)) {
|
|
212
|
+
const known = properties !== undefined && Object.hasOwn(properties, key);
|
|
213
|
+
if (!known && !record?.[0].test(key))
|
|
214
|
+
defaulted[key] = withDefaults(schema.additionalProperties, defaulted[key]);
|
|
215
|
+
}
|
|
216
|
+
return defaulted;
|
|
217
|
+
}
|
|
43
218
|
/** Canonical identity of a normalized value: fields equal to their schema default are omitted. */
|
|
44
219
|
export function canonicalIdentity(schema, value) {
|
|
45
220
|
return canonicalJson(stripDefaults(asSchema(schema), value));
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TSchema } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport { type ChordErrorReason, invalid } from \"./errors.ts\";\n\n/** JSON Schema as data. TypeBox schemas are plain JSON Schema objects. */\ntype Schema = { readonly [key: string]: unknown };\n\nconst asSchema = (schema: unknown): Schema =>\n\tschema !== null && typeof schema === \"object\" ? (schema as Schema) : schema === false ? { not: {} } : {};\n\n/** Canonical JSON: sorted object keys, `undefined` members dropped. */\nexport function canonicalJson(value: unknown): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n\tif (Array.isArray(value)) return `[${value.map((item) => canonicalJson(item)).join(\",\")}]`;\n\tconst keys = Object.keys(value)\n\t\t.filter((key) => (value as Record<string, unknown>)[key] !== undefined)\n\t\t.sort();\n\treturn `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson((value as Record<string, unknown>)[key])}`).join(\",\")}}`;\n}\n\n/** Non-cryptographic 64-bit hash (two FNV-1a lanes). Contracts are trusted, so collisions are not an attack surface. */\nexport function hash64(text: string): string {\n\tlet a = 0x811c9dc5;\n\tlet b = 0x01000193 ^ 0x5bd1e995;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tconst code = text.charCodeAt(index);\n\t\ta = Math.imul(a ^ code, 0x01000193);\n\t\tb = Math.imul(b ^ code, 0x5bd1e995) ^ (b >>> 13);\n\t}\n\treturn (a >>> 0).toString(16).padStart(8, \"0\") + (b >>> 0).toString(16).padStart(8, \"0\");\n}\n\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn a === b || canonicalJson(a) === canonicalJson(b);\n}\n\n/** Throws `invalid` (with `reason`) and the first schema errors when `value` does not match. */\nexport function assertValid(reason: ChordErrorReason, what: string, schema: TSchema, value: unknown): void {\n\tif (Value.Check(schema, value)) return;\n\tconst errors = [...Value.Errors(schema, value)].slice(0, 3);\n\tconst summary = errors.map((error) => `${error.instancePath || \"/\"} ${error.message}`).join(\"; \");\n\tthrow invalid(reason, `${what}: ${summary}`, errors);\n}\n\n/** Applies defaults, strips unknown fields, validates. Returns a fresh value. */\nexport function normalize(schema: TSchema, value: unknown, what: string): unknown {\n\tconst normalized = Value.Clean(schema, Value.Default(schema, Value.Clone(value ?? {})));\n\tassertValid(\"input\", what, schema, normalized);\n\treturn normalized;\n}\n\n/** Canonical identity of a normalized value: fields equal to their schema default are omitted. */\nexport function canonicalIdentity(schema: TSchema, value: unknown): string {\n\treturn canonicalJson(stripDefaults(asSchema(schema), value));\n}\n\nfunction stripDefaults(schema: Schema, value: unknown): unknown {\n\tif (Array.isArray(value)) {\n\t\tconst items = schema.items;\n\t\tif (Array.isArray(items)) return value.map((item, index) => stripDefaults(asSchema(items[index]), item));\n\t\treturn value.map((item) => stripDefaults(asSchema(items), item));\n\t}\n\tif (value === null || typeof value !== \"object\") return value;\n\tconst properties = asSchema(schema.properties);\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst property = asSchema(properties[key]);\n\t\tif (\"default\" in property && deepEqual(property.default, item)) continue;\n\t\tresult[key] = stripDefaults(property, item);\n\t}\n\treturn result;\n}\n\nconst CONSTRAINTS = [\n\t\"minLength\",\n\t\"maxLength\",\n\t\"pattern\",\n\t\"format\",\n\t\"minimum\",\n\t\"maximum\",\n\t\"exclusiveMinimum\",\n\t\"exclusiveMaximum\",\n\t\"multipleOf\",\n\t\"minItems\",\n\t\"maxItems\",\n\t\"uniqueItems\",\n\t\"minProperties\",\n\t\"maxProperties\",\n] as const;\n\nconst typesOf = (schema: Schema): string[] | undefined =>\n\ttypeof schema.type === \"string\" ? [schema.type] : Array.isArray(schema.type) ? (schema.type as string[]) : undefined;\n\n/** Keywords `fits` reasons about. Any other validation keyword in the provider's schema forces exact equality. */\nconst KNOWN: ReadonlySet<string> = new Set([\n\t...CONSTRAINTS,\n\t\"type\",\n\t\"properties\",\n\t\"required\",\n\t\"additionalProperties\",\n\t\"patternProperties\",\n\t\"items\",\n\t\"additionalItems\",\n\t\"const\",\n\t\"enum\",\n\t\"anyOf\",\n\t\"parameters\",\n\t\"returnType\",\n]);\n\n/** Annotations: no effect on validity. */\nconst ANNOTATIONS: ReadonlySet<string> = new Set([\n\t\"title\",\n\t\"description\",\n\t\"default\",\n\t\"examples\",\n\t\"$id\",\n\t\"$schema\",\n\t\"$comment\",\n\t\"readOnly\",\n\t\"writeOnly\",\n\t\"deprecated\",\n]);\n\nconst withoutAnnotations = (schema: Schema): Schema =>\n\tObject.fromEntries(Object.entries(schema).filter(([key]) => !ANNOTATIONS.has(key)));\n\n/**\n * Conservative structural subtyping: true only if every value valid under `sub` is valid under `sup`, where object\n * fields missing from `sub` but optional in `sup` count as fine (unknown fields are stripped at the provider, see\n * `RecordImpl.call`). A provider schema using a keyword this function does not model (`not`, `allOf`, `contains`,\n * `$ref`, ...) or an `additionalProperties` schema only fits an identical consumer schema.\n */\nexport function fits(subSchema: unknown, supSchema: unknown): boolean {\n\tconst sub = withoutAnnotations(asSchema(subSchema));\n\tconst sup = withoutAnnotations(asSchema(supSchema));\n\tif (Object.keys(sup).length === 0) return true;\n\tif (deepEqual(sub, sup)) return true;\n\tif (Object.keys(sup).some((key) => !KNOWN.has(key))) return false;\n\tif (sup.additionalProperties !== undefined && typeof sup.additionalProperties !== \"boolean\") return false;\n\tif (Array.isArray(sub.anyOf)) return sub.anyOf.every((branch) => fits(branch, sup));\n\tif (Array.isArray(sup.anyOf)) return sup.anyOf.some((branch) => fits(sub, branch));\n\tif (\"const\" in sup) return \"const\" in sub && deepEqual(sub.const, sup.const);\n\tif (Array.isArray(sup.enum)) {\n\t\tconst values = \"const\" in sub ? [sub.const] : Array.isArray(sub.enum) ? sub.enum : undefined;\n\t\treturn values?.every((item) => (sup.enum as unknown[]).some((allowed) => deepEqual(allowed, item))) ?? false;\n\t}\n\tfor (const key of CONSTRAINTS) if (key in sup && !deepEqual(sub[key], sup[key])) return false;\n\tconst supTypes = typesOf(sup);\n\tconst subTypes = typesOf(sub);\n\tif (supTypes === undefined || subTypes === undefined) return false;\n\tif (!subTypes.every((type) => supTypes.includes(type) || (type === \"integer\" && supTypes.includes(\"number\")))) {\n\t\treturn false;\n\t}\n\tif (\"const\" in sub || Array.isArray(sub.enum)) return true;\n\tif (subTypes.includes(\"object\") && !objectFits(sub, sup)) return false;\n\tif (subTypes.includes(\"array\") && !arrayFits(sub, sup)) return false;\n\tif (subTypes.includes(\"function\")) return functionFits(sub, sup);\n\treturn true;\n}\n\nfunction objectFits(sub: Schema, sup: Schema): boolean {\n\tconst subProperties = asSchema(sub.properties);\n\tconst supProperties = asSchema(sup.properties);\n\tconst subRequired = new Set((sub.required as string[] | undefined) ?? []);\n\tfor (const key of (sup.required as string[] | undefined) ?? []) if (!subRequired.has(key)) return false;\n\tfor (const [key, property] of Object.entries(supProperties)) {\n\t\tif (key in subProperties) {\n\t\t\tif (!fits(subProperties[key], property)) return false;\n\t\t} else if (typeof sub.additionalProperties === \"object\" && !fits(sub.additionalProperties, property)) {\n\t\t\t// The consumer may send this name with any value its `additionalProperties` allows. Open consumer objects\n\t\t\t// are fine: unknown names are stripped with the consumer's own schema before the call (`RecordImpl.call`).\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (sup.additionalProperties === false) {\n\t\tif (sub.additionalProperties !== false) return false;\n\t\tif (Object.keys(subProperties).some((key) => !(key in supProperties))) return false;\n\t}\n\tconst supPatterns = asSchema(sup.patternProperties);\n\tif (Object.keys(supPatterns).length > 0) {\n\t\t// Every value the consumer may put under a matching name must fit, and the consumer must not allow arbitrary\n\t\t// extra names (it would then allow any value under a matching one).\n\t\tconst subPatterns = asSchema(sub.patternProperties);\n\t\tif (sub.additionalProperties !== false && Object.keys(subPatterns).length === 0) return false;\n\t\tfor (const [pattern, property] of Object.entries(supPatterns)) {\n\t\t\tconst matcher = new RegExp(pattern, \"u\");\n\t\t\tfor (const [key, subProperty] of Object.entries(subProperties)) {\n\t\t\t\tif (!(key in supProperties) && matcher.test(key) && !fits(subProperty, property)) return false;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.keys(subPatterns).length > 0 &&\n\t\t\t\t(!(pattern in subPatterns) || !fits(subPatterns[pattern], property))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tfor (const pattern of Object.keys(subPatterns)) if (!(pattern in supPatterns)) return false;\n\t}\n\treturn true;\n}\n\nfunction arrayFits(sub: Schema, sup: Schema): boolean {\n\tif (Array.isArray(sup.items)) {\n\t\tif (!Array.isArray(sub.items) || sub.items.length !== sup.items.length) return false;\n\t\treturn sub.items.every((item, index) => fits(item, (sup.items as unknown[])[index]));\n\t}\n\tif (Array.isArray(sub.items)) return sub.items.every((item) => fits(item, sup.items));\n\treturn fits(sub.items, sup.items);\n}\n\nfunction functionFits(sub: Schema, sup: Schema): boolean {\n\tconst subParameters = (sub.parameters as unknown[] | undefined) ?? [];\n\tconst supParameters = (sup.parameters as unknown[] | undefined) ?? [];\n\t// A function accepting fewer parameters is fine; each shared parameter is contravariant.\n\tif (subParameters.length > supParameters.length) return false;\n\tif (!subParameters.every((parameter, index) => fits(supParameters[index], parameter))) return false;\n\treturn fits(sub.returnType, sup.returnType);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { compile, type JsonSchema, type ValidationError, type Validator } from \"@earendil-works/pi-schema\";\nimport { type ChordErrorReason, invalid } from \"./errors.ts\";\n\n/** JSON Schema as data: pi-schema builders, or any JSON Schema object (TypeBox's included). */\ntype Schema = { readonly [key: string]: unknown };\n\nconst asSchema = (schema: unknown): Schema =>\n\tschema !== null && typeof schema === \"object\" ? (schema as Schema) : schema === false ? { not: {} } : {};\n\n/** Canonical JSON: sorted object keys, `undefined` members dropped. */\nexport function canonicalJson(value: unknown): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n\tif (Array.isArray(value)) return `[${value.map((item) => canonicalJson(item)).join(\",\")}]`;\n\tconst keys = Object.keys(value)\n\t\t.filter((key) => (value as Record<string, unknown>)[key] !== undefined)\n\t\t.sort();\n\treturn `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson((value as Record<string, unknown>)[key])}`).join(\",\")}}`;\n}\n\n/** Non-cryptographic 64-bit hash (two FNV-1a lanes). Contracts are trusted, so collisions are not an attack surface. */\nexport function hash64(text: string): string {\n\tlet a = 0x811c9dc5;\n\tlet b = 0x01000193 ^ 0x5bd1e995;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tconst code = text.charCodeAt(index);\n\t\ta = Math.imul(a ^ code, 0x01000193);\n\t\tb = Math.imul(b ^ code, 0x5bd1e995) ^ (b >>> 13);\n\t}\n\treturn (a >>> 0).toString(16).padStart(8, \"0\") + (b >>> 0).toString(16).padStart(8, \"0\");\n}\n\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn a === b || canonicalJson(a) === canonicalJson(b);\n}\n\nconst validators = new WeakMap<object, Validator>();\n\n/** The compiled validator of `schema`, compiled once per schema object; `format` is an annotation. */\nfunction validatorOf(schema: JsonSchema): Validator {\n\tif (typeof schema === \"boolean\") return compile(schema);\n\tlet validator = validators.get(schema);\n\tif (validator === undefined) {\n\t\tvalidator = compile(schema);\n\t\tvalidators.set(schema, validator);\n\t}\n\treturn validator;\n}\n\n/** Whether `value` matches `schema`. */\nexport function isValid(schema: JsonSchema, value: unknown): boolean {\n\treturn validatorOf(schema).check(value);\n}\n\n/** Throws `invalid` (with `reason`) and the first schema errors when `value` does not match. */\nexport function assertValid(reason: ChordErrorReason, what: string, schema: JsonSchema, value: unknown): void {\n\tconst validator = validatorOf(schema);\n\tif (validator.check(value)) return;\n\tconst errors: ValidationError[] = validator.errors(value).slice(0, 3);\n\tconst summary = errors.map((error) => `${error.path || \"/\"} ${error.message}`).join(\"; \");\n\tthrow invalid(reason, `${what}: ${summary}`, errors);\n}\n\n/** Applies defaults, strips unknown fields, validates. Returns a fresh value. */\nexport function normalize(schema: JsonSchema, value: unknown, what: string): unknown {\n\tconst normalized = cleanFrom(asSchema(schema), withDefaults(asSchema(schema), cloneData(value ?? {})));\n\tassertValid(\"input\", what, schema, normalized);\n\treturn normalized;\n}\n\n/** A copy of `value` with only what `schema` knows: unknown object fields dropped, recursively (TypeBox's `Clean`). */\nexport function cleaned(schema: JsonSchema, value: unknown): unknown {\n\treturn cleanFrom(asSchema(schema), cloneData(value));\n}\n\n/** A deep copy of plain data: arrays, plain objects and bytes are copied, any other value is kept. */\nfunction cloneData(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(cloneData);\n\tif (value instanceof Uint8Array) return value.slice();\n\tif (value === null || typeof value !== \"object\") return value;\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) return value;\n\tconst copy: Record<string, unknown> = {};\n\tfor (const [key, item] of Object.entries(value)) copy[key] = cloneData(item);\n\treturn copy;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n\nconst isSchemaObject = (value: unknown): value is Schema =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** The object an `allOf` of object schemas evaluates to (TypeBox's `Evaluate`), or undefined for any other `allOf`. */\nfunction mergedAllOf(schema: Schema): Schema | undefined {\n\tif (!Array.isArray(schema.allOf) || !schema.allOf.every((branch) => isSchemaObject(branch.properties)))\n\t\treturn undefined;\n\tconst properties: Record<string, unknown> = {};\n\tconst required = new Set<string>();\n\tfor (const branch of schema.allOf as Schema[]) {\n\t\tObject.assign(properties, branch.properties);\n\t\tfor (const key of (branch.required as string[] | undefined) ?? []) required.add(key);\n\t}\n\treturn {\n\t\ttype: \"object\",\n\t\tproperties,\n\t\trequired: [...required],\n\t\t...(schema.unevaluatedProperties === undefined ? {} : { additionalProperties: schema.unevaluatedProperties }),\n\t};\n}\n\n/** The pattern and value schema of a record (`patternProperties` with one pattern). */\nfunction recordOf(schema: Schema): [RegExp, unknown] | undefined {\n\tif (!isSchemaObject(schema.patternProperties) || isSchemaObject(schema.properties)) return undefined;\n\tconst [entry] = Object.entries(schema.patternProperties);\n\treturn entry === undefined ? undefined : [new RegExp(entry[0], \"u\"), entry[1]];\n}\n\n/** Whether `additional` (an object's `additionalProperties`) keeps an unknown field holding `value`. */\nconst keepsUnknown = (additional: unknown, value: unknown): boolean =>\n\tadditional === true || (isSchemaObject(additional) && isValid(additional, value));\n\n// Mutates `value` (a fresh copy), as TypeBox's `Clean` does.\nfunction cleanFrom(schema: Schema, value: unknown): unknown {\n\tconst merged = mergedAllOf(schema);\n\tif (merged !== undefined) return cleanFrom(merged, value);\n\tif (Array.isArray(schema.anyOf)) {\n\t\tfor (const branch of schema.anyOf) {\n\t\t\tconst candidate = cleanFrom(asSchema(branch), cloneData(value));\n\t\t\tif (isValid(asSchema(branch), candidate)) return candidate;\n\t\t}\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\tconst prefix = Array.isArray(schema.items)\n\t\t\t? schema.items\n\t\t\t: Array.isArray(schema.prefixItems)\n\t\t\t\t? schema.prefixItems\n\t\t\t\t: undefined;\n\t\tif (prefix !== undefined) {\n\t\t\tconst length = Math.min(value.length, prefix.length);\n\t\t\tfor (let index = 0; index < length; index++) value[index] = cleanFrom(asSchema(prefix[index]), value[index]);\n\t\t\treturn value.length > length ? value.slice(0, length) : value;\n\t\t}\n\t\tif (isSchemaObject(schema.items)) return value.map((item) => cleanFrom(schema.items as Schema, item));\n\t\treturn value;\n\t}\n\tif (!isPlainObject(value)) return value;\n\tconst record = recordOf(schema);\n\tconst properties = isSchemaObject(schema.properties) ? schema.properties : undefined;\n\t// An object schema names its fields, a record its key pattern, a map (pi-schema's) its value schema.\n\tif (properties === undefined && record === undefined && !isSchemaObject(schema.additionalProperties)) return value;\n\tfor (const key of Object.keys(value)) {\n\t\tconst known = properties !== undefined && Object.hasOwn(properties, key) ? properties[key] : undefined;\n\t\tconst matched = known ?? (record?.[0].test(key) ? record[1] : undefined);\n\t\tif (matched !== undefined) value[key] = cleanFrom(asSchema(matched), value[key]);\n\t\telse if (keepsUnknown(schema.additionalProperties, value[key]))\n\t\t\tvalue[key] = cleanFrom(asSchema(schema.additionalProperties), value[key]);\n\t\telse delete value[key];\n\t}\n\treturn value;\n}\n\n// Mutates `value` (a fresh copy), as TypeBox's `Default` does: a missing value takes its schema's default, a\n// missing optional field never does.\nfunction withDefaults(schema: Schema, value: unknown): unknown {\n\tconst defaulted = value === undefined && \"default\" in schema ? cloneData(schema.default) : value;\n\tconst merged = mergedAllOf(schema);\n\tif (merged !== undefined) return withDefaults(merged, defaulted);\n\tif (Array.isArray(schema.anyOf)) {\n\t\tfor (const branch of schema.anyOf) {\n\t\t\tconst candidate = withDefaults(asSchema(branch), cloneData(defaulted));\n\t\t\tif (isValid(asSchema(branch), candidate)) return candidate;\n\t\t}\n\t\treturn defaulted;\n\t}\n\tif (Array.isArray(defaulted)) {\n\t\tconst prefix = Array.isArray(schema.items)\n\t\t\t? schema.items\n\t\t\t: Array.isArray(schema.prefixItems)\n\t\t\t\t? schema.prefixItems\n\t\t\t\t: undefined;\n\t\tif (prefix !== undefined) {\n\t\t\tfor (let index = 0; index < prefix.length; index++) {\n\t\t\t\tconst item = withDefaults(asSchema(prefix[index]), defaulted[index]);\n\t\t\t\tif (index < defaulted.length || item !== undefined) defaulted[index] = item;\n\t\t\t}\n\t\t\treturn defaulted;\n\t\t}\n\t\tif (isSchemaObject(schema.items)) return defaulted.map((item) => withDefaults(schema.items as Schema, item));\n\t\treturn defaulted;\n\t}\n\tif (!isPlainObject(defaulted)) return defaulted;\n\tconst properties = isSchemaObject(schema.properties) ? schema.properties : undefined;\n\tconst record = recordOf(schema);\n\tif (properties !== undefined) {\n\t\tconst required = (schema.required as string[] | undefined) ?? [];\n\t\tfor (const [key, property] of Object.entries(properties)) {\n\t\t\tconst item = withDefaults(asSchema(property), defaulted[key]);\n\t\t\tif (item === undefined && (!required.includes(key) || !(\"default\" in asSchema(property)))) continue;\n\t\t\tdefaulted[key] = item;\n\t\t}\n\t} else if (record !== undefined && isSchemaObject(record[1]) && \"default\" in record[1]) {\n\t\tfor (const key of Object.keys(defaulted)) {\n\t\t\tif (record[0].test(key)) defaulted[key] = withDefaults(record[1], defaulted[key]);\n\t\t}\n\t}\n\tif (!isSchemaObject(schema.additionalProperties)) return defaulted;\n\tfor (const key of Object.keys(defaulted)) {\n\t\tconst known = properties !== undefined && Object.hasOwn(properties, key);\n\t\tif (!known && !record?.[0].test(key)) defaulted[key] = withDefaults(schema.additionalProperties, defaulted[key]);\n\t}\n\treturn defaulted;\n}\n\n/** Canonical identity of a normalized value: fields equal to their schema default are omitted. */\nexport function canonicalIdentity(schema: JsonSchema, value: unknown): string {\n\treturn canonicalJson(stripDefaults(asSchema(schema), value));\n}\n\nfunction stripDefaults(schema: Schema, value: unknown): unknown {\n\tif (Array.isArray(value)) {\n\t\tconst items = schema.items;\n\t\tif (Array.isArray(items)) return value.map((item, index) => stripDefaults(asSchema(items[index]), item));\n\t\treturn value.map((item) => stripDefaults(asSchema(items), item));\n\t}\n\tif (value === null || typeof value !== \"object\") return value;\n\tconst properties = asSchema(schema.properties);\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst property = asSchema(properties[key]);\n\t\tif (\"default\" in property && deepEqual(property.default, item)) continue;\n\t\tresult[key] = stripDefaults(property, item);\n\t}\n\treturn result;\n}\n\nconst CONSTRAINTS = [\n\t\"minLength\",\n\t\"maxLength\",\n\t\"pattern\",\n\t\"format\",\n\t\"minimum\",\n\t\"maximum\",\n\t\"exclusiveMinimum\",\n\t\"exclusiveMaximum\",\n\t\"multipleOf\",\n\t\"minItems\",\n\t\"maxItems\",\n\t\"uniqueItems\",\n\t\"minProperties\",\n\t\"maxProperties\",\n] as const;\n\nconst typesOf = (schema: Schema): string[] | undefined =>\n\ttypeof schema.type === \"string\" ? [schema.type] : Array.isArray(schema.type) ? (schema.type as string[]) : undefined;\n\n/** Keywords `fits` reasons about. Any other validation keyword in the provider's schema forces exact equality. */\nconst KNOWN: ReadonlySet<string> = new Set([\n\t...CONSTRAINTS,\n\t\"type\",\n\t\"properties\",\n\t\"required\",\n\t\"additionalProperties\",\n\t\"patternProperties\",\n\t\"items\",\n\t\"additionalItems\",\n\t\"const\",\n\t\"enum\",\n\t\"anyOf\",\n\t\"parameters\",\n\t\"returnType\",\n]);\n\n/** Annotations: no effect on validity. */\nconst ANNOTATIONS: ReadonlySet<string> = new Set([\n\t\"title\",\n\t\"description\",\n\t\"default\",\n\t\"examples\",\n\t\"$id\",\n\t\"$schema\",\n\t\"$comment\",\n\t\"readOnly\",\n\t\"writeOnly\",\n\t\"deprecated\",\n]);\n\nconst withoutAnnotations = (schema: Schema): Schema =>\n\tObject.fromEntries(Object.entries(schema).filter(([key]) => !ANNOTATIONS.has(key)));\n\n/**\n * Conservative structural subtyping: true only if every value valid under `sub` is valid under `sup`, where object\n * fields missing from `sub` but optional in `sup` count as fine (unknown fields are stripped at the provider, see\n * `RecordImpl.call`). A provider schema using a keyword this function does not model (`not`, `allOf`, `contains`,\n * `$ref`, ...) or an `additionalProperties` schema only fits an identical consumer schema.\n */\nexport function fits(subSchema: unknown, supSchema: unknown): boolean {\n\tconst sub = withoutAnnotations(asSchema(subSchema));\n\tconst sup = withoutAnnotations(asSchema(supSchema));\n\tif (Object.keys(sup).length === 0) return true;\n\tif (deepEqual(sub, sup)) return true;\n\tif (Object.keys(sup).some((key) => !KNOWN.has(key))) return false;\n\tif (sup.additionalProperties !== undefined && typeof sup.additionalProperties !== \"boolean\") return false;\n\tif (Array.isArray(sub.anyOf)) return sub.anyOf.every((branch) => fits(branch, sup));\n\tif (Array.isArray(sup.anyOf)) return sup.anyOf.some((branch) => fits(sub, branch));\n\tif (\"const\" in sup) return \"const\" in sub && deepEqual(sub.const, sup.const);\n\tif (Array.isArray(sup.enum)) {\n\t\tconst values = \"const\" in sub ? [sub.const] : Array.isArray(sub.enum) ? sub.enum : undefined;\n\t\treturn values?.every((item) => (sup.enum as unknown[]).some((allowed) => deepEqual(allowed, item))) ?? false;\n\t}\n\tfor (const key of CONSTRAINTS) if (key in sup && !deepEqual(sub[key], sup[key])) return false;\n\tconst supTypes = typesOf(sup);\n\tconst subTypes = typesOf(sub);\n\tif (supTypes === undefined || subTypes === undefined) return false;\n\tif (!subTypes.every((type) => supTypes.includes(type) || (type === \"integer\" && supTypes.includes(\"number\")))) {\n\t\treturn false;\n\t}\n\tif (\"const\" in sub || Array.isArray(sub.enum)) return true;\n\tif (subTypes.includes(\"object\") && !objectFits(sub, sup)) return false;\n\tif (subTypes.includes(\"array\") && !arrayFits(sub, sup)) return false;\n\tif (subTypes.includes(\"function\")) return functionFits(sub, sup);\n\treturn true;\n}\n\nfunction objectFits(sub: Schema, sup: Schema): boolean {\n\tconst subProperties = asSchema(sub.properties);\n\tconst supProperties = asSchema(sup.properties);\n\tconst subRequired = new Set((sub.required as string[] | undefined) ?? []);\n\tfor (const key of (sup.required as string[] | undefined) ?? []) if (!subRequired.has(key)) return false;\n\tfor (const [key, property] of Object.entries(supProperties)) {\n\t\tif (key in subProperties) {\n\t\t\tif (!fits(subProperties[key], property)) return false;\n\t\t} else if (typeof sub.additionalProperties === \"object\" && !fits(sub.additionalProperties, property)) {\n\t\t\t// The consumer may send this name with any value its `additionalProperties` allows. Open consumer objects\n\t\t\t// are fine: unknown names are stripped with the consumer's own schema before the call (`RecordImpl.call`).\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (sup.additionalProperties === false) {\n\t\tif (sub.additionalProperties !== false) return false;\n\t\tif (Object.keys(subProperties).some((key) => !(key in supProperties))) return false;\n\t}\n\tconst supPatterns = asSchema(sup.patternProperties);\n\tif (Object.keys(supPatterns).length > 0) {\n\t\t// Every value the consumer may put under a matching name must fit, and the consumer must not allow arbitrary\n\t\t// extra names (it would then allow any value under a matching one).\n\t\tconst subPatterns = asSchema(sub.patternProperties);\n\t\tif (sub.additionalProperties !== false && Object.keys(subPatterns).length === 0) return false;\n\t\tfor (const [pattern, property] of Object.entries(supPatterns)) {\n\t\t\tconst matcher = new RegExp(pattern, \"u\");\n\t\t\tfor (const [key, subProperty] of Object.entries(subProperties)) {\n\t\t\t\tif (!(key in supProperties) && matcher.test(key) && !fits(subProperty, property)) return false;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.keys(subPatterns).length > 0 &&\n\t\t\t\t(!(pattern in subPatterns) || !fits(subPatterns[pattern], property))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tfor (const pattern of Object.keys(subPatterns)) if (!(pattern in supPatterns)) return false;\n\t}\n\treturn true;\n}\n\nfunction arrayFits(sub: Schema, sup: Schema): boolean {\n\tif (Array.isArray(sup.items)) {\n\t\tif (!Array.isArray(sub.items) || sub.items.length !== sup.items.length) return false;\n\t\treturn sub.items.every((item, index) => fits(item, (sup.items as unknown[])[index]));\n\t}\n\tif (Array.isArray(sub.items)) return sub.items.every((item) => fits(item, sup.items));\n\treturn fits(sub.items, sup.items);\n}\n\nfunction functionFits(sub: Schema, sup: Schema): boolean {\n\tconst subParameters = (sub.parameters as unknown[] | undefined) ?? [];\n\tconst supParameters = (sup.parameters as unknown[] | undefined) ?? [];\n\t// A function accepting fewer parameters is fine; each shared parameter is contravariant.\n\tif (subParameters.length > supParameters.length) return false;\n\tif (!subParameters.every((parameter, index) => fits(supParameters[index], parameter))) return false;\n\treturn fits(sub.returnType, sup.returnType);\n}\n"]}
|
|
@@ -26,6 +26,7 @@ declare class DurableObjectSqliteExecutor implements SqliteExecutor {
|
|
|
26
26
|
constructor(storage: DurableObjectSqliteStorage);
|
|
27
27
|
exec(sql: string): Promise<void>;
|
|
28
28
|
run(sql: string, ...params: SqliteValue[]): Promise<void>;
|
|
29
|
+
runCounted(sql: string, ...params: SqliteValue[]): Promise<number>;
|
|
29
30
|
get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined>;
|
|
30
31
|
all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]>;
|
|
31
32
|
/** Throws when this handle may no longer run SQL. */
|
|
@@ -41,6 +42,7 @@ export declare class DurableObjectSqliteDatabase extends DurableObjectSqliteExec
|
|
|
41
42
|
constructor(storage: DurableObjectSqliteStorage);
|
|
42
43
|
exec(sql: string): Promise<void>;
|
|
43
44
|
run(sql: string, ...params: SqliteValue[]): Promise<void>;
|
|
45
|
+
runCounted(sql: string, ...params: SqliteValue[]): Promise<number>;
|
|
44
46
|
get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined>;
|
|
45
47
|
all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]>;
|
|
46
48
|
/** `ctx.storage.transaction()` commits when the callback resolves and rolls back when it rejects. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/sqlite/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjF,+DAA+D;AAC/D,KAAK,qBAAqB,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACxC,QAAQ,CAAC,GAAG,EAAE;QACb,IAAI,CACH,KAAK,EAAE,MAAM,EACb,GAAG,QAAQ,EAAE,qBAAqB,EAAE,GAClC;YACF,IAAI,IACD;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;aAAE,GAChF;gBAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;aAAE,CAAC;YACvD,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,CAAC;SACnD,CAAC;KACF,CAAC;IACF,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACtD,CAAC;AAiEF,kFAAkF;AAClF,cAAM,2BAA4B,YAAW,cAAc;IAC1D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAEvD,YAAY,OAAO,EAAE,0BAA0B,EAE9C;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrC;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D;IAEK,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAIzF;IAEK,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAM/E;IAED,qDAAqD;IACrD,SAAS,CAAC,KAAK,IAAI,IAAI,CAAG;CAC1B;AAWD;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,2BAA4B,YAAW,cAAc;IACrG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IAEpC,YAAY,OAAO,EAAE,0BAA0B,EAG9C;IAEQ,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExC;IAEQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;IAEQ,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE5F;IAEQ,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAElF;IAED,qGAAqG;IACrG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAWhF;IAED,0FAA0F;IAC1F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;CACD"}
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/sqlite/cloudflare.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,13 @@ class DurableObjectSqliteExecutor {
|
|
|
68
68
|
this.check();
|
|
69
69
|
this.storage.sql.exec(sql, ...bind(params));
|
|
70
70
|
}
|
|
71
|
+
async runCounted(sql, ...params) {
|
|
72
|
+
this.check();
|
|
73
|
+
this.storage.sql.exec(sql, ...bind(params));
|
|
74
|
+
// The cursor's `rowsWritten` is a billing count that includes index writes; SQLite's own count is exact.
|
|
75
|
+
const counted = this.storage.sql.exec("SELECT changes() AS changes").next();
|
|
76
|
+
return counted.done ? 0 : Number(counted.value.changes);
|
|
77
|
+
}
|
|
71
78
|
async get(sql, ...params) {
|
|
72
79
|
this.check();
|
|
73
80
|
const result = this.storage.sql.exec(sql, ...bind(params)).next();
|
|
@@ -108,6 +115,9 @@ export class DurableObjectSqliteDatabase extends DurableObjectSqliteExecutor {
|
|
|
108
115
|
run(sql, ...params) {
|
|
109
116
|
return this.queue.run(() => super.run(sql, ...params));
|
|
110
117
|
}
|
|
118
|
+
runCounted(sql, ...params) {
|
|
119
|
+
return this.queue.run(() => super.runCounted(sql, ...params));
|
|
120
|
+
}
|
|
111
121
|
get(sql, ...params) {
|
|
112
122
|
return this.queue.run(() => super.get(sql, ...params));
|
|
113
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/sqlite/cloudflare.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SqliteDatabase, SqliteExecutor, SqliteValue } from \"./database.ts\";\n\n/** Values a Durable Object SQL binding accepts and returns. */\ntype DurableObjectSqlValue = ArrayBuffer | string | number | null;\n\n/**\n * The parts of a SQLite-backed Durable Object's `ctx.storage` this adapter uses, typed structurally so the package\n * needs no Workers type dependency.\n */\nexport type DurableObjectSqliteStorage = {\n\treadonly sql: {\n\t\texec(\n\t\t\tquery: string,\n\t\t\t...bindings: DurableObjectSqlValue[]\n\t\t): {\n\t\t\tnext():\n\t\t\t\t| { readonly done?: false; readonly value: Record<string, DurableObjectSqlValue> }\n\t\t\t\t| { readonly done: true; readonly value?: undefined };\n\t\t\ttoArray(): Record<string, DurableObjectSqlValue>[];\n\t\t};\n\t};\n\ttransaction<T>(closure: () => Promise<T>): Promise<T>;\n};\n\n/** Runs synchronous operations immediately when idle and holds queued calls behind a transaction. */\nclass SerialQueue {\n\tprivate tail: Promise<void> = Promise.resolve();\n\tprivate pending = 0;\n\n\trun<T>(operation: () => T | Promise<T>): Promise<T> {\n\t\tif (this.pending > 0) return this.enqueue(operation);\n\t\ttry {\n\t\t\treturn Promise.resolve(operation());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\thold<T>(operation: () => Promise<T>): Promise<T> {\n\t\treturn this.enqueue(operation);\n\t}\n\n\tprivate enqueue<T>(operation: () => T | Promise<T>): Promise<T> {\n\t\tthis.pending++;\n\t\tconst result = this.tail.then(operation).finally(() => {\n\t\t\tthis.pending--;\n\t\t});\n\t\tthis.tail = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n}\n\nconst storageQueues = new WeakMap<DurableObjectSqliteStorage, SerialQueue>();\n\nfunction queueFor(storage: DurableObjectSqliteStorage): SerialQueue {\n\tlet queue = storageQueues.get(storage);\n\tif (queue === undefined) {\n\t\tqueue = new SerialQueue();\n\t\tstorageQueues.set(storage, queue);\n\t}\n\treturn queue;\n}\n\n/** Durable Object SQL binds numbers as doubles: a `bigint` outside the safe integer range would lose precision. */\nfunction bindValue(value: SqliteValue): DurableObjectSqlValue {\n\tif (value instanceof Uint8Array) return value.slice().buffer as ArrayBuffer;\n\tif (typeof value !== \"bigint\") return value;\n\tif (value < BigInt(Number.MIN_SAFE_INTEGER) || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new RangeError(`Durable Object SQL cannot bind ${value} without losing precision`);\n\t}\n\treturn Number(value);\n}\n\nconst bind = (params: readonly SqliteValue[]): DurableObjectSqlValue[] => params.map(bindValue);\n\n/** A row as returned, with `BLOB` columns converted to `Uint8Array` in place; no other copy is made. */\nfunction row<T>(row: Record<string, DurableObjectSqlValue>): T {\n\tfor (const key in row) {\n\t\tconst value = row[key];\n\t\tif (value instanceof ArrayBuffer) (row as Record<string, unknown>)[key] = new Uint8Array(value);\n\t}\n\treturn row as T;\n}\n\n/** Executes SQL through `ctx.storage.sql`, which has no separate prepare step. */\nclass DurableObjectSqliteExecutor implements SqliteExecutor {\n\tprotected readonly storage: DurableObjectSqliteStorage;\n\n\tconstructor(storage: DurableObjectSqliteStorage) {\n\t\tthis.storage = storage;\n\t}\n\n\tasync exec(sql: string): Promise<void> {\n\t\tthis.check();\n\t\tthis.storage.sql.exec(sql);\n\t}\n\n\tasync run(sql: string, ...params: SqliteValue[]): Promise<void> {\n\t\tthis.check();\n\t\tthis.storage.sql.exec(sql, ...bind(params));\n\t}\n\n\tasync get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined> {\n\t\tthis.check();\n\t\tconst result = this.storage.sql.exec(sql, ...bind(params)).next();\n\t\treturn result.done ? undefined : row<T>(result.value);\n\t}\n\n\tasync all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]> {\n\t\tthis.check();\n\t\treturn this.storage.sql\n\t\t\t.exec(sql, ...bind(params))\n\t\t\t.toArray()\n\t\t\t.map((value) => row<T>(value));\n\t}\n\n\t/** Throws when this handle may no longer run SQL. */\n\tprotected check(): void {}\n}\n\n/** The handle a transaction callback receives; invalid once the callback settles. */\nclass DurableObjectSqliteTransaction extends DurableObjectSqliteExecutor {\n\tactive = true;\n\n\tprotected override check(): void {\n\t\tif (!this.active) throw new Error(\"SQLite transaction handle is no longer active\");\n\t}\n}\n\n/**\n * `SqliteDatabase` adapter for the SQLite storage of a Cloudflare Durable Object. Adapters given the same storage\n * object share a queue; direct calls to the underlying storage bypass it. Integers are JavaScript numbers; binding a\n * `bigint` outside the safe integer range throws.\n */\nexport class DurableObjectSqliteDatabase extends DurableObjectSqliteExecutor implements SqliteDatabase {\n\tprivate readonly queue: SerialQueue;\n\n\tconstructor(storage: DurableObjectSqliteStorage) {\n\t\tsuper(storage);\n\t\tthis.queue = queueFor(storage);\n\t}\n\n\toverride exec(sql: string): Promise<void> {\n\t\treturn this.queue.run(() => super.exec(sql));\n\t}\n\n\toverride run(sql: string, ...params: SqliteValue[]): Promise<void> {\n\t\treturn this.queue.run(() => super.run(sql, ...params));\n\t}\n\n\toverride get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined> {\n\t\treturn this.queue.run(() => super.get<T>(sql, ...params));\n\t}\n\n\toverride all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]> {\n\t\treturn this.queue.run(() => super.all<T>(sql, ...params));\n\t}\n\n\t/** `ctx.storage.transaction()` commits when the callback resolves and rolls back when it rejects. */\n\ttransaction<T>(callback: (transaction: SqliteExecutor) => Promise<T>): Promise<T> {\n\t\treturn this.queue.hold(() =>\n\t\t\tthis.storage.transaction(async () => {\n\t\t\t\tconst transaction = new DurableObjectSqliteTransaction(this.storage);\n\t\t\t\ttry {\n\t\t\t\t\treturn await callback(transaction);\n\t\t\t\t} finally {\n\t\t\t\t\ttransaction.active = false;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** Waits for queued work. The Durable Object owns its storage, so nothing else closes. */\n\tclose(): Promise<void> {\n\t\treturn this.queue.run(() => {});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/sqlite/cloudflare.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SqliteDatabase, SqliteExecutor, SqliteValue } from \"./database.ts\";\n\n/** Values a Durable Object SQL binding accepts and returns. */\ntype DurableObjectSqlValue = ArrayBuffer | string | number | null;\n\n/**\n * The parts of a SQLite-backed Durable Object's `ctx.storage` this adapter uses, typed structurally so the package\n * needs no Workers type dependency.\n */\nexport type DurableObjectSqliteStorage = {\n\treadonly sql: {\n\t\texec(\n\t\t\tquery: string,\n\t\t\t...bindings: DurableObjectSqlValue[]\n\t\t): {\n\t\t\tnext():\n\t\t\t\t| { readonly done?: false; readonly value: Record<string, DurableObjectSqlValue> }\n\t\t\t\t| { readonly done: true; readonly value?: undefined };\n\t\t\ttoArray(): Record<string, DurableObjectSqlValue>[];\n\t\t};\n\t};\n\ttransaction<T>(closure: () => Promise<T>): Promise<T>;\n};\n\n/** Runs synchronous operations immediately when idle and holds queued calls behind a transaction. */\nclass SerialQueue {\n\tprivate tail: Promise<void> = Promise.resolve();\n\tprivate pending = 0;\n\n\trun<T>(operation: () => T | Promise<T>): Promise<T> {\n\t\tif (this.pending > 0) return this.enqueue(operation);\n\t\ttry {\n\t\t\treturn Promise.resolve(operation());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\thold<T>(operation: () => Promise<T>): Promise<T> {\n\t\treturn this.enqueue(operation);\n\t}\n\n\tprivate enqueue<T>(operation: () => T | Promise<T>): Promise<T> {\n\t\tthis.pending++;\n\t\tconst result = this.tail.then(operation).finally(() => {\n\t\t\tthis.pending--;\n\t\t});\n\t\tthis.tail = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n}\n\nconst storageQueues = new WeakMap<DurableObjectSqliteStorage, SerialQueue>();\n\nfunction queueFor(storage: DurableObjectSqliteStorage): SerialQueue {\n\tlet queue = storageQueues.get(storage);\n\tif (queue === undefined) {\n\t\tqueue = new SerialQueue();\n\t\tstorageQueues.set(storage, queue);\n\t}\n\treturn queue;\n}\n\n/** Durable Object SQL binds numbers as doubles: a `bigint` outside the safe integer range would lose precision. */\nfunction bindValue(value: SqliteValue): DurableObjectSqlValue {\n\tif (value instanceof Uint8Array) return value.slice().buffer as ArrayBuffer;\n\tif (typeof value !== \"bigint\") return value;\n\tif (value < BigInt(Number.MIN_SAFE_INTEGER) || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new RangeError(`Durable Object SQL cannot bind ${value} without losing precision`);\n\t}\n\treturn Number(value);\n}\n\nconst bind = (params: readonly SqliteValue[]): DurableObjectSqlValue[] => params.map(bindValue);\n\n/** A row as returned, with `BLOB` columns converted to `Uint8Array` in place; no other copy is made. */\nfunction row<T>(row: Record<string, DurableObjectSqlValue>): T {\n\tfor (const key in row) {\n\t\tconst value = row[key];\n\t\tif (value instanceof ArrayBuffer) (row as Record<string, unknown>)[key] = new Uint8Array(value);\n\t}\n\treturn row as T;\n}\n\n/** Executes SQL through `ctx.storage.sql`, which has no separate prepare step. */\nclass DurableObjectSqliteExecutor implements SqliteExecutor {\n\tprotected readonly storage: DurableObjectSqliteStorage;\n\n\tconstructor(storage: DurableObjectSqliteStorage) {\n\t\tthis.storage = storage;\n\t}\n\n\tasync exec(sql: string): Promise<void> {\n\t\tthis.check();\n\t\tthis.storage.sql.exec(sql);\n\t}\n\n\tasync run(sql: string, ...params: SqliteValue[]): Promise<void> {\n\t\tthis.check();\n\t\tthis.storage.sql.exec(sql, ...bind(params));\n\t}\n\n\tasync runCounted(sql: string, ...params: SqliteValue[]): Promise<number> {\n\t\tthis.check();\n\t\tthis.storage.sql.exec(sql, ...bind(params));\n\t\t// The cursor's `rowsWritten` is a billing count that includes index writes; SQLite's own count is exact.\n\t\tconst counted = this.storage.sql.exec(\"SELECT changes() AS changes\").next();\n\t\treturn counted.done ? 0 : Number(counted.value.changes);\n\t}\n\n\tasync get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined> {\n\t\tthis.check();\n\t\tconst result = this.storage.sql.exec(sql, ...bind(params)).next();\n\t\treturn result.done ? undefined : row<T>(result.value);\n\t}\n\n\tasync all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]> {\n\t\tthis.check();\n\t\treturn this.storage.sql\n\t\t\t.exec(sql, ...bind(params))\n\t\t\t.toArray()\n\t\t\t.map((value) => row<T>(value));\n\t}\n\n\t/** Throws when this handle may no longer run SQL. */\n\tprotected check(): void {}\n}\n\n/** The handle a transaction callback receives; invalid once the callback settles. */\nclass DurableObjectSqliteTransaction extends DurableObjectSqliteExecutor {\n\tactive = true;\n\n\tprotected override check(): void {\n\t\tif (!this.active) throw new Error(\"SQLite transaction handle is no longer active\");\n\t}\n}\n\n/**\n * `SqliteDatabase` adapter for the SQLite storage of a Cloudflare Durable Object. Adapters given the same storage\n * object share a queue; direct calls to the underlying storage bypass it. Integers are JavaScript numbers; binding a\n * `bigint` outside the safe integer range throws.\n */\nexport class DurableObjectSqliteDatabase extends DurableObjectSqliteExecutor implements SqliteDatabase {\n\tprivate readonly queue: SerialQueue;\n\n\tconstructor(storage: DurableObjectSqliteStorage) {\n\t\tsuper(storage);\n\t\tthis.queue = queueFor(storage);\n\t}\n\n\toverride exec(sql: string): Promise<void> {\n\t\treturn this.queue.run(() => super.exec(sql));\n\t}\n\n\toverride run(sql: string, ...params: SqliteValue[]): Promise<void> {\n\t\treturn this.queue.run(() => super.run(sql, ...params));\n\t}\n\n\toverride runCounted(sql: string, ...params: SqliteValue[]): Promise<number> {\n\t\treturn this.queue.run(() => super.runCounted(sql, ...params));\n\t}\n\n\toverride get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined> {\n\t\treturn this.queue.run(() => super.get<T>(sql, ...params));\n\t}\n\n\toverride all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]> {\n\t\treturn this.queue.run(() => super.all<T>(sql, ...params));\n\t}\n\n\t/** `ctx.storage.transaction()` commits when the callback resolves and rolls back when it rejects. */\n\ttransaction<T>(callback: (transaction: SqliteExecutor) => Promise<T>): Promise<T> {\n\t\treturn this.queue.hold(() =>\n\t\t\tthis.storage.transaction(async () => {\n\t\t\t\tconst transaction = new DurableObjectSqliteTransaction(this.storage);\n\t\t\t\ttry {\n\t\t\t\t\treturn await callback(transaction);\n\t\t\t\t} finally {\n\t\t\t\t\ttransaction.active = false;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** Waits for queued work. The Durable Object owns its storage, so nothing else closes. */\n\tclose(): Promise<void> {\n\t\treturn this.queue.run(() => {});\n\t}\n}\n"]}
|
|
@@ -4,12 +4,15 @@ export type SqliteValue = null | number | bigint | string | Uint8Array;
|
|
|
4
4
|
* Asynchronous SQL operations shared by a database and its transaction handles.
|
|
5
5
|
*
|
|
6
6
|
* `exec` runs SQL text without bindings and may contain several statements. `run`, `get`, and `all`
|
|
7
|
-
* execute one statement with positional bindings.
|
|
8
|
-
*
|
|
7
|
+
* execute one statement with positional bindings. `runCounted` runs one like `run` and resolves with the rows it
|
|
8
|
+
* inserted, updated or deleted, as SQLite's `changes()` counts them (index writes and rows changed by triggers do not
|
|
9
|
+
* count); it may cost a statement more than `run`, so callers that need no count use `run`. Adapters may cache
|
|
10
|
+
* prepared statements by SQL text, so callers pass values as bindings instead of interpolating them.
|
|
9
11
|
*/
|
|
10
12
|
export interface SqliteExecutor {
|
|
11
13
|
exec(sql: string): Promise<void>;
|
|
12
14
|
run(sql: string, ...params: SqliteValue[]): Promise<void>;
|
|
15
|
+
runCounted(sql: string, ...params: SqliteValue[]): Promise<number>;
|
|
13
16
|
get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined>;
|
|
14
17
|
all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]>;
|
|
15
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACrF,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc;IACrD,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":"","sourcesContent":["/** Values supported by the portable SQLite drivers. */\nexport type SqliteValue = null | number | bigint | string | Uint8Array;\n\n/**\n * Asynchronous SQL operations shared by a database and its transaction handles.\n *\n * `exec` runs SQL text without bindings and may contain several statements. `run`, `get`, and `all`\n * execute one statement with positional bindings. Adapters may cache prepared statements by SQL text
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":"","sourcesContent":["/** Values supported by the portable SQLite drivers. */\nexport type SqliteValue = null | number | bigint | string | Uint8Array;\n\n/**\n * Asynchronous SQL operations shared by a database and its transaction handles.\n *\n * `exec` runs SQL text without bindings and may contain several statements. `run`, `get`, and `all`\n * execute one statement with positional bindings. `runCounted` runs one like `run` and resolves with the rows it\n * inserted, updated or deleted, as SQLite's `changes()` counts them (index writes and rows changed by triggers do not\n * count); it may cost a statement more than `run`, so callers that need no count use `run`. Adapters may cache\n * prepared statements by SQL text, so callers pass values as bindings instead of interpolating them.\n */\nexport interface SqliteExecutor {\n\texec(sql: string): Promise<void>;\n\trun(sql: string, ...params: SqliteValue[]): Promise<void>;\n\trunCounted(sql: string, ...params: SqliteValue[]): Promise<number>;\n\tget<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined>;\n\tall<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]>;\n}\n\n/**\n * Minimal portable SQLite database facade.\n *\n * All operations are asynchronous so adapters may execute outside the caller's runtime.\n *\n * `transaction` passes the callback a transaction handle. All work in the transaction\n * must use that handle; the handle is invalid after the callback settles. Adapters must\n * queue unrelated operations and other transactions until the transaction finishes. The\n * returned promise settles after commit or rollback. Calling the database itself (including\n * `transaction` or `close`) from inside a callback therefore waits for that transaction and\n * never settles.\n *\n * When the callback rejects, the adapter must roll the transaction back before rejecting\n * with that same error. If rollback fails, it must reject with a different error (for\n * example an `AggregateError`) so callers cannot mistake the callback error for a\n * guaranteed rollback.\n */\nexport interface SqliteDatabase extends SqliteExecutor {\n\ttransaction<T>(callback: (transaction: SqliteExecutor) => Promise<T>): Promise<T>;\n\tclose(): Promise<void>;\n}\n"]}
|
package/dist/sqlite/node.d.ts
CHANGED
|
@@ -10,7 +10,9 @@ export type NodeSqliteDatabaseOptions = {
|
|
|
10
10
|
};
|
|
11
11
|
/**
|
|
12
12
|
* Executes SQL on one connection. Prepared statements are cached per connection by SQL text, so the
|
|
13
|
-
* database and its transaction handles share them across transactions.
|
|
13
|
+
* database and its transaction handles share them across transactions. The cache keeps the
|
|
14
|
+
* `STATEMENT_CACHE_LIMIT` most recently used statements, so callers generating SQL of unbounded shapes
|
|
15
|
+
* cannot grow it without bound.
|
|
14
16
|
*/
|
|
15
17
|
declare abstract class NodeSqliteExecutor implements SqliteExecutor {
|
|
16
18
|
protected readonly database: DatabaseSync;
|
|
@@ -18,6 +20,7 @@ declare abstract class NodeSqliteExecutor implements SqliteExecutor {
|
|
|
18
20
|
constructor(database: DatabaseSync, statements: Map<string, StatementSync>);
|
|
19
21
|
exec(sql: string): Promise<void>;
|
|
20
22
|
run(sql: string, ...params: SqliteValue[]): Promise<void>;
|
|
23
|
+
runCounted(sql: string, ...params: SqliteValue[]): Promise<number>;
|
|
21
24
|
get<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T | undefined>;
|
|
22
25
|
all<T extends object>(sql: string, ...params: SqliteValue[]): Promise<T[]>;
|
|
23
26
|
protected abstract runOperation<T>(operation: () => T): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sqlite/node.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjF,2DAA2D;AAC3D,MAAM,MAAM,yBAAyB,GAAG;IACvC,2GAA2G;IAC3G,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,4GAA4G;IAC5G,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sqlite/node.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjF,2DAA2D;AAC3D,MAAM,MAAM,yBAAyB,GAAG;IACvC,2GAA2G;IAC3G,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,4GAA4G;IAC5G,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AA6DF;;;;;GAKG;AACH,uBAAe,kBAAmB,YAAW,cAAc;IAC1D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE1D,YAAY,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAGzE;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxD;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;IAED,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAEnF;IAED,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAEzE;IAED,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnE,OAAO,CAAC,SAAS;CAiBjB;AAgBD,wEAAwE;AACxE,qBAAa,kBAAmB,SAAQ,kBAAmB,YAAW,cAAc;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,QAAQ,EAAE,YAAY,EAEjC;IAED,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmBhF;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAWrB;IAED,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAExD;CACD;AAED,+DAA+D;AAC/D,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAmB7B"}
|
package/dist/sqlite/node.js
CHANGED
|
@@ -52,9 +52,13 @@ class SerialOperationQueue {
|
|
|
52
52
|
return settled;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
+
/** How many prepared statements one connection keeps. */
|
|
56
|
+
const STATEMENT_CACHE_LIMIT = 256;
|
|
55
57
|
/**
|
|
56
58
|
* Executes SQL on one connection. Prepared statements are cached per connection by SQL text, so the
|
|
57
|
-
* database and its transaction handles share them across transactions.
|
|
59
|
+
* database and its transaction handles share them across transactions. The cache keeps the
|
|
60
|
+
* `STATEMENT_CACHE_LIMIT` most recently used statements, so callers generating SQL of unbounded shapes
|
|
61
|
+
* cannot grow it without bound.
|
|
58
62
|
*/
|
|
59
63
|
class NodeSqliteExecutor {
|
|
60
64
|
database;
|
|
@@ -73,6 +77,9 @@ class NodeSqliteExecutor {
|
|
|
73
77
|
this.statement(sql).run(...params);
|
|
74
78
|
});
|
|
75
79
|
}
|
|
80
|
+
runCounted(sql, ...params) {
|
|
81
|
+
return this.runOperation(() => Number(this.statement(sql).run(...params).changes));
|
|
82
|
+
}
|
|
76
83
|
get(sql, ...params) {
|
|
77
84
|
return this.runOperation(() => this.statement(sql).get(...params));
|
|
78
85
|
}
|
|
@@ -80,11 +87,21 @@ class NodeSqliteExecutor {
|
|
|
80
87
|
return this.runOperation(() => this.statement(sql).all(...params));
|
|
81
88
|
}
|
|
82
89
|
statement(sql) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
const statements = this.statements;
|
|
91
|
+
let statement = statements.get(sql);
|
|
92
|
+
if (statement !== undefined) {
|
|
93
|
+
// Recency matters only once evictions come near: a small cache keeps one lookup per statement.
|
|
94
|
+
if (statements.size > STATEMENT_CACHE_LIMIT / 2) {
|
|
95
|
+
statements.delete(sql);
|
|
96
|
+
statements.set(sql, statement);
|
|
97
|
+
}
|
|
98
|
+
return statement;
|
|
87
99
|
}
|
|
100
|
+
statement = this.database.prepare(sql);
|
|
101
|
+
statements.set(sql, statement);
|
|
102
|
+
// A Map iterates in insertion order: its first key is the least recently used statement.
|
|
103
|
+
if (statements.size > STATEMENT_CACHE_LIMIT)
|
|
104
|
+
statements.delete(statements.keys().next().value);
|
|
88
105
|
return statement;
|
|
89
106
|
}
|
|
90
107
|
}
|