@ttt-productions/ttt-core 0.79.47 → 0.79.49

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 (127) hide show
  1. package/dist/constants/business-admin.d.ts +7 -0
  2. package/dist/constants/business-admin.d.ts.map +1 -1
  3. package/dist/constants/business-admin.js +7 -0
  4. package/dist/constants/business-admin.js.map +1 -1
  5. package/dist/constants/index.d.ts +3 -0
  6. package/dist/constants/index.d.ts.map +1 -1
  7. package/dist/constants/index.js +3 -0
  8. package/dist/constants/index.js.map +1 -1
  9. package/dist/constants/legal-review-notice-state.d.ts +5 -0
  10. package/dist/constants/legal-review-notice-state.d.ts.map +1 -0
  11. package/dist/constants/legal-review-notice-state.js +19 -0
  12. package/dist/constants/legal-review-notice-state.js.map +1 -0
  13. package/dist/constants/legal-review-notice.d.ts +102 -0
  14. package/dist/constants/legal-review-notice.d.ts.map +1 -0
  15. package/dist/constants/legal-review-notice.js +171 -0
  16. package/dist/constants/legal-review-notice.js.map +1 -0
  17. package/dist/constants/public-documents.d.ts +20 -0
  18. package/dist/constants/public-documents.d.ts.map +1 -0
  19. package/dist/constants/public-documents.js +48 -0
  20. package/dist/constants/public-documents.js.map +1 -0
  21. package/dist/doc-schemas/content.d.ts +56 -0
  22. package/dist/doc-schemas/content.d.ts.map +1 -1
  23. package/dist/doc-schemas/content.js +34 -0
  24. package/dist/doc-schemas/content.js.map +1 -1
  25. package/dist/doc-schemas/index.d.ts +2 -0
  26. package/dist/doc-schemas/index.d.ts.map +1 -1
  27. package/dist/doc-schemas/index.js +2 -0
  28. package/dist/doc-schemas/index.js.map +1 -1
  29. package/dist/doc-schemas/legal-review-notice.d.ts +8 -0
  30. package/dist/doc-schemas/legal-review-notice.d.ts.map +1 -0
  31. package/dist/doc-schemas/legal-review-notice.js +14 -0
  32. package/dist/doc-schemas/legal-review-notice.js.map +1 -0
  33. package/dist/doc-schemas/notifications.d.ts +24 -8
  34. package/dist/doc-schemas/notifications.d.ts.map +1 -1
  35. package/dist/doc-schemas/notifications.js +10 -4
  36. package/dist/doc-schemas/notifications.js.map +1 -1
  37. package/dist/doc-schemas/payments.d.ts +4 -0
  38. package/dist/doc-schemas/payments.d.ts.map +1 -1
  39. package/dist/doc-schemas/payments.js +6 -0
  40. package/dist/doc-schemas/payments.js.map +1 -1
  41. package/dist/doc-schemas/public-documents.d.ts +677 -0
  42. package/dist/doc-schemas/public-documents.d.ts.map +1 -0
  43. package/dist/doc-schemas/public-documents.js +158 -0
  44. package/dist/doc-schemas/public-documents.js.map +1 -0
  45. package/dist/doc-schemas/registry.d.ts +352 -39
  46. package/dist/doc-schemas/registry.d.ts.map +1 -1
  47. package/dist/doc-schemas/registry.js +8 -1
  48. package/dist/doc-schemas/registry.js.map +1 -1
  49. package/dist/doc-schemas/safety/case.d.ts +3 -3
  50. package/dist/doc-schemas/system.d.ts +14 -0
  51. package/dist/doc-schemas/system.d.ts.map +1 -1
  52. package/dist/doc-schemas/system.js +7 -0
  53. package/dist/doc-schemas/system.js.map +1 -1
  54. package/dist/doc-schemas/user.d.ts +14 -1
  55. package/dist/doc-schemas/user.d.ts.map +1 -1
  56. package/dist/doc-schemas/user.js +13 -7
  57. package/dist/doc-schemas/user.js.map +1 -1
  58. package/dist/media/domain-events-admin.d.ts +0 -6
  59. package/dist/media/domain-events-admin.d.ts.map +1 -1
  60. package/dist/media/domain-events-admin.js +0 -10
  61. package/dist/media/domain-events-admin.js.map +1 -1
  62. package/dist/media/domain-events.d.ts +0 -5
  63. package/dist/media/domain-events.d.ts.map +1 -1
  64. package/dist/media/domain-events.js +1 -2
  65. package/dist/media/domain-events.js.map +1 -1
  66. package/dist/media/pending-media.d.ts +0 -55
  67. package/dist/media/pending-media.d.ts.map +1 -1
  68. package/dist/paths/collection-refs.d.ts +2 -0
  69. package/dist/paths/collection-refs.d.ts.map +1 -1
  70. package/dist/paths/collection-refs.js +3 -0
  71. package/dist/paths/collection-refs.js.map +1 -1
  72. package/dist/paths/collections.d.ts +5 -0
  73. package/dist/paths/collections.d.ts.map +1 -1
  74. package/dist/paths/collections.js +14 -0
  75. package/dist/paths/collections.js.map +1 -1
  76. package/dist/paths/path-builders.d.ts +8 -0
  77. package/dist/paths/path-builders.d.ts.map +1 -1
  78. package/dist/paths/path-builders.js +17 -0
  79. package/dist/paths/path-builders.js.map +1 -1
  80. package/dist/schemas/admin.d.ts +119 -42
  81. package/dist/schemas/admin.d.ts.map +1 -1
  82. package/dist/schemas/admin.js +49 -30
  83. package/dist/schemas/admin.js.map +1 -1
  84. package/dist/schemas/atoms.d.ts +8 -0
  85. package/dist/schemas/atoms.d.ts.map +1 -1
  86. package/dist/schemas/atoms.js +8 -0
  87. package/dist/schemas/atoms.js.map +1 -1
  88. package/dist/schemas/hall-library.d.ts +1 -0
  89. package/dist/schemas/hall-library.d.ts.map +1 -1
  90. package/dist/schemas/hall-library.js +6 -1
  91. package/dist/schemas/hall-library.js.map +1 -1
  92. package/dist/schemas/index.d.ts +1 -0
  93. package/dist/schemas/index.d.ts.map +1 -1
  94. package/dist/schemas/index.js +1 -0
  95. package/dist/schemas/index.js.map +1 -1
  96. package/dist/schemas/notification.d.ts +1 -1
  97. package/dist/schemas/payments.d.ts +1 -0
  98. package/dist/schemas/payments.d.ts.map +1 -1
  99. package/dist/schemas/payments.js +5 -0
  100. package/dist/schemas/payments.js.map +1 -1
  101. package/dist/schemas/public-documents.d.ts +399 -0
  102. package/dist/schemas/public-documents.d.ts.map +1 -0
  103. package/dist/schemas/public-documents.js +147 -0
  104. package/dist/schemas/public-documents.js.map +1 -0
  105. package/dist/schemas/safety.d.ts +1 -1
  106. package/dist/types/audit.d.ts +1 -1
  107. package/dist/types/audit.d.ts.map +1 -1
  108. package/dist/types/audit.js.map +1 -1
  109. package/dist/types/index.d.ts +1 -0
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/types/index.js +1 -0
  112. package/dist/types/index.js.map +1 -1
  113. package/dist/types/public-documents.d.ts +3 -0
  114. package/dist/types/public-documents.d.ts.map +1 -0
  115. package/dist/types/public-documents.js +2 -0
  116. package/dist/types/public-documents.js.map +1 -0
  117. package/dist/types/system.d.ts +3 -3
  118. package/dist/types/system.js.map +1 -1
  119. package/dist/utils/index.d.ts +1 -0
  120. package/dist/utils/index.d.ts.map +1 -1
  121. package/dist/utils/index.js +1 -0
  122. package/dist/utils/index.js.map +1 -1
  123. package/dist/utils/public-documents.d.ts +63 -0
  124. package/dist/utils/public-documents.d.ts.map +1 -0
  125. package/dist/utils/public-documents.js +143 -0
  126. package/dist/utils/public-documents.js.map +1 -0
  127. package/package.json +4 -4
