@powerhousedao/shared 6.2.3-dev.4 → 6.2.3-dev.40
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/dist/analytics/index.d.ts +4 -4
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +25 -24
- package/dist/analytics/index.js.map +1 -1
- package/dist/clis/args/{access-token-To5LaIfL.mjs → access-token-3Hqv_U8I.mjs} +2 -2
- package/dist/clis/args/{access-token-To5LaIfL.mjs.map → access-token-3Hqv_U8I.mjs.map} +1 -1
- package/dist/clis/args/access-token-C5sKsH2O.d.mts +16 -0
- package/dist/clis/args/access-token-C5sKsH2O.d.mts.map +1 -0
- package/dist/clis/args/access-token.d.mts +3 -2
- package/dist/clis/args/access-token.mjs +1 -1
- package/dist/clis/args/{common-CcYbXrBx.mjs → common-BXabdhiO.mjs} +30 -7
- package/dist/clis/args/common-BXabdhiO.mjs.map +1 -0
- package/dist/clis/args/common-Bnm859xU.d.mts +186 -0
- package/dist/clis/args/common-Bnm859xU.d.mts.map +1 -0
- package/dist/clis/args/common.d.mts +3 -2
- package/dist/clis/args/common.mjs +1 -1
- package/dist/clis/args/{connect-BVVvCmL9.mjs → connect-BG3HkYBk.mjs} +8 -3
- package/dist/clis/args/connect-BG3HkYBk.mjs.map +1 -0
- package/dist/clis/args/connect-DjeiqXus.d.mts +450 -0
- package/dist/clis/args/connect-DjeiqXus.d.mts.map +1 -0
- package/dist/clis/args/connect.d.mts +3 -2
- package/dist/clis/args/connect.mjs +1 -1
- package/dist/clis/args/{generate-CA916Fvj.mjs → generate-BOItUNvP.mjs} +40 -2
- package/dist/clis/args/generate-BOItUNvP.mjs.map +1 -0
- package/dist/clis/args/generate-BPBBLeUD.d.mts +103 -0
- package/dist/clis/args/generate-BPBBLeUD.d.mts.map +1 -0
- package/dist/clis/args/generate.d.mts +3 -2
- package/dist/clis/args/generate.mjs +1 -1
- package/dist/clis/args/{help-Bqbgbalu.mjs → help-DS1NlcJQ.mjs} +15 -15
- package/dist/clis/args/{help-Bqbgbalu.mjs.map → help-DS1NlcJQ.mjs.map} +1 -1
- package/dist/clis/args/help-DVPTARGn.d.mts +190 -0
- package/dist/clis/args/help-DVPTARGn.d.mts.map +1 -0
- package/dist/clis/args/help.d.mts +3 -2
- package/dist/clis/args/help.mjs +1 -1
- package/dist/clis/args/index.d.mts +20 -19
- package/dist/clis/args/index.mjs +18 -18
- package/dist/clis/args/init-CFeTq4Cq.d.mts +52 -0
- package/dist/clis/args/init-CFeTq4Cq.d.mts.map +1 -0
- package/dist/clis/args/{init-rz9Ei7nq.mjs → init-Dvb42Y87.mjs} +2 -2
- package/dist/clis/args/{init-rz9Ei7nq.mjs.map → init-Dvb42Y87.mjs.map} +1 -1
- package/dist/clis/args/init.d.mts +3 -2
- package/dist/clis/args/init.mjs +1 -1
- package/dist/clis/args/inspect-BjRmtB86.d.mts +13 -0
- package/dist/clis/args/inspect-BjRmtB86.d.mts.map +1 -0
- package/dist/clis/args/{inspect-tckH8mSw.mjs → inspect-UNQgtuR0.mjs} +2 -2
- package/dist/clis/args/{inspect-tckH8mSw.mjs.map → inspect-UNQgtuR0.mjs.map} +1 -1
- package/dist/clis/args/inspect.d.mts +3 -2
- package/dist/clis/args/inspect.mjs +1 -1
- package/dist/clis/args/install-B0tMyUMw.d.mts +37 -0
- package/dist/clis/args/install-B0tMyUMw.d.mts.map +1 -0
- package/dist/clis/args/{install-Sz2DlCHh.mjs → install-F-27kF6m.mjs} +2 -2
- package/dist/clis/args/{install-Sz2DlCHh.mjs.map → install-F-27kF6m.mjs.map} +1 -1
- package/dist/clis/args/install.d.mts +3 -2
- package/dist/clis/args/install.mjs +1 -1
- package/dist/clis/args/{list-DM2d6f1m.mjs → list-Bkfn8Yuo.mjs} +2 -2
- package/dist/clis/args/{list-DM2d6f1m.mjs.map → list-Bkfn8Yuo.mjs.map} +1 -1
- package/dist/clis/args/list-DrbxA7JJ.d.mts +10 -0
- package/dist/clis/args/list-DrbxA7JJ.d.mts.map +1 -0
- package/dist/clis/args/list.d.mts +3 -2
- package/dist/clis/args/list.mjs +1 -1
- package/dist/clis/args/{login-DiKT5Jfu.mjs → login-CIFkQExi.mjs} +2 -2
- package/dist/clis/args/{login-DiKT5Jfu.mjs.map → login-CIFkQExi.mjs.map} +1 -1
- package/dist/clis/args/login-CXRJXg71.d.mts +25 -0
- package/dist/clis/args/login-CXRJXg71.d.mts.map +1 -0
- package/dist/clis/args/login.d.mts +3 -2
- package/dist/clis/args/login.mjs +1 -1
- package/dist/clis/args/{magic-string.es-h_0HDQBQ.mjs → magic-string.es-BWtG0AyA.mjs} +33 -27
- package/dist/clis/args/magic-string.es-BWtG0AyA.mjs.map +1 -0
- package/dist/clis/args/migrate-DkCQRL2D.d.mts +19 -0
- package/dist/clis/args/migrate-DkCQRL2D.d.mts.map +1 -0
- package/dist/clis/args/{migrate-CG_gWc4k.mjs → migrate-DwJGhc2d.mjs} +2 -2
- package/dist/clis/args/{migrate-CG_gWc4k.mjs.map → migrate-DwJGhc2d.mjs.map} +1 -1
- package/dist/clis/args/migrate.d.mts +3 -2
- package/dist/clis/args/migrate.mjs +1 -1
- package/dist/clis/args/publish-CeW4bOrl.d.mts +16 -0
- package/dist/clis/args/publish-CeW4bOrl.d.mts.map +1 -0
- package/dist/clis/args/{publish-DDZYsUfV.mjs → publish-DHqlGWmL.mjs} +2 -2
- package/dist/clis/args/{publish-DDZYsUfV.mjs.map → publish-DHqlGWmL.mjs.map} +1 -1
- package/dist/clis/args/publish.d.mts +3 -2
- package/dist/clis/args/publish.mjs +1 -1
- package/dist/clis/args/{registry-C_OVFQmI.mjs → registry-DIwES3l2.mjs} +2 -2
- package/dist/clis/args/{registry-C_OVFQmI.mjs.map → registry-DIwES3l2.mjs.map} +1 -1
- package/dist/clis/args/registry-DNH8xuaE.d.mts +17 -0
- package/dist/clis/args/registry-DNH8xuaE.d.mts.map +1 -0
- package/dist/clis/args/registry.d.mts +3 -2
- package/dist/clis/args/registry.mjs +1 -1
- package/dist/clis/args/service-CHjY5epu.d.mts +27 -0
- package/dist/clis/args/service-CHjY5epu.d.mts.map +1 -0
- package/dist/clis/args/{service-CHOOr0Gg.mjs → service-Cpjlyeu5.mjs} +2 -2
- package/dist/clis/args/{service-CHOOr0Gg.mjs.map → service-Cpjlyeu5.mjs.map} +1 -1
- package/dist/clis/args/service.d.mts +3 -2
- package/dist/clis/args/service.mjs +1 -1
- package/dist/clis/args/{switchboard-Dsp7nosi.mjs → switchboard-CCaAtU56.mjs} +2 -2
- package/dist/clis/args/{switchboard-Dsp7nosi.mjs.map → switchboard-CCaAtU56.mjs.map} +1 -1
- package/dist/clis/args/switchboard-RrNb1fUH.d.mts +70 -0
- package/dist/clis/args/switchboard-RrNb1fUH.d.mts.map +1 -0
- package/dist/clis/args/switchboard.d.mts +3 -2
- package/dist/clis/args/switchboard.mjs +1 -1
- package/dist/clis/args/{uninstall-CTwTX0u_.mjs → uninstall-3U0B8g5c.mjs} +2 -2
- package/dist/clis/args/{uninstall-CTwTX0u_.mjs.map → uninstall-3U0B8g5c.mjs.map} +1 -1
- package/dist/clis/args/uninstall-CDx7lwxn.d.mts +28 -0
- package/dist/clis/args/uninstall-CDx7lwxn.d.mts.map +1 -0
- package/dist/clis/args/uninstall.d.mts +3 -2
- package/dist/clis/args/uninstall.mjs +1 -1
- package/dist/clis/args/unpublish-CEDsk6uv.d.mts +22 -0
- package/dist/clis/args/unpublish-CEDsk6uv.d.mts.map +1 -0
- package/dist/clis/args/{unpublish-BPMkGEg5.mjs → unpublish-s9zUh6Gw.mjs} +2 -2
- package/dist/clis/args/{unpublish-BPMkGEg5.mjs.map → unpublish-s9zUh6Gw.mjs.map} +1 -1
- package/dist/clis/args/unpublish.d.mts +3 -2
- package/dist/clis/args/unpublish.mjs +1 -1
- package/dist/clis/args/{vetra-b4KUu1Ax.mjs → vetra-BUNlAAPp.mjs} +2 -2
- package/dist/clis/args/{vetra-b4KUu1Ax.mjs.map → vetra-BUNlAAPp.mjs.map} +1 -1
- package/dist/clis/args/vetra-DkDaWFPi.d.mts +111 -0
- package/dist/clis/args/vetra-DkDaWFPi.d.mts.map +1 -0
- package/dist/clis/args/vetra-ports.test.d.mts +2 -1
- package/dist/clis/args/vetra-ports.test.mjs +285 -180
- package/dist/clis/args/vetra-ports.test.mjs.map +1 -1
- package/dist/clis/args/vetra.d.mts +3 -2
- package/dist/clis/args/vetra.mjs +1 -1
- package/dist/clis/build-config-CR5lvv_A.mjs +231 -0
- package/dist/clis/build-config-CR5lvv_A.mjs.map +1 -0
- package/dist/clis/build-config.d.mts +44 -10614
- package/dist/clis/build-config.d.mts.map +1 -1
- package/dist/clis/build-config.mjs +2 -88
- package/dist/clis/build-pieces.d.mts +100 -0
- package/dist/clis/build-pieces.d.mts.map +1 -0
- package/dist/clis/build-pieces.mjs +371 -0
- package/dist/clis/build-pieces.mjs.map +1 -0
- package/dist/clis/command-names.d.mts +2 -2
- package/dist/clis/command-names.d.mts.map +1 -1
- package/dist/clis/command-names.mjs.map +1 -1
- package/dist/clis/constants.d.mts +3 -462
- package/dist/clis/constants.mjs +25 -8
- package/dist/clis/constants.mjs.map +1 -1
- package/dist/clis/index-6CZwrmQi.d.mts +11154 -0
- package/dist/clis/index-6CZwrmQi.d.mts.map +1 -0
- package/dist/clis/index.d.mts +1382 -1221
- package/dist/clis/index.d.mts.map +1 -1
- package/dist/clis/index.mjs +257 -71
- package/dist/clis/index.mjs.map +1 -1
- package/dist/clis/project-env.d.mts +4 -4
- package/dist/clis/project-env.d.mts.map +1 -1
- package/dist/clis/project-env.mjs.map +1 -1
- package/dist/clis/project-ports.d.mts +5 -5
- package/dist/clis/project-ports.d.mts.map +1 -1
- package/dist/clis/project-ports.mjs +1 -1
- package/dist/clis/project-ports.mjs.map +1 -1
- package/dist/clis/services/telemetry.d.mts +7 -7
- package/dist/clis/services/telemetry.d.mts.map +1 -1
- package/dist/clis/services/telemetry.mjs.map +1 -1
- package/dist/clis/types-DM26OWlT.d.mts +541 -0
- package/dist/clis/types-DM26OWlT.d.mts.map +1 -0
- package/dist/clis/utils.d.mts +4 -4
- package/dist/clis/utils.d.mts.map +1 -1
- package/dist/clis/utils.mjs.map +1 -1
- package/dist/{config-loader-B845Hidf.js → config-loader-CXhzL512.js} +33 -8
- package/dist/config-loader-CXhzL512.js.map +1 -0
- package/dist/connect/config-loader.d.ts +15 -8
- package/dist/connect/config-loader.d.ts.map +1 -1
- package/dist/connect/config-loader.js +2 -2
- package/dist/connect/index.d.ts +190 -56
- package/dist/connect/index.d.ts.map +1 -1
- package/dist/connect/index.js +303 -30
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/json-adapter.d.ts +3 -4
- package/dist/connect/json-adapter.d.ts.map +1 -1
- package/dist/connect/json-adapter.js.map +1 -1
- package/dist/constants-CZasmdmu.d.ts +9 -0
- package/dist/constants-CZasmdmu.d.ts.map +1 -0
- package/dist/constants.d.ts +3 -2
- package/dist/constants.js +11 -5
- package/dist/constants.js.map +1 -1
- package/dist/document-drive/index.d.ts +131 -105
- package/dist/document-drive/index.d.ts.map +1 -1
- package/dist/document-drive/index.js +116 -54
- package/dist/document-drive/index.js.map +1 -1
- package/dist/document-model/index.d.ts +4 -4
- package/dist/document-model/index.js +294 -231
- package/dist/document-model/index.js.map +1 -1
- package/dist/document-model/mock.d.ts +2 -3
- package/dist/document-model/mock.d.ts.map +1 -1
- package/dist/document-model/mock.js +2 -1
- package/dist/document-model/mock.js.map +1 -1
- package/dist/document-model/utils.d.ts +3 -2
- package/dist/document-model/utils.js +1 -1
- package/dist/index-DdXp-CVw.d.ts +36 -0
- package/dist/index-DdXp-CVw.d.ts.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.js.map +1 -1
- package/dist/processors/index.d.ts +3 -2
- package/dist/processors/index.js +63 -4
- package/dist/processors/index.js.map +1 -1
- package/dist/purge-v06m_oGz.js +381 -0
- package/dist/purge-v06m_oGz.js.map +1 -0
- package/dist/registry/index.d.ts +15 -15
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +24 -6
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/manifest-slim.d.ts +4 -3
- package/dist/registry/manifest-slim.d.ts.map +1 -1
- package/dist/registry/manifest-slim.js +21 -0
- package/dist/registry/manifest-slim.js.map +1 -1
- package/dist/registry/updates.d.ts +3 -3
- package/dist/registry/updates.d.ts.map +1 -1
- package/dist/registry/updates.js.map +1 -1
- package/dist/registry/urls.d.ts +2 -2
- package/dist/registry/urls.d.ts.map +1 -1
- package/dist/registry/urls.js.map +1 -1
- package/dist/{types-YqLqb0Zb.d.ts → types-B11NGQOQ.d.ts} +39 -43
- package/dist/types-B11NGQOQ.d.ts.map +1 -0
- package/dist/{types-C1in4fl3.d.ts → types-Bsp8VL2y.d.ts} +2 -2
- package/dist/types-Bsp8VL2y.d.ts.map +1 -0
- package/dist/{types-CpnWmiFY.d.ts → types-CFbd2nan.d.ts} +2012 -821
- package/dist/types-CFbd2nan.d.ts.map +1 -0
- package/dist/{utils-DP122OSS.d.ts → utils-BrKxCmKx.d.ts} +2 -2
- package/dist/utils-BrKxCmKx.d.ts.map +1 -0
- package/dist/{utils-aaTmfxFW.js → utils-CSF716ux.js} +10 -3
- package/dist/utils-CSF716ux.js.map +1 -0
- package/package.json +10 -5
- package/dist/clis/args/access-token--9H57y8J.d.mts +0 -18
- package/dist/clis/args/access-token--9H57y8J.d.mts.map +0 -1
- package/dist/clis/args/common-CcYbXrBx.mjs.map +0 -1
- package/dist/clis/args/common-zPBoTNJF.d.mts +0 -183
- package/dist/clis/args/common-zPBoTNJF.d.mts.map +0 -1
- package/dist/clis/args/connect-BVVvCmL9.mjs.map +0 -1
- package/dist/clis/args/connect-BtU0MTTc.d.mts +0 -443
- package/dist/clis/args/connect-BtU0MTTc.d.mts.map +0 -1
- package/dist/clis/args/generate-CA916Fvj.mjs.map +0 -1
- package/dist/clis/args/generate-DnV-bfXt.d.mts +0 -87
- package/dist/clis/args/generate-DnV-bfXt.d.mts.map +0 -1
- package/dist/clis/args/help-CjAsudUn.d.mts +0 -193
- package/dist/clis/args/help-CjAsudUn.d.mts.map +0 -1
- package/dist/clis/args/init-CUXyfquF.d.mts +0 -55
- package/dist/clis/args/init-CUXyfquF.d.mts.map +0 -1
- package/dist/clis/args/inspect-DtZeoA5c.d.mts +0 -15
- package/dist/clis/args/inspect-DtZeoA5c.d.mts.map +0 -1
- package/dist/clis/args/install-CkP8zcHb.d.mts +0 -40
- package/dist/clis/args/install-CkP8zcHb.d.mts.map +0 -1
- package/dist/clis/args/list-BGf8s_gj.d.mts +0 -12
- package/dist/clis/args/list-BGf8s_gj.d.mts.map +0 -1
- package/dist/clis/args/login-DNsHwvqk.d.mts +0 -27
- package/dist/clis/args/login-DNsHwvqk.d.mts.map +0 -1
- package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs.map +0 -1
- package/dist/clis/args/migrate-sixkWhxm.d.mts +0 -21
- package/dist/clis/args/migrate-sixkWhxm.d.mts.map +0 -1
- package/dist/clis/args/publish-Dqe5DUst.d.mts +0 -18
- package/dist/clis/args/publish-Dqe5DUst.d.mts.map +0 -1
- package/dist/clis/args/registry-C_RfTsKB.d.mts +0 -19
- package/dist/clis/args/registry-C_RfTsKB.d.mts.map +0 -1
- package/dist/clis/args/service-DhIkf8-O.d.mts +0 -22
- package/dist/clis/args/service-DhIkf8-O.d.mts.map +0 -1
- package/dist/clis/args/switchboard-BlPaq2at.d.mts +0 -72
- package/dist/clis/args/switchboard-BlPaq2at.d.mts.map +0 -1
- package/dist/clis/args/uninstall-BpA3YYbw.d.mts +0 -31
- package/dist/clis/args/uninstall-BpA3YYbw.d.mts.map +0 -1
- package/dist/clis/args/unpublish-CvwaIimG.d.mts +0 -24
- package/dist/clis/args/unpublish-CvwaIimG.d.mts.map +0 -1
- package/dist/clis/args/vetra-CoMvTJK7.d.mts +0 -113
- package/dist/clis/args/vetra-CoMvTJK7.d.mts.map +0 -1
- package/dist/clis/build-config.mjs.map +0 -1
- package/dist/clis/constants.d.mts.map +0 -1
- package/dist/config-loader-B845Hidf.js.map +0 -1
- package/dist/constants-BP_gjn8g.d.ts +0 -8
- package/dist/constants-BP_gjn8g.d.ts.map +0 -1
- package/dist/index-C_iVZe7f.d.ts +0 -7
- package/dist/index-C_iVZe7f.d.ts.map +0 -1
- package/dist/index-DyYIJtVy.d.ts +0 -836
- package/dist/index-DyYIJtVy.d.ts.map +0 -1
- package/dist/types-C1in4fl3.d.ts.map +0 -1
- package/dist/types-CpnWmiFY.d.ts.map +0 -1
- package/dist/types-YqLqb0Zb.d.ts.map +0 -1
- package/dist/utils-DP122OSS.d.ts.map +0 -1
- package/dist/utils-aaTmfxFW.js.map +0 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { a as base58Decode, c as buildOperationSignatureParams, d as hex2ab, i as ab2hex, l as
|
|
1
|
+
import { a as base58Decode, c as buildOperationSignatureParams, d as hashBrowser, f as hex2ab, i as ab2hex, l as bytesToBase64Url, n as generateId, o as base64UrlToBytes, r as generateMock, s as buildOperationSignatureMessage, t as deriveOperationId, u as getUnixTimestamp } from "../utils-CSF716ux.js";
|
|
2
|
+
import { A as signActionV2, C as DOCUMENT_SCOPE_ACTION_TYPES, D as canonicalJson, E as actionSigningTarget, M as v2TupleProblem, O as hashActionV2, S as CanonicalJsonError, T as actionSignerIdentity, _ as mergePeerCapabilities, a as purgedProtocolVersions, b as selectProtocolVersions, c as PEER_CAPABILITIES, d as holdReason, f as isOlderManifest, g as manifestRevision, h as localSupports, i as purgeMarkerOperation, j as targetDocumentId, k as isV2ActionHash, l as PEER_MANIFEST_FORMAT, m as localPeerManifest, n as isPurgeMarker, o as DOCUMENT_PURGE_PROTOCOL, p as legacySupports, r as purgeDocumentAction, s as MARKER_REFUSAL_FEATURE, t as PURGE_DOCUMENT, u as coversLocal, v as peerSupports, w as actionPreimageV2, x as ACTION_SIGNATURE_V2_PREFIX, y as readPeerManifest } from "../purge-v06m_oGz.js";
|
|
2
3
|
import { ZodError, z } from "zod";
|
|
3
4
|
import { stringify } from "safe-stable-stringify";
|
|
5
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
4
6
|
import { strFromU8, strToU8, unzip, zip } from "fflate";
|
|
5
|
-
import { castDraft, create, unsafe } from "mutative";
|
|
7
|
+
import { castDraft, create, isDraft, original, unsafe } from "mutative";
|
|
6
8
|
import { constantCase, pascalCase } from "change-case";
|
|
7
9
|
//#region document-model/signatures.ts
|
|
8
10
|
/**
|
|
@@ -198,7 +200,7 @@ var GrantNotFoundError = class extends Error {
|
|
|
198
200
|
}
|
|
199
201
|
};
|
|
200
202
|
/**
|
|
201
|
-
* Thrown when a disallowed action (UNDO, REDO
|
|
203
|
+
* Thrown when a disallowed action (UNDO, REDO) targets the auth scope.
|
|
202
204
|
*/
|
|
203
205
|
var AuthActionNotAllowedError = class extends Error {
|
|
204
206
|
actionType;
|
|
@@ -257,8 +259,6 @@ var UnsupportedDocumentModelVersionError = class extends Error {
|
|
|
257
259
|
//#region document-model/schemas.ts
|
|
258
260
|
const isDefinedNonNullAny = (v) => v !== void 0 && v !== null;
|
|
259
261
|
const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v));
|
|
260
|
-
const Load_StateSchema = z.enum(["LOAD_STATE"]);
|
|
261
|
-
const PruneSchema = z.enum(["PRUNE"]);
|
|
262
262
|
const RedoSchema = z.enum(["REDO"]);
|
|
263
263
|
const Set_NameSchema = z.enum(["SET_NAME"]);
|
|
264
264
|
const Set_PreferredEditorSchema = z.enum(["SET_PREFERRED_EDITOR"]);
|
|
@@ -268,50 +268,12 @@ function OperationScopeSchema() {
|
|
|
268
268
|
}
|
|
269
269
|
function DocumentActionSchema() {
|
|
270
270
|
return z.union([
|
|
271
|
-
LoadStateActionSchema(),
|
|
272
|
-
PruneActionSchema(),
|
|
273
271
|
RedoActionSchema(),
|
|
274
272
|
SetNameActionSchema(),
|
|
275
273
|
SetPreferredEditorActionSchema(),
|
|
276
274
|
UndoActionSchema()
|
|
277
275
|
]);
|
|
278
276
|
}
|
|
279
|
-
function LoadStateActionSchema() {
|
|
280
|
-
return z.object({
|
|
281
|
-
id: z.string(),
|
|
282
|
-
timestampUtcMs: z.string(),
|
|
283
|
-
input: z.lazy(() => LoadStateActionInputSchema()),
|
|
284
|
-
type: Load_StateSchema,
|
|
285
|
-
scope: OperationScopeSchema()
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
function LoadStateActionInputSchema() {
|
|
289
|
-
return z.object({
|
|
290
|
-
operations: z.number(),
|
|
291
|
-
state: z.lazy(() => LoadStateActionStateInputSchema())
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
function LoadStateActionStateInputSchema() {
|
|
295
|
-
return z.object({
|
|
296
|
-
data: z.unknown().nullish(),
|
|
297
|
-
name: z.string()
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
function PruneActionSchema() {
|
|
301
|
-
return z.object({
|
|
302
|
-
id: z.string(),
|
|
303
|
-
timestampUtcMs: z.string(),
|
|
304
|
-
input: z.lazy(() => PruneActionInputSchema()),
|
|
305
|
-
type: PruneSchema,
|
|
306
|
-
scope: OperationScopeSchema()
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
function PruneActionInputSchema() {
|
|
310
|
-
return z.object({
|
|
311
|
-
end: z.number().nullish(),
|
|
312
|
-
start: z.number().nullish()
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
277
|
function RedoActionInputSchema() {
|
|
316
278
|
return z.object({ count: z.number() });
|
|
317
279
|
}
|
|
@@ -729,6 +691,13 @@ const PowerhouseModuleSchema = z.object({
|
|
|
729
691
|
documentTypes: z.array(z.string()).optional()
|
|
730
692
|
});
|
|
731
693
|
const PowerhouseModulesSchema = z.array(PowerhouseModuleSchema).optional();
|
|
694
|
+
const PieceModuleSchema = PowerhouseModuleSchema.extend({
|
|
695
|
+
version: z.string().optional(),
|
|
696
|
+
description: z.string().optional(),
|
|
697
|
+
bundle: z.string().optional(),
|
|
698
|
+
descriptor: z.string().optional()
|
|
699
|
+
});
|
|
700
|
+
const PieceModulesSchema = z.array(PieceModuleSchema).optional();
|
|
732
701
|
const PublisherSchema = z.object({
|
|
733
702
|
name: z.string().optional(),
|
|
734
703
|
url: z.string().optional()
|
|
@@ -739,7 +708,7 @@ const ConfigEntrySchema = z.object({
|
|
|
739
708
|
type: ConfigEntryTypeSchema,
|
|
740
709
|
description: z.string().optional(),
|
|
741
710
|
required: z.boolean().optional(),
|
|
742
|
-
default: z.
|
|
711
|
+
default: z.string().optional()
|
|
743
712
|
});
|
|
744
713
|
const PwaUrlPatternSchema = z.union([z.string(), z.strictObject({
|
|
745
714
|
source: z.string(),
|
|
@@ -835,6 +804,7 @@ const ManifestSchema = z.object({
|
|
|
835
804
|
editors: PowerhouseModulesSchema,
|
|
836
805
|
processors: PowerhouseModulesSchema,
|
|
837
806
|
subgraphs: PowerhouseModulesSchema,
|
|
807
|
+
pieces: PieceModulesSchema,
|
|
838
808
|
config: z.array(ConfigEntrySchema).optional(),
|
|
839
809
|
pwa: PwaConfigSchema.optional()
|
|
840
810
|
});
|
|
@@ -854,35 +824,6 @@ const undo = (count = 1, scope = "global") => createAction("UNDO", { count }, vo
|
|
|
854
824
|
* @category Actions
|
|
855
825
|
*/
|
|
856
826
|
const redo = (count = 1, scope = "global") => createAction("REDO", { count }, void 0, RedoActionInputSchema, scope);
|
|
857
|
-
/**
|
|
858
|
-
* Joins multiple operations into a single {@link loadState | LOAD_STATE} operation.
|
|
859
|
-
*
|
|
860
|
-
* @remarks
|
|
861
|
-
* Useful to keep operations history smaller. Operations to prune are selected by index,
|
|
862
|
-
* similar to the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | slice} method in Arrays.
|
|
863
|
-
*
|
|
864
|
-
* @param start - Index of the first operation to prune
|
|
865
|
-
* @param end - Index of the last operation to prune
|
|
866
|
-
* @category Actions
|
|
867
|
-
*/
|
|
868
|
-
const prune = (start, end, scope = "global") => createAction("PRUNE", {
|
|
869
|
-
start,
|
|
870
|
-
end
|
|
871
|
-
}, void 0, PruneActionInputSchema, scope);
|
|
872
|
-
/**
|
|
873
|
-
* Replaces the state of the document.
|
|
874
|
-
*
|
|
875
|
-
* @remarks
|
|
876
|
-
* This action shouldn't be used directly. It is dispatched by the {@link prune} action.
|
|
877
|
-
*
|
|
878
|
-
* @param state - State to be set in the document.
|
|
879
|
-
* @param operations - Number of operations that were removed from the previous state.
|
|
880
|
-
* @category Actions
|
|
881
|
-
*/
|
|
882
|
-
const loadState = (state, operations) => createAction("LOAD_STATE", {
|
|
883
|
-
state,
|
|
884
|
-
operations
|
|
885
|
-
}, void 0, LoadStateActionInputSchema);
|
|
886
827
|
const noop = (scope = "global") => createAction("NOOP", {}, void 0, void 0, scope);
|
|
887
828
|
/**
|
|
888
829
|
* Helper function to be used by action creators.
|
|
@@ -980,6 +921,7 @@ async function buildOperationSignature(context, signMethod) {
|
|
|
980
921
|
const signature = await signMethod(buildOperationSignatureMessage(params));
|
|
981
922
|
return [...params, `0x${ab2hex(signature)}`];
|
|
982
923
|
}
|
|
924
|
+
/** @deprecated Emits a legacy SHA-1 tuple; sign through `ISigner.signAction`. */
|
|
983
925
|
async function buildSignedAction(action, reducer, document, signer, signHandler) {
|
|
984
926
|
const scopeOperations = reducer(document, action, void 0, { reuseOperationResultingState: true }).operations[action.scope];
|
|
985
927
|
if (!scopeOperations) throw new Error(`No operations found for scope: ${action.scope}`);
|
|
@@ -992,8 +934,10 @@ async function buildSignedAction(action, reducer, document, signer, signHandler)
|
|
|
992
934
|
action,
|
|
993
935
|
previousStateHash
|
|
994
936
|
}, signHandler);
|
|
995
|
-
|
|
937
|
+
const actionContext = { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) };
|
|
938
|
+
return operationWithContext(operation, actionContext);
|
|
996
939
|
}
|
|
940
|
+
/** @deprecated Use `verifyActionSignature` from `@powerhousedao/reactor`. */
|
|
997
941
|
async function verifyOperationSignature(signature, signer, verifyHandler) {
|
|
998
942
|
const publicKey = signer.app.key;
|
|
999
943
|
const params = signature.slice(0, 4);
|
|
@@ -1068,8 +1012,6 @@ const baseActions = {
|
|
|
1068
1012
|
setPreferredEditor,
|
|
1069
1013
|
undo,
|
|
1070
1014
|
redo,
|
|
1071
|
-
prune,
|
|
1072
|
-
loadState,
|
|
1073
1015
|
noop
|
|
1074
1016
|
};
|
|
1075
1017
|
const documentModelActions = {
|
|
@@ -1187,7 +1129,7 @@ var AuthAdministrationMissingError = class extends Error {
|
|
|
1187
1129
|
this.name = "AuthAdministrationMissingError";
|
|
1188
1130
|
}
|
|
1189
1131
|
};
|
|
1190
|
-
const GRANT_KEYS = new Set([
|
|
1132
|
+
const GRANT_KEYS = /* @__PURE__ */ new Set([
|
|
1191
1133
|
"id",
|
|
1192
1134
|
"description",
|
|
1193
1135
|
"effect",
|
|
@@ -1195,13 +1137,13 @@ const GRANT_KEYS = new Set([
|
|
|
1195
1137
|
"capability",
|
|
1196
1138
|
"where"
|
|
1197
1139
|
]);
|
|
1198
|
-
const PRINCIPAL_KINDS = new Set([
|
|
1140
|
+
const PRINCIPAL_KINDS = /* @__PURE__ */ new Set([
|
|
1199
1141
|
"anyone",
|
|
1200
1142
|
"address",
|
|
1201
1143
|
"group",
|
|
1202
1144
|
"match"
|
|
1203
1145
|
]);
|
|
1204
|
-
const COMPARISON_CONDITION_KINDS = new Set([
|
|
1146
|
+
const COMPARISON_CONDITION_KINDS = /* @__PURE__ */ new Set([
|
|
1205
1147
|
"eq",
|
|
1206
1148
|
"ne",
|
|
1207
1149
|
"lt",
|
|
@@ -2530,12 +2472,12 @@ function assertAuthPreservedOnDuplicate(documentId, source, duplicated) {
|
|
|
2530
2472
|
* The auth scope a state snapshot may install, given the policy already there.
|
|
2531
2473
|
*
|
|
2532
2474
|
* `applyAuthAction` is the validated door onto `state.auth`, but a whole-state
|
|
2533
|
-
* snapshot (UPGRADE_DOCUMENT's `initialState
|
|
2534
|
-
*
|
|
2535
|
-
*
|
|
2536
|
-
*
|
|
2537
|
-
*
|
|
2538
|
-
*
|
|
2475
|
+
* snapshot (UPGRADE_DOCUMENT's `initialState`) replaces the scope wholesale and
|
|
2476
|
+
* is authorized as a `document`-scope write. Without this, a subject holding
|
|
2477
|
+
* `execute` on `document` and no auth grant at all can install a policy of its
|
|
2478
|
+
* choosing, name itself `creator` (which exempts the policy from the retention
|
|
2479
|
+
* rule for good), or wipe an existing policy by carrying the default
|
|
2480
|
+
* uninitialized one.
|
|
2539
2481
|
*
|
|
2540
2482
|
* Three cases:
|
|
2541
2483
|
*
|
|
@@ -2562,13 +2504,9 @@ function resolveSnapshotAuth(documentId, documentType, current, incoming) {
|
|
|
2562
2504
|
assertValidInitialGrants(incoming.grants, documentType, incoming.creator);
|
|
2563
2505
|
return incoming;
|
|
2564
2506
|
}
|
|
2565
|
-
/** UNDO
|
|
2507
|
+
/** UNDO and REDO are rejected on the auth scope. */
|
|
2566
2508
|
function assertAuthScopeActionAllowed(action) {
|
|
2567
|
-
if (action.scope === "auth" && [
|
|
2568
|
-
"UNDO",
|
|
2569
|
-
"REDO",
|
|
2570
|
-
"PRUNE"
|
|
2571
|
-
].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
|
|
2509
|
+
if (action.scope === "auth" && ["UNDO", "REDO"].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
|
|
2572
2510
|
}
|
|
2573
2511
|
/**
|
|
2574
2512
|
* Evaluates the auth policy for a single request and reports why it refused.
|
|
@@ -2674,6 +2612,63 @@ function assertIsDocumentModelDocument(document) {
|
|
|
2674
2612
|
DocumentModelSchema.parse(document);
|
|
2675
2613
|
}
|
|
2676
2614
|
//#endregion
|
|
2615
|
+
//#region document-model/signature-policy.ts
|
|
2616
|
+
/** The `protocolVersions` key that fixes a document's signature requirement. */
|
|
2617
|
+
const SIGNATURE_PROTOCOL = "signature";
|
|
2618
|
+
/** `protocolVersions.signature` of a document that requires v2 tuples. */
|
|
2619
|
+
const SIGNATURE_PROTOCOL_V2 = 2;
|
|
2620
|
+
/** What a new document is created as unless the caller or host says otherwise. */
|
|
2621
|
+
const DEFAULT_SIGNATURE_POLICY = "v2-required";
|
|
2622
|
+
function isSignaturePolicy(value) {
|
|
2623
|
+
return value === "legacy" || value === "v2-required";
|
|
2624
|
+
}
|
|
2625
|
+
const DERIVED_ID = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
2626
|
+
/** Read from a header, a CREATE_DOCUMENT input or a bare map. */
|
|
2627
|
+
function signaturePolicyOf(source) {
|
|
2628
|
+
const version = (source && "protocolVersions" in source ? source.protocolVersions : source)?.[SIGNATURE_PROTOCOL];
|
|
2629
|
+
return typeof version === "number" && version >= 2 ? "v2-required" : "legacy";
|
|
2630
|
+
}
|
|
2631
|
+
/** `protocolVersions` for a new v2-required document. */
|
|
2632
|
+
function v2RequiredProtocolVersions(base = {}) {
|
|
2633
|
+
return {
|
|
2634
|
+
"base-reducer": 2,
|
|
2635
|
+
...base,
|
|
2636
|
+
[SIGNATURE_PROTOCOL]: 2
|
|
2637
|
+
};
|
|
2638
|
+
}
|
|
2639
|
+
/**
|
|
2640
|
+
* The policy a create call asks for: `signaturePolicy`, else the `signature`
|
|
2641
|
+
* key of its `protocolVersions`, else `fallback`, the host's default.
|
|
2642
|
+
*/
|
|
2643
|
+
function requestedSignaturePolicy(request, fallback) {
|
|
2644
|
+
if (request?.signaturePolicy) return request.signaturePolicy;
|
|
2645
|
+
if (request?.protocolVersions?.["signature"] !== void 0) return signaturePolicyOf(request.protocolVersions);
|
|
2646
|
+
return fallback;
|
|
2647
|
+
}
|
|
2648
|
+
/** `protocolVersions` for a new document under `policy`, over `base`. */
|
|
2649
|
+
function protocolVersionsFor(policy, base = {}) {
|
|
2650
|
+
if (policy === "v2-required") return v2RequiredProtocolVersions(base);
|
|
2651
|
+
const { [SIGNATURE_PROTOCOL]: _signature, ...rest } = base;
|
|
2652
|
+
return {
|
|
2653
|
+
"base-reducer": 2,
|
|
2654
|
+
...rest
|
|
2655
|
+
};
|
|
2656
|
+
}
|
|
2657
|
+
/** `base64url(sha256(canonicalJson(params)))`, unpadded. */
|
|
2658
|
+
function deriveDocumentId(params) {
|
|
2659
|
+
const preimage = canonicalJson({
|
|
2660
|
+
documentType: params.documentType,
|
|
2661
|
+
createdAtUtcIso: params.createdAtUtcIso,
|
|
2662
|
+
nonce: params.nonce,
|
|
2663
|
+
protocolVersions: params.protocolVersions
|
|
2664
|
+
}, "document id");
|
|
2665
|
+
return bytesToBase64Url(sha256(new TextEncoder().encode(preimage)));
|
|
2666
|
+
}
|
|
2667
|
+
/** Whether `id` has the shape `deriveDocumentId` produces. */
|
|
2668
|
+
function isDerivedDocumentId(id) {
|
|
2669
|
+
return DERIVED_ID.test(id);
|
|
2670
|
+
}
|
|
2671
|
+
//#endregion
|
|
2677
2672
|
//#region document-model/header.ts
|
|
2678
2673
|
/**
|
|
2679
2674
|
* Generates a deterministic payload from signing parameters
|
|
@@ -2693,11 +2688,11 @@ async function createVerificationSigner(pubKey) {
|
|
|
2693
2688
|
}, true, ["verify"]);
|
|
2694
2689
|
return {
|
|
2695
2690
|
publicKey: cryptoKey,
|
|
2696
|
-
|
|
2697
|
-
|
|
2691
|
+
sign(_data) {
|
|
2692
|
+
return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign data"));
|
|
2698
2693
|
},
|
|
2699
|
-
|
|
2700
|
-
|
|
2694
|
+
signAction(_action, _target, _abortSignal) {
|
|
2695
|
+
return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign actions"));
|
|
2701
2696
|
},
|
|
2702
2697
|
async verify(data, signature) {
|
|
2703
2698
|
let isValid;
|
|
@@ -2767,26 +2762,68 @@ const validateHeader = async (header) => {
|
|
|
2767
2762
|
* Creates a header that has yet to be signed. This header is not valid, but
|
|
2768
2763
|
* can be input into {@link createSignedHeader} to create a signed header.
|
|
2769
2764
|
*
|
|
2765
|
+
* With `protocolVersions` requiring v2 signatures the header takes a random
|
|
2766
|
+
* nonce and the id {@link deriveDocumentId} gives, so `id` must be omitted.
|
|
2767
|
+
*
|
|
2770
2768
|
* @returns An unsigned header for a document.
|
|
2771
2769
|
*/
|
|
2772
|
-
const createPresignedHeader = (id
|
|
2773
|
-
|
|
2774
|
-
|
|
2770
|
+
const createPresignedHeader = (id, documentType = "", protocolVersions) => {
|
|
2771
|
+
const createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
2772
|
+
const header = {
|
|
2773
|
+
id: id ?? generateId(),
|
|
2775
2774
|
sig: {
|
|
2776
2775
|
publicKey: {},
|
|
2777
2776
|
nonce: ""
|
|
2778
2777
|
},
|
|
2779
2778
|
documentType,
|
|
2780
|
-
createdAtUtcIso
|
|
2779
|
+
createdAtUtcIso,
|
|
2781
2780
|
slug: "",
|
|
2782
2781
|
name: "",
|
|
2783
2782
|
branch: "main",
|
|
2784
2783
|
revision: { document: 0 },
|
|
2785
|
-
lastModifiedAtUtcIso:
|
|
2784
|
+
lastModifiedAtUtcIso: createdAtUtcIso,
|
|
2786
2785
|
meta: {}
|
|
2787
2786
|
};
|
|
2787
|
+
if (protocolVersions === void 0) return header;
|
|
2788
|
+
header.protocolVersions = { ...protocolVersions };
|
|
2789
|
+
if (signaturePolicyOf(header) === "legacy") return header;
|
|
2790
|
+
if (id !== void 0) throw new Error(`A v2-required document's id is derived from its header; cannot use ${id}`);
|
|
2791
|
+
header.sig.nonce = generateId();
|
|
2792
|
+
header.id = deriveDocumentId({
|
|
2793
|
+
documentType,
|
|
2794
|
+
createdAtUtcIso,
|
|
2795
|
+
nonce: header.sig.nonce,
|
|
2796
|
+
protocolVersions: header.protocolVersions
|
|
2797
|
+
});
|
|
2798
|
+
return header;
|
|
2788
2799
|
};
|
|
2789
2800
|
/**
|
|
2801
|
+
* A header for a copy of a document headed `source`. A copy is v2-required
|
|
2802
|
+
* when its source is or when `policy` asks for it, and then takes a derived id;
|
|
2803
|
+
* otherwise it takes `id`. It keeps the source's other protocol versions.
|
|
2804
|
+
*/
|
|
2805
|
+
function createCopyHeader(source, id, policy = DEFAULT_SIGNATURE_POLICY) {
|
|
2806
|
+
const base = source.protocolVersions ?? {};
|
|
2807
|
+
if (signaturePolicyOf(source) === "v2-required" || policy === "v2-required") return createPresignedHeader(void 0, source.documentType, protocolVersionsFor("v2-required", base));
|
|
2808
|
+
const header = createPresignedHeader(id, source.documentType);
|
|
2809
|
+
if (source.protocolVersions) header.protocolVersions = { ...source.protocolVersions };
|
|
2810
|
+
return header;
|
|
2811
|
+
}
|
|
2812
|
+
/** Whether a v2-required `header` carries the id its params derive. */
|
|
2813
|
+
function hasDerivedDocumentId(header) {
|
|
2814
|
+
if (signaturePolicyOf(header) === "legacy" || !header.protocolVersions) return false;
|
|
2815
|
+
try {
|
|
2816
|
+
return deriveDocumentId({
|
|
2817
|
+
documentType: header.documentType,
|
|
2818
|
+
createdAtUtcIso: header.createdAtUtcIso,
|
|
2819
|
+
nonce: header.sig.nonce,
|
|
2820
|
+
protocolVersions: header.protocolVersions
|
|
2821
|
+
}) === header.id;
|
|
2822
|
+
} catch {
|
|
2823
|
+
return false;
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
/**
|
|
2790
2827
|
* Creates a new, signed header for a document. This will replace the id of the
|
|
2791
2828
|
* document.
|
|
2792
2829
|
*
|
|
@@ -2829,7 +2866,8 @@ const createSignedHeader = async (unsignedHeader, documentType, signer) => {
|
|
|
2829
2866
|
* some are not. See the PHDocumentHeader type for more information.
|
|
2830
2867
|
*/
|
|
2831
2868
|
const createSignedHeaderForSigner = async (documentType, signer) => {
|
|
2832
|
-
|
|
2869
|
+
const unsignedHeader = createPresignedHeader();
|
|
2870
|
+
return await createSignedHeader(unsignedHeader, documentType, signer);
|
|
2833
2871
|
};
|
|
2834
2872
|
//#endregion
|
|
2835
2873
|
//#region document-model/documents.ts
|
|
@@ -2847,9 +2885,7 @@ function isDocumentAction(action) {
|
|
|
2847
2885
|
"SET_NAME",
|
|
2848
2886
|
"SET_PREFERRED_EDITOR",
|
|
2849
2887
|
"UNDO",
|
|
2850
|
-
"REDO"
|
|
2851
|
-
"PRUNE",
|
|
2852
|
-
"LOAD_STATE"
|
|
2888
|
+
"REDO"
|
|
2853
2889
|
].includes(action.type);
|
|
2854
2890
|
}
|
|
2855
2891
|
/**
|
|
@@ -2905,12 +2941,16 @@ function createDocumentScopeOperations(header, state) {
|
|
|
2905
2941
|
}
|
|
2906
2942
|
/**
|
|
2907
2943
|
* Creates a new document. When `documentType` is given the header is stamped
|
|
2908
|
-
* with it and the document-scope operations are seeded.
|
|
2944
|
+
* with it and the document-scope operations are seeded. Without
|
|
2945
|
+
* `protocolVersions` the document is v2-required and takes a derived id; with
|
|
2946
|
+
* them it is v2-required only if they say so (see {@link protocolVersionsFor}).
|
|
2909
2947
|
*/
|
|
2910
|
-
function baseCreateDocument(createState, initialState, documentType = "") {
|
|
2948
|
+
function baseCreateDocument(createState, initialState, documentType = "", protocolVersions) {
|
|
2911
2949
|
const state = createState(initialState);
|
|
2912
|
-
const header = createPresignedHeader(
|
|
2913
|
-
|
|
2950
|
+
const header = createPresignedHeader(void 0, documentType, protocolVersions === void 0 ? protocolVersionsFor("v2-required") : {
|
|
2951
|
+
"base-reducer": 2,
|
|
2952
|
+
...protocolVersions
|
|
2953
|
+
});
|
|
2914
2954
|
return {
|
|
2915
2955
|
header,
|
|
2916
2956
|
state,
|
|
@@ -2926,8 +2966,39 @@ function baseCreateDocument(createState, initialState, documentType = "") {
|
|
|
2926
2966
|
clipboard: []
|
|
2927
2967
|
};
|
|
2928
2968
|
}
|
|
2969
|
+
/**
|
|
2970
|
+
* `document`, not yet created, under a fresh header for `policy`. A legacy
|
|
2971
|
+
* header takes `id` when given; a v2-required one ignores `id` and derives its
|
|
2972
|
+
* own, so a caller that needs a fixed id must ask for legacy.
|
|
2973
|
+
* `protocolVersions` are merged over the document's. Name, slug, branch and
|
|
2974
|
+
* meta carry over. A document already under `policy` is returned as is unless
|
|
2975
|
+
* a legacy `id` or `protocolVersions` are given.
|
|
2976
|
+
*/
|
|
2977
|
+
function withSignaturePolicy(document, policy, options = {}) {
|
|
2978
|
+
const id = policy === "legacy" ? options.id : void 0;
|
|
2979
|
+
if (id === void 0 && options.protocolVersions === void 0 && signaturePolicyOf(document.header) === policy) return document;
|
|
2980
|
+
const source = document.header;
|
|
2981
|
+
const header = createPresignedHeader(id, source.documentType, protocolVersionsFor(policy, {
|
|
2982
|
+
...source.protocolVersions,
|
|
2983
|
+
...options.protocolVersions
|
|
2984
|
+
}));
|
|
2985
|
+
header.name = source.name;
|
|
2986
|
+
header.slug = source.slug;
|
|
2987
|
+
header.branch = source.branch;
|
|
2988
|
+
header.meta = source.meta;
|
|
2989
|
+
const operations = document.operations.document ? {
|
|
2990
|
+
...document.operations,
|
|
2991
|
+
document: createDocumentScopeOperations(header, document.state)
|
|
2992
|
+
} : document.operations;
|
|
2993
|
+
return {
|
|
2994
|
+
...document,
|
|
2995
|
+
header,
|
|
2996
|
+
operations
|
|
2997
|
+
};
|
|
2998
|
+
}
|
|
2929
2999
|
function hashDocumentStateForScope(document, scope = "global") {
|
|
2930
|
-
|
|
3000
|
+
const stateString = stringify(document.state[scope] || "");
|
|
3001
|
+
return hashBrowser(stateString);
|
|
2931
3002
|
}
|
|
2932
3003
|
function readOnly(value) {
|
|
2933
3004
|
return Object.freeze(value);
|
|
@@ -3058,7 +3129,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
|
|
|
3058
3129
|
const backfilledInitialState = backfillAuthState(initialState);
|
|
3059
3130
|
let documentState = backfilledInitialState;
|
|
3060
3131
|
const operationsToReplay = [];
|
|
3061
|
-
const allScopes = new Set([
|
|
3132
|
+
const allScopes = /* @__PURE__ */ new Set([
|
|
3062
3133
|
...Object.keys(operations),
|
|
3063
3134
|
"global",
|
|
3064
3135
|
"local"
|
|
@@ -3116,7 +3187,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
|
|
|
3116
3187
|
if (operation.hash !== hashDocumentStateForScope(result, scope)) throw new HashMismatchError(scope, result, operation);
|
|
3117
3188
|
else break;
|
|
3118
3189
|
}
|
|
3119
|
-
const allResultScopes = new Set([
|
|
3190
|
+
const allResultScopes = /* @__PURE__ */ new Set([
|
|
3120
3191
|
...Object.keys(result.operations),
|
|
3121
3192
|
...Object.keys(operations),
|
|
3122
3193
|
"global",
|
|
@@ -3179,8 +3250,8 @@ function checkCleanedOperationsIntegrity(sortedOperations) {
|
|
|
3179
3250
|
index: nextOperation.index,
|
|
3180
3251
|
skip: nextOperation.skip
|
|
3181
3252
|
},
|
|
3182
|
-
issue:
|
|
3183
|
-
category: nextIndex > currentIndex + 1 ?
|
|
3253
|
+
issue: "UNEXPECTED_INDEX",
|
|
3254
|
+
category: nextIndex > currentIndex + 1 ? "MISSING_INDEX" : "DUPLICATED_INDEX",
|
|
3184
3255
|
message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`
|
|
3185
3256
|
});
|
|
3186
3257
|
currentIndex = nextOperation.index;
|
|
@@ -3290,12 +3361,14 @@ function attachBranch(trunk, newBranch) {
|
|
|
3290
3361
|
nextTrunkOperation = trunkCopy.shift();
|
|
3291
3362
|
}
|
|
3292
3363
|
if (!nextTrunkOperation) enteredBranch = true;
|
|
3293
|
-
else if (!enteredBranch)
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3364
|
+
else if (!enteredBranch) {
|
|
3365
|
+
if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
|
|
3366
|
+
newOperations.shift();
|
|
3367
|
+
result.push(nextTrunkOperation);
|
|
3368
|
+
} else {
|
|
3369
|
+
trunkCopy.unshift(nextTrunkOperation);
|
|
3370
|
+
enteredBranch = true;
|
|
3371
|
+
}
|
|
3299
3372
|
}
|
|
3300
3373
|
if (enteredBranch) {
|
|
3301
3374
|
let nextAppend = newOperations.shift();
|
|
@@ -3326,13 +3399,14 @@ function split(sortedTargetOperations, sortedMergeOperations) {
|
|
|
3326
3399
|
for (let i = 0; i < maxLength; i++) {
|
|
3327
3400
|
const targetOperation = sortedTargetOperations[i];
|
|
3328
3401
|
const mergeOperation = sortedMergeOperations[i];
|
|
3329
|
-
if (targetOperation && mergeOperation)
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3402
|
+
if (targetOperation && mergeOperation) {
|
|
3403
|
+
if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) commonOperations.push(targetOperation);
|
|
3404
|
+
else {
|
|
3405
|
+
splitHappened = true;
|
|
3406
|
+
targetDiffOperations.push(targetOperation);
|
|
3407
|
+
mergeDiffOperations.push(mergeOperation);
|
|
3408
|
+
}
|
|
3409
|
+
} else if (targetOperation) targetDiffOperations.push(targetOperation);
|
|
3336
3410
|
else if (mergeOperation) mergeDiffOperations.push(mergeOperation);
|
|
3337
3411
|
}
|
|
3338
3412
|
return [
|
|
@@ -3384,14 +3458,14 @@ function prepareOperations(operationsHistory, newOperations) {
|
|
|
3384
3458
|
const sortedOperationsHistory = sortOperations(operationsHistory);
|
|
3385
3459
|
const sortedOperations = sortOperations(newOperations);
|
|
3386
3460
|
const integrityErrors = checkCleanedOperationsIntegrity([...sortedOperationsHistory, ...sortedOperations]);
|
|
3387
|
-
const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category ===
|
|
3461
|
+
const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category === "MISSING_INDEX")].sort((a, b) => b.operation.index - a.operation.index).pop()?.operation;
|
|
3388
3462
|
for (const newOperation of sortedOperations) {
|
|
3389
3463
|
if (firstMissingIndexOperation && newOperation.index >= firstMissingIndexOperation.index) {
|
|
3390
3464
|
result.invalidOperations.push(newOperation);
|
|
3391
3465
|
continue;
|
|
3392
3466
|
}
|
|
3393
3467
|
if (integrityErrors.some((integrityError) => {
|
|
3394
|
-
return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category ===
|
|
3468
|
+
return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === "DUPLICATED_INDEX";
|
|
3395
3469
|
})) {
|
|
3396
3470
|
result.duplicatedOperations.push(newOperation);
|
|
3397
3471
|
continue;
|
|
@@ -3620,18 +3694,6 @@ function redoOperation(document, action, skip) {
|
|
|
3620
3694
|
});
|
|
3621
3695
|
});
|
|
3622
3696
|
}
|
|
3623
|
-
function loadStateOperation(document, action) {
|
|
3624
|
-
const loaded = backfillAuthState(action.state.data);
|
|
3625
|
-
loaded.auth = resolveSnapshotAuth(document.header.id, document.header.documentType, backfillAuthState({ ...document.state }).auth, loaded.auth);
|
|
3626
|
-
return {
|
|
3627
|
-
...document,
|
|
3628
|
-
header: {
|
|
3629
|
-
...document.header,
|
|
3630
|
-
name: action.state.name
|
|
3631
|
-
},
|
|
3632
|
-
state: loaded
|
|
3633
|
-
};
|
|
3634
|
-
}
|
|
3635
3697
|
/**
|
|
3636
3698
|
* Reads an operation's outcome. A denial takes precedence over a reducer
|
|
3637
3699
|
* error, since a denied operation never reaches its reducer.
|
|
@@ -3664,15 +3726,12 @@ function replayOperations(initialState, clearedOperations, stateReducer, header,
|
|
|
3664
3726
|
* @returns The updated document state.
|
|
3665
3727
|
*/
|
|
3666
3728
|
function updateOperationsForAction(document, action, reuseLastOperationIndex, skip, context) {
|
|
3667
|
-
if ([
|
|
3668
|
-
"UNDO",
|
|
3669
|
-
"REDO",
|
|
3670
|
-
"PRUNE"
|
|
3671
|
-
].includes(action.type)) return document;
|
|
3729
|
+
if (["UNDO", "REDO"].includes(action.type)) return document;
|
|
3672
3730
|
const scope = action.scope;
|
|
3673
3731
|
const existing = document.operations[scope];
|
|
3674
3732
|
const lastOperationIndex = existing?.at(-1)?.index ?? -1;
|
|
3675
|
-
const
|
|
3733
|
+
const index = reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1;
|
|
3734
|
+
const newOperation = operationFromAction(action, index, skip, context);
|
|
3676
3735
|
const operations = [...existing ?? [], newOperation];
|
|
3677
3736
|
return {
|
|
3678
3737
|
...document,
|
|
@@ -3716,20 +3775,17 @@ function updateDocument(document, action, reuseLastOperationIndex, skip, context
|
|
|
3716
3775
|
return newDocument;
|
|
3717
3776
|
}
|
|
3718
3777
|
/**
|
|
3719
|
-
* The base document reducer function
|
|
3778
|
+
* The base document reducer function.
|
|
3720
3779
|
*
|
|
3721
3780
|
* @param state The current state of the document.
|
|
3722
3781
|
* @param action The action being applied to the document.
|
|
3723
|
-
* @param wrappedReducer The custom reducer function being wrapped by the base reducer.
|
|
3724
3782
|
* @returns The updated document state.
|
|
3725
3783
|
*/
|
|
3726
|
-
function _baseReducer(document, action
|
|
3784
|
+
function _baseReducer(document, action) {
|
|
3727
3785
|
const parsedAction = DocumentActionSchema().parse(action);
|
|
3728
3786
|
switch (parsedAction.type) {
|
|
3729
3787
|
case "SET_NAME": return setNameOperation(document, parsedAction.input);
|
|
3730
3788
|
case "SET_PREFERRED_EDITOR": return setPreferredEditorOperation(document, parsedAction.input);
|
|
3731
|
-
case "PRUNE": return pruneOperation(document, parsedAction.input, wrappedReducer);
|
|
3732
|
-
case "LOAD_STATE": return loadStateOperation(document, parsedAction.input);
|
|
3733
3789
|
default: return document;
|
|
3734
3790
|
}
|
|
3735
3791
|
}
|
|
@@ -3807,7 +3863,7 @@ function processUndoOperation(document, scope, customReducer, reuseOperationResu
|
|
|
3807
3863
|
}
|
|
3808
3864
|
/**
|
|
3809
3865
|
* Base document reducer that wraps a custom document reducer and handles
|
|
3810
|
-
* document-level actions such as undo, redo,
|
|
3866
|
+
* document-level actions such as undo, redo, and set name.
|
|
3811
3867
|
*
|
|
3812
3868
|
* @template TGlobalState - The type of the state of the custom reducer.
|
|
3813
3869
|
* @template TAction - The type of the actions of the custom reducer.
|
|
@@ -3835,7 +3891,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3835
3891
|
...newDocument,
|
|
3836
3892
|
clipboard: []
|
|
3837
3893
|
};
|
|
3838
|
-
if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action
|
|
3894
|
+
if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action);
|
|
3839
3895
|
const operationContext = {
|
|
3840
3896
|
documentId: document.header.id,
|
|
3841
3897
|
scope: _action.scope,
|
|
@@ -3898,11 +3954,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3898
3954
|
}
|
|
3899
3955
|
}
|
|
3900
3956
|
});
|
|
3901
|
-
if ([
|
|
3902
|
-
"UNDO",
|
|
3903
|
-
"REDO",
|
|
3904
|
-
"PRUNE"
|
|
3905
|
-
].includes(_action.type)) return newDocument;
|
|
3957
|
+
if (["UNDO", "REDO"].includes(_action.type)) return newDocument;
|
|
3906
3958
|
const scope = _action.scope || "global";
|
|
3907
3959
|
const replayHash = options.replayOptions?.operation.hash;
|
|
3908
3960
|
const hash = replayHash ? replayHash : hashDocumentStateForScope(newDocument, scope);
|
|
@@ -3922,7 +3974,6 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3922
3974
|
* - `SET_NAME`
|
|
3923
3975
|
* - `UNDO`
|
|
3924
3976
|
* - `REDO`
|
|
3925
|
-
* - `PRUNE`
|
|
3926
3977
|
*
|
|
3927
3978
|
* It also updates the document-related attributes on every operation.
|
|
3928
3979
|
*
|
|
@@ -3937,46 +3988,6 @@ function createReducer(stateReducer, documentReducer = baseReducer) {
|
|
|
3937
3988
|
};
|
|
3938
3989
|
return reducer;
|
|
3939
3990
|
}
|
|
3940
|
-
function pruneOperation(document, input, wrappedReducer) {
|
|
3941
|
-
const operations = document.operations.global;
|
|
3942
|
-
if (!operations) throw new Error("No global operations found");
|
|
3943
|
-
let { start, end } = input;
|
|
3944
|
-
start = start || 0;
|
|
3945
|
-
end = end || operations.length;
|
|
3946
|
-
const actionsToPrune = operations.slice(start, end);
|
|
3947
|
-
const actionsToKeepStart = operations.slice(0, start);
|
|
3948
|
-
const actionsToKeepEnd = operations.slice(end);
|
|
3949
|
-
const newDocument = replayOperations(document.initialState, {
|
|
3950
|
-
...document.operations,
|
|
3951
|
-
global: actionsToKeepStart.concat(actionsToPrune)
|
|
3952
|
-
}, wrappedReducer, document.header);
|
|
3953
|
-
const newState = newDocument.state;
|
|
3954
|
-
const name = newDocument.header.name;
|
|
3955
|
-
const loadStateIndex = actionsToKeepStart.length;
|
|
3956
|
-
const loadStateTimestamp = actionsToKeepStart.length ? actionsToKeepStart[actionsToKeepStart.length - 1].timestampUtcMs : actionsToKeepEnd.length ? actionsToKeepEnd[0].timestampUtcMs : (/* @__PURE__ */ new Date()).toISOString();
|
|
3957
|
-
const action = loadState({
|
|
3958
|
-
name,
|
|
3959
|
-
...newState
|
|
3960
|
-
}, actionsToPrune.length);
|
|
3961
|
-
return replayOperations(document.initialState, {
|
|
3962
|
-
...document.operations,
|
|
3963
|
-
global: [
|
|
3964
|
-
...actionsToKeepStart,
|
|
3965
|
-
{
|
|
3966
|
-
skip: 0,
|
|
3967
|
-
...action,
|
|
3968
|
-
action,
|
|
3969
|
-
timestampUtcMs: loadStateTimestamp,
|
|
3970
|
-
index: loadStateIndex,
|
|
3971
|
-
hash: hashDocumentStateForScope({ state: newState }, "global")
|
|
3972
|
-
},
|
|
3973
|
-
...actionsToKeepEnd.map((action, index) => ({
|
|
3974
|
-
...action,
|
|
3975
|
-
index: loadStateIndex + index + 1
|
|
3976
|
-
}))
|
|
3977
|
-
]
|
|
3978
|
-
}, wrappedReducer, document.header);
|
|
3979
|
-
}
|
|
3980
3991
|
//#endregion
|
|
3981
3992
|
//#region document-model/validation.ts
|
|
3982
3993
|
/**
|
|
@@ -3986,11 +3997,10 @@ function pruneOperation(document, input, wrappedReducer) {
|
|
|
3986
3997
|
const RESERVED_OPERATION_NAMES = [
|
|
3987
3998
|
"UNDO",
|
|
3988
3999
|
"REDO",
|
|
3989
|
-
"PRUNE",
|
|
3990
|
-
"LOAD_STATE",
|
|
3991
4000
|
"SET_NAME",
|
|
3992
4001
|
"SET_PREFERRED_EDITOR",
|
|
3993
|
-
"NOOP"
|
|
4002
|
+
"NOOP",
|
|
4003
|
+
"PURGE_DOCUMENT"
|
|
3994
4004
|
];
|
|
3995
4005
|
/**
|
|
3996
4006
|
* Operation names become the literal action `type` string at runtime and the
|
|
@@ -4226,6 +4236,15 @@ function orderBy(items, order) {
|
|
|
4226
4236
|
return (rank.get(a.item.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.item.id) ?? Number.MAX_SAFE_INTEGER) || a.index - b.index;
|
|
4227
4237
|
}).map(({ item }) => item);
|
|
4228
4238
|
}
|
|
4239
|
+
/**
|
|
4240
|
+
* The untouched base of a mutative draft, or the value itself when it is not a
|
|
4241
|
+
* draft. Build replacement lists from it and freeze them before assigning, as
|
|
4242
|
+
* the drive node reducer does, so finalize skips the walk over the assigned
|
|
4243
|
+
* list. Read before writing: the base does not see this action's mutations.
|
|
4244
|
+
*/
|
|
4245
|
+
function readBase(value) {
|
|
4246
|
+
return isDraft(value) ? original(value) : value;
|
|
4247
|
+
}
|
|
4229
4248
|
const documentModelHeaderReducer = {
|
|
4230
4249
|
setModelNameOperation(state, action) {
|
|
4231
4250
|
state.name = action.input.name;
|
|
@@ -4275,7 +4294,8 @@ const documentModelModuleReducer = {
|
|
|
4275
4294
|
deleteModuleOperation(state, action) {
|
|
4276
4295
|
findModuleOrThrow(state, action.input.id);
|
|
4277
4296
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
4278
|
-
|
|
4297
|
+
const modules = readBase(latestSpec).modules.filter((m) => m.id != action.input.id);
|
|
4298
|
+
latestSpec.modules = Object.freeze(modules);
|
|
4279
4299
|
},
|
|
4280
4300
|
reorderModulesOperation(state, action) {
|
|
4281
4301
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
@@ -4393,14 +4413,20 @@ const documentModelOperationReducer = {
|
|
|
4393
4413
|
const matches = latestSpec.modules.flatMap((mod) => mod.operations.filter((op) => op.id === action.input.operationId));
|
|
4394
4414
|
if (matches.length === 0) throw new Error(`Operation "${action.input.operationId}" not found in the latest specification`);
|
|
4395
4415
|
if (matches.length > 1) throw new Error(`Operation "${action.input.operationId}" is duplicated in the latest specification`);
|
|
4396
|
-
const moved = matches[0];
|
|
4397
|
-
for (const mod of latestSpec.modules)
|
|
4398
|
-
|
|
4416
|
+
const moved = readBase(matches[0]);
|
|
4417
|
+
for (const mod of latestSpec.modules) {
|
|
4418
|
+
const operations = readBase(mod).operations.filter((op) => op.id !== action.input.operationId);
|
|
4419
|
+
if (mod === targetModule) operations.push(moved);
|
|
4420
|
+
mod.operations = Object.freeze(operations);
|
|
4421
|
+
}
|
|
4399
4422
|
},
|
|
4400
4423
|
deleteOperationOperation(state, action) {
|
|
4401
4424
|
findOperationOrThrow(state, action.input.id);
|
|
4402
4425
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
4403
|
-
for (const mod of latestSpec.modules)
|
|
4426
|
+
for (const mod of latestSpec.modules) {
|
|
4427
|
+
const operations = readBase(mod).operations.filter((operation) => operation.id != action.input.id);
|
|
4428
|
+
mod.operations = Object.freeze(operations);
|
|
4429
|
+
}
|
|
4404
4430
|
},
|
|
4405
4431
|
reorderModuleOperationsOperation(state, action) {
|
|
4406
4432
|
const targetModule = findModuleOrThrow(state, action.input.moduleId);
|
|
@@ -4438,7 +4464,8 @@ const documentModelStateSchemaReducer = {
|
|
|
4438
4464
|
if (!Object.keys(latestSpec.state).includes(action.input.scope)) throw new Error(`Invalid scope: ${action.input.scope}`);
|
|
4439
4465
|
const scopeState = latestSpec.state[action.input.scope];
|
|
4440
4466
|
if (!scopeState.examples.some((e) => e.id == action.input.id)) throw new Error(`State example "${action.input.id}" not found in scope "${action.input.scope}"`);
|
|
4441
|
-
|
|
4467
|
+
const examples = readBase(scopeState).examples.filter((e) => e.id != action.input.id);
|
|
4468
|
+
scopeState.examples = Object.freeze(examples);
|
|
4442
4469
|
},
|
|
4443
4470
|
reorderStateExamplesOperation(state, action) {
|
|
4444
4471
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
@@ -4708,7 +4735,11 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
|
|
|
4708
4735
|
const toVersion = action.input.toVersion;
|
|
4709
4736
|
if (fromVersion === toVersion && fromVersion > 0) return document;
|
|
4710
4737
|
if (fromVersion > toVersion) throw new DowngradeNotSupportedError(document.header.documentType, fromVersion, toVersion);
|
|
4711
|
-
if (upgradePath)
|
|
4738
|
+
if (upgradePath) {
|
|
4739
|
+
const protocolVersions = document.header.protocolVersions;
|
|
4740
|
+
for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
|
|
4741
|
+
document = withProtocolVersions(document, protocolVersions);
|
|
4742
|
+
}
|
|
4712
4743
|
applyInitialState(document, action);
|
|
4713
4744
|
document.state.document = {
|
|
4714
4745
|
...document.state.document,
|
|
@@ -4716,12 +4747,22 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
|
|
|
4716
4747
|
};
|
|
4717
4748
|
return document;
|
|
4718
4749
|
}
|
|
4750
|
+
/** CREATE_DOCUMENT fixes `protocolVersions`; this puts them back after a reducer. */
|
|
4751
|
+
function withProtocolVersions(document, protocolVersions) {
|
|
4752
|
+
const header = { ...document.header };
|
|
4753
|
+
if (protocolVersions === void 0) delete header.protocolVersions;
|
|
4754
|
+
else header.protocolVersions = { ...protocolVersions };
|
|
4755
|
+
return {
|
|
4756
|
+
...document,
|
|
4757
|
+
header
|
|
4758
|
+
};
|
|
4759
|
+
}
|
|
4719
4760
|
/**
|
|
4720
|
-
* Applies a DELETE_DOCUMENT action to a document.
|
|
4761
|
+
* Applies a DELETE_DOCUMENT action, or a PURGE_DOCUMENT marker, to a document.
|
|
4721
4762
|
* Marks the document as deleted in the document scope state.
|
|
4722
4763
|
*/
|
|
4723
4764
|
function applyDeleteDocumentAction(document, action) {
|
|
4724
|
-
const deletedAt = action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();
|
|
4765
|
+
const deletedAt = isPurgeMarker(action) ? action.input.purgedAtUtcIso : action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();
|
|
4725
4766
|
document.state = {
|
|
4726
4767
|
...document.state,
|
|
4727
4768
|
document: {
|
|
@@ -4841,7 +4882,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
|
|
|
4841
4882
|
const curr = boundaries[i]?.[s] ?? 0;
|
|
4842
4883
|
if (boundaries[i]) boundaries[i][s] = Math.max(prev, curr);
|
|
4843
4884
|
}
|
|
4844
|
-
const allScopes = new Set([
|
|
4885
|
+
const allScopes = /* @__PURE__ */ new Set([
|
|
4845
4886
|
...Object.keys(operations),
|
|
4846
4887
|
"global",
|
|
4847
4888
|
"local"
|
|
@@ -4886,7 +4927,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
|
|
|
4886
4927
|
const spineActionType = spineOp.action.type;
|
|
4887
4928
|
if (spineActionType === "CREATE_DOCUMENT" || spineActionType === "UPGRADE_DOCUMENT") continue;
|
|
4888
4929
|
if (isDenied(spineOp)) continue;
|
|
4889
|
-
if (spineActionType === "DELETE_DOCUMENT") document = applyDeleteDocumentAction(document, spineOp.action);
|
|
4930
|
+
if (spineActionType === "DELETE_DOCUMENT" || spineActionType === "PURGE_DOCUMENT") document = applyDeleteDocumentAction(document, spineOp.action);
|
|
4890
4931
|
else document = reducer(document, spineOp.action, dispatch, {
|
|
4891
4932
|
ignoreSkipOperations: true,
|
|
4892
4933
|
checkHashes,
|
|
@@ -4928,7 +4969,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
|
|
|
4928
4969
|
}
|
|
4929
4970
|
}
|
|
4930
4971
|
}
|
|
4931
|
-
const allResultScopes = new Set([
|
|
4972
|
+
const allResultScopes = /* @__PURE__ */ new Set([
|
|
4932
4973
|
...Object.keys(document.operations),
|
|
4933
4974
|
...Object.keys(operations),
|
|
4934
4975
|
"global",
|
|
@@ -5012,22 +5053,22 @@ async function createZip(document) {
|
|
|
5012
5053
|
*/
|
|
5013
5054
|
async function createMinimalZip(data) {
|
|
5014
5055
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
5015
|
-
const header = {
|
|
5016
|
-
id: data.documentId,
|
|
5017
|
-
sig: {
|
|
5018
|
-
publicKey: {},
|
|
5019
|
-
nonce: ""
|
|
5020
|
-
},
|
|
5021
|
-
documentType: data.documentType,
|
|
5022
|
-
createdAtUtcIso: now,
|
|
5023
|
-
slug: data.name,
|
|
5024
|
-
name: data.name,
|
|
5025
|
-
branch: data.branch,
|
|
5026
|
-
revision: {},
|
|
5027
|
-
lastModifiedAtUtcIso: now
|
|
5028
|
-
};
|
|
5029
5056
|
return zipAsync({
|
|
5030
|
-
"header.json": jsonEntry(
|
|
5057
|
+
"header.json": jsonEntry({
|
|
5058
|
+
id: data.documentId,
|
|
5059
|
+
sig: {
|
|
5060
|
+
publicKey: {},
|
|
5061
|
+
nonce: ""
|
|
5062
|
+
},
|
|
5063
|
+
documentType: data.documentType,
|
|
5064
|
+
createdAtUtcIso: now,
|
|
5065
|
+
slug: data.name,
|
|
5066
|
+
name: data.name,
|
|
5067
|
+
branch: data.branch,
|
|
5068
|
+
revision: {},
|
|
5069
|
+
lastModifiedAtUtcIso: now,
|
|
5070
|
+
...data.protocolVersions && { protocolVersions: data.protocolVersions }
|
|
5071
|
+
}),
|
|
5031
5072
|
"state.json": jsonEntry(data.state),
|
|
5032
5073
|
"current-state.json": jsonEntry(data.state),
|
|
5033
5074
|
"operations.json": jsonEntry({})
|
|
@@ -5051,7 +5092,10 @@ async function parseZipData(data) {
|
|
|
5051
5092
|
if (!files["header.json"]) throw new Error("Document header not found - file format may be outdated");
|
|
5052
5093
|
const header = JSON.parse(readEntry(files, "header.json"));
|
|
5053
5094
|
if (!files["operations.json"]) throw new Error("Operations history not found");
|
|
5054
|
-
const
|
|
5095
|
+
const operations = JSON.parse(readEntry(files, "operations.json"));
|
|
5096
|
+
const clearedOperations = garbageCollectDocumentOperations(operations);
|
|
5097
|
+
pinProtocolVersionsToCreate(header, operations);
|
|
5098
|
+
backfillBaseReducerVersion(header);
|
|
5055
5099
|
const operationsError = validateOperations(clearedOperations);
|
|
5056
5100
|
if (operationsError.length) {
|
|
5057
5101
|
const errorMessages = operationsError.map((err) => err.message);
|
|
@@ -5063,6 +5107,25 @@ async function parseZipData(data) {
|
|
|
5063
5107
|
clearedOperations
|
|
5064
5108
|
};
|
|
5065
5109
|
}
|
|
5110
|
+
/** header.json is a snapshot; the stored CREATE_DOCUMENT input wins. */
|
|
5111
|
+
function pinProtocolVersionsToCreate(header, operations) {
|
|
5112
|
+
const create = operations.document?.find((operation) => operation.action.type === "CREATE_DOCUMENT");
|
|
5113
|
+
if (!create) return;
|
|
5114
|
+
const input = create.action.input;
|
|
5115
|
+
if (input?.protocolVersions) header.protocolVersions = { ...input.protocolVersions };
|
|
5116
|
+
else if (header.protocolVersions) {
|
|
5117
|
+
const { [SIGNATURE_PROTOCOL]: _dropped, ...rest } = header.protocolVersions;
|
|
5118
|
+
header.protocolVersions = rest;
|
|
5119
|
+
}
|
|
5120
|
+
}
|
|
5121
|
+
/** A zip with no recorded base-reducer version predates it: replay as v1. */
|
|
5122
|
+
function backfillBaseReducerVersion(header) {
|
|
5123
|
+
if (typeof header.protocolVersions?.["base-reducer"] === "number") return;
|
|
5124
|
+
header.protocolVersions = {
|
|
5125
|
+
...header.protocolVersions,
|
|
5126
|
+
"base-reducer": 1
|
|
5127
|
+
};
|
|
5128
|
+
}
|
|
5066
5129
|
async function loadFromZipData(data, reducer, options) {
|
|
5067
5130
|
const { initialState, header, clearedOperations } = await parseZipData(data);
|
|
5068
5131
|
return {
|
|
@@ -5138,6 +5201,6 @@ const getFileBrowser = (file) => {
|
|
|
5138
5201
|
return Promise.resolve().then(() => readFileBrowser(file));
|
|
5139
5202
|
};
|
|
5140
5203
|
//#endregion
|
|
5141
|
-
export { AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DOCUMENT_DELETED_REASON, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError,
|
|
5204
|
+
export { ACTION_SIGNATURE_V2_PREFIX, AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CanonicalJsonError, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DEFAULT_SIGNATURE_POLICY, DOCUMENT_DELETED_REASON, DOCUMENT_PURGE_PROTOCOL, DOCUMENT_SCOPE_ACTION_TYPES, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError, MARKER_REFUSAL_FEATURE, MAX_AUTH_GRANTS, MAX_CAPABILITY_OPERATIONS, MAX_CONDITION_DEPTH, MAX_CONDITION_NODES, MAX_SUPPORTED_AUTH_VERSION, ManifestSchema, ModuleSchema, MoveGrantActionInputSchema, MoveOperationInputSchema, OPERATION_NAME_PATTERN, OperationErrorSchema, OperationScopeSchema, OperationSpecificationSchema, PEER_CAPABILITIES, PEER_MANIFEST_FORMAT, PURGE_DOCUMENT, PieceModuleSchema, PieceModulesSchema, PowerhouseModuleSchema, PowerhouseModulesSchema, PublisherSchema, PwaConfigSchema, RESERVED_OPERATION_NAMES, RedoActionInputSchema, RedoActionSchema, RedoSchema, RemoveGrantActionInputSchema, ReorderChangeLogItemsInputSchema, ReorderModuleOperationsInputSchema, ReorderModulesInputSchema, ReorderOperationErrorsInputSchema, ReorderOperationExamplesInputSchema, ReorderStateExamplesInputSchema, SIGNATURE_PROTOCOL, SIGNATURE_PROTOCOL_V2, ScopeStateSchema, SetAuthorNameInputSchema, SetAuthorWebsiteInputSchema, SetGrantActionInputSchema, SetInitialStateInputSchema, SetModelDescriptionInputSchema, SetModelExtensionInputSchema, SetModelIdInputSchema, SetModelNameInputSchema, SetModuleDescriptionInputSchema, SetModuleNameInputSchema, SetNameActionInputSchema, SetNameActionSchema, SetOperationDescriptionInputSchema, SetOperationErrorCodeInputSchema, SetOperationErrorDescriptionInputSchema, SetOperationErrorNameInputSchema, SetOperationErrorTemplateInputSchema, SetOperationNameInputSchema, SetOperationReducerInputSchema, SetOperationSchemaInputSchema, SetOperationScopeInputSchema, SetOperationTemplateInputSchema, SetPreferredEditorActionInputSchema, SetPreferredEditorActionSchema, SetStateSchemaInputSchema, Set_NameSchema, Set_PreferredEditorSchema, StateSchema, UndoActionInputSchema, UndoActionSchema, UndoSchema, UnsupportedDocumentModelVersionError, UpdateChangeLogItemInputSchema, UpdateOperationExampleInputSchema, UpdateStateExampleInputSchema, ab2hex, actionContext, actionFromAction, actionPreimageV2, actionSigner, actionSignerIdentity, actionSigningTarget, actions, addChangeLogItem, addModule, addOperation, addOperationError, addOperationExample, addStateExample, addUndo, appendWithoutApplying, applyAuthAction, applyDeleteDocumentAction, applyInitializeAuthAction, applyMoveGrantAction, applyRemoveGrantAction, applySetGrantAction, applyUpgradeDocumentAction, assertAuthAdministrationRetained, assertAuthPreservedOnDuplicate, assertAuthScopeActionAllowed, assertIsDocumentModelDocument, assertIsDocumentModelState, assertModuleIdUnique, assertOperationErrorIdUnique, assertOperationExampleIdUnique, assertOperationIdUnique, assertValidGrant, assertValidGrantUpsert, assertValidInitialGrants, attachBranch, backfillAuthState, base58Decode, base64UrlToBytes, baseActions, baseCreateDocument, baseLoadFromInput, baseLoadFromInputVersioned, baseReducer, baseReducerVersion, baseSaveToFileHandle, buildOperationSignature, buildOperationSignatureMessage, buildOperationSignatureParams, buildSignedAction, bytesToBase64Url, canonicalJson, checkCleanedOperationsIntegrity, checkOperationsIntegrity, computeUpgradeTransitions, coversLocal, createAction, createAuthState, createBaseState, createCopyHeader, createDocumentState, createGlobalState, createLocalState, createMinimalZip, createPresignedHeader, createReducer, createSignedHeader, createSignedHeaderForSigner, createState, createVerificationSigner, createZip, decide, defaultAuthState, defaultBaseState, defaultDocumentState, defaultGlobalState, defaultLocalState, defaultPHState, definedNonNullAnySchema, deleteChangeLogItem, deleteModule, deleteOperation, deleteOperationError, deleteOperationExample, deleteStateExample, deriveDocumentId, deriveOperationId, deserializeSignature, diffOperations, documentModelActions, documentModelDocumentType, documentModelFileExtension, documentModelGlobalState, documentModelHeaderReducer, documentModelInitialGlobalState, documentModelInitialLocalState, documentModelLoadFromInput, documentModelModuleReducer, documentModelOperationErrorReducer, documentModelOperationExampleReducer, documentModelOperationReducer, documentModelReducer, documentModelSaveToFileHandle, documentModelStateReducer, documentModelStateSchemaReducer, documentModelVersioningReducer, evaluate, evaluateCondition, evaluateGrantStack, evaluateGrants, fetchFileBrowser, filterDocumentOperationsResultingState, filterDuplicatedOperations, findModuleOrThrow, findOperationErrorOrThrow, findOperationExampleOrThrow, findOperationOrThrow, garbageCollect, garbageCollectDocumentOperations, garbageCollectV2, generateId, generateMock, getAllOperationNames, getDocumentLastModified, getFileBrowser, getUnixTimestamp, grantProblem, groupDocumentType, groupMembershipActionTypes, groupOperationsByScope, hasDerivedDocumentId, hashActionV2, hashBrowser, hashDocumentStateForScope, hex2ab, holdReason, initializeAuth, isAuthAction, isDefinedNonNullAny, isDenied, isDerivedDocumentId, isDocumentAction, isDocumentCreator, isDocumentModelDocument, isDocumentModelState, isDocumentZip, isNoopOperation, isOlderManifest, isPlainValue, isPurgeMarker, isReservedOperationName, isSignaturePolicy, isUndo, isUndoRedo, isV2ActionHash, isValidOperationNameFormat, legacySupports, localPeerManifest, localSupports, manifestRevision, mapSkippedOperations, mapSkippedOperationsV2, mentionedGroupIds, merge, mergePeerCapabilities, moveGrant, moveOperation, nextSkipNumber, noop, normalizeDocumentModelVersion, operationExampleCreators, operationFromAction, operationFromOperation, operationOutcome, operationWithContext, operationsAreEqual, parseBulkArchive, parseResultingState, peerSupports, precedes, prepareOperations, processUndoRedo, protocolVersionsFor, purgeDocumentAction, purgeMarkerOperation, purgedProtocolVersions, readFileBrowser, readOnly, readPeerManifest, redo, redoOperation, referencedGroupIds, releaseNewVersion, removeExistingOperations, removeGrant, reorderChangeLogItems, reorderModuleOperations, reorderModules, reorderOperationErrors, reorderOperationExamples, reorderStateExamples, replayDocument, replayDocumentVersioned, replayOperations, requestedSignaturePolicy, reshuffleByTimestamp, reshuffleByTimestampAndIndex, resolveSnapshotAuth, selectProtocolVersions, serializeSignature, setAuthorName, setAuthorWebsite, setGrant, setInitialState, setModelDescription, setModelExtension, setModelId, setModelName, setModuleDescription, setModuleName, setName, setNameOperation, setOperationDescription, setOperationErrorCode, setOperationErrorDescription, setOperationErrorName, setOperationErrorTemplate, setOperationName, setOperationReducer, setOperationSchema, setOperationScope, setOperationTemplate, setPreferredEditor, setPreferredEditorOperation, setStateSchema, sign, signActionV2, signaturePolicyOf, skipHeaderOperations, sortMappedOperations, sortOperations, split, targetDocumentId, toTransportAction, undo, undoOperation, undoOperationV2, updateChangeLogItem, updateDocument, updateHeaderRevision, updateOperationExample, updateStateExample, v2RequiredProtocolVersions, v2TupleProblem, validateHeader, validateInitialState, validateModule, validateModuleOperation, validateModules, validateOperationName, validateOperations, validateStateSchemaName, verify, verifyOperationSignature, withProtocolVersions, withSignaturePolicy, writeFileBrowser, zipEntries };
|
|
5142
5205
|
|
|
5143
5206
|
//# sourceMappingURL=index.js.map
|