@superblocksteam/shared 0.9614.2 → 0.9615.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 (173) hide show
  1. package/dist/database-lifecycle/appDatabaseCompatibility.d.ts +5 -3
  2. package/dist/database-lifecycle/appDatabaseCompatibility.d.ts.map +1 -1
  3. package/dist/database-lifecycle/appDatabaseCompatibility.js.map +1 -1
  4. package/dist/database-lifecycle/appDatabaseImport.d.ts +70 -0
  5. package/dist/database-lifecycle/appDatabaseImport.d.ts.map +1 -0
  6. package/dist/database-lifecycle/appDatabaseImport.js +111 -0
  7. package/dist/database-lifecycle/appDatabaseImport.js.map +1 -0
  8. package/dist/database-lifecycle/appDatabaseImport.test.d.ts +2 -0
  9. package/dist/database-lifecycle/appDatabaseImport.test.d.ts.map +1 -0
  10. package/dist/database-lifecycle/appDatabaseImport.test.js +145 -0
  11. package/dist/database-lifecycle/appDatabaseImport.test.js.map +1 -0
  12. package/dist/database-lifecycle/appDatabaseStatus.d.ts +79 -0
  13. package/dist/database-lifecycle/appDatabaseStatus.d.ts.map +1 -0
  14. package/dist/database-lifecycle/appDatabaseStatus.js +28 -0
  15. package/dist/database-lifecycle/appDatabaseStatus.js.map +1 -0
  16. package/dist/database-lifecycle/appDatabaseStatus.test.d.ts +2 -0
  17. package/dist/database-lifecycle/appDatabaseStatus.test.d.ts.map +1 -0
  18. package/dist/database-lifecycle/appDatabaseStatus.test.js +88 -0
  19. package/dist/database-lifecycle/appDatabaseStatus.test.js.map +1 -0
  20. package/dist/database-lifecycle/dataImport.d.ts +53 -0
  21. package/dist/database-lifecycle/dataImport.d.ts.map +1 -0
  22. package/dist/database-lifecycle/dataImport.js +173 -0
  23. package/dist/database-lifecycle/dataImport.js.map +1 -0
  24. package/dist/database-lifecycle/dataImport.test.d.ts +2 -0
  25. package/dist/database-lifecycle/dataImport.test.d.ts.map +1 -0
  26. package/dist/database-lifecycle/dataImport.test.js +84 -0
  27. package/dist/database-lifecycle/dataImport.test.js.map +1 -0
  28. package/dist/database-lifecycle/index.d.ts +101 -5
  29. package/dist/database-lifecycle/index.d.ts.map +1 -1
  30. package/dist/database-lifecycle/index.js +55 -6
  31. package/dist/database-lifecycle/index.js.map +1 -1
  32. package/dist/database-lifecycle/index.test.js +18 -6
  33. package/dist/database-lifecycle/index.test.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/plugins/templates/workflow.d.ts.map +1 -1
  39. package/dist/plugins/templates/workflow.js +1 -3
  40. package/dist/plugins/templates/workflow.js.map +1 -1
  41. package/dist/socket/protocol.d.ts +19 -2
  42. package/dist/socket/protocol.d.ts.map +1 -1
  43. package/dist/socket/protocol.js.map +1 -1
  44. package/dist/types/ai/index.d.ts +39 -0
  45. package/dist/types/ai/index.d.ts.map +1 -1
  46. package/dist/types/ai/index.js +8 -1
  47. package/dist/types/ai/index.js.map +1 -1
  48. package/dist/types/billing/usageSource.d.ts +1 -0
  49. package/dist/types/billing/usageSource.d.ts.map +1 -1
  50. package/dist/types/billing/usageSource.js +19 -1
  51. package/dist/types/billing/usageSource.js.map +1 -1
  52. package/dist/types/event/index.d.ts +6 -1
  53. package/dist/types/event/index.d.ts.map +1 -1
  54. package/dist/types/event/index.js +5 -0
  55. package/dist/types/event/index.js.map +1 -1
  56. package/dist/types/policyGate/index.d.ts +11 -0
  57. package/dist/types/policyGate/index.d.ts.map +1 -1
  58. package/dist/types/policyGate/index.js +9 -0
  59. package/dist/types/policyGate/index.js.map +1 -1
  60. package/dist/utils/attachment-delivery.js +1 -1
  61. package/dist/utils/attachment-delivery.js.map +1 -1
  62. package/dist/utils/attachment-delivery.test.js +11 -0
  63. package/dist/utils/attachment-delivery.test.js.map +1 -1
  64. package/dist/utils/attachment-upload.d.ts +15 -0
  65. package/dist/utils/attachment-upload.d.ts.map +1 -1
  66. package/dist/utils/attachment-upload.js +44 -2
  67. package/dist/utils/attachment-upload.js.map +1 -1
  68. package/dist/utils/attachment-upload.test.js +37 -1
  69. package/dist/utils/attachment-upload.test.js.map +1 -1
  70. package/dist/utils/attachment-validation.d.ts +18 -1
  71. package/dist/utils/attachment-validation.d.ts.map +1 -1
  72. package/dist/utils/attachment-validation.js +38 -5
  73. package/dist/utils/attachment-validation.js.map +1 -1
  74. package/dist/utils/attachment-validation.test.js +22 -3
  75. package/dist/utils/attachment-validation.test.js.map +1 -1
  76. package/dist-esm/database-lifecycle/appDatabaseCompatibility.d.ts +5 -3
  77. package/dist-esm/database-lifecycle/appDatabaseCompatibility.d.ts.map +1 -1
  78. package/dist-esm/database-lifecycle/appDatabaseCompatibility.js.map +1 -1
  79. package/dist-esm/database-lifecycle/appDatabaseImport.d.ts +70 -0
  80. package/dist-esm/database-lifecycle/appDatabaseImport.d.ts.map +1 -0
  81. package/dist-esm/database-lifecycle/appDatabaseImport.js +104 -0
  82. package/dist-esm/database-lifecycle/appDatabaseImport.js.map +1 -0
  83. package/dist-esm/database-lifecycle/appDatabaseImport.test.d.ts +2 -0
  84. package/dist-esm/database-lifecycle/appDatabaseImport.test.d.ts.map +1 -0
  85. package/dist-esm/database-lifecycle/appDatabaseImport.test.js +143 -0
  86. package/dist-esm/database-lifecycle/appDatabaseImport.test.js.map +1 -0
  87. package/dist-esm/database-lifecycle/appDatabaseStatus.d.ts +79 -0
  88. package/dist-esm/database-lifecycle/appDatabaseStatus.d.ts.map +1 -0
  89. package/dist-esm/database-lifecycle/appDatabaseStatus.js +23 -0
  90. package/dist-esm/database-lifecycle/appDatabaseStatus.js.map +1 -0
  91. package/dist-esm/database-lifecycle/appDatabaseStatus.test.d.ts +2 -0
  92. package/dist-esm/database-lifecycle/appDatabaseStatus.test.d.ts.map +1 -0
  93. package/dist-esm/database-lifecycle/appDatabaseStatus.test.js +86 -0
  94. package/dist-esm/database-lifecycle/appDatabaseStatus.test.js.map +1 -0
  95. package/dist-esm/database-lifecycle/dataImport.d.ts +53 -0
  96. package/dist-esm/database-lifecycle/dataImport.d.ts.map +1 -0
  97. package/dist-esm/database-lifecycle/dataImport.js +165 -0
  98. package/dist-esm/database-lifecycle/dataImport.js.map +1 -0
  99. package/dist-esm/database-lifecycle/dataImport.test.d.ts +2 -0
  100. package/dist-esm/database-lifecycle/dataImport.test.d.ts.map +1 -0
  101. package/dist-esm/database-lifecycle/dataImport.test.js +82 -0
  102. package/dist-esm/database-lifecycle/dataImport.test.js.map +1 -0
  103. package/dist-esm/database-lifecycle/index.d.ts +101 -5
  104. package/dist-esm/database-lifecycle/index.d.ts.map +1 -1
  105. package/dist-esm/database-lifecycle/index.js +36 -5
  106. package/dist-esm/database-lifecycle/index.js.map +1 -1
  107. package/dist-esm/database-lifecycle/index.test.js +19 -7
  108. package/dist-esm/database-lifecycle/index.test.js.map +1 -1
  109. package/dist-esm/index.d.ts +1 -0
  110. package/dist-esm/index.d.ts.map +1 -1
  111. package/dist-esm/index.js +1 -0
  112. package/dist-esm/index.js.map +1 -1
  113. package/dist-esm/plugins/templates/workflow.d.ts.map +1 -1
  114. package/dist-esm/plugins/templates/workflow.js +1 -3
  115. package/dist-esm/plugins/templates/workflow.js.map +1 -1
  116. package/dist-esm/socket/protocol.d.ts +19 -2
  117. package/dist-esm/socket/protocol.d.ts.map +1 -1
  118. package/dist-esm/socket/protocol.js.map +1 -1
  119. package/dist-esm/types/ai/index.d.ts +39 -0
  120. package/dist-esm/types/ai/index.d.ts.map +1 -1
  121. package/dist-esm/types/ai/index.js +6 -0
  122. package/dist-esm/types/ai/index.js.map +1 -1
  123. package/dist-esm/types/billing/usageSource.d.ts +1 -0
  124. package/dist-esm/types/billing/usageSource.d.ts.map +1 -1
  125. package/dist-esm/types/billing/usageSource.js +18 -0
  126. package/dist-esm/types/billing/usageSource.js.map +1 -1
  127. package/dist-esm/types/event/index.d.ts +6 -1
  128. package/dist-esm/types/event/index.d.ts.map +1 -1
  129. package/dist-esm/types/event/index.js +5 -0
  130. package/dist-esm/types/event/index.js.map +1 -1
  131. package/dist-esm/types/policyGate/index.d.ts +11 -0
  132. package/dist-esm/types/policyGate/index.d.ts.map +1 -1
  133. package/dist-esm/types/policyGate/index.js +8 -0
  134. package/dist-esm/types/policyGate/index.js.map +1 -1
  135. package/dist-esm/utils/attachment-delivery.js +2 -2
  136. package/dist-esm/utils/attachment-delivery.js.map +1 -1
  137. package/dist-esm/utils/attachment-delivery.test.js +11 -0
  138. package/dist-esm/utils/attachment-delivery.test.js.map +1 -1
  139. package/dist-esm/utils/attachment-upload.d.ts +15 -0
  140. package/dist-esm/utils/attachment-upload.d.ts.map +1 -1
  141. package/dist-esm/utils/attachment-upload.js +41 -1
  142. package/dist-esm/utils/attachment-upload.js.map +1 -1
  143. package/dist-esm/utils/attachment-upload.test.js +38 -2
  144. package/dist-esm/utils/attachment-upload.test.js.map +1 -1
  145. package/dist-esm/utils/attachment-validation.d.ts +18 -1
  146. package/dist-esm/utils/attachment-validation.d.ts.map +1 -1
  147. package/dist-esm/utils/attachment-validation.js +38 -5
  148. package/dist-esm/utils/attachment-validation.js.map +1 -1
  149. package/dist-esm/utils/attachment-validation.test.js +23 -4
  150. package/dist-esm/utils/attachment-validation.test.js.map +1 -1
  151. package/package.json +1 -1
  152. package/src/database-lifecycle/appDatabaseCompatibility.ts +6 -3
  153. package/src/database-lifecycle/appDatabaseImport.test.ts +185 -0
  154. package/src/database-lifecycle/appDatabaseImport.ts +205 -0
  155. package/src/database-lifecycle/appDatabaseStatus.test.ts +105 -0
  156. package/src/database-lifecycle/appDatabaseStatus.ts +95 -0
  157. package/src/database-lifecycle/dataImport.test.ts +95 -0
  158. package/src/database-lifecycle/dataImport.ts +244 -0
  159. package/src/database-lifecycle/index.test.ts +20 -6
  160. package/src/database-lifecycle/index.ts +203 -7
  161. package/src/index.ts +1 -0
  162. package/src/plugins/templates/workflow.ts +1 -3
  163. package/src/socket/protocol.ts +14 -2
  164. package/src/types/ai/index.ts +39 -0
  165. package/src/types/billing/usageSource.ts +20 -0
  166. package/src/types/event/index.ts +6 -1
  167. package/src/types/policyGate/index.ts +14 -0
  168. package/src/utils/attachment-delivery.test.ts +14 -0
  169. package/src/utils/attachment-delivery.ts +2 -2
  170. package/src/utils/attachment-upload.test.ts +48 -1
  171. package/src/utils/attachment-upload.ts +48 -1
  172. package/src/utils/attachment-validation.test.ts +35 -3
  173. package/src/utils/attachment-validation.ts +52 -6