@@ -0,0 +1,158 @@
1
+ // Versioned public documents — the Firestore contracts of the release system.
2
+ //
3
+ // _appConfig/{documentId} current projection (public; the
4
+ // existing page readers read it)
5
+ // publicDocuments/{documentId}/publicDocumentVersions/v{n} immutable published version
6
+ // publicDocumentDrafts/{documentId} the private working copy
7
+ // publicDocumentReleases/{releaseId} one release record per publish
8
+ // _appConfig/app.publicDocumentVersions the version block every session
9
+ // already reads live
10
+ // userProfiles/{uid}/privateData/{uid}.publicDocumentAcceptance
11
+ // what the person last accepted
12
+ //
13
+ // All are backend-written. Versions are whole numbers v1, v2, … per document, assigned by the
14
+ // one publish transaction; a correction is a new version, never an edit. "Require acceptance"
15
+ // is recorded on the release and in the version block — never as a second version number.
16
+ // Acceptance HISTORY lives only in the append-only `publicDocuments.accepted` audit events.
17
+ import { z } from 'zod';
18
+ import { SPECIAL_DOCS } from '../paths/collections.js';
19
+ import { PUBLIC_DOCUMENT_IDS } from '../constants/public-documents.js';
20
+ import { LegalPageDocumentSchema, RulesAndAgreementsSchema, FuturePlansDocumentSchema, TakeItDownPageCopySchema, DmcaPolicyDocumentSchema, } from './content.js';
21
+ import { LegalReviewNoticeRevisionSchema } from './legal-review-notice.js';
22
+ export const PublicDocumentIdSchema = z.enum(PUBLIC_DOCUMENT_IDS);
23
+ /** A published version number: v1 is the first. */
24
+ export const PublicDocumentVersionNumberSchema = z.number().int().positive();
25
+ /** A version reference where 0 means "none yet" (never accepted / never required / no base). */
26
+ const versionOrNoneSchema = z.number().int().nonnegative();
27
+ /** An acceptance level: 0 = nothing required / nothing accepted; each requiring release adds 1. */
28
+ export const PublicDocumentAcceptanceLevelSchema = z.number().int().nonnegative();
29
+ /** A document paired with one of its published versions. */
30
+ export const PublicDocumentVersionRefSchema = z
31
+ .object({
32
+ documentId: PublicDocumentIdSchema,
33
+ version: PublicDocumentVersionNumberSchema,
34
+ })
35
+ .strict();
36
+ // ── Content ──────────────────────────────────────────────────────────────────
37
+ // A document's CONTENT is its current-projection shape minus `version` / `lastUpdated`, so the
38
+ // existing page readers, the working copy, and the immutable version all share one shape.
39
+ export const LegalPageContentSchema = LegalPageDocumentSchema.pick({ sections: true });
40
+ export const RulesAndAgreementsContentSchema = RulesAndAgreementsSchema.pick({ rules: true, agreements: true });
41
+ export const FuturePlansContentSchema = FuturePlansDocumentSchema.pick({ plans: true });
42
+ export const TakeItDownPageCopyContentSchema = TakeItDownPageCopySchema.pick({ strings: true });
43
+ export const DmcaPolicyContentSchema = DmcaPolicyDocumentSchema.pick({
44
+ intro: true,
45
+ contactBlocks: true,
46
+ sections: true,
47
+ });
48
+ /** Each document's stored content schema. */
49
+ export const PUBLIC_DOCUMENT_CONTENT_SCHEMAS = {
50
+ [SPECIAL_DOCS.TERMS_PAGE]: LegalPageContentSchema,
51
+ [SPECIAL_DOCS.PRIVACY_PAGE]: LegalPageContentSchema,
52
+ [SPECIAL_DOCS.RULES_AND_AGREEMENTS]: RulesAndAgreementsContentSchema,
53
+ [SPECIAL_DOCS.FUTURE_PLANS]: FuturePlansContentSchema,
54
+ [SPECIAL_DOCS.DMCA_POLICY]: DmcaPolicyContentSchema,
55
+ [SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY]: TakeItDownPageCopyContentSchema,
56
+ };
57
+ /** Each document's current-projection schema (`_appConfig/{documentId}`). */
58
+ export const PUBLIC_DOCUMENT_PROJECTION_SCHEMAS = {
59
+ [SPECIAL_DOCS.TERMS_PAGE]: LegalPageDocumentSchema,
60
+ [SPECIAL_DOCS.PRIVACY_PAGE]: LegalPageDocumentSchema,
61
+ [SPECIAL_DOCS.RULES_AND_AGREEMENTS]: RulesAndAgreementsSchema,
62
+ [SPECIAL_DOCS.FUTURE_PLANS]: FuturePlansDocumentSchema,
63
+ [SPECIAL_DOCS.DMCA_POLICY]: DmcaPolicyDocumentSchema,
64
+ [SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY]: TakeItDownPageCopySchema,
65
+ };
66
+ // One discriminated branch per document, so a version or draft's `content` is typed by its
67
+ // `documentId`.
68
+ function perDocument(shape) {
69
+ const branch = (documentId) => z.object({ documentId: z.literal(documentId), content: PUBLIC_DOCUMENT_CONTENT_SCHEMAS[documentId], ...shape });
70
+ return z.discriminatedUnion('documentId', [
71
+ branch(SPECIAL_DOCS.TERMS_PAGE),
72
+ branch(SPECIAL_DOCS.PRIVACY_PAGE),
73
+ branch(SPECIAL_DOCS.RULES_AND_AGREEMENTS),
74
+ branch(SPECIAL_DOCS.FUTURE_PLANS),
75
+ branch(SPECIAL_DOCS.DMCA_POLICY),
76
+ branch(SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY),
77
+ ]);
78
+ }
79
+ // ── Immutable version ────────────────────────────────────────────────────────
80
+ /**
81
+ * `publicDocuments/{documentId}/publicDocumentVersions/v{version}` — one published version,
82
+ * written once by the publish transaction and never edited: the full content, the version,
83
+ * the release that published it, the publisher's uid, and the server time.
84
+ */
85
+ export const PublicDocumentVersionSchema = perDocument({
86
+ version: PublicDocumentVersionNumberSchema,
87
+ releaseId: z.string().min(1),
88
+ publishedBy: z.string().min(1),
89
+ publishedAt: z.number(),
90
+ });
91
+ // ── Working copy ─────────────────────────────────────────────────────────────
92
+ /**
93
+ * `publicDocumentDrafts/{documentId}` — the one private working copy of a document, saved from
94
+ * its Admin editor. `baseVersion` is the published version the edit started from (0 when the
95
+ * document has never been published): the publish rejects a draft whose base is no longer the
96
+ * current version, and one whose content equals the current version.
97
+ */
98
+ export const PublicDocumentDraftSchema = perDocument({
99
+ baseVersion: versionOrNoneSchema,
100
+ savedBy: z.string().min(1),
101
+ savedAt: z.number(),
102
+ });
103
+ // ── Release record ───────────────────────────────────────────────────────────
104
+ /**
105
+ * `publicDocumentReleases/{releaseId}` — one record per publish: which documents moved to
106
+ * which versions, whether the release requires acceptance, the required-acceptance level in
107
+ * force after it (raised by one only when it requires acceptance), and who published it when.
108
+ */
109
+ export const PublicDocumentReleaseSchema = z.object({
110
+ releaseId: z.string().min(1),
111
+ documents: z.array(PublicDocumentVersionRefSchema).min(1),
112
+ requireAcceptance: z.boolean(),
113
+ requiredAcceptanceLevel: PublicDocumentAcceptanceLevelSchema,
114
+ publishedBy: z.string().min(1),
115
+ publishedAt: z.number(),
116
+ });
117
+ // ── Version block on _appConfig/app ──────────────────────────────────────────
118
+ /**
119
+ * One document's entry in the version block: its current published version and the latest
120
+ * version a release REQUIRED acceptance of (0 when none has).
121
+ */
122
+ export const PublicDocumentVersionStateSchema = z
123
+ .object({
124
+ currentVersion: PublicDocumentVersionNumberSchema,
125
+ requiredVersion: versionOrNoneSchema,
126
+ })
127
+ .strict()
128
+ .refine((state) => state.requiredVersion <= state.currentVersion, {
129
+ message: 'requiredVersion cannot exceed currentVersion',
130
+ });
131
+ /**
132
+ * `_appConfig/app.publicDocumentVersions` — written only by the publish transaction. A document
133
+ * never published has no entry. `requiredAcceptanceLevel` rises by one with every release that
134
+ * requires acceptance; a session whose accepted level is below it is asked to accept.
135
+ */
136
+ export const PublicDocumentVersionBlockSchema = z
137
+ .object({
138
+ documents: z.partialRecord(PublicDocumentIdSchema, PublicDocumentVersionStateSchema),
139
+ requiredAcceptanceLevel: PublicDocumentAcceptanceLevelSchema,
140
+ })
141
+ .strict();
142
+ // ── The person's acceptance summary (private doc) ────────────────────────────
143
+ /**
144
+ * `privateData/{uid}.publicDocumentAcceptance` — the LATEST accepted version of each document
145
+ * and the accepted level, replaced whole on every acceptance (registration or the re-acceptance
146
+ * prompt). A document absent from `documentVersions` counts as version 0. The notice revision in
147
+ * force at that acceptance is recorded when the notice was active. History is not kept here — it
148
+ * is the `publicDocuments.accepted` audit events.
149
+ */
150
+ export const PublicDocumentAcceptanceSchema = z
151
+ .object({
152
+ documentVersions: z.partialRecord(PublicDocumentIdSchema, versionOrNoneSchema),
153
+ acceptedLevel: PublicDocumentAcceptanceLevelSchema,
154
+ legalReviewNoticeRevision: LegalReviewNoticeRevisionSchema.optional(),
155
+ acceptedAt: z.number(),
156
+ })
157
+ .strict();
158
+ //# sourceMappingURL=public-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-documents.js","sourceRoot":"","sources":["../../src/doc-schemas/public-documents.ts"],"names":[],"mappings":"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","sourcesContent":["// Versioned public documents — the Firestore contracts of the release system.\n//\n// _appConfig/{documentId} current projection (public; the\n// existing page readers read it)\n// publicDocuments/{documentId}/publicDocumentVersions/v{n} immutable published version\n// publicDocumentDrafts/{documentId} the private working copy\n// publicDocumentReleases/{releaseId} one release record per publish\n// _appConfig/app.publicDocumentVersions the version block every session\n// already reads live\n// userProfiles/{uid}/privateData/{uid}.publicDocumentAcceptance\n// what the person last accepted\n//\n// All are backend-written. Versions are whole numbers v1, v2, … per document, assigned by the\n// one publish transaction; a correction is a new version, never an edit. \"Require acceptance\"\n// is recorded on the release and in the version block — never as a second version number.\n// Acceptance HISTORY lives only in the append-only `publicDocuments.accepted` audit events.\n\nimport { z } from 'zod';\nimport { SPECIAL_DOCS } from '../paths/collections.js';\nimport { PUBLIC_DOCUMENT_IDS, type PublicDocumentId } from '../constants/public-documents.js';\nimport {\n LegalPageDocumentSchema,\n RulesAndAgreementsSchema,\n FuturePlansDocumentSchema,\n TakeItDownPageCopySchema,\n DmcaPolicyDocumentSchema,\n} from './content.js';\nimport { LegalReviewNoticeRevisionSchema } from './legal-review-notice.js';\n\nexport const PublicDocumentIdSchema = z.enum(PUBLIC_DOCUMENT_IDS);\n\n/** A published version number: v1 is the first. */\nexport const PublicDocumentVersionNumberSchema = z.number().int().positive();\n\n/** A version reference where 0 means \"none yet\" (never accepted / never required / no base). */\nconst versionOrNoneSchema = z.number().int().nonnegative();\n\n/** An acceptance level: 0 = nothing required / nothing accepted; each requiring release adds 1. */\nexport const PublicDocumentAcceptanceLevelSchema = z.number().int().nonnegative();\n\n/** A document paired with one of its published versions. */\nexport const PublicDocumentVersionRefSchema = z\n .object({\n documentId: PublicDocumentIdSchema,\n version: PublicDocumentVersionNumberSchema,\n })\n .strict();\nexport type PublicDocumentVersionRef = z.infer<typeof PublicDocumentVersionRefSchema>;\n\n// ── Content ──────────────────────────────────────────────────────────────────\n// A document's CONTENT is its current-projection shape minus `version` / `lastUpdated`, so the\n// existing page readers, the working copy, and the immutable version all share one shape.\n\nexport const LegalPageContentSchema = LegalPageDocumentSchema.pick({ sections: true });\nexport const RulesAndAgreementsContentSchema = RulesAndAgreementsSchema.pick({ rules: true, agreements: true });\nexport const FuturePlansContentSchema = FuturePlansDocumentSchema.pick({ plans: true });\nexport const TakeItDownPageCopyContentSchema = TakeItDownPageCopySchema.pick({ strings: true });\nexport const DmcaPolicyContentSchema = DmcaPolicyDocumentSchema.pick({\n intro: true,\n contactBlocks: true,\n sections: true,\n});\n\n/** Each document's stored content schema. */\nexport const PUBLIC_DOCUMENT_CONTENT_SCHEMAS = {\n [SPECIAL_DOCS.TERMS_PAGE]: LegalPageContentSchema,\n [SPECIAL_DOCS.PRIVACY_PAGE]: LegalPageContentSchema,\n [SPECIAL_DOCS.RULES_AND_AGREEMENTS]: RulesAndAgreementsContentSchema,\n [SPECIAL_DOCS.FUTURE_PLANS]: FuturePlansContentSchema,\n [SPECIAL_DOCS.DMCA_POLICY]: DmcaPolicyContentSchema,\n [SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY]: TakeItDownPageCopyContentSchema,\n} as const satisfies Record<PublicDocumentId, z.ZodType>;\n\n/** The content of document `D`. */\nexport type PublicDocumentContent<D extends PublicDocumentId = PublicDocumentId> = z.infer<\n (typeof PUBLIC_DOCUMENT_CONTENT_SCHEMAS)[D]\n>;\n\n/** Each document's current-projection schema (`_appConfig/{documentId}`). */\nexport const PUBLIC_DOCUMENT_PROJECTION_SCHEMAS = {\n [SPECIAL_DOCS.TERMS_PAGE]: LegalPageDocumentSchema,\n [SPECIAL_DOCS.PRIVACY_PAGE]: LegalPageDocumentSchema,\n [SPECIAL_DOCS.RULES_AND_AGREEMENTS]: RulesAndAgreementsSchema,\n [SPECIAL_DOCS.FUTURE_PLANS]: FuturePlansDocumentSchema,\n [SPECIAL_DOCS.DMCA_POLICY]: DmcaPolicyDocumentSchema,\n [SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY]: TakeItDownPageCopySchema,\n} as const satisfies Record<PublicDocumentId, z.ZodType>;\n\n/**\n * The current projection the publish writes for document `D`: its content plus the version and\n * the publish time. Assignable to the page's existing document type.\n */\nexport type PublicDocumentProjection<D extends PublicDocumentId = PublicDocumentId> =\n PublicDocumentContent<D> & { version: number; lastUpdated: number };\n\n// One discriminated branch per document, so a version or draft's `content` is typed by its\n// `documentId`.\nfunction perDocument<const S extends z.ZodRawShape>(shape: S) {\n const branch = <const D extends PublicDocumentId>(documentId: D) =>\n z.object({ documentId: z.literal(documentId), content: PUBLIC_DOCUMENT_CONTENT_SCHEMAS[documentId], ...shape });\n return z.discriminatedUnion('documentId', [\n branch(SPECIAL_DOCS.TERMS_PAGE),\n branch(SPECIAL_DOCS.PRIVACY_PAGE),\n branch(SPECIAL_DOCS.RULES_AND_AGREEMENTS),\n branch(SPECIAL_DOCS.FUTURE_PLANS),\n branch(SPECIAL_DOCS.DMCA_POLICY),\n branch(SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY),\n ]);\n}\n\n// ── Immutable version ────────────────────────────────────────────────────────\n\n/**\n * `publicDocuments/{documentId}/publicDocumentVersions/v{version}` — one published version,\n * written once by the publish transaction and never edited: the full content, the version,\n * the release that published it, the publisher's uid, and the server time.\n */\nexport const PublicDocumentVersionSchema = perDocument({\n version: PublicDocumentVersionNumberSchema,\n releaseId: z.string().min(1),\n publishedBy: z.string().min(1),\n publishedAt: z.number(),\n});\nexport type PublicDocumentVersion = z.infer<typeof PublicDocumentVersionSchema>;\n\n// ── Working copy ─────────────────────────────────────────────────────────────\n\n/**\n * `publicDocumentDrafts/{documentId}` — the one private working copy of a document, saved from\n * its Admin editor. `baseVersion` is the published version the edit started from (0 when the\n * document has never been published): the publish rejects a draft whose base is no longer the\n * current version, and one whose content equals the current version.\n */\nexport const PublicDocumentDraftSchema = perDocument({\n baseVersion: versionOrNoneSchema,\n savedBy: z.string().min(1),\n savedAt: z.number(),\n});\nexport type PublicDocumentDraft = z.infer<typeof PublicDocumentDraftSchema>;\n\n// ── Release record ───────────────────────────────────────────────────────────\n\n/**\n * `publicDocumentReleases/{releaseId}` — one record per publish: which documents moved to\n * which versions, whether the release requires acceptance, the required-acceptance level in\n * force after it (raised by one only when it requires acceptance), and who published it when.\n */\nexport const PublicDocumentReleaseSchema = z.object({\n releaseId: z.string().min(1),\n documents: z.array(PublicDocumentVersionRefSchema).min(1),\n requireAcceptance: z.boolean(),\n requiredAcceptanceLevel: PublicDocumentAcceptanceLevelSchema,\n publishedBy: z.string().min(1),\n publishedAt: z.number(),\n});\nexport type PublicDocumentRelease = z.infer<typeof PublicDocumentReleaseSchema>;\n\n// ── Version block on _appConfig/app ──────────────────────────────────────────\n\n/**\n * One document's entry in the version block: its current published version and the latest\n * version a release REQUIRED acceptance of (0 when none has).\n */\nexport const PublicDocumentVersionStateSchema = z\n .object({\n currentVersion: PublicDocumentVersionNumberSchema,\n requiredVersion: versionOrNoneSchema,\n })\n .strict()\n .refine((state) => state.requiredVersion <= state.currentVersion, {\n message: 'requiredVersion cannot exceed currentVersion',\n });\nexport type PublicDocumentVersionState = z.infer<typeof PublicDocumentVersionStateSchema>;\n\n/**\n * `_appConfig/app.publicDocumentVersions` — written only by the publish transaction. A document\n * never published has no entry. `requiredAcceptanceLevel` rises by one with every release that\n * requires acceptance; a session whose accepted level is below it is asked to accept.\n */\nexport const PublicDocumentVersionBlockSchema = z\n .object({\n documents: z.partialRecord(PublicDocumentIdSchema, PublicDocumentVersionStateSchema),\n requiredAcceptanceLevel: PublicDocumentAcceptanceLevelSchema,\n })\n .strict();\nexport type PublicDocumentVersionBlock = z.infer<typeof PublicDocumentVersionBlockSchema>;\n\n// ── The person's acceptance summary (private doc) ────────────────────────────\n\n/**\n * `privateData/{uid}.publicDocumentAcceptance` — the LATEST accepted version of each document\n * and the accepted level, replaced whole on every acceptance (registration or the re-acceptance\n * prompt). A document absent from `documentVersions` counts as version 0. The notice revision in\n * force at that acceptance is recorded when the notice was active. History is not kept here — it\n * is the `publicDocuments.accepted` audit events.\n */\nexport const PublicDocumentAcceptanceSchema = z\n .object({\n documentVersions: z.partialRecord(PublicDocumentIdSchema, versionOrNoneSchema),\n acceptedLevel: PublicDocumentAcceptanceLevelSchema,\n legalReviewNoticeRevision: LegalReviewNoticeRevisionSchema.optional(),\n acceptedAt: z.number(),\n })\n .strict();\nexport type PublicDocumentAcceptance = z.infer<typeof PublicDocumentAcceptanceSchema>;\n"]}