@voltro/cms 0.86.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +5484 -0
  2. package/README.md +138 -0
  3. package/THIRD-PARTY-NOTICES.md +1511 -276
  4. package/dist/ContentForm.js +1 -2
  5. package/dist/RichDocumentEditor.js +1 -2
  6. package/dist/RichDocumentView.js +82 -38
  7. package/dist/RichTextSurface.js +1 -2
  8. package/dist/aiCandidates.js +4 -5
  9. package/dist/aiOperations.js +1 -2
  10. package/dist/applicationBuildSnapshotService.js +100 -0
  11. package/dist/assetRenditions.js +101 -0
  12. package/dist/assetRevision.js +45 -0
  13. package/dist/assetUseRights.js +71 -0
  14. package/dist/audiences.js +1 -2
  15. package/dist/availability.js +20 -18
  16. package/dist/blueprint.js +76 -77
  17. package/dist/build.d.ts +3063 -0
  18. package/dist/build.js +37 -0
  19. package/dist/buildApplicationAdmission.js +15 -0
  20. package/dist/buildApplicationCatalog.js +135 -0
  21. package/dist/buildApplicationCatalogTable.js +23 -0
  22. package/dist/buildApplicationRest.js +98 -0
  23. package/dist/buildApplicationUpload.js +110 -0
  24. package/dist/buildSnapshot.js +400 -0
  25. package/dist/buildSnapshotApplicationPin.js +31 -0
  26. package/dist/buildSnapshotRest.js +209 -0
  27. package/dist/buildSnapshotService.js +264 -0
  28. package/dist/buildSnapshotTables.js +24 -0
  29. package/dist/bulk.js +72 -72
  30. package/dist/cacheIdentity.js +1 -2
  31. package/dist/changes.js +280 -64
  32. package/dist/cmsContext.js +1 -2
  33. package/dist/collections.js +1 -2
  34. package/dist/consent.js +6 -7
  35. package/dist/contentLocations.js +52 -0
  36. package/dist/contentProjection.js +82 -0
  37. package/dist/contentRouteIdentity.js +12 -0
  38. package/dist/contentRouteMaterializer.js +96 -0
  39. package/dist/contentRouteTypes.js +38 -0
  40. package/dist/contentSeo.js +188 -0
  41. package/dist/contentTreePath.js +59 -0
  42. package/dist/contentType.js +121 -105
  43. package/dist/contentValues.js +17 -0
  44. package/dist/contentfulImport.js +1 -2
  45. package/dist/copies.js +4 -5
  46. package/dist/cutover.js +1 -2
  47. package/dist/deliveryChecks.js +1 -2
  48. package/dist/domainHost.js +6 -0
  49. package/dist/domains.js +82 -89
  50. package/dist/draftTexts.js +38 -39
  51. package/dist/duplicates.js +24 -25
  52. package/dist/edgePurge.js +1 -2
  53. package/dist/editHistory.js +1 -2
  54. package/dist/effectForm.js +1 -2
  55. package/dist/environmentAliases.js +137 -0
  56. package/dist/environments.js +108 -71
  57. package/dist/errors.js +55 -16
  58. package/dist/experiments.js +8 -9
  59. package/dist/exposure.js +1 -2
  60. package/dist/extensionManifest.js +2 -3
  61. package/dist/extensions.js +1 -2
  62. package/dist/fieldSchema.js +1 -2
  63. package/dist/formStrings.js +1 -2
  64. package/dist/frontendBindings.js +98 -0
  65. package/dist/frontendMedia.js +17 -0
  66. package/dist/glossary.js +1 -2
  67. package/dist/history.js +1 -2
  68. package/dist/htmlImport.js +1 -2
  69. package/dist/index.d.ts +760 -47
  70. package/dist/index.js +89 -73
  71. package/dist/initializePublicRoutes.js +27 -0
  72. package/dist/liveContentRouteView.js +75 -0
  73. package/dist/media.js +1 -2
  74. package/dist/metrics.js +1 -2
  75. package/dist/migration.js +1 -2
  76. package/dist/migrationStages.js +1 -2
  77. package/dist/nativeOutputDeploymentService.js +204 -0
  78. package/dist/outputActivation.js +233 -0
  79. package/dist/outputActivationOrigin.js +50 -0
  80. package/dist/outputActivationStore.js +410 -0
  81. package/dist/outputActivationTables.js +10 -0
  82. package/dist/outputActivationTarget.js +80 -0
  83. package/dist/outputActivationTargetTable.js +24 -0
  84. package/dist/outputDeployment.js +173 -0
  85. package/dist/outputDeploymentRest.js +167 -0
  86. package/dist/outputDeploymentService.js +240 -0
  87. package/dist/outputRouteGraph.js +176 -0
  88. package/dist/outputSafetyArtifact.js +146 -0
  89. package/dist/outputTargetRest.js +61 -0
  90. package/dist/pathSegmentEncoding.js +3 -0
  91. package/dist/presenceAnchors.js +1 -2
  92. package/dist/preview.js +1 -2
  93. package/dist/privateCmsTransport.js +75 -0
  94. package/dist/privateNativeRouteReservation.js +9 -0
  95. package/dist/promotion.js +69 -61
  96. package/dist/publicBuild.js +89 -0
  97. package/dist/publicBuildRest.js +97 -0
  98. package/dist/publicBuildService.js +62 -0
  99. package/dist/publicOutputHttp.js +128 -0
  100. package/dist/publicOutputService.js +286 -0
  101. package/dist/publicPresentation.js +16 -0
  102. package/dist/publicRouteDispositionAdmission.js +37 -0
  103. package/dist/publicRouteHistoryStore.js +11 -0
  104. package/dist/publicRouteHistoryView.js +33 -0
  105. package/dist/publicRouteIntegrity.js +4 -0
  106. package/dist/publicRouteMutation.js +5 -0
  107. package/dist/publicRouteNamespace.js +133 -0
  108. package/dist/publicRoutePublication.js +35 -0
  109. package/dist/publicRouteRegistry.js +16 -0
  110. package/dist/publicRouteRegistryBinding.js +193 -0
  111. package/dist/publicRouteRegistryDefinition.js +75 -0
  112. package/dist/publicRouteSitePublication.js +39 -0
  113. package/dist/publicRouteTables.js +12 -0
  114. package/dist/publicRouteUrl.js +17 -0
  115. package/dist/publicationSeo.js +51 -0
  116. package/dist/publicationState.js +295 -0
  117. package/dist/quality.js +9 -10
  118. package/dist/reconfigurePublicRoutes.js +40 -0
  119. package/dist/recurrence.js +1 -2
  120. package/dist/redirects.js +105 -75
  121. package/dist/referenceGraph.js +16 -16
  122. package/dist/references.js +3 -4
  123. package/dist/release.js +178 -143
  124. package/dist/renderReadAuthority.js +42 -0
  125. package/dist/renderReadGrant.js +136 -0
  126. package/dist/rest.js +1 -2
  127. package/dist/review.js +29 -30
  128. package/dist/richDocument.js +56 -27
  129. package/dist/richInline.js +1 -2
  130. package/dist/routeDispositionGraph.js +43 -0
  131. package/dist/routeDispositionRest.js +50 -0
  132. package/dist/routeDispositionService.js +72 -0
  133. package/dist/routeDispositionStore.js +288 -0
  134. package/dist/routeDispositionTables.js +4 -0
  135. package/dist/routeDispositions.js +90 -0
  136. package/dist/routeHistoryStorage.js +319 -0
  137. package/dist/routeHistoryStore.js +11 -0
  138. package/dist/schedule.js +37 -38
  139. package/dist/search.js +1 -2
  140. package/dist/selectionIntent.js +1 -2
  141. package/dist/seo.js +2 -3
  142. package/dist/series.js +12 -13
  143. package/dist/share.js +14 -15
  144. package/dist/siteBindings.js +158 -0
  145. package/dist/siteBuildCandidate.js +103 -0
  146. package/dist/siteDelivery.js +114 -0
  147. package/dist/siteState.js +46 -0
  148. package/dist/snapshotAddressGraph.js +54 -0
  149. package/dist/snapshotAddressRead.js +72 -0
  150. package/dist/snapshotAppConsumer.js +70 -0
  151. package/dist/snapshotAppExecution.js +101 -0
  152. package/dist/snapshotApplication.js +74 -0
  153. package/dist/snapshotApprovedRouteDispositions.js +43 -0
  154. package/dist/snapshotAssetAssembly.js +69 -0
  155. package/dist/snapshotAssetAssemblyRest.js +49 -0
  156. package/dist/snapshotBindingRead.js +60 -0
  157. package/dist/snapshotCodeSeo.js +28 -0
  158. package/dist/snapshotComponent.js +33 -0
  159. package/dist/snapshotComponentSource.js +23 -0
  160. package/dist/snapshotConsumer.js +86 -0
  161. package/dist/snapshotContentIdentity.js +9 -0
  162. package/dist/snapshotDefinitions.js +263 -0
  163. package/dist/snapshotDocumentAssembly.js +192 -0
  164. package/dist/snapshotDocumentAssemblyRest.js +83 -0
  165. package/dist/snapshotDocumentProjection.js +201 -0
  166. package/dist/snapshotDocumentTransfer.js +34 -0
  167. package/dist/snapshotDocumentTransferRest.js +79 -0
  168. package/dist/snapshotDomains.js +55 -0
  169. package/dist/snapshotEnvironment.js +30 -0
  170. package/dist/snapshotFieldPlan.js +84 -0
  171. package/dist/snapshotFrontend.js +102 -0
  172. package/dist/snapshotLink.js +7 -0
  173. package/dist/snapshotMedia.js +110 -0
  174. package/dist/snapshotMediaCapture.js +245 -0
  175. package/dist/snapshotMediaFields.js +224 -0
  176. package/dist/snapshotMediaRead.js +184 -0
  177. package/dist/snapshotMediaReader.js +12 -0
  178. package/dist/snapshotObservation.js +15 -0
  179. package/dist/snapshotObservedRouteHistory.js +33 -0
  180. package/dist/snapshotOutputTransfer.js +77 -0
  181. package/dist/snapshotPageLoader.js +6 -0
  182. package/dist/snapshotPageSeo.js +58 -0
  183. package/dist/snapshotPathLocale.js +14 -0
  184. package/dist/snapshotPresentation.js +85 -0
  185. package/dist/snapshotPresentationPolicy.js +11 -0
  186. package/dist/snapshotProjection.js +118 -0
  187. package/dist/snapshotPublicAccess.js +160 -0
  188. package/dist/snapshotPublicRouteHistory.js +39 -0
  189. package/dist/snapshotReadAdmission.js +37 -0
  190. package/dist/snapshotRedirectOutput.js +150 -0
  191. package/dist/snapshotRedirectTargets.js +23 -0
  192. package/dist/snapshotRedirects.js +131 -0
  193. package/dist/snapshotReference.js +7 -0
  194. package/dist/snapshotReferenceAddress.js +9 -0
  195. package/dist/snapshotReferenceGraph.js +78 -0
  196. package/dist/snapshotReferenceRead.js +64 -0
  197. package/dist/snapshotRelease.js +98 -0
  198. package/dist/snapshotRender.js +360 -0
  199. package/dist/snapshotRenderDependencies.js +177 -0
  200. package/dist/snapshotRenditions.js +87 -0
  201. package/dist/snapshotRichDocument.js +61 -0
  202. package/dist/snapshotRoleTransfer.js +105 -0
  203. package/dist/snapshotRoleTransferRest.js +98 -0
  204. package/dist/snapshotRouteAdmission.js +70 -0
  205. package/dist/snapshotRouteDispatch.js +110 -0
  206. package/dist/snapshotRouteDispositionPlan.js +72 -0
  207. package/dist/snapshotRouteRead.js +42 -0
  208. package/dist/snapshotRoutes.js +78 -0
  209. package/dist/snapshotRouting.js +112 -0
  210. package/dist/snapshotSeo.js +178 -0
  211. package/dist/snapshotSeoControls.js +100 -0
  212. package/dist/snapshotSeoDocumentInventory.js +114 -0
  213. package/dist/snapshotSeoDocuments.js +128 -0
  214. package/dist/snapshotSeoMerge.js +84 -0
  215. package/dist/snapshotSeoMetadata.js +136 -0
  216. package/dist/snapshotSeoOutput.js +172 -0
  217. package/dist/snapshotSeoPathSets.js +104 -0
  218. package/dist/snapshotSeoRead.js +87 -0
  219. package/dist/snapshotSite.js +127 -0
  220. package/dist/snapshotSitemapFiles.js +35 -0
  221. package/dist/snapshotTreeDependencies.js +57 -0
  222. package/dist/snapshotTreeLoader.js +9 -0
  223. package/dist/snapshotTreeRead.js +157 -0
  224. package/dist/staticPathSet.js +176 -0
  225. package/dist/staticPathSetRest.js +128 -0
  226. package/dist/staticPathSetService.js +248 -0
  227. package/dist/staticPathSetStore.js +337 -0
  228. package/dist/stewardship.js +2 -3
  229. package/dist/taxonomy.js +1 -2
  230. package/dist/team.js +1 -2
  231. package/dist/templates.js +2 -3
  232. package/dist/trackChanges.js +1 -2
  233. package/dist/translation.js +1 -2
  234. package/dist/tree.js +10 -11
  235. package/dist/usage.js +1 -2
  236. package/dist/validation.js +54 -55
  237. package/dist/visualEditing.js +1 -2
  238. package/dist/web.d.ts +709 -7
  239. package/dist/web.js +50 -33
  240. package/dist/workflow.js +9 -10
  241. package/dist/write.js +251 -227
  242. package/dist/xliff.js +1 -2
  243. package/package.json +21 -7
