@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,21 @@
1
+ import type { Manifest } from "./schemaTypes.ts";
2
+ export declare const COLUMNUS_DATA_TRANSFER_VERSION: 1;
3
+ export declare const MAX_TRANSFER_BYTES: number;
4
+ export type ColumnusDataTransferManifest = {
5
+ version: typeof COLUMNUS_DATA_TRANSFER_VERSION;
6
+ tables: string[];
7
+ schemaHash: string;
8
+ includeFileStorage: boolean;
9
+ };
10
+ export type DataTransferManifestValidation = {
11
+ ok: true;
12
+ manifest: ColumnusDataTransferManifest;
13
+ } | {
14
+ ok: false;
15
+ error: string;
16
+ };
17
+ /** Internal/system tables must never enter a tenant-to-tenant data transfer. */
18
+ export declare function isProtectedTransferTable(table: string): boolean;
19
+ export declare function validateDataTransferManifest(value: unknown): DataTransferManifestValidation;
20
+ /** Whether the selected manifest slice contains a file/image field at any nesting depth. */
21
+ export declare function manifestTablesUseFileStorage(manifest: Manifest, tableNames: readonly string[]): boolean;
@@ -0,0 +1,74 @@
1
+ // packages/@columnus/shared/src/dataTransfer.ts
2
+ var COLUMNUS_DATA_TRANSFER_VERSION = 1;
3
+ var MAX_TRANSFER_BYTES = 50 * 1024 * 1024;
4
+ var SCHEMA_HASH_RE = /^[0-9a-f]{64}$/;
5
+ var TABLE_NAME_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ function isProtectedTransferTable(table) {
10
+ return table.startsWith("_") || table.startsWith("columnus_") || table.startsWith("studio_");
11
+ }
12
+ function validateDataTransferManifest(value) {
13
+ if (!isRecord(value)) return { ok: false, error: "dataTransfer must be an object" };
14
+ if (value.version !== COLUMNUS_DATA_TRANSFER_VERSION) {
15
+ return {
16
+ ok: false,
17
+ error: `dataTransfer.version must be ${COLUMNUS_DATA_TRANSFER_VERSION}`
18
+ };
19
+ }
20
+ if (!Array.isArray(value.tables) || value.tables.length === 0) {
21
+ return { ok: false, error: "dataTransfer.tables must be a non-empty array" };
22
+ }
23
+ if (!value.tables.every((table) => typeof table === "string" && TABLE_NAME_RE.test(table))) {
24
+ return { ok: false, error: "dataTransfer.tables contains an invalid table name" };
25
+ }
26
+ const tables = value.tables;
27
+ if (new Set(tables).size !== tables.length) {
28
+ return { ok: false, error: "dataTransfer.tables must not contain duplicates" };
29
+ }
30
+ const protectedTable = tables.find(isProtectedTransferTable);
31
+ if (protectedTable) {
32
+ return { ok: false, error: `Protected table cannot be transferred: ${protectedTable}` };
33
+ }
34
+ if (typeof value.schemaHash !== "string" || !SCHEMA_HASH_RE.test(value.schemaHash)) {
35
+ return { ok: false, error: "dataTransfer.schemaHash must be a lowercase SHA-256 hex string" };
36
+ }
37
+ if (typeof value.includeFileStorage !== "boolean") {
38
+ return { ok: false, error: "dataTransfer.includeFileStorage must be a boolean" };
39
+ }
40
+ return {
41
+ ok: true,
42
+ manifest: {
43
+ version: COLUMNUS_DATA_TRANSFER_VERSION,
44
+ tables: [...tables],
45
+ schemaHash: value.schemaHash,
46
+ includeFileStorage: value.includeFileStorage
47
+ }
48
+ };
49
+ }
50
+ function fieldTypeUsesStorage(type) {
51
+ switch (type.kind) {
52
+ case "file":
53
+ case "image":
54
+ return true;
55
+ case "array":
56
+ return fieldTypeUsesStorage(type.element);
57
+ case "object":
58
+ return type.fields.some((field) => fieldTypeUsesStorage(field.type));
59
+ case "union":
60
+ return type.options.some(fieldTypeUsesStorage);
61
+ default:
62
+ return false;
63
+ }
64
+ }
65
+ function manifestTablesUseFileStorage(manifest, tableNames) {
66
+ const allowed = new Set(tableNames);
67
+ return manifest.tables.some(
68
+ (table) => allowed.has(table.name) && table.fields.some((field) => fieldTypeUsesStorage(field.type))
69
+ );
70
+ }
71
+
72
+ export { COLUMNUS_DATA_TRANSFER_VERSION, MAX_TRANSFER_BYTES, isProtectedTransferTable, manifestTablesUseFileStorage, validateDataTransferManifest };
73
+ //# sourceMappingURL=dataTransfer.js.map
74
+ //# sourceMappingURL=dataTransfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dataTransfer.ts"],"names":[],"mappings":"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","file":"dataTransfer.js","sourcesContent":["import type { FieldType, Manifest } from \"./schemaTypes.ts\";\n\nexport const COLUMNUS_DATA_TRANSFER_VERSION = 1 as const;\nexport const MAX_TRANSFER_BYTES = 50 * 1024 * 1024;\n\nexport type ColumnusDataTransferManifest = {\n version: typeof COLUMNUS_DATA_TRANSFER_VERSION;\n tables: string[];\n schemaHash: string;\n includeFileStorage: boolean;\n};\n\nexport type DataTransferManifestValidation =\n | { ok: true; manifest: ColumnusDataTransferManifest }\n | { ok: false; error: string };\n\nconst SCHEMA_HASH_RE = /^[0-9a-f]{64}$/;\nconst TABLE_NAME_RE = /^[A-Za-z][A-Za-z0-9_]*$/;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Internal/system tables must never enter a tenant-to-tenant data transfer. */\nexport function isProtectedTransferTable(table: string): boolean {\n return table.startsWith(\"_\") || table.startsWith(\"columnus_\") || table.startsWith(\"studio_\");\n}\n\nexport function validateDataTransferManifest(value: unknown): DataTransferManifestValidation {\n if (!isRecord(value)) return { ok: false, error: \"dataTransfer must be an object\" };\n if (value.version !== COLUMNUS_DATA_TRANSFER_VERSION) {\n return {\n ok: false,\n error: `dataTransfer.version must be ${COLUMNUS_DATA_TRANSFER_VERSION}`,\n };\n }\n if (!Array.isArray(value.tables) || value.tables.length === 0) {\n return { ok: false, error: \"dataTransfer.tables must be a non-empty array\" };\n }\n if (!value.tables.every((table) => typeof table === \"string\" && TABLE_NAME_RE.test(table))) {\n return { ok: false, error: \"dataTransfer.tables contains an invalid table name\" };\n }\n const tables = value.tables as string[];\n if (new Set(tables).size !== tables.length) {\n return { ok: false, error: \"dataTransfer.tables must not contain duplicates\" };\n }\n const protectedTable = tables.find(isProtectedTransferTable);\n if (protectedTable) {\n return { ok: false, error: `Protected table cannot be transferred: ${protectedTable}` };\n }\n if (typeof value.schemaHash !== \"string\" || !SCHEMA_HASH_RE.test(value.schemaHash)) {\n return { ok: false, error: \"dataTransfer.schemaHash must be a lowercase SHA-256 hex string\" };\n }\n if (typeof value.includeFileStorage !== \"boolean\") {\n return { ok: false, error: \"dataTransfer.includeFileStorage must be a boolean\" };\n }\n\n return {\n ok: true,\n manifest: {\n version: COLUMNUS_DATA_TRANSFER_VERSION,\n tables: [...tables],\n schemaHash: value.schemaHash,\n includeFileStorage: value.includeFileStorage,\n },\n };\n}\n\nfunction fieldTypeUsesStorage(type: FieldType): boolean {\n switch (type.kind) {\n case \"file\":\n case \"image\":\n return true;\n case \"array\":\n return fieldTypeUsesStorage(type.element);\n case \"object\":\n return type.fields.some((field) => fieldTypeUsesStorage(field.type));\n case \"union\":\n return type.options.some(fieldTypeUsesStorage);\n default:\n return false;\n }\n}\n\n/** Whether the selected manifest slice contains a file/image field at any nesting depth. */\nexport function manifestTablesUseFileStorage(\n manifest: Manifest,\n tableNames: readonly string[],\n): boolean {\n const allowed = new Set(tableNames);\n return manifest.tables.some(\n (table) =>\n allowed.has(table.name) && table.fields.some((field) => fieldTypeUsesStorage(field.type)),\n );\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /** Format a date-only value (local midnight ms) for grid display. */
2
+ export declare function formatDateCell(ms: number): string;
3
+ /** Format a datetime value (epoch ms) for grid display. */
4
+ export declare function formatDateTimeCell(ms: number): string;
5
+ /** Value for `<input type="date">` from local-midnight ms. */
6
+ export declare function dateInputValue(ms: number): string;
7
+ /** Value for `<input type="datetime-local">` from epoch ms. */
8
+ export declare function dateTimeInputValue(ms: number): string;
9
+ /** Parse `YYYY-MM-DD` to local midnight ms. */
10
+ export declare function parseDateInput(s: string): number | null;
11
+ /** Parse `YYYY-MM-DDTHH:mm` (datetime-local) to epoch ms. */
12
+ export declare function parseDateTimeInput(s: string): number | null;
13
+ /** Serialize a date field for CSV export. */
14
+ export declare function serializeDateCsv(ms: number): string;
15
+ /** Serialize a datetime field for CSV export. */
16
+ export declare function serializeDateTimeCsv(ms: number): string;
17
+ /** Parse a CSV cell into ms for date or datetime kinds. */
18
+ export declare function parseDateCsv(s: string, kind: "date" | "datetime"): number | null;
@@ -0,0 +1,73 @@
1
+ // packages/@columnus/shared/src/dateValues.ts
2
+ function formatDateCell(ms) {
3
+ return new Intl.DateTimeFormat(void 0, { dateStyle: "medium" }).format(new Date(ms));
4
+ }
5
+ function formatDateTimeCell(ms) {
6
+ return new Intl.DateTimeFormat(void 0, {
7
+ dateStyle: "medium",
8
+ timeStyle: "short"
9
+ }).format(new Date(ms));
10
+ }
11
+ function pad2(n) {
12
+ return String(n).padStart(2, "0");
13
+ }
14
+ function dateInputValue(ms) {
15
+ const d = new Date(ms);
16
+ return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
17
+ }
18
+ function dateTimeInputValue(ms) {
19
+ const d = new Date(ms);
20
+ return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
21
+ }
22
+ function parseDateInput(s) {
23
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s.trim());
24
+ if (!m) return null;
25
+ const y = Number(m[1]);
26
+ const mo = Number(m[2]) - 1;
27
+ const d = Number(m[3]);
28
+ const dt = new Date(y, mo, d);
29
+ if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;
30
+ return dt.getTime();
31
+ }
32
+ function parseDateTimeInput(s) {
33
+ const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/.exec(s.trim());
34
+ if (!m) return null;
35
+ const y = Number(m[1]);
36
+ const mo = Number(m[2]) - 1;
37
+ const d = Number(m[3]);
38
+ const h = Number(m[4]);
39
+ const min = Number(m[5]);
40
+ const dt = new Date(y, mo, d, h, min);
41
+ if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d || dt.getHours() !== h || dt.getMinutes() !== min) {
42
+ return null;
43
+ }
44
+ return dt.getTime();
45
+ }
46
+ function serializeDateCsv(ms) {
47
+ return dateInputValue(ms);
48
+ }
49
+ function serializeDateTimeCsv(ms) {
50
+ return new Date(ms).toISOString();
51
+ }
52
+ function parseDateCsv(s, kind) {
53
+ const trimmed = s.trim();
54
+ if (!trimmed) return null;
55
+ if (kind === "date") {
56
+ const fromDate = parseDateInput(trimmed);
57
+ if (fromDate !== null) return fromDate;
58
+ const fromIso2 = Date.parse(trimmed);
59
+ if (Number.isFinite(fromIso2)) {
60
+ const d = new Date(fromIso2);
61
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
62
+ }
63
+ return null;
64
+ }
65
+ const fromLocal = parseDateTimeInput(trimmed);
66
+ if (fromLocal !== null) return fromLocal;
67
+ const fromIso = Date.parse(trimmed);
68
+ return Number.isFinite(fromIso) ? fromIso : null;
69
+ }
70
+
71
+ export { dateInputValue, dateTimeInputValue, formatDateCell, formatDateTimeCell, parseDateCsv, parseDateInput, parseDateTimeInput, serializeDateCsv, serializeDateTimeCsv };
72
+ //# sourceMappingURL=dateValues.js.map
73
+ //# sourceMappingURL=dateValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dateValues.ts"],"names":["fromIso"],"mappings":"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","file":"dateValues.js","sourcesContent":["/** Format a date-only value (local midnight ms) for grid display. */\nexport function formatDateCell(ms: number): string {\n return new Intl.DateTimeFormat(undefined, { dateStyle: \"medium\" }).format(new Date(ms));\n}\n\n/** Format a datetime value (epoch ms) for grid display. */\nexport function formatDateTimeCell(ms: number): string {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(new Date(ms));\n}\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, \"0\");\n}\n\n/** Value for `<input type=\"date\">` from local-midnight ms. */\nexport function dateInputValue(ms: number): string {\n const d = new Date(ms);\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Value for `<input type=\"datetime-local\">` from epoch ms. */\nexport function dateTimeInputValue(ms: number): string {\n const d = new Date(ms);\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\n/** Parse `YYYY-MM-DD` to local midnight ms. */\nexport function parseDateInput(s: string): number | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s.trim());\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const d = Number(m[3]);\n const dt = new Date(y, mo, d);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;\n return dt.getTime();\n}\n\n/** Parse `YYYY-MM-DDTHH:mm` (datetime-local) to epoch ms. */\nexport function parseDateTimeInput(s: string): number | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$/.exec(s.trim());\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const d = Number(m[3]);\n const h = Number(m[4]);\n const min = Number(m[5]);\n const dt = new Date(y, mo, d, h, min);\n if (\n dt.getFullYear() !== y ||\n dt.getMonth() !== mo ||\n dt.getDate() !== d ||\n dt.getHours() !== h ||\n dt.getMinutes() !== min\n ) {\n return null;\n }\n return dt.getTime();\n}\n\n/** Serialize a date field for CSV export. */\nexport function serializeDateCsv(ms: number): string {\n return dateInputValue(ms);\n}\n\n/** Serialize a datetime field for CSV export. */\nexport function serializeDateTimeCsv(ms: number): string {\n return new Date(ms).toISOString();\n}\n\n/** Parse a CSV cell into ms for date or datetime kinds. */\nexport function parseDateCsv(s: string, kind: \"date\" | \"datetime\"): number | null {\n const trimmed = s.trim();\n if (!trimmed) return null;\n if (kind === \"date\") {\n const fromDate = parseDateInput(trimmed);\n if (fromDate !== null) return fromDate;\n const fromIso = Date.parse(trimmed);\n if (Number.isFinite(fromIso)) {\n const d = new Date(fromIso);\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n }\n return null;\n }\n const fromLocal = parseDateTimeInput(trimmed);\n if (fromLocal !== null) return fromLocal;\n const fromIso = Date.parse(trimmed);\n return Number.isFinite(fromIso) ? fromIso : null;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function stripAnsi(s: string): string;
2
+ export declare function extractError(out: string): string;
3
+ export declare function classifyPhase(out: string): "schema" | "deploy" | "unknown";
@@ -0,0 +1,23 @@
1
+ // packages/@columnus/shared/src/deployOutput.ts
2
+ var ANSI_RE = /\x1b\[[0-9;]*m/g;
3
+ function stripAnsi(s) {
4
+ return s.replace(ANSI_RE, "");
5
+ }
6
+ function extractError(out) {
7
+ const lines = out.split(/\r?\n/);
8
+ const firstErrIdx = lines.findIndex((l) => /^[✖✗×]|^Error|^Schema|^Hit an error/.test(l.trim()));
9
+ const slice = firstErrIdx >= 0 ? lines.slice(firstErrIdx) : lines;
10
+ const trimmed = slice.join("\n").trim();
11
+ if (trimmed.length > 4e3) return `${trimmed.slice(0, 4e3)}
12
+ \u2026`;
13
+ return trimmed || out.slice(0, 2e3) || "Convex push failed without output";
14
+ }
15
+ function classifyPhase(out) {
16
+ const cleaned = stripAnsi(out);
17
+ if (/schema/i.test(cleaned)) return "schema";
18
+ return "deploy";
19
+ }
20
+
21
+ export { classifyPhase, extractError, stripAnsi };
22
+ //# sourceMappingURL=deployOutput.js.map
23
+ //# sourceMappingURL=deployOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deployOutput.ts"],"names":[],"mappings":";AAEA,IAAM,OAAA,GAAU,iBAAA;AAET,SAAS,UAAU,CAAA,EAAmB;AAC3C,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC9B;AAEO,SAAS,aAAa,GAAA,EAAqB;AAGhD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,sCAAsC,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAC/F,EAAA,MAAM,QAAQ,WAAA,IAAe,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AACtC,EAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAM,OAAO,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAC;AAAA,MAAA,CAAA;AAC3D,EAAA,OAAO,OAAA,IAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,IAAK,mCAAA;AAC1C;AAEO,SAAS,cAAc,GAAA,EAA8C;AAC1E,EAAA,MAAM,OAAA,GAAU,UAAU,GAAG,CAAA;AAC7B,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,OAAO,QAAA;AACT","file":"deployOutput.js","sourcesContent":["// Shared parsers for `convex deploy` CLI output. Used by deploy-service and diagnostics.\n\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport function extractError(out: string): string {\n // The CLI prints \"✖\" lines followed by detail. Keep everything from the first\n // \"✖\" (or \"Error\" / \"Schema\") onward, trimmed to a reasonable length.\n const lines = out.split(/\\r?\\n/);\n const firstErrIdx = lines.findIndex((l) => /^[✖✗×]|^Error|^Schema|^Hit an error/.test(l.trim()));\n const slice = firstErrIdx >= 0 ? lines.slice(firstErrIdx) : lines;\n const trimmed = slice.join(\"\\n\").trim();\n if (trimmed.length > 4000) return `${trimmed.slice(0, 4000)}\\n…`;\n return trimmed || out.slice(0, 2000) || \"Convex push failed without output\";\n}\n\nexport function classifyPhase(out: string): \"schema\" | \"deploy\" | \"unknown\" {\n const cleaned = stripAnsi(out);\n if (/schema/i.test(cleaned)) return \"schema\";\n return \"deploy\";\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare function truncateDisplay(s: string, n: number): string;
2
+ /** One-line label for display-value cache and UI fallbacks; unwraps BlockNote JSON. */
3
+ export declare function formatDisplayPreviewText(value: string, maxLen?: number): string;
4
+ /** Heuristic label when no Preview template is configured. */
5
+ export declare function fallbackPreviewLabel(row: Record<string, unknown>): string;
6
+ export declare function fallbackIdLabel(documentId: string): string;
7
+ export declare function formatIdShort(id: string, n?: number): string;
8
+ export declare function looksLikeId(s: string): boolean;
9
+ export declare function toDocumentId(value: unknown): string | undefined;
10
+ export declare function safeStringify(v: unknown): string;
11
+ export declare function emptyToUndefined(v: string, optional?: boolean): string | undefined;
12
+ /** Compact one-line preview of an arbitrary value (used in cell previews). */
13
+ export declare function formatPrimitivePreview(v: unknown): string;