@columnus/shared 0.1.47

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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/dist/apiProfile.d.ts +1072 -0
  3. package/dist/apiProfile.js +4210 -0
  4. package/dist/apiProfile.js.map +1 -0
  5. package/dist/apiProfileSlug.d.ts +11 -0
  6. package/dist/apiProfileSlug.js +39 -0
  7. package/dist/apiProfileSlug.js.map +1 -0
  8. package/dist/apiToken.d.ts +6 -0
  9. package/dist/apiToken.js +35 -0
  10. package/dist/apiToken.js.map +1 -0
  11. package/dist/betterAuthSession.d.ts +8 -0
  12. package/dist/betterAuthSession.js +57 -0
  13. package/dist/betterAuthSession.js.map +1 -0
  14. package/dist/bffHost.d.ts +36 -0
  15. package/dist/bffHost.js +74 -0
  16. package/dist/bffHost.js.map +1 -0
  17. package/dist/bffProtocol.d.ts +1357 -0
  18. package/dist/bffProtocol.js +4362 -0
  19. package/dist/bffProtocol.js.map +1 -0
  20. package/dist/bffRedact.d.ts +30 -0
  21. package/dist/bffRedact.js +55 -0
  22. package/dist/bffRedact.js.map +1 -0
  23. package/dist/ciPreviewEnv.d.ts +49 -0
  24. package/dist/ciPreviewEnv.js +143 -0
  25. package/dist/ciPreviewEnv.js.map +1 -0
  26. package/dist/clipboardTransfer.d.ts +25 -0
  27. package/dist/clipboardTransfer.js +4862 -0
  28. package/dist/clipboardTransfer.js.map +1 -0
  29. package/dist/convexSiteUrl.d.ts +73 -0
  30. package/dist/convexSiteUrl.js +137 -0
  31. package/dist/convexSiteUrl.js.map +1 -0
  32. package/dist/csv.d.ts +54 -0
  33. package/dist/csv.js +5499 -0
  34. package/dist/csv.js.map +1 -0
  35. package/dist/dataTransfer.d.ts +21 -0
  36. package/dist/dataTransfer.js +74 -0
  37. package/dist/dataTransfer.js.map +1 -0
  38. package/dist/dateValues.d.ts +18 -0
  39. package/dist/dateValues.js +73 -0
  40. package/dist/dateValues.js.map +1 -0
  41. package/dist/deployOutput.d.ts +3 -0
  42. package/dist/deployOutput.js +23 -0
  43. package/dist/deployOutput.js.map +1 -0
  44. package/dist/displayLabel.d.ts +13 -0
  45. package/dist/displayLabel.js +4342 -0
  46. package/dist/displayLabel.js.map +1 -0
  47. package/dist/displayTemplateGenerator.d.ts +11 -0
  48. package/dist/displayTemplateGenerator.js +98 -0
  49. package/dist/displayTemplateGenerator.js.map +1 -0
  50. package/dist/displayTypes.d.ts +10 -0
  51. package/dist/displayTypes.js +3 -0
  52. package/dist/displayTypes.js.map +1 -0
  53. package/dist/dotenv.d.ts +8 -0
  54. package/dist/dotenv.js +61 -0
  55. package/dist/dotenv.js.map +1 -0
  56. package/dist/erdLayout.d.ts +27 -0
  57. package/dist/erdLayout.js +78 -0
  58. package/dist/erdLayout.js.map +1 -0
  59. package/dist/fieldTypeFormat.d.ts +5 -0
  60. package/dist/fieldTypeFormat.js +63 -0
  61. package/dist/fieldTypeFormat.js.map +1 -0
  62. package/dist/fieldTypeMeta.d.ts +50 -0
  63. package/dist/fieldTypeMeta.js +84 -0
  64. package/dist/fieldTypeMeta.js.map +1 -0
  65. package/dist/fieldValueEqual.d.ts +4 -0
  66. package/dist/fieldValueEqual.js +58 -0
  67. package/dist/fieldValueEqual.js.map +1 -0
  68. package/dist/importMatch.d.ts +80 -0
  69. package/dist/importMatch.js +5643 -0
  70. package/dist/importMatch.js.map +1 -0
  71. package/dist/index.d.ts +58 -0
  72. package/dist/index.js +10647 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/inferIdentifier.d.ts +18 -0
  75. package/dist/inferIdentifier.js +49 -0
  76. package/dist/inferIdentifier.js.map +1 -0
  77. package/dist/keyboard.d.ts +16 -0
  78. package/dist/keyboard.js +71 -0
  79. package/dist/keyboard.js.map +1 -0
  80. package/dist/manifestDeploy.d.ts +27 -0
  81. package/dist/manifestDeploy.js +16 -0
  82. package/dist/manifestDeploy.js.map +1 -0
  83. package/dist/manifestHash.d.ts +11 -0
  84. package/dist/manifestHash.js +35 -0
  85. package/dist/manifestHash.js.map +1 -0
  86. package/dist/previewDeployName.d.ts +26 -0
  87. package/dist/previewDeployName.js +77 -0
  88. package/dist/previewDeployName.js.map +1 -0
  89. package/dist/proposePolicy.d.ts +17 -0
  90. package/dist/proposePolicy.js +33 -0
  91. package/dist/proposePolicy.js.map +1 -0
  92. package/dist/queryBetween.d.ts +20 -0
  93. package/dist/queryBetween.js +28 -0
  94. package/dist/queryBetween.js.map +1 -0
  95. package/dist/queryExecution.d.ts +5 -0
  96. package/dist/queryExecution.js +58 -0
  97. package/dist/queryExecution.js.map +1 -0
  98. package/dist/queryFieldOps.d.ts +66 -0
  99. package/dist/queryFieldOps.js +138 -0
  100. package/dist/queryFieldOps.js.map +1 -0
  101. package/dist/queryMerge.d.ts +29 -0
  102. package/dist/queryMerge.js +4277 -0
  103. package/dist/queryMerge.js.map +1 -0
  104. package/dist/queryPlan.d.ts +97 -0
  105. package/dist/queryPlan.js +4564 -0
  106. package/dist/queryPlan.js.map +1 -0
  107. package/dist/queryStudio.d.ts +25 -0
  108. package/dist/queryStudio.js +4658 -0
  109. package/dist/queryStudio.js.map +1 -0
  110. package/dist/queryTypes.d.ts +402 -0
  111. package/dist/queryTypes.js +4239 -0
  112. package/dist/queryTypes.js.map +1 -0
  113. package/dist/queryValidators.d.ts +99 -0
  114. package/dist/queryValidators.js +76 -0
  115. package/dist/queryValidators.js.map +1 -0
  116. package/dist/readApiQuery.d.ts +10 -0
  117. package/dist/readApiQuery.js +24 -0
  118. package/dist/readApiQuery.js.map +1 -0
  119. package/dist/recordTableColumns.d.ts +21 -0
  120. package/dist/recordTableColumns.js +4469 -0
  121. package/dist/recordTableColumns.js.map +1 -0
  122. package/dist/refDisplayRequests.d.ts +17 -0
  123. package/dist/refDisplayRequests.js +4877 -0
  124. package/dist/refDisplayRequests.js.map +1 -0
  125. package/dist/refGraph.d.ts +23 -0
  126. package/dist/refGraph.js +102 -0
  127. package/dist/refGraph.js.map +1 -0
  128. package/dist/refsRecompute.d.ts +8 -0
  129. package/dist/refsRecompute.js +12 -0
  130. package/dist/refsRecompute.js.map +1 -0
  131. package/dist/richDoc.d.ts +67 -0
  132. package/dist/richDoc.js +4408 -0
  133. package/dist/richDoc.js.map +1 -0
  134. package/dist/schemaGenerator.d.ts +31 -0
  135. package/dist/schemaGenerator.js +198 -0
  136. package/dist/schemaGenerator.js.map +1 -0
  137. package/dist/schemaShrink.d.ts +74 -0
  138. package/dist/schemaShrink.js +132 -0
  139. package/dist/schemaShrink.js.map +1 -0
  140. package/dist/schemaShrinkValidators.d.ts +72 -0
  141. package/dist/schemaShrinkValidators.js +31 -0
  142. package/dist/schemaShrinkValidators.js.map +1 -0
  143. package/dist/schemaTypes.d.ts +454 -0
  144. package/dist/schemaTypes.js +4557 -0
  145. package/dist/schemaTypes.js.map +1 -0
  146. package/dist/share.d.ts +8 -0
  147. package/dist/share.js +4755 -0
  148. package/dist/share.js.map +1 -0
  149. package/dist/shareApiBridge.d.ts +18 -0
  150. package/dist/shareApiBridge.js +4283 -0
  151. package/dist/shareApiBridge.js.map +1 -0
  152. package/dist/shareGuestPolicy.d.ts +14 -0
  153. package/dist/shareGuestPolicy.js +90 -0
  154. package/dist/shareGuestPolicy.js.map +1 -0
  155. package/dist/shareProposal.d.ts +113 -0
  156. package/dist/shareProposal.js +4810 -0
  157. package/dist/shareProposal.js.map +1 -0
  158. package/dist/shareProposalDiff.d.ts +13 -0
  159. package/dist/shareProposalDiff.js +91 -0
  160. package/dist/shareProposalDiff.js.map +1 -0
  161. package/dist/shareScopes.d.ts +14 -0
  162. package/dist/shareScopes.js +223 -0
  163. package/dist/shareScopes.js.map +1 -0
  164. package/dist/shareTokenCrypto.d.ts +9 -0
  165. package/dist/shareTokenCrypto.js +87 -0
  166. package/dist/shareTokenCrypto.js.map +1 -0
  167. package/dist/shareTokens.d.ts +6 -0
  168. package/dist/shareTokens.js +26 -0
  169. package/dist/shareTokens.js.map +1 -0
  170. package/dist/shareTypes.d.ts +107 -0
  171. package/dist/shareTypes.js +3 -0
  172. package/dist/shareTypes.js.map +1 -0
  173. package/dist/shareValidators.d.ts +168 -0
  174. package/dist/shareValidators.js +124 -0
  175. package/dist/shareValidators.js.map +1 -0
  176. package/dist/shareWizard.d.ts +14 -0
  177. package/dist/shareWizard.js +200 -0
  178. package/dist/shareWizard.js.map +1 -0
  179. package/dist/spaceBundle.d.ts +67 -0
  180. package/dist/spaceBundle.js +4664 -0
  181. package/dist/spaceBundle.js.map +1 -0
  182. package/dist/storageFieldValues.d.ts +10 -0
  183. package/dist/storageFieldValues.js +4421 -0
  184. package/dist/storageFieldValues.js.map +1 -0
  185. package/dist/studioBoot.d.ts +49 -0
  186. package/dist/studioBoot.js +167 -0
  187. package/dist/studioBoot.js.map +1 -0
  188. package/dist/syncClampMembership.d.ts +22 -0
  189. package/dist/syncClampMembership.js +74 -0
  190. package/dist/syncClampMembership.js.map +1 -0
  191. package/dist/tenantHosts.d.ts +30 -0
  192. package/dist/tenantHosts.js +60 -0
  193. package/dist/tenantHosts.js.map +1 -0
  194. package/dist/tenantSecretsCrypto.d.ts +31 -0
  195. package/dist/tenantSecretsCrypto.js +145 -0
  196. package/dist/tenantSecretsCrypto.js.map +1 -0
  197. package/dist/useDebouncedCommit.d.ts +11 -0
  198. package/dist/useDebouncedCommit.js +34 -0
  199. package/dist/useDebouncedCommit.js.map +1 -0
  200. package/dist/useDebouncedValue.d.ts +1 -0
  201. package/dist/useDebouncedValue.js +15 -0
  202. package/dist/useDebouncedValue.js.map +1 -0
  203. package/dist/useModifierHeld.d.ts +2 -0
  204. package/dist/useModifierHeld.js +28 -0
  205. package/dist/useModifierHeld.js.map +1 -0
  206. package/package.json +36 -0