package/dist/release.js CHANGED
@@ -1,160 +1,190 @@
1
- import { asTyped as e } from "./effectForm.js";
2
- import { ContentNotFound as t, ReferenceUnavailable as n, ReleaseNotEditable as r, ReviewRequired as i } from "./errors.js";
3
- import { publishRevision as a, unpublish as o } from "./write.js";
4
- import { and as s, eq as c, generateId as l, id as u, integer as d, json as f, lte as p, table as m, text as h, timestamp as g } from "@voltro/database";
5
- import { tenant as _ } from "@voltro/plugin-multitenancy/mixin";
6
- //#region src/release.ts
7
- var v = "cms_releases", y = "cms_release_items", b = [
1
+ import { PublicRouteRegistryUnavailable as e } from "./publicRouteRegistry.js";
2
+ import { ChangeFeedUnavailable as t, ContentNotFound as n, ReferenceUnavailable as r, ReleaseNotEditable as i, ReviewRequired as a } from "./errors.js";
3
+ import { asTyped as o } from "./effectForm.js";
4
+ import { activatePublicationRelease as s, lockPublicationStream as c } from "./changes.js";
5
+ import { withPublicRouteStateMutation as l } from "./publicRouteMutation.js";
6
+ import { withPublicRoutePublicationBatch as u } from "./publicRoutePublication.js";
7
+ import { publishRevision as d, unpublish as f } from "./write.js";
8
+ import { and as p, eq as m, generateId as h, id as g, integer as _, isNull as v, json as y, lte as b, table as x, text as S, timestamp as C } from "@voltro/database";
9
+ import { tenant as w } from "@voltro/plugin-multitenancy/mixin";
10
+ // src/release.ts
11
+ var T = "cms_releases", E = "cms_release_items", D = [
8
12
  "draft",
9
13
  "scheduled",
10
14
  "published",
11
15
  "failed"
12
- ], x = m(v, {
13
- id: u({ prefix: "crel" }),
14
- name: h(),
15
- site: h().maxLength(64),
16
- environment: h().maxLength(64),
17
- status: h().oneOf(b),
18
- scheduledAt: g().nullable(),
19
- publishedAt: g().nullable(),
20
- rollbackOf: h().nullable(),
21
- claimToken: h().nullable(),
22
- failure: h().nullable()
23
- }).with(_()), S = m(y, {
24
- id: u({ prefix: "crit" }),
25
- releaseId: h(),
26
- contentType: h().maxLength(64),
27
- variantId: h().maxLength(64),
28
- locale: h().maxLength(64),
29
- action: h().oneOf(["publish", "unpublish"]),
30
- revisionId: h().nullable(),
31
- previousRevisionId: h().nullable(),
32
- position: d(),
33
- inherited: f().nullable()
34
- }).with(_()).unique("cms_release_items_uq_variant", [
16
+ ], O = x(T, {
17
+ id: g({ prefix: "crel" }),
18
+ name: S(),
19
+ site: S().maxLength(64),
20
+ environment: S().maxLength(64),
21
+ status: S().oneOf(D),
22
+ scheduledAt: C().nullable(),
23
+ publishedAt: C().nullable(),
24
+ publicationGeneration: S().maxLength(20).nullable(),
25
+ publicationCheckpoint: S().maxLength(64).nullable(),
26
+ rollbackOf: S().nullable(),
27
+ claimToken: S().nullable(),
28
+ failure: S().nullable()
29
+ }).with(w()), k = x(E, {
30
+ id: g({ prefix: "crit" }),
31
+ releaseId: S(),
32
+ contentType: S().maxLength(64),
33
+ variantId: S().maxLength(64),
34
+ locale: S().maxLength(64),
35
+ action: S().oneOf(["publish", "unpublish"]),
36
+ revisionId: S().nullable(),
37
+ previousRevisionId: S().nullable(),
38
+ position: _(),
39
+ inherited: y().nullable()
40
+ }).with(w()).unique("cms_release_items_uq_variant", [
35
41
  "tenantId",
36
42
  "releaseId",
37
43
  "contentType",
38
44
  "variantId"
39
- ]), C = (e, t, n, r) => e.query({
45
+ ]), A = (e, t, n, r, i) => e.query({
40
46
  table: t,
41
47
  predicate: n,
48
+ ...i === void 0 ? {} : { lock: i },
42
49
  order: r === void 0 ? [] : [r],
43
50
  take: void 0,
44
51
  skip: void 0,
45
52
  projection: void 0
46
- }), w = async (e, n) => {
47
- let [r] = await C(e, v, c("id", n));
48
- if (r === void 0) throw new t({
53
+ }), j = async (e, t, r) => {
54
+ let [i] = await A(e, T, m("id", t), void 0, r);
55
+ if (i === void 0) throw new n({
49
56
  contentType: "release",
50
- id: n,
57
+ id: t,
51
58
  stage: "draft"
52
59
  });
53
- return r;
54
- }, T = (e, t) => ({
60
+ return i;
61
+ }, M = async (e, n) => {
62
+ let r = await j(e, n);
63
+ if (typeof r.tenantId != "string" || r.tenantId === "") throw new t({ reason: "scope" });
64
+ return await c(e, {
65
+ tenantId: r.tenantId,
66
+ site: String(r.site),
67
+ environment: String(r.environment)
68
+ }), j(e, n, "update");
69
+ }, N = (e, t) => ({
55
70
  site: String(e.site),
56
71
  environment: String(e.environment),
57
72
  locale: t
58
- }), E = (e, t) => e.insert(v, {
73
+ }), P = (e, t) => e.insert(T, {
59
74
  ...t,
60
75
  status: "draft"
61
- }), D = async (e, n, i) => {
62
- let a = await w(e, n);
63
- if (a.status !== "draft") throw new r({
64
- id: n,
76
+ }), F = async (e, t, r) => {
77
+ let a = await j(e, t, "update");
78
+ if (a.status !== "draft") throw new i({
79
+ id: t,
65
80
  status: String(a.status)
66
81
  });
67
- let o = T(a, i.locale), [l] = await C(e, `${i.type.name}_drafts`, s(c("id", i.id), c("site", o.site), c("environment", o.environment), c("locale", o.locale)));
68
- if (l === void 0) throw new t({
69
- contentType: i.type.name,
70
- id: i.id,
82
+ let o = N(a, r.locale), [s] = await A(e, `${r.type.name}_drafts`, p(m("id", r.id), m("site", o.site), m("environment", o.environment), m("locale", o.locale)), void 0, "update");
83
+ if (s === void 0) throw new n({
84
+ contentType: r.type.name,
85
+ id: r.id,
71
86
  stage: "draft"
72
87
  });
73
- let u = i.action ?? "publish", d = await C(e, y, s(c("releaseId", n), c("contentType", i.type.name), c("variantId", i.id))), f = {
74
- action: u,
75
- locale: i.locale,
76
- revisionId: u === "publish" ? i.revisionId ?? String(l.revisionId) : null
77
- }, [p] = d;
78
- if (p !== void 0) return await e.update("cms_release_items", String(p.id), f) ?? p;
79
- let m = (await C(e, y, c("releaseId", n))).length;
80
- return e.insert(y, {
81
- releaseId: n,
82
- contentType: i.type.name,
83
- variantId: i.id,
84
- position: m,
85
- ...f
88
+ let c = r.action ?? "publish", l = await A(e, E, p(m("releaseId", t), m("contentType", r.type.name), m("variantId", r.id)), void 0, "update"), u = {
89
+ action: c,
90
+ locale: r.locale,
91
+ revisionId: c === "publish" ? r.revisionId ?? String(s.revisionId) : null
92
+ }, [d] = l;
93
+ if (d !== void 0) return await e.update("cms_release_items", String(d.id), u) ?? d;
94
+ let f = (await A(e, E, m("releaseId", t), void 0, "update")).length;
95
+ return e.insert(E, {
96
+ releaseId: t,
97
+ contentType: r.type.name,
98
+ variantId: r.id,
99
+ position: f,
100
+ ...u
86
101
  });
87
- }, O = async (e, t) => {
88
- let [n] = await C(e, v, c("id", t));
102
+ }, I = async (e, t) => {
103
+ let [n] = await A(e, T, m("id", t));
89
104
  return n === void 0 ? null : String(n.status);
90
- }, k = (e, t) => C(e, y, c("releaseId", t), {
105
+ }, L = (e, t) => A(e, E, m("releaseId", t), {
91
106
  column: "position",
92
107
  direction: "asc"
93
- }), A = (e, t) => C(e, v, s(c("site", t.site), c("environment", t.environment)), {
108
+ }), R = (e, t) => A(e, T, p(m("site", t.site), m("environment", t.environment)), {
94
109
  column: "createdAt",
95
110
  direction: "desc"
96
- }), j = async (e, t, n, r) => {
97
- let [i] = await C(e, `${t}_published`, s(c("id", n), c("site", r.site), c("environment", r.environment), c("locale", r.locale)));
111
+ }), z = async (e, t, n, r) => {
112
+ let [i] = await A(e, `${t}_published`, p(m("id", n), m("site", r.site), m("environment", r.environment), m("locale", r.locale)), void 0, "update");
98
113
  return i === void 0 ? null : String(i.revisionId);
99
- }, M = async (e, n, i, s = /* @__PURE__ */ new Date(), c = {}) => {
100
- let l = await w(e, i);
101
- if (l.status !== "draft" && l.status !== "scheduled") throw new r({
102
- id: i,
103
- status: String(l.status)
114
+ }, B = async (e, t, r, a = /* @__PURE__ */ new Date(), o = {}) => {
115
+ let c = await M(e, r);
116
+ if (c.status !== "draft" && c.status !== "scheduled") throw new i({
117
+ id: r,
118
+ status: String(c.status)
104
119
  });
105
- let u = new Map(n.map((e) => [e.name, e]));
106
- for (let n of await k(e, i)) {
107
- let r = u.get(String(n.contentType));
108
- if (r === void 0) throw new t({
109
- contentType: String(n.contentType),
110
- id: String(n.variantId),
111
- stage: "draft"
112
- });
113
- let s = T(l, String(n.locale)), c = String(n.variantId), d = await j(e, r.name, c, s);
114
- n.action === "publish" ? await a(e, r, c, s, String(n.revisionId), { releaseId: i }) : d !== null && await o(e, r, c, s, { releaseId: i }), await e.update(y, String(n.id), { previousRevisionId: d });
115
- }
116
- let d = await e.update("cms_releases", i, {
117
- status: "published",
118
- publishedAt: s
119
- }) ?? l;
120
- for (let t of c.afterPublish ?? []) await t(e, d, s);
121
- return d;
122
- }, N = async (e, t, n) => {
123
- let i = await w(e, t);
124
- if (i.status !== "draft") throw new r({
120
+ return u(e, {
121
+ tenantId: String(c.tenantId),
122
+ site: String(c.site),
123
+ environment: String(c.environment)
124
+ }, async () => {
125
+ let i = new Map(t.map((e) => [e.name, e]));
126
+ for (let t of await A(e, E, m("releaseId", r), {
127
+ column: "position",
128
+ direction: "asc"
129
+ }, "update")) {
130
+ let a = i.get(String(t.contentType));
131
+ if (a === void 0) throw new n({
132
+ contentType: String(t.contentType),
133
+ id: String(t.variantId),
134
+ stage: "draft"
135
+ });
136
+ let o = N(c, String(t.locale)), s = String(t.variantId), l = await z(e, a.name, s, o);
137
+ t.action === "publish" ? await d(e, a, s, o, String(t.revisionId), { releaseId: r }) : l !== null && await f(e, a, s, o, { releaseId: r }), await e.update(E, String(t.id), { previousRevisionId: l });
138
+ }
139
+ let l = await s(e, {
140
+ tenantId: String(c.tenantId),
141
+ site: String(c.site),
142
+ environment: String(c.environment)
143
+ }, r), u = await e.update("cms_releases", r, {
144
+ status: "published",
145
+ publishedAt: a,
146
+ publicationGeneration: l.generation,
147
+ publicationCheckpoint: l.checkpoint
148
+ }) ?? c;
149
+ for (let t of o.afterPublish ?? []) await t(e, u, a);
150
+ return u;
151
+ });
152
+ }, V = async (e, t, n) => {
153
+ let r = await j(e, t, "update");
154
+ if (r.status !== "draft") throw new i({
125
155
  id: t,
126
- status: String(i.status)
156
+ status: String(r.status)
127
157
  });
128
158
  return await e.update("cms_releases", t, {
129
159
  status: "scheduled",
130
160
  scheduledAt: n
131
- }) ?? i;
132
- }, P = async (e, t, n = /* @__PURE__ */ new Date(), r = {}) => {
133
- let i = await C(e, v, s(c("status", "scheduled"), p("scheduledAt", n))), a = [];
161
+ }) ?? r;
162
+ }, H = async (e, t, n = /* @__PURE__ */ new Date(), r = {}) => {
163
+ let i = await A(e, T, p(m("status", "scheduled"), b("scheduledAt", n))), a = [];
134
164
  for (let o of i) {
135
- let i = String(o.id), u = l({
165
+ let i = String(o.id), s = h({
136
166
  kind: "typeid",
137
167
  prefix: "claim"
138
168
  }, "cms_releases") ?? `claim_${Date.now()}`;
139
169
  try {
140
- await e.transactional(async (e) => await e.updateMany("cms_releases", { claimToken: u }, { where: s(c("id", i), c("status", "scheduled")) }) === 1 && (await M(e, t, i, n, r), !0)) && a.push(i);
170
+ await e.transactional(async (e) => (await M(e, i), await e.updateMany("cms_releases", { claimToken: s }, { where: p(m("id", i), m("status", "scheduled")) }) === 1 && (await B(e, t, i, n, r), !0))) && a.push(i);
141
171
  } catch (t) {
142
- await e.update(v, i, {
172
+ await e.updateMany(T, {
143
173
  status: "failed",
144
- failure: F(t)
145
- });
174
+ failure: U(t)
175
+ }, { where: p(m("id", i), m("status", "scheduled"), o.claimToken === null || o.claimToken === void 0 ? v("claimToken") : m("claimToken", o.claimToken)) });
146
176
  }
147
177
  }
148
178
  return a;
149
- }, F = (e) => {
150
- if (e instanceof n) return `ReferenceUnavailable: ${e.contentType} ${e.id} uses ${e.targets.map((e) => `${e.contentType} ${e.documentId} (${e.reason})`).join(", ")}`;
151
- if (e instanceof i) return `ReviewRequired: ${e.contentType} ${e.id} revision ${e.revisionId} is not approved`;
152
- if (e instanceof t) return `ContentNotFound: ${e.contentType} ${e.id} (${e.stage})`;
153
- let r = e?._tag;
154
- return typeof r == "string" ? r : e instanceof Error ? e.message : String(e);
155
- }, I = async (e, t) => {
156
- let n = await w(e, t);
157
- if (n.status !== "failed") throw new r({
179
+ }, U = (e) => {
180
+ if (e instanceof r) return `ReferenceUnavailable: ${e.contentType} ${e.id} uses ${e.targets.map((e) => `${e.contentType} ${e.documentId} (${e.reason})`).join(", ")}`;
181
+ if (e instanceof a) return `ReviewRequired: ${e.contentType} ${e.id} revision ${e.revisionId} is not approved`;
182
+ if (e instanceof n) return `ContentNotFound: ${e.contentType} ${e.id} (${e.stage})`;
183
+ let t = e?._tag;
184
+ return typeof t == "string" ? t : e instanceof Error ? e.message : String(e);
185
+ }, W = async (e, t) => {
186
+ let n = await j(e, t, "update");
187
+ if (n.status !== "failed") throw new i({
158
188
  id: t,
159
189
  status: String(n.status)
160
190
  });
@@ -164,42 +194,47 @@ var v = "cms_releases", y = "cms_release_items", b = [
164
194
  claimToken: null,
165
195
  scheduledAt: null
166
196
  }) ?? n;
167
- }, L = async (e, t, n, i = /* @__PURE__ */ new Date(), a = {}) => {
168
- let o = await w(e, n);
169
- if (o.status !== "published") throw new r({
197
+ }, G = async (e, t, n, r = /* @__PURE__ */ new Date(), a = {}) => {
198
+ let o = await M(e, n);
199
+ if (o.status !== "published") throw new i({
170
200
  id: n,
171
201
  status: String(o.status)
172
202
  });
173
- let s = await e.insert(v, {
174
- name: `Rollback of ${String(o.name)}`,
175
- site: o.site,
176
- environment: o.environment,
177
- status: "draft",
178
- rollbackOf: n,
179
- ...o.tenantId !== void 0 && o.tenantId !== null ? { tenantId: o.tenantId } : {}
180
- }), c = String(s.id), l = 0;
181
- for (let t of await k(e, n)) {
182
- let n = t.previousRevisionId;
183
- await e.insert(y, {
184
- releaseId: c,
185
- contentType: t.contentType,
186
- variantId: t.variantId,
187
- locale: t.locale,
188
- action: n == null ? "unpublish" : "publish",
189
- revisionId: n ?? null,
190
- position: l++,
191
- ...t.tenantId !== void 0 && t.tenantId !== null ? { tenantId: t.tenantId } : {}
192
- });
193
- }
194
- return M(e, t, c, i, a);
195
- }, R = [
196
- t,
197
- r,
203
+ return l(e, async () => {
204
+ let i = await e.insert(T, {
205
+ name: `Rollback of ${String(o.name)}`,
206
+ site: o.site,
207
+ environment: o.environment,
208
+ status: "draft",
209
+ rollbackOf: n,
210
+ ...o.tenantId !== void 0 && o.tenantId !== null ? { tenantId: o.tenantId } : {}
211
+ }), s = String(i.id), c = 0;
212
+ for (let t of await L(e, n)) {
213
+ let n = t.previousRevisionId;
214
+ await e.insert(E, {
215
+ releaseId: s,
216
+ contentType: t.contentType,
217
+ variantId: t.variantId,
218
+ locale: t.locale,
219
+ action: n == null ? "unpublish" : "publish",
220
+ revisionId: n ?? null,
221
+ position: c++,
222
+ ...t.tenantId !== void 0 && t.tenantId !== null ? { tenantId: t.tenantId } : {}
223
+ });
224
+ }
225
+ return B(e, t, s, r, a);
226
+ });
227
+ }, K = [
228
+ n,
198
229
  i,
199
- n
200
- ], z = (...t) => e(() => E(...t)), B = (...n) => e(() => D(...n), t, r), V = async (e, t, n, r) => {
201
- let [i] = await C(e, y, s(c("releaseId", t), c("variantId", n)));
202
- return i !== void 0 && (await e.update(y, String(i.id), { inherited: r }), !0);
203
- }, H = (...t) => e(() => V(...t)), U = (...t) => e(() => k(...t)), W = (...t) => e(() => O(...t)), G = (...t) => e(() => A(...t)), K = (...t) => e(() => M(...t), ...R), q = (...t) => e(() => N(...t), ...R), J = (...t) => e(() => P(...t)), Y = (...t) => e(() => L(...t), ...R), X = (...t) => e(() => I(...t), ...R);
204
- //#endregion
205
- export { v as CMS_RELEASES_TABLE, y as CMS_RELEASE_ITEMS_TABLE, b as RELEASE_STATUSES, D as addToRelease, B as addToReleaseEffect, S as cmsReleaseItemsTable, x as cmsReleasesTable, E as createRelease, z as createReleaseEffect, F as describeFailure, k as listReleaseItems, U as listReleaseItemsEffect, A as listReleases, G as listReleasesEffect, V as pinReleaseInheritance, H as pinReleaseInheritanceEffect, P as publishDueReleases, J as publishDueReleasesEffect, M as publishRelease, K as publishReleaseEffect, O as releaseStatusOf, W as releaseStatusOfEffect, I as retryRelease, X as retryReleaseEffect, L as rollbackRelease, Y as rollbackReleaseEffect, N as scheduleRelease, q as scheduleReleaseEffect };
230
+ a,
231
+ r
232
+ ], q = [
233
+ ...K,
234
+ t,
235
+ e
236
+ ], J = (...e) => o(() => P(...e)), Y = (...e) => o(() => F(...e), n, i), X = async (e, t, n, r) => {
237
+ let [i] = await A(e, E, p(m("releaseId", t), m("variantId", n)));
238
+ return i !== void 0 && (await e.update(E, String(i.id), { inherited: r }), !0);
239
+ }, Z = (...e) => o(() => X(...e)), Q = (...e) => o(() => L(...e)), $ = (...e) => o(() => I(...e)), ee = (...e) => o(() => R(...e)), te = (...e) => o(() => B(...e), ...q), ne = (...e) => o(() => V(...e), ...K), re = (...e) => o(() => H(...e)), ie = (...e) => o(() => G(...e), ...q), ae = (...e) => o(() => W(...e), ...K);
240
+ export { T as CMS_RELEASES_TABLE, E as CMS_RELEASE_ITEMS_TABLE, D as RELEASE_STATUSES, F as addToRelease, Y as addToReleaseEffect, k as cmsReleaseItemsTable, O as cmsReleasesTable, P as createRelease, J as createReleaseEffect, U as describeFailure, L as listReleaseItems, Q as listReleaseItemsEffect, R as listReleases, ee as listReleasesEffect, X as pinReleaseInheritance, Z as pinReleaseInheritanceEffect, H as publishDueReleases, re as publishDueReleasesEffect, B as publishRelease, te as publishReleaseEffect, I as releaseStatusOf, $ as releaseStatusOfEffect, W as retryRelease, ae as retryReleaseEffect, G as rollbackRelease, ie as rollbackReleaseEffect, V as scheduleRelease, ne as scheduleReleaseEffect };
@@ -0,0 +1,42 @@
1
+ import { dataStoreApiKeyStore as e, lockApiKeyById as t, sha256Hex as n } from "@voltro/runtime";
2
+ // src/renderReadAuthority.ts
3
+ var r = (e) => {
4
+ if (typeof e != "object" || !e || Array.isArray(e)) return null;
5
+ let t = e;
6
+ return Object.keys(t).length !== 3 || Object.keys(t).some((e) => ![
7
+ "kind",
8
+ "id",
9
+ "scope"
10
+ ].includes(e)) || t.kind !== "apiKey" || typeof t.id != "string" || !/^[A-Za-z0-9_-]{1,64}$/.test(t.id) || typeof t.scope != "string" || !/^[A-Za-z][A-Za-z0-9:_.-]{0,127}$/.test(t.scope) ? null : {
11
+ kind: "apiKey",
12
+ id: t.id,
13
+ scope: t.scope
14
+ };
15
+ }, i = (e, t, n, r) => e === null || e.id !== n || e.tenantId !== t.tenantId || e.revokedAt !== null || e.onBehalfOf !== null && e.onBehalfOf !== void 0 || !Array.isArray(e.scopes) || !e.scopes.every((e) => typeof e == "string") || e.metadata === null || typeof e.metadata != "object" || Array.isArray(e.metadata) || e.metadata.site !== t.site || e.metadata.environment !== t.environment || e.expiresAt !== null && (!Number.isSafeInteger(e.expiresAt) || e.expiresAt <= r) ? null : {
16
+ expiresAt: e.expiresAt,
17
+ scopes: [...e.scopes]
18
+ }, a = async (t, n, r, a) => i(await e(t).findById(r), n, r, a), o = async (e, t, n, r) => {
19
+ let i = await a(e, t, n.id, r);
20
+ return i !== null && i.scopes.includes(n.scope) ? { expiresAt: i.expiresAt } : null;
21
+ }, s = async (t, r, i, o) => {
22
+ if (typeof i != "string" || i.length === 0 || i.length > 512 || !Number.isSafeInteger(o) || !Number.isFinite(new Date(o).getTime())) return null;
23
+ let s = await e(t).findByHash(n(i));
24
+ if (s === null) return null;
25
+ let c = await a(t, r, s.id, o);
26
+ return c === null ? null : {
27
+ id: s.id,
28
+ ...c
29
+ };
30
+ }, c = async (r, a, o, s) => {
31
+ if (typeof o != "string" || o.length === 0 || o.length > 512 || !Number.isSafeInteger(s) || !Number.isFinite(new Date(s).getTime())) return null;
32
+ let c = n(o), l = await e(r).findByHash(c);
33
+ if (l === null) return null;
34
+ let u = await t(r, l.id, a.tenantId);
35
+ if (u === null || u.hashedKey !== c) return null;
36
+ let d = i(u, a, l.id, s);
37
+ return d === null ? null : {
38
+ id: u.id,
39
+ ...d
40
+ };
41
+ };
42
+ export { r as copyRenderReadAuthority, c as lockRenderReadCredential, o as readRenderReadAuthority, s as readRenderReadCredential, a as readRenderReadOrganization };
@@ -0,0 +1,136 @@
1
+ import { copyRenderReadAuthority as e, readRenderReadAuthority as t } from "./renderReadAuthority.js";
2
+ import { Schema as n } from "effect";
3
+ import { and as r, eq as i, id as a, json as o, table as s, text as c, timestamp as l } from "@voltro/database";
4
+ import { tenant as u } from "@voltro/plugin-multitenancy/mixin";
5
+ import { createHmac as d, timingSafeEqual as f } from "node:crypto";
6
+ import { canonicalJson as p, generateApiKeyToken as m } from "@voltro/runtime";
7
+ // src/renderReadGrant.ts
8
+ var h = class extends n.TaggedError()("RenderReadGrantRejected", { reason: n.Literals([
9
+ "binding",
10
+ "key",
11
+ "expiry",
12
+ "token",
13
+ "revoked",
14
+ "expired",
15
+ "authority"
16
+ ]) }) {}, g = "_voltro_cms_render_read_grants", _ = s(g, {
17
+ id: a({ prefix: "crrg" }),
18
+ site: c().maxLength(64),
19
+ environment: c().maxLength(64),
20
+ binding: o(),
21
+ keyId: c().maxLength(64),
22
+ verifier: c().maxLength(64),
23
+ issuedAt: l(),
24
+ expiresAt: l(),
25
+ revokedAt: l().nullable()
26
+ }).with(u()), v = "crread1", y = [
27
+ "tenantId",
28
+ "site",
29
+ "environment",
30
+ "consumerId",
31
+ "snapshotId",
32
+ "snapshotDigest",
33
+ "releaseId",
34
+ "buildId",
35
+ "policyDigest",
36
+ "projectionDigest"
37
+ ], b = [
38
+ "tenantId",
39
+ "site",
40
+ "environment",
41
+ "consumerId",
42
+ "snapshotId",
43
+ "buildId"
44
+ ], x = [
45
+ "snapshotDigest",
46
+ "policyDigest",
47
+ "projectionDigest"
48
+ ], S = (e) => {
49
+ throw new h({ reason: e });
50
+ }, C = (e) => typeof e == "string" && e.length > 0 && e.length <= 64 && /^[a-zA-Z0-9_-]+$/.test(e), w = (e) => typeof e == "string" && /^[0-9a-f]{64}$/.test(e), T = (e) => e instanceof Date ? e.getTime() : typeof e == "string" ? Date.parse(e) : NaN, E = (e) => Number.isSafeInteger(e) && Number.isFinite(new Date(e).getTime()), D = (e) => {
51
+ if (typeof e != "object" || !e || Array.isArray(e)) return S("binding");
52
+ let t = e;
53
+ return Object.keys(t).length !== y.length || Object.keys(t).some((e) => !y.includes(e)) || !b.every((e) => C(t[e])) || !x.every((e) => w(t[e])) || !(t.releaseId === null || C(t.releaseId)) ? S("binding") : Object.fromEntries(y.map((e) => [e, t[e]]));
54
+ }, O = (e) => !C(e.id) || !(e.material instanceof Uint8Array) || e.material.length < 32 ? S("key") : e, k = (e) => [
55
+ e.tenantId,
56
+ e.site,
57
+ e.environment
58
+ ].every(C) ? r(i("tenantId", e.tenantId), i("site", e.site), i("environment", e.environment)) : S("binding"), A = (e, t, n) => d("sha256", e.material).update(p({
59
+ purpose: "voltro.cms.render-read/v1",
60
+ nonce: t,
61
+ id: n.id,
62
+ keyId: n.keyId,
63
+ binding: n.binding,
64
+ issuedAt: T(n.issuedAt),
65
+ expiresAt: T(n.expiresAt)
66
+ })).digest("hex"), j = async (n, r, i) => {
67
+ let a = D(r), o = O({
68
+ id: i.key.id,
69
+ material: new Uint8Array(i.key.material)
70
+ }), s = i.now ?? Date.now(), c = i.expiresAt, l = i.maxExpiresAt;
71
+ if (![
72
+ s,
73
+ c,
74
+ l
75
+ ].every(E) || c <= s || c > l) return S("expiry");
76
+ let u = i.authority === void 0 ? void 0 : e(i.authority);
77
+ if (u === null) return S("authority");
78
+ if (u !== void 0) {
79
+ let e = await t(n, a, u, s);
80
+ if (e === null || e.expiresAt !== null && c > e.expiresAt) return S("authority");
81
+ }
82
+ let d = m(""), f = await n.insert(g, {
83
+ tenantId: a.tenantId,
84
+ site: a.site,
85
+ environment: a.environment,
86
+ binding: u === void 0 ? a : {
87
+ ...a,
88
+ authority: u
89
+ },
90
+ keyId: o.id,
91
+ verifier: "",
92
+ issuedAt: new Date(s),
93
+ expiresAt: new Date(c),
94
+ revokedAt: null
95
+ });
96
+ return C(f.id) ? (await n.update(g, f.id, { verifier: A(o, d, f) }), {
97
+ id: f.id,
98
+ token: `${v}.${f.id}.${d}`,
99
+ expiresAt: c
100
+ }) : S("token");
101
+ }, M = async (n, a, o, s, c) => {
102
+ let l = D(o), u = s.now ?? Date.now();
103
+ if (!E(u)) return S("expiry");
104
+ if (s.keys.length === 0 || new Set(s.keys.map((e) => e.id)).size !== s.keys.length) return S("key");
105
+ for (let e of s.keys) O(e);
106
+ if (typeof a != "string" || a.length > 128) return S("token");
107
+ let d = a.split(".");
108
+ if (d.length !== 3 || d[0] !== v || !C(d[1]) || !/^[A-Za-z0-9_-]{40}$/.test(d[2])) return S("token");
109
+ let [m] = await n.query({
110
+ table: g,
111
+ predicate: r(k(l), i("id", d[1])),
112
+ order: [],
113
+ take: 1,
114
+ skip: void 0,
115
+ projection: void 0
116
+ });
117
+ if (m === void 0 || !w(m.verifier)) return S("token");
118
+ let h = s.keys.find((e) => e.id === m.keyId);
119
+ if (h === void 0) return S("token");
120
+ let _ = Buffer.from(A(h, d[2], m), "hex"), y = Buffer.from(m.verifier, "hex");
121
+ if (!f(_, y) || m.binding === null || typeof m.binding != "object" || Array.isArray(m.binding)) return S("token");
122
+ let b = m.binding, { authority: x, ...j } = b;
123
+ if (p(j) !== p(l)) return S("token");
124
+ if (m.revokedAt !== null) return S("revoked");
125
+ let M = T(m.issuedAt), N = T(m.expiresAt);
126
+ if (!E(M) || !E(N) || M > u || N <= M) return S("token");
127
+ if (c === void 0 && N <= u) return S("expired");
128
+ if (Object.hasOwn(b, "authority")) {
129
+ let r = e(x);
130
+ if (r === null || await t(n, l, r, u) === null || c !== void 0 && p(r) !== p(c)) return S("authority");
131
+ } else if (c !== void 0) return S("authority");
132
+ }, N = (e, t, n, r) => M(e, t, n, r), P = (t, n, r, i, a) => {
133
+ let o = e(i);
134
+ return o === null ? S("authority") : M(t, n, r, a, o);
135
+ };
136
+ export { g as RENDER_READ_GRANTS_TABLE, h as RenderReadGrantRejected, j as issueRenderReadGrant, _ as renderReadGrantsTable, N as verifyRenderReadGrant, P as verifyRenderReadRenewal };
package/dist/rest.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/rest.ts
1
+ // src/rest.ts
2
2
  var e = (e) => {
3
3
  let t = e.authorization;
4
4
  return t && t.toLowerCase().startsWith("bearer ") ? t.slice(7).trim() : e["x-api-key"];
@@ -48,5 +48,4 @@ var e = (e) => {
48
48
  body: await n.cms.contentType(o).limit(u).all()
49
49
  };
50
50
  };
51
- //#endregion
52
51
  export { t as handleCmsRest };