@owlmeans/server-planning 0.1.18-rc.8 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -19
- package/agent-meta/manifest.json +105 -4
- package/agent-meta/skills/server-planning/SKILL.md +89 -138
- package/agent-meta/skills/server-planning/parts/auxiliary.md +54 -0
- package/agent-meta/skills/server-planning/parts/executor.md +82 -0
- package/agent-meta/skills/server-planning/parts/schemas.md +26 -0
- package/agent-meta/skills/server-planning/parts/serving.md +88 -0
- package/agent-meta/skills/server-planning/parts/stores.md +91 -0
- package/build/actions/apply-schema-request.d.ts +8 -0
- package/build/actions/apply-schema-request.d.ts.map +1 -0
- package/build/actions/apply-schema-request.js +33 -0
- package/build/actions/apply-schema-request.js.map +1 -0
- package/build/actions/commit.d.ts +3 -3
- package/build/actions/commit.d.ts.map +1 -1
- package/build/actions/commit.js +5 -4
- package/build/actions/commit.js.map +1 -1
- package/build/actions/define-schemas.d.ts +13 -0
- package/build/actions/define-schemas.d.ts.map +1 -0
- package/build/actions/define-schemas.js +28 -0
- package/build/actions/define-schemas.js.map +1 -0
- package/build/actions/execute.d.ts +11 -10
- package/build/actions/execute.d.ts.map +1 -1
- package/build/actions/execute.js +17 -27
- package/build/actions/execute.js.map +1 -1
- package/build/actions/execution/types.d.ts +34 -0
- package/build/actions/execution/types.d.ts.map +1 -0
- package/build/actions/execution/types.js +2 -0
- package/build/actions/execution/types.js.map +1 -0
- package/build/actions/execution.d.ts +4 -0
- package/build/actions/execution.d.ts.map +1 -0
- package/build/actions/execution.js +88 -0
- package/build/actions/execution.js.map +1 -0
- package/build/actions/get-card.d.ts +6 -0
- package/build/actions/get-card.d.ts.map +1 -0
- package/build/actions/get-card.js +9 -0
- package/build/actions/get-card.js.map +1 -0
- package/build/actions/get-specification.d.ts +6 -0
- package/build/actions/get-specification.d.ts.map +1 -0
- package/build/actions/get-specification.js +9 -0
- package/build/actions/get-specification.js.map +1 -0
- package/build/actions/index.d.ts +12 -3
- package/build/actions/index.d.ts.map +1 -1
- package/build/actions/index.js +11 -3
- package/build/actions/index.js.map +1 -1
- package/build/actions/links.d.ts +3 -3
- package/build/actions/links.d.ts.map +1 -1
- package/build/actions/links.js +6 -5
- package/build/actions/links.js.map +1 -1
- package/build/actions/list-card-specifications.d.ts +6 -0
- package/build/actions/list-card-specifications.d.ts.map +1 -0
- package/build/actions/list-card-specifications.js +11 -0
- package/build/actions/list-card-specifications.js.map +1 -0
- package/build/actions/list-card-transitions.d.ts +6 -0
- package/build/actions/list-card-transitions.d.ts.map +1 -0
- package/build/actions/list-card-transitions.js +11 -0
- package/build/actions/list-card-transitions.js.map +1 -0
- package/build/actions/list-cards.d.ts +6 -0
- package/build/actions/list-cards.d.ts.map +1 -0
- package/build/actions/list-cards.js +10 -0
- package/build/actions/list-cards.js.map +1 -0
- package/build/actions/list-schemas.d.ts +13 -0
- package/build/actions/list-schemas.d.ts.map +1 -0
- package/build/actions/list-schemas.js +20 -0
- package/build/actions/list-schemas.js.map +1 -0
- package/build/actions/list-specification-revisions.d.ts +6 -0
- package/build/actions/list-specification-revisions.d.ts.map +1 -0
- package/build/actions/list-specification-revisions.js +10 -0
- package/build/actions/list-specification-revisions.js.map +1 -0
- package/build/actions/resources.d.ts +5 -0
- package/build/actions/resources.d.ts.map +1 -0
- package/build/actions/resources.js +111 -0
- package/build/actions/resources.js.map +1 -0
- package/build/actions/summarize-cards.d.ts +6 -0
- package/build/actions/summarize-cards.d.ts.map +1 -0
- package/build/actions/summarize-cards.js +11 -0
- package/build/actions/summarize-cards.js.map +1 -0
- package/build/actions/transitions.d.ts +3 -3
- package/build/actions/transitions.d.ts.map +1 -1
- package/build/actions/transitions.js +4 -3
- package/build/actions/transitions.js.map +1 -1
- package/build/actions/types.d.ts +6 -0
- package/build/actions/types.d.ts.map +1 -0
- package/build/actions/types.js +2 -0
- package/build/actions/types.js.map +1 -0
- package/build/actions/watch.d.ts +2 -2
- package/build/actions/watch.d.ts.map +1 -1
- package/build/actions/watch.js +8 -6
- package/build/actions/watch.js.map +1 -1
- package/build/conformance/assert/types.d.ts +19 -0
- package/build/conformance/assert/types.d.ts.map +1 -0
- package/build/conformance/assert/types.js +2 -0
- package/build/conformance/assert/types.js.map +1 -0
- package/build/conformance/assert.d.ts +15 -0
- package/build/conformance/assert.d.ts.map +1 -0
- package/build/conformance/assert.js +52 -0
- package/build/conformance/assert.js.map +1 -0
- package/build/conformance/cases.d.ts +7 -0
- package/build/conformance/cases.d.ts.map +1 -0
- package/build/conformance/cases.js +544 -0
- package/build/conformance/cases.js.map +1 -0
- package/build/conformance/clock.d.ts +6 -0
- package/build/conformance/clock.d.ts.map +1 -0
- package/build/conformance/clock.js +12 -0
- package/build/conformance/clock.js.map +1 -0
- package/build/conformance/consts.d.ts +30 -0
- package/build/conformance/consts.d.ts.map +1 -0
- package/build/conformance/consts.js +159 -0
- package/build/conformance/consts.js.map +1 -0
- package/build/conformance/errors.d.ts +5 -0
- package/build/conformance/errors.d.ts.map +1 -0
- package/build/conformance/errors.js +8 -0
- package/build/conformance/errors.js.map +1 -0
- package/build/conformance/fixtures/types.d.ts +13 -0
- package/build/conformance/fixtures/types.d.ts.map +1 -0
- package/build/conformance/fixtures/types.js +2 -0
- package/build/conformance/fixtures/types.js.map +1 -0
- package/build/conformance/fixtures.d.ts +14 -0
- package/build/conformance/fixtures.d.ts.map +1 -0
- package/build/conformance/fixtures.js +26 -0
- package/build/conformance/fixtures.js.map +1 -0
- package/build/conformance/index.d.ts +15 -0
- package/build/conformance/index.d.ts.map +1 -0
- package/build/conformance/index.js +12 -0
- package/build/conformance/index.js.map +1 -0
- package/build/conformance/resources.d.ts +4 -0
- package/build/conformance/resources.d.ts.map +1 -0
- package/build/conformance/resources.js +228 -0
- package/build/conformance/resources.js.map +1 -0
- package/build/conformance/types.d.ts +18 -0
- package/build/conformance/types.d.ts.map +1 -0
- package/build/conformance/types.js +2 -0
- package/build/conformance/types.js.map +1 -0
- package/build/consts.d.ts +5 -0
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +5 -0
- package/build/consts.js.map +1 -1
- package/build/definitions.d.ts +18 -0
- package/build/definitions.d.ts.map +1 -0
- package/build/definitions.js +225 -0
- package/build/definitions.js.map +1 -0
- package/build/executor/changes/types.d.ts +36 -0
- package/build/executor/changes/types.d.ts.map +1 -0
- package/build/executor/changes/types.js +2 -0
- package/build/executor/changes/types.js.map +1 -0
- package/build/executor/changes.d.ts +3 -30
- package/build/executor/changes.d.ts.map +1 -1
- package/build/executor/changes.js +42 -51
- package/build/executor/changes.js.map +1 -1
- package/build/executor/code/types.d.ts +17 -0
- package/build/executor/code/types.d.ts.map +1 -0
- package/build/executor/code/types.js +2 -0
- package/build/executor/code/types.js.map +1 -0
- package/build/executor/code.d.ts +3 -14
- package/build/executor/code.d.ts.map +1 -1
- package/build/executor/code.js +50 -54
- package/build/executor/code.js.map +1 -1
- package/build/executor/consts.local.d.ts +5 -0
- package/build/executor/consts.local.d.ts.map +1 -0
- package/build/executor/consts.local.js +6 -0
- package/build/executor/consts.local.js.map +1 -0
- package/build/executor/creator/types.d.ts +33 -0
- package/build/executor/creator/types.d.ts.map +1 -0
- package/build/executor/creator/types.js +2 -0
- package/build/executor/creator/types.js.map +1 -0
- package/build/executor/creator.d.ts +11 -0
- package/build/executor/creator.d.ts.map +1 -0
- package/build/executor/creator.js +32 -0
- package/build/executor/creator.js.map +1 -0
- package/build/executor/resolve/types.d.ts +30 -0
- package/build/executor/resolve/types.d.ts.map +1 -0
- package/build/executor/resolve/types.js +2 -0
- package/build/executor/resolve/types.js.map +1 -0
- package/build/executor/resolve.d.ts +5 -34
- package/build/executor/resolve.d.ts.map +1 -1
- package/build/executor/resolve.js +169 -110
- package/build/executor/resolve.js.map +1 -1
- package/build/executor/types.d.ts +23 -0
- package/build/executor/types.d.ts.map +1 -0
- package/build/executor/types.js +2 -0
- package/build/executor/types.js.map +1 -0
- package/build/executor/validate.d.ts +6 -5
- package/build/executor/validate.d.ts.map +1 -1
- package/build/executor/validate.js +38 -27
- package/build/executor/validate.js.map +1 -1
- package/build/executor.d.ts +11 -7
- package/build/executor.d.ts.map +1 -1
- package/build/executor.js +27 -21
- package/build/executor.js.map +1 -1
- package/build/facade.d.ts +20 -2
- package/build/facade.d.ts.map +1 -1
- package/build/facade.js +144 -22
- package/build/facade.js.map +1 -1
- package/build/helper.d.ts +5 -9
- package/build/helper.d.ts.map +1 -1
- package/build/helper.js +12 -11
- package/build/helper.js.map +1 -1
- package/build/hierarchy/types.d.ts +20 -0
- package/build/hierarchy/types.d.ts.map +1 -0
- package/build/hierarchy/types.js +2 -0
- package/build/hierarchy/types.js.map +1 -0
- package/build/hierarchy.d.ts +5 -0
- package/build/hierarchy.d.ts.map +1 -0
- package/build/hierarchy.js +133 -0
- package/build/hierarchy.js.map +1 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/invariants/types.d.ts +6 -0
- package/build/invariants/types.d.ts.map +1 -0
- package/build/invariants/types.js +2 -0
- package/build/invariants/types.js.map +1 -0
- package/build/invariants.d.ts +5 -0
- package/build/invariants.d.ts.map +1 -0
- package/build/invariants.js +126 -0
- package/build/invariants.js.map +1 -0
- package/build/projection.d.ts +4 -10
- package/build/projection.d.ts.map +1 -1
- package/build/projection.js +7 -5
- package/build/projection.js.map +1 -1
- package/build/queue/consts.d.ts +5 -0
- package/build/queue/consts.d.ts.map +1 -0
- package/build/queue/consts.js +5 -0
- package/build/queue/consts.js.map +1 -0
- package/build/queue/declare.d.ts +5 -0
- package/build/queue/declare.d.ts.map +1 -0
- package/build/queue/declare.js +5 -0
- package/build/queue/declare.js.map +1 -0
- package/build/queue/index.d.ts +3 -18
- package/build/queue/index.d.ts.map +1 -1
- package/build/queue/index.js +2 -7
- package/build/queue/index.js.map +1 -1
- package/build/queue/types.d.ts +13 -0
- package/build/queue/types.d.ts.map +1 -0
- package/build/queue/types.js +2 -0
- package/build/queue/types.js.map +1 -0
- package/build/registry.d.ts +5 -22
- package/build/registry.d.ts.map +1 -1
- package/build/registry.js +16 -10
- package/build/registry.js.map +1 -1
- package/build/resources.d.ts +5 -0
- package/build/resources.d.ts.map +1 -0
- package/build/resources.js +287 -0
- package/build/resources.js.map +1 -0
- package/build/service.d.ts +3 -16
- package/build/service.d.ts.map +1 -1
- package/build/service.js +12 -0
- package/build/service.js.map +1 -1
- package/build/store/commits.d.ts.map +1 -1
- package/build/store/commits.js +3 -1
- package/build/store/commits.js.map +1 -1
- package/build/store/composite.d.ts +1 -0
- package/build/store/composite.d.ts.map +1 -1
- package/build/store/composite.js +7 -2
- package/build/store/composite.js.map +1 -1
- package/build/store/consts.local.d.ts +2 -0
- package/build/store/consts.local.d.ts.map +1 -0
- package/build/store/consts.local.js +2 -0
- package/build/store/consts.local.js.map +1 -0
- package/build/store/fold/types.d.ts +43 -0
- package/build/store/fold/types.d.ts.map +1 -0
- package/build/store/fold/types.js +2 -0
- package/build/store/fold/types.js.map +1 -0
- package/build/store/fold.d.ts +8 -30
- package/build/store/fold.d.ts.map +1 -1
- package/build/store/fold.js +190 -198
- package/build/store/fold.js.map +1 -1
- package/build/store/index.d.ts +1 -0
- package/build/store/index.d.ts.map +1 -1
- package/build/store/index.js.map +1 -1
- package/build/store/memory.d.ts +12 -0
- package/build/store/memory.d.ts.map +1 -1
- package/build/store/memory.js +0 -0
- package/build/store/memory.js.map +1 -1
- package/build/store/types.d.ts +15 -1
- package/build/store/types.d.ts.map +1 -1
- package/build/store/types.local.d.ts +5 -0
- package/build/store/types.local.d.ts.map +1 -0
- package/build/store/types.local.js +2 -0
- package/build/store/types.local.js.map +1 -0
- package/build/types.d.ts +126 -2
- package/build/types.d.ts.map +1 -1
- package/build/types.local.d.ts +7 -0
- package/build/types.local.d.ts.map +1 -0
- package/build/types.local.js +2 -0
- package/build/types.local.js.map +1 -0
- package/build/utils/access/types.d.ts +30 -0
- package/build/utils/access/types.d.ts.map +1 -0
- package/build/utils/access/types.js +2 -0
- package/build/utils/access/types.js.map +1 -0
- package/build/utils/access.d.ts +4 -0
- package/build/utils/access.d.ts.map +1 -0
- package/build/utils/access.js +28 -0
- package/build/utils/access.js.map +1 -0
- package/build/utils/guard/types.d.ts +23 -0
- package/build/utils/guard/types.d.ts.map +1 -0
- package/build/utils/guard/types.js +2 -0
- package/build/utils/guard/types.js.map +1 -0
- package/build/utils/guard.d.ts +7 -10
- package/build/utils/guard.d.ts.map +1 -1
- package/build/utils/guard.js +36 -32
- package/build/utils/guard.js.map +1 -1
- package/build/utils/handler/types.d.ts +26 -0
- package/build/utils/handler/types.d.ts.map +1 -0
- package/build/utils/handler/types.js +2 -0
- package/build/utils/handler/types.js.map +1 -0
- package/build/utils/handler.d.ts +6 -0
- package/build/utils/handler.d.ts.map +1 -0
- package/build/utils/handler.js +21 -0
- package/build/utils/handler.js.map +1 -0
- package/build/utils/index.d.ts +8 -0
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +3 -0
- package/build/utils/index.js.map +1 -1
- package/build/utils/request/types.d.ts +23 -0
- package/build/utils/request/types.d.ts.map +1 -0
- package/build/utils/request/types.js +2 -0
- package/build/utils/request/types.js.map +1 -0
- package/build/utils/request.d.ts +4 -0
- package/build/utils/request.d.ts.map +1 -0
- package/build/utils/request.js +27 -0
- package/build/utils/request.js.map +1 -0
- package/build/utils/scope.d.ts +17 -13
- package/build/utils/scope.d.ts.map +1 -1
- package/build/utils/scope.js +21 -35
- package/build/utils/scope.js.map +1 -1
- package/build/utils/types.d.ts +8 -0
- package/build/utils/types.d.ts.map +1 -0
- package/build/utils/types.js +2 -0
- package/build/utils/types.js.map +1 -0
- package/package.json +30 -22
- package/src/actions/apply-schema-request.ts +36 -0
- package/src/actions/commit.ts +7 -5
- package/src/actions/define-schemas.ts +34 -0
- package/src/actions/execute.ts +32 -34
- package/src/actions/execution/types.ts +34 -0
- package/src/actions/execution.ts +100 -0
- package/src/actions/get-card.ts +14 -0
- package/src/actions/get-specification.ts +14 -0
- package/src/actions/index.ts +13 -3
- package/src/actions/links.ts +8 -6
- package/src/actions/list-card-specifications.ts +15 -0
- package/src/actions/list-card-transitions.ts +15 -0
- package/src/actions/list-cards.ts +14 -0
- package/src/actions/list-schemas.ts +29 -0
- package/src/actions/list-specification-revisions.ts +15 -0
- package/src/actions/resources.ts +79 -0
- package/src/actions/summarize-cards.ts +15 -0
- package/src/actions/transitions.ts +6 -4
- package/src/actions/types.ts +5 -0
- package/src/actions/watch.ts +11 -7
- package/src/conformance/assert/types.ts +16 -0
- package/src/conformance/assert.ts +67 -0
- package/src/conformance/cases.ts +631 -0
- package/src/conformance/clock.ts +11 -0
- package/src/conformance/consts.ts +165 -0
- package/src/conformance/errors.ts +7 -0
- package/src/conformance/fixtures/types.ts +11 -0
- package/src/conformance/fixtures.ts +46 -0
- package/src/conformance/index.ts +14 -0
- package/src/conformance/resources.ts +227 -0
- package/src/conformance/types.ts +20 -0
- package/src/consts.ts +6 -0
- package/src/definitions.ts +264 -0
- package/src/executor/changes/types.ts +38 -0
- package/src/executor/changes.ts +49 -68
- package/src/executor/code/types.ts +23 -0
- package/src/executor/code.ts +62 -69
- package/src/executor/consts.local.ts +8 -0
- package/src/executor/creator/types.ts +33 -0
- package/src/executor/creator.ts +43 -0
- package/src/executor/resolve/types.ts +30 -0
- package/src/executor/resolve.ts +181 -139
- package/src/executor/types.ts +23 -0
- package/src/executor/validate.ts +40 -38
- package/src/executor.ts +33 -27
- package/src/facade.ts +132 -29
- package/src/helper.ts +12 -11
- package/src/hierarchy/types.ts +20 -0
- package/src/hierarchy.ts +113 -0
- package/src/index.ts +1 -0
- package/src/invariants/types.ts +6 -0
- package/src/invariants.ts +106 -0
- package/src/projection.ts +12 -18
- package/src/queue/consts.ts +5 -0
- package/src/queue/declare.ts +7 -0
- package/src/queue/index.ts +3 -25
- package/src/queue/types.ts +14 -0
- package/src/registry.ts +18 -36
- package/src/resources.ts +256 -0
- package/src/service.ts +16 -20
- package/src/store/commits.ts +5 -4
- package/src/store/composite.ts +7 -2
- package/src/store/consts.local.ts +1 -0
- package/src/store/fold/types.ts +44 -0
- package/src/store/fold.ts +214 -212
- package/src/store/index.ts +1 -0
- package/src/store/memory.ts +0 -0
- package/src/store/types.local.ts +3 -0
- package/src/store/types.ts +16 -1
- package/src/types.local.ts +7 -0
- package/src/types.ts +139 -6
- package/src/utils/access/types.ts +30 -0
- package/src/utils/access.ts +33 -0
- package/src/utils/guard/types.ts +21 -0
- package/src/utils/guard.ts +44 -31
- package/src/utils/handler/types.ts +28 -0
- package/src/utils/handler.ts +35 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/request/types.ts +23 -0
- package/src/utils/request.ts +40 -0
- package/src/utils/scope.ts +39 -42
- package/src/utils/types.ts +8 -0
- package/tests/access.spec.ts +160 -0
- package/tests/app.spec.ts +112 -0
- package/tests/conformance.spec.ts +47 -0
- package/tests/create-example.spec.ts +202 -0
- package/tests/creator.spec.ts +257 -0
- package/tests/entrypoints.spec.ts +5 -0
- package/tests/memory-store.spec.ts +52 -0
- package/tests/narrowing.spec.ts +94 -0
- package/tests/plugins.spec.ts +4 -3
- package/tests/writes.spec.ts +140 -0
- package/build/actions/cards.d.ts +0 -16
- package/build/actions/cards.d.ts.map +0 -1
- package/build/actions/cards.js +0 -32
- package/build/actions/cards.js.map +0 -1
- package/build/actions/schemas.d.ts +0 -6
- package/build/actions/schemas.d.ts.map +0 -1
- package/build/actions/schemas.js +0 -9
- package/build/actions/schemas.js.map +0 -1
- package/build/actions/specs.d.ts +0 -10
- package/build/actions/specs.d.ts.map +0 -1
- package/build/actions/specs.js +0 -14
- package/build/actions/specs.js.map +0 -1
- package/src/actions/cards.ts +0 -52
- package/src/actions/schemas.ts +0 -15
- package/src/actions/specs.ts +0 -23
package/build/helper.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
|
+
import { servePlanningResources } from './actions/resources.js';
|
|
1
2
|
import { bind } from '@owlmeans/server-entrypoint';
|
|
2
|
-
import { executePlanning, getCard, getCommit, getSpecification, getTransition, listCardSpecifications, listCardTransitions, listCards, listLinks, listSchemas, listSpecificationRevisions, summarizeCards, watchCommits, } from './actions/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { defineSchemas, executePlanning, getCard, getCommit, getSpecification, getTransition, listCardSpecifications, listCardTransitions, listCards, listLinks, listSchemas, listSpecificationRevisions, summarizeCards, watchCommits, } from './actions/index.js';
|
|
4
|
+
import { planningHandlerOf } from './utils/handler.js';
|
|
4
5
|
/**
|
|
5
6
|
* Bind this package's handlers to a tree declared by `makePlanningProtocols` — one binding per
|
|
6
|
-
* protocol, the base included.
|
|
7
|
-
* wants its own handler for one leaf binds
|
|
7
|
+
* protocol, the base included (and `schema.define` when the tree declares it). Pass the tree
|
|
8
|
+
* itself, never a flattened list; an application that wants its own handler for one leaf binds
|
|
9
|
+
* that protocol afterwards.
|
|
8
10
|
*/
|
|
9
11
|
export const servePlanningEntrypoints = (protocols, opts) => [
|
|
12
|
+
...servePlanningResources(protocols, opts),
|
|
10
13
|
bind(protocols.base),
|
|
11
14
|
bind(protocols.schema.list, listSchemas(protocols.schema.list, opts)),
|
|
15
|
+
...(protocols.schema.define != null
|
|
16
|
+
? [bind(protocols.schema.define, defineSchemas(protocols.schema.define, opts))]
|
|
17
|
+
: []),
|
|
12
18
|
bind(protocols.card.list, listCards(protocols.card.list, opts)),
|
|
13
19
|
bind(protocols.card.summary, summarizeCards(protocols.card.summary, opts)),
|
|
14
20
|
bind(protocols.card.get, getCard(protocols.card.get, opts)),
|
|
@@ -22,11 +28,6 @@ export const servePlanningEntrypoints = (protocols, opts) => [
|
|
|
22
28
|
bind(protocols.commit.get, getCommit(protocols.commit.get, opts)),
|
|
23
29
|
bind(protocols.commit.events, watchCommits(protocols.commit.events, opts)),
|
|
24
30
|
];
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
* (a `channel`) — never an entity from the request body.
|
|
28
|
-
*
|
|
29
|
-
* @throws {AuthorizationError} when the request carries no organization
|
|
30
|
-
*/
|
|
31
|
-
export const planningFor = (ctx, req, extra, opts) => planningServiceOf(ctx, opts).for(scopeOf(req, extra));
|
|
31
|
+
/** @deprecated compat:factory-refactor — use `planningHandlerOf(ctx).planningFor(…)` */
|
|
32
|
+
export const planningFor = (ctx, req, extra, opts) => planningHandlerOf(ctx).planningFor(req, extra, opts);
|
|
32
33
|
//# sourceMappingURL=helper.js.map
|
package/build/helper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Workcard } from '@owlmeans/planning';
|
|
2
|
+
export interface PlanningHierarchy {
|
|
3
|
+
ancestors: (card: Pick<Workcard, 'entityId' | 'parent' | 'parents'>) => Promise<Workcard[]>;
|
|
4
|
+
project: (card: Pick<Workcard, 'entityId' | 'kind' | 'id' | 'parent'>) => Promise<string | undefined>;
|
|
5
|
+
projects: (card: Workcard) => Promise<string[]>;
|
|
6
|
+
visible: (card: Workcard, projects?: readonly string[]) => Promise<boolean>;
|
|
7
|
+
descendants: (id: string, entityId: string) => Promise<Workcard[]>;
|
|
8
|
+
/**
|
|
9
|
+
* A card's own documents: the specifications whose primary parent is the card, and theirs in
|
|
10
|
+
* turn. They never block the card's delete — its fold removes them with it.
|
|
11
|
+
*/
|
|
12
|
+
documents: (id: string, entityId: string) => Promise<Workcard[]>;
|
|
13
|
+
/**
|
|
14
|
+
* The card's own shape against its schemas — or, `deleting`, whether it may go: a project always
|
|
15
|
+
* (its delete purges what is under it); any other card only when everything under it is one of
|
|
16
|
+
* its own `documents` (`hierarchy:parent-in-use` otherwise).
|
|
17
|
+
*/
|
|
18
|
+
validate: (card: Workcard, deleting?: boolean) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hierarchy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3F,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACrG,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClE;;;OAGG;IACH,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAChE;;;;OAIG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hierarchy/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PlanningRuntime } from './types.js';
|
|
2
|
+
import type { PlanningHierarchy } from './hierarchy/types.js';
|
|
3
|
+
/** One recursive resolver for schema inheritance, project authorization and hierarchy constraints. */
|
|
4
|
+
export declare const makePlanningHierarchy: (runtime: PlanningRuntime) => PlanningHierarchy;
|
|
5
|
+
//# sourceMappingURL=hierarchy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,sGAAsG;AACtG,eAAO,MAAM,qBAAqB,YAAa,eAAe,KAAG,iBAwGhE,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { CardTypeNotAllowed, FieldsInvalid, ParentNotFound, PlanningError, PlanningSchemaKind, SchemaOrigin, WorkcardKind, } from '@owlmeans/planning';
|
|
2
|
+
/** One recursive resolver for schema inheritance, project authorization and hierarchy constraints. */
|
|
3
|
+
export const makePlanningHierarchy = (runtime) => {
|
|
4
|
+
const cards = () => runtime.reader().cards;
|
|
5
|
+
const ancestors = async (card) => {
|
|
6
|
+
const visited = new Set();
|
|
7
|
+
const result = [];
|
|
8
|
+
const visit = async (id, path) => {
|
|
9
|
+
if (path.has(id))
|
|
10
|
+
throw new PlanningError(`hierarchy:cycle:${id}`);
|
|
11
|
+
if (visited.has(id))
|
|
12
|
+
return;
|
|
13
|
+
const parent = await cards().get(id, card.entityId);
|
|
14
|
+
if (parent == null || parent.entityId !== card.entityId)
|
|
15
|
+
throw new ParentNotFound(id);
|
|
16
|
+
const next = new Set([...path, id]);
|
|
17
|
+
for (const reference of parent.parents)
|
|
18
|
+
await visit(reference, next);
|
|
19
|
+
visited.add(id);
|
|
20
|
+
result.push(parent);
|
|
21
|
+
};
|
|
22
|
+
for (const id of card.parents)
|
|
23
|
+
await visit(id, new Set());
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
const project = async (card) => {
|
|
27
|
+
if (card.kind === WorkcardKind.Project)
|
|
28
|
+
return card.id;
|
|
29
|
+
const visited = new Set();
|
|
30
|
+
let parent = card.parent;
|
|
31
|
+
while (parent != null) {
|
|
32
|
+
if (visited.has(parent))
|
|
33
|
+
throw new PlanningError(`hierarchy:cycle:${parent}`);
|
|
34
|
+
visited.add(parent);
|
|
35
|
+
const found = await cards().get(parent, card.entityId);
|
|
36
|
+
if (found == null)
|
|
37
|
+
throw new ParentNotFound(parent);
|
|
38
|
+
if (found.kind === WorkcardKind.Project)
|
|
39
|
+
return found.id;
|
|
40
|
+
parent = found.parent;
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
};
|
|
44
|
+
const descendants = async (id, entityId) => {
|
|
45
|
+
const found = new Map();
|
|
46
|
+
let frontier = [id];
|
|
47
|
+
while (frontier.length > 0) {
|
|
48
|
+
const result = await cards().list({ entityId, parents: { $overlaps: frontier }, kind: [WorkcardKind.Card, WorkcardKind.Project, WorkcardKind.Specification] }, { size: 0 });
|
|
49
|
+
frontier = [];
|
|
50
|
+
for (const card of result.items)
|
|
51
|
+
if (card.id !== id && !found.has(card.id)) {
|
|
52
|
+
found.set(card.id, card);
|
|
53
|
+
frontier.push(card.id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return [...found.values()];
|
|
57
|
+
};
|
|
58
|
+
/** The specifications among `below` whose primary parent is `id` or one already owned. */
|
|
59
|
+
const ownedOf = (id, below) => {
|
|
60
|
+
const owners = new Set([id]);
|
|
61
|
+
const owned = [];
|
|
62
|
+
let grown = true;
|
|
63
|
+
while (grown) {
|
|
64
|
+
grown = false;
|
|
65
|
+
for (const card of below) {
|
|
66
|
+
if (card.kind === WorkcardKind.Specification && card.parent != null && owners.has(card.parent) && !owners.has(card.id)) {
|
|
67
|
+
owners.add(card.id);
|
|
68
|
+
owned.push(card);
|
|
69
|
+
grown = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return owned;
|
|
74
|
+
};
|
|
75
|
+
const assertPair = (parent, card, schemas) => {
|
|
76
|
+
if (card.kind === WorkcardKind.Specification)
|
|
77
|
+
return;
|
|
78
|
+
const childType = schemas.type(card.type);
|
|
79
|
+
if (childType.parents?.types != null && !childType.parents.types.includes(parent.type))
|
|
80
|
+
throw new CardTypeNotAllowed(`${card.type}:parent:${parent.type}`);
|
|
81
|
+
const parentType = schemas.type(parent.type);
|
|
82
|
+
if (parentType.children != null) {
|
|
83
|
+
if (!parentType.children.types.includes(card.type))
|
|
84
|
+
throw new CardTypeNotAllowed(`${parent.type}:child:${card.type}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (parent.kind !== WorkcardKind.Project)
|
|
88
|
+
throw new CardTypeNotAllowed(`${parent.type}:child:${card.type}`);
|
|
89
|
+
const container = parentType;
|
|
90
|
+
const allowed = card.kind === WorkcardKind.Project ? container.projectTypes ?? [] : container.cardTypes;
|
|
91
|
+
const origin = schemas.originOf?.(PlanningSchemaKind.Type, card.type);
|
|
92
|
+
if (!allowed.includes(card.type) && !(card.kind === WorkcardKind.Card && container.scopedCardTypes && (origin === SchemaOrigin.Project || origin === SchemaOrigin.Entity)))
|
|
93
|
+
throw new CardTypeNotAllowed(`${parent.type}:${card.type}`);
|
|
94
|
+
};
|
|
95
|
+
const hierarchy = {
|
|
96
|
+
ancestors,
|
|
97
|
+
project,
|
|
98
|
+
descendants,
|
|
99
|
+
documents: async (id, entityId) => ownedOf(id, await descendants(id, entityId)),
|
|
100
|
+
projects: async (card) => [...new Set([...(card.kind === WorkcardKind.Project ? [card.id] : []), ...(await ancestors(card)).filter(parent => parent.kind === WorkcardKind.Project).map(parent => parent.id)])],
|
|
101
|
+
visible: async (card, projects) => projects == null || (await hierarchy.projects(card)).some(id => projects.includes(id)),
|
|
102
|
+
validate: async (card, deleting = false) => {
|
|
103
|
+
if (deleting) {
|
|
104
|
+
if (card.kind === WorkcardKind.Project)
|
|
105
|
+
return;
|
|
106
|
+
// The card's own documents go with it; anything else under it keeps it alive.
|
|
107
|
+
const below = await descendants(card.id, card.entityId);
|
|
108
|
+
if (below.length > ownedOf(card.id, below).length)
|
|
109
|
+
throw new PlanningError(`hierarchy:parent-in-use:${card.id}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const schemas = await runtime.schemasFor(card.entityId, await project(card));
|
|
113
|
+
const type = schemas.type(card.type);
|
|
114
|
+
if (type.parents?.required && card.parent == null)
|
|
115
|
+
throw new ParentNotFound(`required:${card.type}`);
|
|
116
|
+
if (card.parent != null && !card.parents.includes(card.parent))
|
|
117
|
+
throw new FieldsInvalid('hierarchy:primary-membership');
|
|
118
|
+
const parents = await ancestors(card);
|
|
119
|
+
if (parents.some(parent => parent.id === card.id))
|
|
120
|
+
throw new PlanningError(`hierarchy:cycle:${card.id}`);
|
|
121
|
+
for (const id of card.parents) {
|
|
122
|
+
const parent = parents.find(parent => parent.id === id);
|
|
123
|
+
assertPair(parent, card, await runtime.schemasFor(card.entityId, await project(parent)));
|
|
124
|
+
}
|
|
125
|
+
if (card.parent != null)
|
|
126
|
+
card.parentType = parents.find(parent => parent.id === card.parent).type;
|
|
127
|
+
else
|
|
128
|
+
delete card.parentType;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
return hierarchy;
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,mBAAmB,kBAAkB,CAAA;AAErC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,mBAAmB,kBAAkB,CAAA;AAErC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Workcard, Transition } from '@owlmeans/planning';
|
|
2
|
+
export interface PlanningInvariants {
|
|
3
|
+
validate: (before: Workcard | null, after: Workcard | null, transition: Transition) => Promise<void>;
|
|
4
|
+
references: (after: Workcard, transition: Transition) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/invariants/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpG,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/invariants/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PlanningRuntime } from './types.js';
|
|
2
|
+
import type { PlanningInvariants } from './invariants/types.js';
|
|
3
|
+
/** Checks projected state again at persistence time, including queued writes whose parents moved. */
|
|
4
|
+
export declare const makePlanningInvariants: (runtime: PlanningRuntime) => PlanningInvariants;
|
|
5
|
+
//# sourceMappingURL=invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../src/invariants.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,YAAa,eAAe,KAAG,kBAgGjE,CAAA"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { FieldsInvalid, PlanningResourceKind, PLANNING_ASSIGNEE, PLANNING_REPORTER, ProjectMode, RelationshipRefused, TransitionAction, validateHelper, WorkcardKind, } from '@owlmeans/planning';
|
|
2
|
+
import { makePlanningHierarchy } from './hierarchy.js';
|
|
3
|
+
/** Checks projected state again at persistence time, including queued writes whose parents moved. */
|
|
4
|
+
export const makePlanningInvariants = (runtime) => {
|
|
5
|
+
const registryFor = async (card) => await runtime.schemasFor(card.entityId, await makePlanningHierarchy(runtime).project(card));
|
|
6
|
+
const referencesOf = async (card) => {
|
|
7
|
+
const schemas = await registryFor(card);
|
|
8
|
+
const refs = [];
|
|
9
|
+
if (card.reporter != null)
|
|
10
|
+
refs.push({ type: PLANNING_REPORTER, to: card.reporter, toKind: PlanningResourceKind.Assignee });
|
|
11
|
+
if (card.assignee != null)
|
|
12
|
+
refs.push({ type: PLANNING_ASSIGNEE, to: card.assignee, toKind: PlanningResourceKind.Assignee });
|
|
13
|
+
for (const rule of schemas.type(card.type).relationships ?? []) {
|
|
14
|
+
if (rule.field == null)
|
|
15
|
+
continue;
|
|
16
|
+
const value = card.fields[rule.field];
|
|
17
|
+
if (value == null)
|
|
18
|
+
continue;
|
|
19
|
+
if (rule.multiple !== true && typeof value !== 'string')
|
|
20
|
+
throw new FieldsInvalid(`relationship:field:${rule.field}:single`);
|
|
21
|
+
if (rule.multiple === true && (!Array.isArray(value) || value.some(id => typeof id !== 'string')))
|
|
22
|
+
throw new FieldsInvalid(`relationship:field:${rule.field}:multiple`);
|
|
23
|
+
for (const id of Array.isArray(value) ? value : [value])
|
|
24
|
+
refs.push({ type: rule.name, to: id, toKind: rule.toKind ?? PlanningResourceKind.Workcard });
|
|
25
|
+
}
|
|
26
|
+
return refs;
|
|
27
|
+
};
|
|
28
|
+
const assertReference = async (card, ref, existing) => {
|
|
29
|
+
const reader = runtime.reader();
|
|
30
|
+
const kind = ref.toKind ?? PlanningResourceKind.Workcard;
|
|
31
|
+
const target = kind === PlanningResourceKind.Assignee ? await reader.assignees?.get(ref.to, card.entityId)
|
|
32
|
+
: kind === PlanningResourceKind.Team ? await reader.teams?.get(ref.to, card.entityId)
|
|
33
|
+
: kind === PlanningResourceKind.Workcard ? await reader.cards.get(ref.to, card.entityId) : null;
|
|
34
|
+
if (target == null || target.entityId !== card.entityId)
|
|
35
|
+
throw new RelationshipRefused(`reference:${kind}:${ref.to}`);
|
|
36
|
+
const rule = (await registryFor(card)).type(card.type).relationships?.find(rule => rule.name === ref.type);
|
|
37
|
+
if (rule?.from != null && !rule.from.includes(card.type))
|
|
38
|
+
throw new RelationshipRefused(`from-type:${ref.type}:${card.type}`);
|
|
39
|
+
if (rule?.to != null && !rule.to.includes('type' in target ? String(target.type) : ''))
|
|
40
|
+
throw new RelationshipRefused(`to-type:${ref.type}`);
|
|
41
|
+
if (kind === PlanningResourceKind.Assignee && !existing && 'retired' in target && target.retired)
|
|
42
|
+
throw new RelationshipRefused(`assignee:retired:${ref.to}`);
|
|
43
|
+
};
|
|
44
|
+
const invariants = {
|
|
45
|
+
validate: async (before, after, transition) => {
|
|
46
|
+
const hierarchy = makePlanningHierarchy(runtime);
|
|
47
|
+
if (after == null) {
|
|
48
|
+
if (before != null) {
|
|
49
|
+
await hierarchy.validate(before, true);
|
|
50
|
+
// What the delete's fold removes: a project's whole subtree, any other card's own documents.
|
|
51
|
+
const removed = before.kind === WorkcardKind.Project ? await hierarchy.descendants(before.id, before.entityId) : await hierarchy.documents(before.id, before.entityId);
|
|
52
|
+
const doomed = new Set([before.id, ...removed.map(card => card.id)]);
|
|
53
|
+
const incoming = await runtime.reader().links?.list({ entityId: before.entityId, to: [...doomed], toKind: PlanningResourceKind.Workcard }, { size: 0 });
|
|
54
|
+
for (const edge of incoming?.items ?? []) {
|
|
55
|
+
if (doomed.has(edge.from) || (edge.fromKind ?? PlanningResourceKind.Workcard) !== PlanningResourceKind.Workcard)
|
|
56
|
+
continue;
|
|
57
|
+
const owner = await runtime.reader().cards.get(edge.from, before.entityId);
|
|
58
|
+
if (owner != null && (await registryFor(owner)).type(owner.type).relationships?.some(rule => rule.name === edge.type && rule.field != null)) {
|
|
59
|
+
throw new RelationshipRefused(`reference-in-use:${edge.to}:${edge.from}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await hierarchy.validate(after);
|
|
66
|
+
const schemas = await registryFor(after);
|
|
67
|
+
validateHelper.validateCard(after, schemas);
|
|
68
|
+
if (after.kind !== WorkcardKind.Project && after.mode != null)
|
|
69
|
+
throw new FieldsInvalid('mode:project-only');
|
|
70
|
+
if (after.kind === WorkcardKind.Project && after.mode == null)
|
|
71
|
+
after.mode = ProjectMode.Opened;
|
|
72
|
+
const previous = before == null ? [] : await referencesOf(before);
|
|
73
|
+
for (const ref of await referencesOf(after))
|
|
74
|
+
await assertReference(after, ref, previous.some(entry => entry.type === ref.type && entry.to === ref.to && entry.toKind === ref.toKind));
|
|
75
|
+
const counted = new Map();
|
|
76
|
+
for (const link of transition.links ?? (transition.link != null ? [transition.link] : [])) {
|
|
77
|
+
const rule = schemas.type(after.type).relationships?.find(rule => rule.name === link.type);
|
|
78
|
+
if (rule == null)
|
|
79
|
+
throw new RelationshipRefused(`unknown:${link.type}`);
|
|
80
|
+
if ((link.toKind ?? PlanningResourceKind.Workcard) !== (rule.toKind ?? PlanningResourceKind.Workcard) || (link.fromKind ?? PlanningResourceKind.Workcard) !== PlanningResourceKind.Workcard)
|
|
81
|
+
throw new RelationshipRefused(`kind:${link.type}`);
|
|
82
|
+
if (link.from != null && link.from !== after.id)
|
|
83
|
+
throw new RelationshipRefused(`from:${link.from}`);
|
|
84
|
+
if (rule?.field != null)
|
|
85
|
+
throw new RelationshipRefused(`field-authoritative:${rule.field}`);
|
|
86
|
+
if (transition.action !== TransitionAction.Unlink) {
|
|
87
|
+
await assertReference(after, link, false);
|
|
88
|
+
if (rule.single) {
|
|
89
|
+
const destinations = counted.get(rule.name) ?? new Set();
|
|
90
|
+
destinations.add(link.to);
|
|
91
|
+
for (const edge of (await runtime.reader().links?.list({ entityId: after.entityId, from: after.id, type: rule.name }, { size: 0 }))?.items ?? [])
|
|
92
|
+
destinations.add(edge.to);
|
|
93
|
+
counted.set(rule.name, destinations);
|
|
94
|
+
if (destinations.size > 1)
|
|
95
|
+
throw new RelationshipRefused(`single:${rule.name}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (before != null && (before.parent !== after.parent || JSON.stringify(before.parents) !== JSON.stringify(after.parents))) {
|
|
100
|
+
const reader = runtime.reader();
|
|
101
|
+
const alternate = { ...runtime, reader: () => ({ ...reader, cards: { ...reader.cards, get: async (id, entityId) => id === after.id && entityId === after.entityId ? after : await reader.cards.get(id, entityId) } }) };
|
|
102
|
+
const hypothetical = makePlanningHierarchy(alternate);
|
|
103
|
+
for (const child of await hierarchy.descendants(after.id, after.entityId)) {
|
|
104
|
+
await hypothetical.validate(child);
|
|
105
|
+
await makePlanningInvariants(alternate).validate(child, child, { ...transition, links: undefined, link: undefined, action: TransitionAction.Update });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
references: async (after, transition) => {
|
|
110
|
+
const links = runtime.service().store(after.type).links;
|
|
111
|
+
if (links == null)
|
|
112
|
+
return;
|
|
113
|
+
const schemas = await registryFor(after);
|
|
114
|
+
const types = [PLANNING_REPORTER, PLANNING_ASSIGNEE, ...(schemas.type(after.type).relationships ?? []).filter(rule => rule.field != null).map(rule => rule.name)];
|
|
115
|
+
const wanted = await referencesOf(after);
|
|
116
|
+
const stored = await links.list({ entityId: after.entityId, from: after.id, type: types }, { size: 0 });
|
|
117
|
+
for (const link of stored.items)
|
|
118
|
+
if (!wanted.some(ref => ref.type === link.type && ref.to === link.to && (ref.toKind ?? PlanningResourceKind.Workcard) === (link.toKind ?? PlanningResourceKind.Workcard)))
|
|
119
|
+
await links.drop({ entityId: after.entityId, id: link.id });
|
|
120
|
+
for (const ref of wanted)
|
|
121
|
+
await links.put({ ...ref, from: after.id, fromKind: PlanningResourceKind.Workcard, entityId: after.entityId, createdAt: transition.at, transition: transition.id, project: transition.project });
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
return invariants;
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../src/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EACtF,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,GACpE,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAItD,qGAAqG;AACrG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAwB,EAAsB,EAAE;IACrF,MAAM,WAAW,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACzI,MAAM,YAAY,GAAG,KAAK,EAAE,IAAc,EAAgC,EAAE;QAC1E,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,IAAI,GAAwB,EAAE,CAAA;QACpC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC3H,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC3H,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;gBAAE,SAAQ;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrC,IAAI,KAAK,IAAI,IAAI;gBAAE,SAAQ;YAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,IAAI,CAAC,KAAK,SAAS,CAAC,CAAA;YAC3H,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;gBAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,IAAI,CAAC,KAAK,WAAW,CAAC,CAAA;YACvK,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAY,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjK,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,MAAM,eAAe,GAAG,KAAK,EAAE,IAAc,EAAE,GAAsB,EAAE,QAAiB,EAAiB,EAAE;QACzG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,KAAK,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;YACxG,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;gBACnF,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnG,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,mBAAmB,CAAC,aAAa,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;QACrH,MAAM,IAAI,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1G,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7H,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5I,IAAI,IAAI,KAAK,oBAAoB,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,mBAAmB,CAAC,oBAAoB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/J,CAAC,CAAA;IACD,MAAM,UAAU,GAAuB;QACrC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;YAChD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;oBACtC,6FAA6F;oBAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,EAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;oBACxK,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC,CAAC,CAAA;oBACtE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;oBACvJ,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;wBACzC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,oBAAoB,CAAC,QAAQ;4BAAE,SAAQ;wBACzH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;wBAC1E,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;4BAC5I,MAAM,IAAI,mBAAmB,CAAC,oBAAoB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;wBAC3E,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAM;YACR,CAAC;YACD,MAAM,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;YACxC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI;gBAAE,MAAM,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAAA;YAC3G,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAA;YAC9F,MAAM,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;YACjE,KAAK,MAAM,GAAG,IAAI,MAAM,YAAY,CAAC,KAAK,CAAC;gBAAE,MAAM,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;YACrL,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAA;YAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC1F,IAAI,IAAI,IAAI,IAAI;oBAAE,MAAM,IAAI,mBAAmB,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBACvE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,oBAAoB,CAAC,QAAQ;oBAAE,MAAM,IAAI,mBAAmB,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/O,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;oBAAE,MAAM,IAAI,mBAAmB,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBACnG,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI;oBAAE,MAAM,IAAI,mBAAmB,CAAC,uBAAuB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC3F,IAAI,UAAU,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBAClD,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;oBACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;wBAChE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBACzB,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;4BAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBAC3K,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;wBACpC,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC;4BAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC3H,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;gBAC/B,MAAM,SAAS,GAAoB,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;gBACxO,MAAM,YAAY,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;gBACrD,KAAK,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3E,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;oBAClC,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAA;gBACvJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAA;YACvD,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAM;YACzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;YACxC,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACjK,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YACvG,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;oBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YACvQ,KAAK,MAAM,GAAG,IAAI,MAAM;gBAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,EAAG,EAAE,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7N,CAAC;KACF,CAAA;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
|
package/build/projection.d.ts
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import type { BasicConfig, BasicContext } from '@owlmeans/context';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ProjectionRequest } from './queue/index.js';
|
|
2
|
+
import type { ProjectionRequest } from './queue/types.js';
|
|
4
3
|
import type { JobProcessor, QueueHooks } from '@owlmeans/queue';
|
|
4
|
+
import type { ProjectionOptions } from './types.js';
|
|
5
5
|
import type { FoldResult } from './store/types.js';
|
|
6
|
-
export interface ProjectionOptions {
|
|
7
|
-
/** The planning service alias. */
|
|
8
|
-
service?: string;
|
|
9
|
-
/** The store the queue folds — the service's default store when omitted. */
|
|
10
|
-
store?: (service: PlanningService) => PlanningStore;
|
|
11
|
-
/** Where events go — the store's commit hub `publish` when it has one. */
|
|
12
|
-
publish?: (event: CommitEvent) => Promise<void>;
|
|
13
|
-
}
|
|
14
6
|
/**
|
|
15
7
|
* The body of a projection job: fold one card with the service's `committed` as the commit
|
|
16
8
|
* listener, so the `after` chain runs in the process that took the job.
|
|
@@ -24,5 +16,7 @@ export declare const makeProjectionProcessor: (ctx: BasicContext<BasicConfig>, o
|
|
|
24
16
|
* failed event is published — otherwise `execute({ wait: true })` and `commits.wait` hang to their
|
|
25
17
|
* timeout. Merge it into the queue driver's hooks.
|
|
26
18
|
*/
|
|
19
|
+
export declare const makePlanningQueueHooks: (ctx: BasicContext<BasicConfig>, opts?: ProjectionOptions) => QueueHooks;
|
|
20
|
+
/** @deprecated compat:factory-refactor — use `makePlanningQueueHooks(…)` */
|
|
27
21
|
export declare const planningQueueHooks: (ctx: BasicContext<BasicConfig>, opts?: ProjectionOptions) => QueueHooks;
|
|
28
22
|
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAW7D;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,QAC7B,YAAY,CAAC,WAAW,CAAC,SAAS,iBAAiB,KACvD,YAAY,CAAC,iBAAiB,EAAE,UAAU,CAU5C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAS,YAAY,CAAC,WAAW,CAAC,SAAS,iBAAiB,KAAG,UAUhG,CAAA;AAEF,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,QAAS,YAAY,CAAC,WAAW,CAAC,SAAS,iBAAiB,KAAG,UAC3D,CAAA"}
|
package/build/projection.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PLANNING_SERVICE } from '@owlmeans/planning';
|
|
2
|
-
import { PLANNING_PROJECT_JOB, PLANNING_PROJECTION_QUEUE } from './queue/
|
|
3
|
-
import {
|
|
2
|
+
import { PLANNING_PROJECT_JOB, PLANNING_PROJECTION_QUEUE } from './queue/consts.js';
|
|
3
|
+
import { foldHelper } from './store/fold.js';
|
|
4
4
|
const serviceOf = (ctx, opts) => ctx.service(opts?.service ?? PLANNING_SERVICE);
|
|
5
5
|
const storeOf = (service, opts) => opts?.store?.(service) ?? service.store();
|
|
6
6
|
const publisherOf = (store, opts) => opts?.publish ?? store.commits?.publish;
|
|
@@ -15,7 +15,7 @@ export const makeProjectionProcessor = (ctx, opts) => async (job) => {
|
|
|
15
15
|
const service = serviceOf(ctx, opts);
|
|
16
16
|
const store = storeOf(service, opts);
|
|
17
17
|
const publish = publisherOf(store, opts);
|
|
18
|
-
return await foldPending(store, job.data.cardId, job.data.entityId, {
|
|
18
|
+
return await foldHelper.foldPending(store, job.data.cardId, job.data.entityId, {
|
|
19
19
|
touch: job.touch,
|
|
20
20
|
onCommitted: async (event) => { await service.committed(event); },
|
|
21
21
|
...(publish != null ? { publish } : {}),
|
|
@@ -26,7 +26,7 @@ export const makeProjectionProcessor = (ctx, opts) => async (job) => {
|
|
|
26
26
|
* failed event is published — otherwise `execute({ wait: true })` and `commits.wait` hang to their
|
|
27
27
|
* timeout. Merge it into the queue driver's hooks.
|
|
28
28
|
*/
|
|
29
|
-
export const
|
|
29
|
+
export const makePlanningQueueHooks = (ctx, opts) => ({
|
|
30
30
|
onJobDead: async (job, reason) => {
|
|
31
31
|
if (job.queue !== PLANNING_PROJECTION_QUEUE || job.name !== PLANNING_PROJECT_JOB) {
|
|
32
32
|
return;
|
|
@@ -34,7 +34,9 @@ export const planningQueueHooks = (ctx, opts) => ({
|
|
|
34
34
|
const request = job.data;
|
|
35
35
|
const store = storeOf(serviceOf(ctx, opts), opts);
|
|
36
36
|
const publish = publisherOf(store, opts);
|
|
37
|
-
await failPending(store, request.cardId, request.entityId, reason, publish != null ? { publish } : {});
|
|
37
|
+
await foldHelper.failPending(store, request.cardId, request.entityId, reason, publish != null ? { publish } : {});
|
|
38
38
|
},
|
|
39
39
|
});
|
|
40
|
+
/** @deprecated compat:factory-refactor — use `makePlanningQueueHooks(…)` */
|
|
41
|
+
export const planningQueueHooks = (ctx, opts) => makePlanningQueueHooks(ctx, opts);
|
|
40
42
|
//# sourceMappingURL=projection.js.map
|
package/build/projection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAA4C,MAAM,oBAAoB,CAAA;AAC/F,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAGnF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,MAAM,SAAS,GAAG,CAAC,GAA8B,EAAE,IAAwB,EAAmB,EAAE,CAC9F,GAAG,CAAC,OAAO,CAAsB,IAAI,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAA;AAErE,MAAM,OAAO,GAAG,CAAC,OAAwB,EAAE,IAAwB,EAAiB,EAAE,CACpF,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAA;AAE3C,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,IAAwB,EAAE,EAAE,CACrE,IAAI,EAAE,OAAO,IAAK,KAAK,CAAC,OAA0C,EAAE,OAAO,CAAA;AAE7E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,GAA8B,EAAE,IAAwB,EACX,EAAE,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAExC,OAAO,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC7E,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;QAC9D,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAA8B,EAAE,IAAwB,EAAc,EAAE,CAAC,CAAC;IAC/G,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC/B,IAAI,GAAG,CAAC,KAAK,KAAK,yBAAyB,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACjF,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAyB,CAAA;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACxC,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnH,CAAC;CACF,CAAC,CAAA;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAA8B,EAAE,IAAwB,EAAc,EAAE,CACzG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The server-side queue used to project planning transitions. */
|
|
2
|
+
export declare const PLANNING_PROJECTION_QUEUE = "planning-projection";
|
|
3
|
+
/** The processor name accepted by the planning projection queue. */
|
|
4
|
+
export declare const PLANNING_PROJECT_JOB = "planning:project";
|
|
5
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/queue/consts.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The server-side queue used to project planning transitions. */
|
|
2
|
+
export const PLANNING_PROJECTION_QUEUE = 'planning-projection';
|
|
3
|
+
/** The processor name accepted by the planning projection queue. */
|
|
4
|
+
export const PLANNING_PROJECT_JOB = 'planning:project';
|
|
5
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/queue/consts.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAA;AAE9D,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Config } from '@owlmeans/queue';
|
|
2
|
+
import type { PlanningQueueOptions } from './types.js';
|
|
3
|
+
/** Declare the shared projection address; each process separately chooses whether to listen. */
|
|
4
|
+
export declare const declarePlanningQueue: <C extends Config>(cfg: C, opts?: PlanningQueueOptions) => C;
|
|
5
|
+
//# sourceMappingURL=declare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare.d.ts","sourceRoot":"","sources":["../../src/queue/declare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,gGAAgG;AAChG,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,OAAO,CAAC,SAAS,oBAAoB,KAAG,CACjB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { declareQueue } from '@owlmeans/queue';
|
|
2
|
+
import { PLANNING_PROJECT_JOB, PLANNING_PROJECTION_QUEUE } from './consts.js';
|
|
3
|
+
/** Declare the shared projection address; each process separately chooses whether to listen. */
|
|
4
|
+
export const declarePlanningQueue = (cfg, opts) => declareQueue(cfg, PLANNING_PROJECTION_QUEUE, [PLANNING_PROJECT_JOB], opts);
|
|
5
|
+
//# sourceMappingURL=declare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare.js","sourceRoot":"","sources":["../../src/queue/declare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAG7E,gGAAgG;AAChG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAmB,GAAM,EAAE,IAA2B,EAAK,EAAE,CAC/F,YAAY,CAAC,GAAG,EAAE,yBAAyB,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAA"}
|
package/build/queue/index.d.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
/** The processor name accepted by the planning projection queue. */
|
|
5
|
-
export declare const PLANNING_PROJECT_JOB = "planning:project";
|
|
6
|
-
/** What one projection job folds. */
|
|
7
|
-
export interface ProjectionRequest {
|
|
8
|
-
cardId: string;
|
|
9
|
-
entityId: string;
|
|
10
|
-
/** The transition that requested projection; it is a hint rather than a fold bound. */
|
|
11
|
-
transition?: string;
|
|
12
|
-
}
|
|
13
|
-
export interface PlanningQueueOptions {
|
|
14
|
-
worker?: QueueWorkerOptions;
|
|
15
|
-
defaults?: JobOptions;
|
|
16
|
-
}
|
|
17
|
-
/** Declare the shared projection address; each process separately chooses whether to listen. */
|
|
18
|
-
export declare const declarePlanningQueue: <C extends Config>(cfg: C, opts?: PlanningQueueOptions) => C;
|
|
1
|
+
export { declarePlanningQueue } from './declare.js';
|
|
2
|
+
export { PLANNING_PROJECTION_QUEUE, PLANNING_PROJECT_JOB } from './consts.js';
|
|
3
|
+
export type { PlanningQueueOptions, ProjectionRequest } from './types.js';
|
|
19
4
|
//# sourceMappingURL=index.d.ts.map
|