@@ -0,0 +1,23 @@
1
+ import type { FieldType, Manifest, Table } from "./schemaTypes.ts";
2
+ export type RefFieldEdge = {
3
+ field: string;
4
+ targetTable: string;
5
+ array: boolean;
6
+ };
7
+ export declare function collectReferencedIds(table: Table, rows: Record<string, unknown>[]): Map<string, Set<string>>;
8
+ export declare function collectIdsFromField(rows: Record<string, unknown>[], fieldName: string, type: FieldType, refs: Map<string, Set<string>>): void;
9
+ /** Collect referenced document ids from raw field values (selection chips, formula bar). */
10
+ export declare function collectIdsFromValues(values: readonly unknown[], type: FieldType, refs: Map<string, Set<string>>): void;
11
+ export declare function addRef(refs: Map<string, Set<string>>, table: string, id: string): void;
12
+ /** Manifest `id` / `id[]` ref topology for one table (field names + targets). */
13
+ export declare function refFieldsForTable(table: Table): RefFieldEdge[];
14
+ /** Tables that have at least one outgoing `id` / `id[]` field. */
15
+ export declare function tablesWithOutgoingRefs(manifest: Manifest): string[];
16
+ /** Stable fingerprint of manifest ref topology (ignores labels, indexes, display templates). */
17
+ export declare function computeRefGraphFingerprint(manifest: Manifest): string;
18
+ /** Tables whose ref-field topology changed between two manifests. */
19
+ export declare function listTablesWithRefGraphChanges(before: Manifest, after: Manifest): string[];
20
+ /** Whether a field type can hold outgoing `id` / `id[]` references. */
21
+ export declare function fieldTypeHasOutgoingRefs(type: FieldType): boolean;
22
+ /** Flatten `collectReferencedIds` output to unique target document ids. */
23
+ export declare function referencedTargetIds(refs: Map<string, Set<string>>): Set<string>;
@@ -0,0 +1,102 @@
1
+ // packages/@columnus/shared/src/refGraph.ts
2
+ function refEdgesForType(type) {
3
+ switch (type.kind) {
4
+ case "id":
5
+ return [{ field: "", targetTable: type.table, array: false }];
6
+ case "array":
7
+ if (type.element.kind === "id") {
8
+ return [{ field: "", targetTable: type.element.table, array: true }];
9
+ }
10
+ return [];
11
+ default:
12
+ return [];
13
+ }
14
+ }
15
+ function collectTargetIdsFromValue(value, edge, refs) {
16
+ if (edge.array) {
17
+ if (!Array.isArray(value)) return;
18
+ for (const item of value) {
19
+ if (typeof item === "string" && item.length > 0) addRef(refs, edge.targetTable, item);
20
+ }
21
+ return;
22
+ }
23
+ if (typeof value === "string" && value.length > 0) addRef(refs, edge.targetTable, value);
24
+ }
25
+ function collectReferencedIds(table, rows) {
26
+ const refs = /* @__PURE__ */ new Map();
27
+ for (const edge of refFieldsForTable(table)) {
28
+ for (const row of rows) {
29
+ collectTargetIdsFromValue(row[edge.field], edge, refs);
30
+ }
31
+ }
32
+ return refs;
33
+ }
34
+ function collectIdsFromField(rows, fieldName, type, refs) {
35
+ for (const template of refEdgesForType(type)) {
36
+ const edge = { ...template};
37
+ for (const row of rows) {
38
+ collectTargetIdsFromValue(row[fieldName], edge, refs);
39
+ }
40
+ }
41
+ }
42
+ function collectIdsFromValues(values, type, refs) {
43
+ for (const template of refEdgesForType(type)) {
44
+ for (const value of values) {
45
+ collectTargetIdsFromValue(value, template, refs);
46
+ }
47
+ }
48
+ }
49
+ function addRef(refs, table, id) {
50
+ const set = refs.get(table) ?? /* @__PURE__ */ new Set();
51
+ set.add(id);
52
+ refs.set(table, set);
53
+ }
54
+ function refFieldsForTable(table) {
55
+ const edges = [];
56
+ for (const field of table.fields) {
57
+ for (const template of refEdgesForType(field.type)) {
58
+ edges.push({ ...template, field: field.name });
59
+ }
60
+ }
61
+ return edges.sort(
62
+ (a, b) => a.field.localeCompare(b.field) || a.targetTable.localeCompare(b.targetTable)
63
+ );
64
+ }
65
+ function tablesWithOutgoingRefs(manifest) {
66
+ return manifest.tables.filter((table) => refFieldsForTable(table).length > 0).map((table) => table.name).sort((a, b) => a.localeCompare(b));
67
+ }
68
+ function tableRefFingerprint(table) {
69
+ return JSON.stringify(refFieldsForTable(table));
70
+ }
71
+ function computeRefGraphFingerprint(manifest) {
72
+ const tables = [...manifest.tables].sort((a, b) => a.name.localeCompare(b.name)).map((table) => ({ name: table.name, refs: refFieldsForTable(table) }));
73
+ return JSON.stringify(tables);
74
+ }
75
+ function listTablesWithRefGraphChanges(before, after) {
76
+ const beforeMap = new Map(before.tables.map((t) => [t.name, tableRefFingerprint(t)]));
77
+ const afterMap = new Map(after.tables.map((t) => [t.name, tableRefFingerprint(t)]));
78
+ const changed = /* @__PURE__ */ new Set();
79
+ for (const [name, fp] of afterMap) {
80
+ if (beforeMap.get(name) !== fp) changed.add(name);
81
+ }
82
+ for (const table of before.tables) {
83
+ if (!afterMap.has(table.name) && refFieldsForTable(table).length > 0) {
84
+ changed.add(table.name);
85
+ }
86
+ }
87
+ return [...changed].sort((a, b) => a.localeCompare(b));
88
+ }
89
+ function fieldTypeHasOutgoingRefs(type) {
90
+ return refEdgesForType(type).length > 0;
91
+ }
92
+ function referencedTargetIds(refs) {
93
+ const out = /* @__PURE__ */ new Set();
94
+ for (const ids of refs.values()) {
95
+ for (const id of ids) out.add(id);
96
+ }
97
+ return out;
98
+ }
99
+
100
+ export { addRef, collectIdsFromField, collectIdsFromValues, collectReferencedIds, computeRefGraphFingerprint, fieldTypeHasOutgoingRefs, listTablesWithRefGraphChanges, refFieldsForTable, referencedTargetIds, tablesWithOutgoingRefs };
101
+ //# sourceMappingURL=refGraph.js.map
102
+ //# sourceMappingURL=refGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/refGraph.ts"],"names":[],"mappings":"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","file":"refGraph.js","sourcesContent":["import type { FieldType, Manifest, Table } from \"./schemaTypes.ts\";\n\nexport type RefFieldEdge = {\n field: string;\n targetTable: string;\n array: boolean;\n};\n\nfunction refEdgesForType(type: FieldType): RefFieldEdge[] {\n switch (type.kind) {\n case \"id\":\n return [{ field: \"\", targetTable: type.table, array: false }];\n case \"array\":\n if (type.element.kind === \"id\") {\n return [{ field: \"\", targetTable: type.element.table, array: true }];\n }\n return [];\n default:\n return [];\n }\n}\n\nfunction collectTargetIdsFromValue(\n value: unknown,\n edge: RefFieldEdge,\n refs: Map<string, Set<string>>,\n): void {\n if (edge.array) {\n if (!Array.isArray(value)) return;\n for (const item of value) {\n if (typeof item === \"string\" && item.length > 0) addRef(refs, edge.targetTable, item);\n }\n return;\n }\n if (typeof value === \"string\" && value.length > 0) addRef(refs, edge.targetTable, value);\n}\n\nexport function collectReferencedIds(\n table: Table,\n rows: Record<string, unknown>[],\n): Map<string, Set<string>> {\n const refs = new Map<string, Set<string>>();\n for (const edge of refFieldsForTable(table)) {\n for (const row of rows) {\n collectTargetIdsFromValue(row[edge.field], edge, refs);\n }\n }\n return refs;\n}\n\nexport function collectIdsFromField(\n rows: Record<string, unknown>[],\n fieldName: string,\n type: FieldType,\n refs: Map<string, Set<string>>,\n): void {\n for (const template of refEdgesForType(type)) {\n const edge: RefFieldEdge = { ...template, field: fieldName };\n for (const row of rows) {\n collectTargetIdsFromValue(row[fieldName], edge, refs);\n }\n }\n}\n\n/** Collect referenced document ids from raw field values (selection chips, formula bar). */\nexport function collectIdsFromValues(\n values: readonly unknown[],\n type: FieldType,\n refs: Map<string, Set<string>>,\n): void {\n for (const template of refEdgesForType(type)) {\n for (const value of values) {\n collectTargetIdsFromValue(value, template, refs);\n }\n }\n}\n\nexport function addRef(refs: Map<string, Set<string>>, table: string, id: string): void {\n const set = refs.get(table) ?? new Set<string>();\n set.add(id);\n refs.set(table, set);\n}\n\n/** Manifest `id` / `id[]` ref topology for one table (field names + targets). */\nexport function refFieldsForTable(table: Table): RefFieldEdge[] {\n const edges: RefFieldEdge[] = [];\n for (const field of table.fields) {\n for (const template of refEdgesForType(field.type)) {\n edges.push({ ...template, field: field.name });\n }\n }\n return edges.sort(\n (a, b) => a.field.localeCompare(b.field) || a.targetTable.localeCompare(b.targetTable),\n );\n}\n\n/** Tables that have at least one outgoing `id` / `id[]` field. */\nexport function tablesWithOutgoingRefs(manifest: Manifest): string[] {\n return manifest.tables\n .filter((table) => refFieldsForTable(table).length > 0)\n .map((table) => table.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction tableRefFingerprint(table: Table): string {\n return JSON.stringify(refFieldsForTable(table));\n}\n\n/** Stable fingerprint of manifest ref topology (ignores labels, indexes, display templates). */\nexport function computeRefGraphFingerprint(manifest: Manifest): string {\n const tables = [...manifest.tables]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((table) => ({ name: table.name, refs: refFieldsForTable(table) }));\n return JSON.stringify(tables);\n}\n\n/** Tables whose ref-field topology changed between two manifests. */\nexport function listTablesWithRefGraphChanges(before: Manifest, after: Manifest): string[] {\n const beforeMap = new Map(before.tables.map((t) => [t.name, tableRefFingerprint(t)]));\n const afterMap = new Map(after.tables.map((t) => [t.name, tableRefFingerprint(t)]));\n const changed = new Set<string>();\n for (const [name, fp] of afterMap) {\n if (beforeMap.get(name) !== fp) changed.add(name);\n }\n for (const table of before.tables) {\n if (!afterMap.has(table.name) && refFieldsForTable(table).length > 0) {\n changed.add(table.name);\n }\n }\n return [...changed].sort((a, b) => a.localeCompare(b));\n}\n\n/** Whether a field type can hold outgoing `id` / `id[]` references. */\nexport function fieldTypeHasOutgoingRefs(type: FieldType): boolean {\n return refEdgesForType(type).length > 0;\n}\n\n/** Flatten `collectReferencedIds` output to unique target document ids. */\nexport function referencedTargetIds(refs: Map<string, Set<string>>): Set<string> {\n const out = new Set<string>();\n for (const ids of refs.values()) {\n for (const id of ids) out.add(id);\n }\n return out;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /** No page progress for this long means a backfill chain is probably stuck. */
2
+ export declare const REFS_RECOMPUTE_STALE_MS: number;
3
+ export type RefsRecomputeManifestState = {
4
+ refsRecomputeTargetHash?: string;
5
+ refsRecomputeHeartbeatAt?: number;
6
+ };
7
+ /** True when a target-matching backfill was started recently and is still making progress. */
8
+ export declare function isRefsRecomputeInFlight(row: RefsRecomputeManifestState | null | undefined, targetFingerprint: string, nowMs: number): boolean;
@@ -0,0 +1,12 @@
1
+ // packages/@columnus/shared/src/refsRecompute.ts
2
+ var REFS_RECOMPUTE_STALE_MS = 10 * 60 * 1e3;
3
+ function isRefsRecomputeInFlight(row, targetFingerprint, nowMs) {
4
+ if (!row || row.refsRecomputeTargetHash !== targetFingerprint) return false;
5
+ const heartbeat = row.refsRecomputeHeartbeatAt;
6
+ if (heartbeat == null) return false;
7
+ return nowMs - heartbeat < REFS_RECOMPUTE_STALE_MS;
8
+ }
9
+
10
+ export { REFS_RECOMPUTE_STALE_MS, isRefsRecomputeInFlight };
11
+ //# sourceMappingURL=refsRecompute.js.map
12
+ //# sourceMappingURL=refsRecompute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/refsRecompute.ts"],"names":[],"mappings":";AACO,IAAM,uBAAA,GAA0B,KAAK,EAAA,GAAK;AAQ1C,SAAS,uBAAA,CACd,GAAA,EACA,iBAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,uBAAA,KAA4B,mBAAmB,OAAO,KAAA;AACtE,EAAA,MAAM,YAAY,GAAA,CAAI,wBAAA;AACtB,EAAA,IAAI,SAAA,IAAa,MAAM,OAAO,KAAA;AAC9B,EAAA,OAAO,QAAQ,SAAA,GAAY,uBAAA;AAC7B","file":"refsRecompute.js","sourcesContent":["/** No page progress for this long means a backfill chain is probably stuck. */\nexport const REFS_RECOMPUTE_STALE_MS = 10 * 60 * 1000;\n\nexport type RefsRecomputeManifestState = {\n refsRecomputeTargetHash?: string;\n refsRecomputeHeartbeatAt?: number;\n};\n\n/** True when a target-matching backfill was started recently and is still making progress. */\nexport function isRefsRecomputeInFlight(\n row: RefsRecomputeManifestState | null | undefined,\n targetFingerprint: string,\n nowMs: number,\n): boolean {\n if (!row || row.refsRecomputeTargetHash !== targetFingerprint) return false;\n const heartbeat = row.refsRecomputeHeartbeatAt;\n if (heartbeat == null) return false;\n return nowMs - heartbeat < REFS_RECOMPUTE_STALE_MS;\n}\n"]}
@@ -0,0 +1,67 @@
1
+ /** Shared rich-text / markdown field storage (BlockNote envelope). */
2
+ import { type Query } from "./queryTypes.ts";
3
+ export type RecordLinkAttrs = {
4
+ table: string;
5
+ id: string;
6
+ };
7
+ export type RecordTableAttrs = {
8
+ table: string;
9
+ /** Stored as JSON in block `filterJson` — Query AST. */
10
+ query: Query | null;
11
+ };
12
+ /** BlockNote block array stored in the envelope (opaque JSON). */
13
+ export type RichDocBlock = {
14
+ id: string;
15
+ type: string;
16
+ props?: Record<string, unknown>;
17
+ content?: unknown;
18
+ children?: RichDocBlock[];
19
+ };
20
+ export type StudioRichDocV1 = {
21
+ format: "blocknote";
22
+ version: 1;
23
+ blocks: RichDocBlock[];
24
+ };
25
+ export declare const RICH_DOC_FORMAT: "blocknote";
26
+ export declare const RICH_DOC_VERSION: 1;
27
+ export declare const EMPTY_BLOCK_ID = "00000000-0000-4000-8000-000000000001";
28
+ export declare function emptyParagraphBlock(): RichDocBlock;
29
+ export declare function parseRecordTableQueryJson(filterJson: string): Query | null;
30
+ export declare function stringifyRecordTableQuery(query: Query | null): string;
31
+ export declare function isBlockNoteEnvelope(parsed: unknown): parsed is StudioRichDocV1;
32
+ /** Canonical empty rich document (BlockNote envelope). */
33
+ export declare const EMPTY_RICH_DOC: string;
34
+ /** @deprecated Alias for EMPTY_RICH_DOC — markdown fields use BlockNote storage. */
35
+ export declare const EMPTY_MARKDOWN_DOC: string;
36
+ export declare function isValidRichFieldJson(value: string): boolean;
37
+ /** @deprecated Alias */
38
+ export declare const isValidMarkdownDocJson: typeof isValidRichFieldJson;
39
+ /**
40
+ * Placeholder URL scheme BlockNote accepts for inline links. Stored JSON uses `doc:slug`;
41
+ * the editor/preview need a normal https href so BlockNote does not strip the attribute.
42
+ */
43
+ export declare const COLUMNUS_DOC_LINK_MARKER = "https://__columnus_doc__/";
44
+ /** @deprecated Use COLUMNUS_DOC_LINK_MARKER */
45
+ export declare const STUDIO_DOC_LINK_MARKER = "https://__columnus_doc__/";
46
+ /** BlockNote markdown only accepts known URL schemes; rewrite doc: links before parse. */
47
+ export declare function preprocessDocLinksInMarkdown(markdown: string): string;
48
+ /** Rewrite `doc:` hrefs for BlockNote display (editor/preview). */
49
+ export declare function preprocessDocLinksInBlocks(blocks: RichDocBlock[]): RichDocBlock[];
50
+ /** Restore `doc:` hrefs when serializing from BlockNote back to storage. */
51
+ export declare function postprocessDocLinksInBlocks(blocks: RichDocBlock[]): RichDocBlock[];
52
+ /** Clone stored blocks and rewrite doc links for BlockNote. */
53
+ export declare function blocksForBlockNoteDisplay(blocks: RichDocBlock[]): RichDocBlock[];
54
+ /** Canonical stored JSON for a field value. */
55
+ export declare function canonicalRichFieldJson(value: unknown): string;
56
+ export declare function parseRichDocBlocks(value: unknown): RichDocBlock[];
57
+ export declare function stringifyRichDoc(blocks: RichDocBlock[]): string;
58
+ export declare function normalizeRichField(value: unknown): string;
59
+ /** Wrap plain text as a single BlockNote paragraph (CSV import / paste). */
60
+ export declare function wrapPlainTextAsRichDoc(text: string): string;
61
+ /** @deprecated Alias */
62
+ export declare const normalizeMarkdownField: typeof normalizeRichField;
63
+ export declare function extractPlainText(value: unknown, maxLength?: number): string;
64
+ export declare function collectRecordLinkIdsFromBlocks(blocks: RichDocBlock[]): Map<string, Set<string>>;
65
+ export declare function collectRecordLinkIds(value: unknown): Map<string, Set<string>>;
66
+ /** Parse doc cross-links from markdown hrefs. Supports `doc:slug` and relative `.md` paths. */
67
+ export declare function parseDocLinkHref(href: string): string | null;