@@ -0,0 +1,143 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { isAppDatabaseImportCallbackResult, isAppDatabaseImportDispatchPayload, parseAppDatabaseImportValidationMetadata } from './appDatabaseImport.js';
3
+ describe('App Database import contracts', () => {
4
+ test('validates operation-specific dispatch fields', () => {
5
+ const base = {
6
+ applicationId: 'application-id',
7
+ bindingId: 'binding-id',
8
+ bindingKey: 'binding-key',
9
+ desiredSpec: { engine: 'postgres', logicalName: 'Orders DB' },
10
+ desiredSpecHash: 'desired-spec-hash',
11
+ import: {
12
+ importId: 'import-id',
13
+ kind: 'pg_dump_custom',
14
+ prefixSizeBytes: 1_024,
15
+ profileToken: 'profile-token',
16
+ resourceToken: 'resource-token'
17
+ },
18
+ organizationId: 'organization-id',
19
+ profile: 'production',
20
+ requestId: 'request-id',
21
+ resourceKey: 'organization/application/database/profile/default'
22
+ };
23
+ expect(isAppDatabaseImportDispatchPayload({
24
+ ...base,
25
+ import: { ...base.import, expectedSizeBytes: 10_000 },
26
+ operation: 'prepare_import_prefix_upload'
27
+ })).toBe(true);
28
+ expect(isAppDatabaseImportDispatchPayload({
29
+ ...base,
30
+ import: base.import,
31
+ operation: 'prepare_import_prefix_upload'
32
+ })).toBe(false);
33
+ expect(isAppDatabaseImportDispatchPayload({
34
+ ...base,
35
+ import: {
36
+ ...base.import,
37
+ expectedSizeBytes: 10_000,
38
+ prefixObjectKey: 'imports/import-id/prefix'
39
+ },
40
+ operation: 'prepare_import_prefix_upload'
41
+ })).toBe(false);
42
+ expect(isAppDatabaseImportDispatchPayload({
43
+ ...base,
44
+ import: { ...base.import, prefixObjectKey: 'imports/import-id/prefix' },
45
+ operation: 'inspect_import_prefix'
46
+ })).toBe(true);
47
+ expect(isAppDatabaseImportDispatchPayload({
48
+ ...base,
49
+ import: {
50
+ ...base.import,
51
+ expectedSizeBytes: 10_000,
52
+ prefixObjectKey: 'imports/import-id/prefix'
53
+ },
54
+ operation: 'inspect_import_prefix'
55
+ })).toBe(false);
56
+ expect({
57
+ ...base,
58
+ import: { ...base.import, expectedSizeBytes: 10_000 },
59
+ operation: 'prepare_import_prefix_upload'
60
+ }).not.toHaveProperty('import.prefixObjectKey');
61
+ expect(isAppDatabaseImportDispatchPayload({
62
+ ...base,
63
+ operation: 'inspect_import_prefix'
64
+ })).toBe(false);
65
+ expect(isAppDatabaseImportDispatchPayload({
66
+ ...base,
67
+ import: { ...base.import, profileToken: '' },
68
+ operation: 'prepare_import_prefix_upload'
69
+ })).toBe(false);
70
+ expect(isAppDatabaseImportDispatchPayload({
71
+ ...base,
72
+ import: { ...base.import, resourceToken: '' },
73
+ operation: 'prepare_import_prefix_upload'
74
+ })).toBe(false);
75
+ const withoutOrganization = { ...base };
76
+ delete withoutOrganization.organizationId;
77
+ expect(isAppDatabaseImportDispatchPayload({
78
+ ...withoutOrganization,
79
+ import: { ...base.import, expectedSizeBytes: 10_000 },
80
+ operation: 'prepare_import_prefix_upload'
81
+ })).toBe(false);
82
+ });
83
+ test('requires prefix growth and narrow nested callback results', () => {
84
+ expect(isAppDatabaseImportCallbackResult({
85
+ inspectedPrefixSizeBytes: 1_024,
86
+ nextPrefixSizeBytes: 2_048,
87
+ result: 'prefix_incomplete'
88
+ })).toBe(true);
89
+ expect(isAppDatabaseImportCallbackResult({
90
+ inspectedPrefixSizeBytes: 1_024,
91
+ nextPrefixSizeBytes: 1_024,
92
+ result: 'prefix_incomplete'
93
+ })).toBe(false);
94
+ expect(isAppDatabaseImportCallbackResult({
95
+ prefixObjectKey: 'imports/import-id/prefix',
96
+ prefixUploadUrl: 'https://uploads.example/prefix',
97
+ result: 'prefix_upload_url'
98
+ })).toBe(true);
99
+ expect(isAppDatabaseImportCallbackResult({
100
+ prefixUploadUrl: 'https://uploads.example/prefix',
101
+ result: 'prefix_upload_url'
102
+ })).toBe(false);
103
+ const callback = {
104
+ bindingKey: 'binding-key',
105
+ import: {
106
+ prefixObjectKey: 'imports/import-id/prefix',
107
+ prefixUploadUrl: 'https://uploads.example/prefix',
108
+ result: 'prefix_upload_url'
109
+ },
110
+ lifecycleState: 'ready',
111
+ requestId: 'request-id'
112
+ };
113
+ if (callback.import.result !== 'prefix_upload_url') {
114
+ throw new Error('Expected prefix upload URL callback');
115
+ }
116
+ expect(callback.import.prefixUploadUrl).toContain('https://');
117
+ expect(isAppDatabaseImportCallbackResult({
118
+ result: 'schema_validated',
119
+ validationMetadata: {
120
+ postgresMajorVersion: 16,
121
+ tableNames: ['public.orders']
122
+ }
123
+ })).toBe(true);
124
+ expect(isAppDatabaseImportCallbackResult({
125
+ postgresMajorVersion: 16,
126
+ result: 'schema_validated',
127
+ tableNames: ['public.orders']
128
+ })).toBe(false);
129
+ });
130
+ test('retains only allowlisted validation metadata', () => {
131
+ expect(parseAppDatabaseImportValidationMetadata({
132
+ postgresMajorVersion: 16,
133
+ rows: [{ secret: 'value' }],
134
+ sql: 'CREATE TABLE private_data',
135
+ tableNames: ['public.orders', 'public.customers']
136
+ })).toEqual({
137
+ postgresMajorVersion: 16,
138
+ tableNames: ['public.orders', 'public.customers']
139
+ });
140
+ expect(parseAppDatabaseImportValidationMetadata({ postgresMajorVersion: 16, tableNames: [''] })).toBeUndefined();
141
+ });
142
+ });
143
+ //# sourceMappingURL=appDatabaseImport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDatabaseImport.test.js","sourceRoot":"","sources":["../../src/database-lifecycle/appDatabaseImport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { AppDatabaseTagRef } from './appDatabaseCompatibility.js';
2
+ import type { DatabaseEngine, LifecycleMigrationState, LifecycleState } from './index.js';
3
+ /**
4
+ * Builder-safe physical instance fields. Pool capacity and the internal
5
+ * instance id stay off this payload: they are org-wide admin facts, and
6
+ * capacity.used counts every application in the org.
7
+ */
8
+ export type AppDatabaseStatusInstance = {
9
+ engine: DatabaseEngine;
10
+ engineVersion: string | null;
11
+ region: string;
12
+ };
13
+ export type AppDatabaseStatusIntegration = {
14
+ apiNames: string[];
15
+ id: string;
16
+ name: string;
17
+ pluginId: string;
18
+ };
19
+ export type AppDatabaseStatusBinding = {
20
+ bindingId: string;
21
+ created: string;
22
+ instance: AppDatabaseStatusInstance | null;
23
+ integration: AppDatabaseStatusIntegration | null;
24
+ lastActivity: string;
25
+ lifecycleState: LifecycleState;
26
+ logicalName: string;
27
+ migrationDirectory: string | null;
28
+ migrationState: LifecycleMigrationState;
29
+ };
30
+ export type AppDatabaseStatusTag = AppDatabaseTagRef & {
31
+ /** Null when this data tag has no live (non-cancelled) database. */
32
+ binding: AppDatabaseStatusBinding | null;
33
+ /**
34
+ * True when this data tag had a database that was retired. The live
35
+ * binding is omitted so the tag can be provisioned again, but Status
36
+ * still shows Deleted instead of No database.
37
+ */
38
+ deleted: boolean;
39
+ displayName: string;
40
+ isDefaultEditor: boolean;
41
+ };
42
+ export type AppDatabaseStatus = {
43
+ applicationId: string;
44
+ /**
45
+ * Whether the app declares an App Database right now (working-state
46
+ * requirement). Same meaning as AppDatabaseCompatibility.hasAppDatabase.
47
+ * A leftover live binding with no requirement still appears under tags.
48
+ */
49
+ hasAppDatabase: boolean;
50
+ /**
51
+ * Whether leftover App Database code is still in the working tree: SQL
52
+ * in the last known migration folder, or APIs still wired to the app's
53
+ * Postgres integration. Used to offer Clark cleanup after Edit databases
54
+ * are gone. Not a complete scan of every page or helper.
55
+ */
56
+ hasDatabaseCode: boolean;
57
+ /**
58
+ * Whether the currently live published version stamped a database
59
+ * requirement. Working-state (Edit) rows are not this signal: a leftover
60
+ * production database stays undeletable until a version without databases
61
+ * is live.
62
+ */
63
+ liveVersionHasAppDatabase: boolean;
64
+ tags: AppDatabaseStatusTag[];
65
+ };
66
+ /**
67
+ * Edit lifecycle membership: tags used for edit provisioning and migrations.
68
+ * That is every editor-only tag, plus the editor default even when that
69
+ * default is also deploy-allowed.
70
+ */
71
+ export declare function isEditLifecycleTag(tag: Pick<AppDatabaseStatusTag, 'availableModes'>): boolean;
72
+ /**
73
+ * Deploy lifecycle membership for builder-facing grouping: deploy-allowed
74
+ * tags that are not the editor default. Publish still may write the editor
75
+ * default when it is also deploy-allowed; that tag stays an Edit database.
76
+ */
77
+ export declare function isDeployLifecycleTag(tag: Pick<AppDatabaseStatusTag, 'availableModes'>): boolean;
78
+ export declare function isProductionDatabaseRetirementEligible(status: AppDatabaseStatus): boolean;
79
+ //# sourceMappingURL=appDatabaseStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDatabaseStatus.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/appDatabaseStatus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1F;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,oEAAoE;IACpE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC,IAAI,EAAE,oBAAoB,EAAE,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAE7F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAE/F;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAIzF"}
@@ -0,0 +1,23 @@
1
+ import { ViewMode } from '../types/event/index.js';
2
+ /**
3
+ * Edit lifecycle membership: tags used for edit provisioning and migrations.
4
+ * That is every editor-only tag, plus the editor default even when that
5
+ * default is also deploy-allowed.
6
+ */
7
+ export function isEditLifecycleTag(tag) {
8
+ return tag.availableModes.includes(ViewMode.EDITOR);
9
+ }
10
+ /**
11
+ * Deploy lifecycle membership for builder-facing grouping: deploy-allowed
12
+ * tags that are not the editor default. Publish still may write the editor
13
+ * default when it is also deploy-allowed; that tag stays an Edit database.
14
+ */
15
+ export function isDeployLifecycleTag(tag) {
16
+ return tag.availableModes.includes(ViewMode.DEPLOYED) && !tag.availableModes.includes(ViewMode.EDITOR);
17
+ }
18
+ export function isProductionDatabaseRetirementEligible(status) {
19
+ const hasEditDatabase = status.tags.some((tag) => tag.binding !== null && isEditLifecycleTag(tag));
20
+ const hasLeftoverProductionDatabase = status.tags.some((tag) => tag.binding !== null && !isEditLifecycleTag(tag));
21
+ return !hasEditDatabase && hasLeftoverProductionDatabase && !status.liveVersionHasAppDatabase;
22
+ }
23
+ //# sourceMappingURL=appDatabaseStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDatabaseStatus.js","sourceRoot":"","sources":["../../src/database-lifecycle/appDatabaseStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAwEnD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiD;IAClF,OAAO,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAiD;IACpF,OAAO,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,MAAyB;IAC9E,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IACnG,MAAM,6BAA6B,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClH,OAAO,CAAC,eAAe,IAAI,6BAA6B,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC;AAChG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=appDatabaseStatus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDatabaseStatus.test.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/appDatabaseStatus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ViewMode } from '../types/event/index.js';
3
+ import { isProductionDatabaseRetirementEligible } from './appDatabaseStatus.js';
4
+ const binding = {
5
+ bindingId: 'binding-1',
6
+ created: '2026-09-14T00:00:00.000Z',
7
+ instance: null,
8
+ integration: null,
9
+ lastActivity: '2026-09-14T00:00:00.000Z',
10
+ lifecycleState: 'ready',
11
+ logicalName: 'app_db',
12
+ migrationDirectory: null,
13
+ migrationState: 'migrated'
14
+ };
15
+ function status(overrides = {}) {
16
+ return {
17
+ applicationId: 'app-1',
18
+ hasAppDatabase: false,
19
+ hasDatabaseCode: false,
20
+ liveVersionHasAppDatabase: false,
21
+ tags: [
22
+ {
23
+ availableModes: [ViewMode.DEPLOYED],
24
+ binding,
25
+ deleted: false,
26
+ displayName: 'Production',
27
+ isDefaultEditor: false,
28
+ profileKey: 'production'
29
+ }
30
+ ],
31
+ ...overrides
32
+ };
33
+ }
34
+ describe('production database retirement eligibility', () => {
35
+ it('offers deletion after a live version that does not need a database and Edit leftovers are gone', () => {
36
+ expect(isProductionDatabaseRetirementEligible(status())).toBe(true);
37
+ });
38
+ it('refuses deletion while the live version still needs a database', () => {
39
+ expect(isProductionDatabaseRetirementEligible(status({ liveVersionHasAppDatabase: true }))).toBe(false);
40
+ });
41
+ it('refuses deletion while an Edit-only database remains', () => {
42
+ expect(isProductionDatabaseRetirementEligible(status({
43
+ tags: [
44
+ ...status().tags,
45
+ {
46
+ availableModes: [ViewMode.EDITOR],
47
+ binding: { ...binding, bindingId: 'edit-binding' },
48
+ deleted: false,
49
+ displayName: 'Staging',
50
+ isDefaultEditor: true,
51
+ profileKey: 'staging'
52
+ }
53
+ ]
54
+ }))).toBe(false);
55
+ });
56
+ it('offers deletion of an unassigned leftover after a live version that does not need a database', () => {
57
+ expect(isProductionDatabaseRetirementEligible(status({
58
+ tags: [
59
+ {
60
+ availableModes: [],
61
+ binding,
62
+ deleted: false,
63
+ displayName: 'Removed production',
64
+ isDefaultEditor: false,
65
+ profileKey: 'removed-production'
66
+ }
67
+ ]
68
+ }))).toBe(true);
69
+ });
70
+ it('refuses deletion while the editor default is still live, even when that tag is also deploy-allowed', () => {
71
+ expect(isProductionDatabaseRetirementEligible(status({
72
+ tags: [
73
+ ...status().tags,
74
+ {
75
+ availableModes: [ViewMode.EDITOR, ViewMode.DEPLOYED],
76
+ binding: { ...binding, bindingId: 'edit-binding' },
77
+ deleted: false,
78
+ displayName: 'Staging',
79
+ isDefaultEditor: true,
80
+ profileKey: 'staging'
81
+ }
82
+ ]
83
+ }))).toBe(false);
84
+ });
85
+ });
86
+ //# sourceMappingURL=appDatabaseStatus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDatabaseStatus.test.js","sourceRoot":"","sources":["../../src/database-lifecycle/appDatabaseStatus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export declare const DATA_IMPORT_KINDS: readonly ["csv", "pg_dump_custom"];
2
+ export declare const DATA_IMPORT_STATES: readonly ["requested", "preparing_upload", "preparing_prefix_upload", "awaiting_upload", "awaiting_prefix_upload", "uploading", "upload_completed", "validating", "validating_schema", "schema_validated", "ready", "importing", "completed", "failed", "cancelled"];
3
+ export declare const DATA_IMPORT_ACTIVE_STATES: ("requested" | "preparing_upload" | "preparing_prefix_upload" | "awaiting_upload" | "awaiting_prefix_upload" | "uploading" | "upload_completed" | "validating" | "validating_schema" | "schema_validated" | "ready" | "importing" | "completed" | "failed" | "cancelled")[];
4
+ export declare const DATA_IMPORT_TARGET_TYPES: readonly ["app_database"];
5
+ export type DataImportKind = (typeof DATA_IMPORT_KINDS)[number];
6
+ export type DataImportState = (typeof DATA_IMPORT_STATES)[number];
7
+ export type DataImportTargetType = (typeof DATA_IMPORT_TARGET_TYPES)[number];
8
+ export type DataImportTargetBase = {
9
+ type: DataImportTargetType;
10
+ };
11
+ export type AppDatabaseDataImportTarget = DataImportTargetBase & {
12
+ applicationId: string;
13
+ bindingId: string;
14
+ profile: string;
15
+ };
16
+ export type DataImportTarget = AppDatabaseDataImportTarget;
17
+ export type DataImportUploadMetadata = {
18
+ completedPartNumbers?: number[];
19
+ filename: string;
20
+ prefixExpiresAt?: number;
21
+ objectChecksumSha256?: string;
22
+ objectKey?: string;
23
+ objectSizeBytes?: string;
24
+ partCount?: number;
25
+ partSizeBytes?: number;
26
+ uploadId?: string;
27
+ };
28
+ export type PgDumpDataImportMetadata = {
29
+ kind: 'pg_dump_custom';
30
+ currentPrefixSizeBytes?: number;
31
+ postgresMajorVersion?: number;
32
+ prefixChecksumSha256?: string;
33
+ prefixObjectKey?: string;
34
+ requestedPrefixSizeBytes?: number;
35
+ tableNames?: string[];
36
+ };
37
+ export type CsvDataImportMetadata = {
38
+ kind: 'csv';
39
+ mode: 'append' | 'replace';
40
+ table: string;
41
+ };
42
+ export type DataImportMetadata = PgDumpDataImportMetadata | CsvDataImportMetadata;
43
+ export type DataImportOutcome = {
44
+ rowsDeleted?: string;
45
+ rowsInserted?: string;
46
+ rowsRead?: string;
47
+ };
48
+ export declare function mintDataImportConcurrencyKey(metadata: DataImportMetadata, target: AppDatabaseDataImportTarget): string;
49
+ export declare function parseDataImportTarget(value: unknown): DataImportTarget | undefined;
50
+ export declare function parseDataImportMetadata(kind: DataImportKind, value: unknown): DataImportMetadata | undefined;
51
+ export declare function parseDataImportOutcome(value: unknown): DataImportOutcome | undefined;
52
+ export declare function sqlStringList(values: readonly string[]): string;
53
+ //# sourceMappingURL=dataImport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataImport.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/dataImport.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,oCAAqC,CAAC;AAIpE,eAAO,MAAM,kBAAkB,sQAgBrB,CAAC;AAEX,eAAO,MAAM,yBAAyB,6QAErC,CAAC;AACF,eAAO,MAAM,wBAAwB,2BAA4B,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,MAAM,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAE3D,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAKF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,gBAAgB,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GAAG,qBAAqB,CAAC;AAIlF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAOF,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAKtH;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAgBlF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAgB5G;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAmBpF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,165 @@
1
+ export const DATA_IMPORT_KINDS = ['csv', 'pg_dump_custom'];
2
+ // CHECK union for every kind. Prefix/schema success is `schema_validated`.
3
+ // `ready` stays available for CSV/JSON "validated, waiting to apply".
4
+ // Only `completed`, `failed`, and `cancelled` release the concurrency slot.
5
+ export const DATA_IMPORT_STATES = [
6
+ 'requested',
7
+ 'preparing_upload',
8
+ 'preparing_prefix_upload',
9
+ 'awaiting_upload',
10
+ 'awaiting_prefix_upload',
11
+ 'uploading',
12
+ 'upload_completed',
13
+ 'validating',
14
+ 'validating_schema',
15
+ 'schema_validated',
16
+ 'ready',
17
+ 'importing',
18
+ 'completed',
19
+ 'failed',
20
+ 'cancelled'
21
+ ];
22
+ const DATA_IMPORT_TERMINAL_STATES = ['completed', 'failed', 'cancelled'];
23
+ export const DATA_IMPORT_ACTIVE_STATES = DATA_IMPORT_STATES.filter((state) => !DATA_IMPORT_TERMINAL_STATES.includes(state));
24
+ export const DATA_IMPORT_TARGET_TYPES = ['app_database'];
25
+ const DATA_IMPORT_OUTCOME_KEYS = ['rowsDeleted', 'rowsInserted', 'rowsRead'];
26
+ // Kind decides the grain. Callers do not supply this string.
27
+ // pg_dump_custom: one in-flight dump per binding.
28
+ // csv: one in-flight import per canonical schema.table on that binding.
29
+ export function mintDataImportConcurrencyKey(metadata, target) {
30
+ if (metadata.kind === 'pg_dump_custom') {
31
+ return `pg_dump_custom:${target.bindingId}`;
32
+ }
33
+ return `csv:${target.bindingId}:${metadata.table}`;
34
+ }
35
+ export function parseDataImportTarget(value) {
36
+ if (!isUnknownRecord(value) ||
37
+ value.type !== 'app_database' ||
38
+ !isNonEmptyString(value.applicationId) ||
39
+ !isNonEmptyString(value.bindingId) ||
40
+ !isNonEmptyString(value.profile)) {
41
+ return undefined;
42
+ }
43
+ return {
44
+ applicationId: value.applicationId,
45
+ bindingId: value.bindingId,
46
+ profile: value.profile,
47
+ type: value.type
48
+ };
49
+ }
50
+ export function parseDataImportMetadata(kind, value) {
51
+ if (!isUnknownRecord(value) || value.kind !== kind) {
52
+ return undefined;
53
+ }
54
+ if (kind === 'pg_dump_custom') {
55
+ return parsePgDumpMetadata(value);
56
+ }
57
+ const table = canonicalCsvTable(value.table);
58
+ if (table === undefined || (value.mode !== 'append' && value.mode !== 'replace')) {
59
+ return undefined;
60
+ }
61
+ const allowed = new Set(['kind', 'mode', 'table']);
62
+ if (Object.keys(value).some((key) => !allowed.has(key))) {
63
+ return undefined;
64
+ }
65
+ return { kind: 'csv', mode: value.mode, table };
66
+ }
67
+ export function parseDataImportOutcome(value) {
68
+ if (!isUnknownRecord(value)) {
69
+ return undefined;
70
+ }
71
+ if (Object.keys(value).some((key) => !DATA_IMPORT_OUTCOME_KEYS.includes(key))) {
72
+ return undefined;
73
+ }
74
+ const outcome = {};
75
+ for (const key of DATA_IMPORT_OUTCOME_KEYS) {
76
+ const count = value[key];
77
+ if (count === undefined) {
78
+ continue;
79
+ }
80
+ if (!isDecimalCount(count)) {
81
+ return undefined;
82
+ }
83
+ outcome[key] = count;
84
+ }
85
+ return outcome;
86
+ }
87
+ export function sqlStringList(values) {
88
+ return values.map((value) => `'${value}'`).join(', ');
89
+ }
90
+ function isNonEmptyString(value) {
91
+ return typeof value === 'string' && value.trim().length > 0;
92
+ }
93
+ // One unquoted lowercase schema.table. Each part is at most 63 bytes, which
94
+ // is PostgreSQL's identifier limit. A longer spelling would truncate to the
95
+ // same relation as another accepted key.
96
+ const CANONICAL_CSV_TABLE = /^[a-z_][a-z0-9_]{0,62}\.[a-z_][a-z0-9_]{0,62}$/;
97
+ function canonicalCsvTable(value) {
98
+ if (typeof value !== 'string') {
99
+ return undefined;
100
+ }
101
+ const table = value.trim();
102
+ if (!CANONICAL_CSV_TABLE.test(table)) {
103
+ return undefined;
104
+ }
105
+ return table;
106
+ }
107
+ function parsePgDumpMetadata(value) {
108
+ const metadata = { kind: 'pg_dump_custom' };
109
+ if (!assignOptionalString(metadata, 'prefixChecksumSha256', value.prefixChecksumSha256))
110
+ return undefined;
111
+ if (!assignOptionalString(metadata, 'prefixObjectKey', value.prefixObjectKey))
112
+ return undefined;
113
+ if (!assignOptionalInteger(metadata, 'currentPrefixSizeBytes', value.currentPrefixSizeBytes))
114
+ return undefined;
115
+ if (!assignOptionalInteger(metadata, 'postgresMajorVersion', value.postgresMajorVersion))
116
+ return undefined;
117
+ if (!assignOptionalInteger(metadata, 'requestedPrefixSizeBytes', value.requestedPrefixSizeBytes))
118
+ return undefined;
119
+ if (value.tableNames !== undefined) {
120
+ if (!Array.isArray(value.tableNames) || !value.tableNames.every(isNonEmptyString)) {
121
+ return undefined;
122
+ }
123
+ metadata.tableNames = value.tableNames;
124
+ }
125
+ const allowed = new Set([
126
+ 'kind',
127
+ 'currentPrefixSizeBytes',
128
+ 'postgresMajorVersion',
129
+ 'prefixChecksumSha256',
130
+ 'prefixObjectKey',
131
+ 'requestedPrefixSizeBytes',
132
+ 'tableNames'
133
+ ]);
134
+ if (Object.keys(value).some((key) => !allowed.has(key))) {
135
+ return undefined;
136
+ }
137
+ return metadata;
138
+ }
139
+ function assignOptionalString(metadata, key, value) {
140
+ if (value === undefined) {
141
+ return true;
142
+ }
143
+ if (!isNonEmptyString(value)) {
144
+ return false;
145
+ }
146
+ metadata[key] = value;
147
+ return true;
148
+ }
149
+ function assignOptionalInteger(metadata, key, value) {
150
+ if (value === undefined) {
151
+ return true;
152
+ }
153
+ if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
154
+ return false;
155
+ }
156
+ metadata[key] = value;
157
+ return true;
158
+ }
159
+ function isDecimalCount(value) {
160
+ return typeof value === 'string' && /^(0|[1-9][0-9]*)$/.test(value);
161
+ }
162
+ function isUnknownRecord(value) {
163
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
164
+ }
165
+ //# sourceMappingURL=dataImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataImport.js","sourceRoot":"","sources":["../../src/database-lifecycle/dataImport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dataImport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataImport.test.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/dataImport.test.ts"],"names":[],"mappings":""}