@byline/db-postgres 0.9.3
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.
- package/LICENSE +373 -0
- package/README.md +18 -0
- package/dist/database/schema/auth.d.ts +857 -0
- package/dist/database/schema/auth.d.ts.map +1 -0
- package/dist/database/schema/auth.js +176 -0
- package/dist/database/schema/auth.js.map +1 -0
- package/dist/database/schema/index.d.ts +2955 -0
- package/dist/database/schema/index.d.ts.map +1 -0
- package/dist/database/schema/index.js +500 -0
- package/dist/database/schema/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/test-helper.d.ts +17 -0
- package/dist/lib/test-helper.d.ts.map +1 -0
- package/dist/lib/test-helper.js +47 -0
- package/dist/lib/test-helper.js.map +1 -0
- package/dist/modules/admin/admin-permissions-repository.d.ts +17 -0
- package/dist/modules/admin/admin-permissions-repository.d.ts.map +1 -0
- package/dist/modules/admin/admin-permissions-repository.js +76 -0
- package/dist/modules/admin/admin-permissions-repository.js.map +1 -0
- package/dist/modules/admin/admin-roles-repository.d.ts +12 -0
- package/dist/modules/admin/admin-roles-repository.d.ts.map +1 -0
- package/dist/modules/admin/admin-roles-repository.js +168 -0
- package/dist/modules/admin/admin-roles-repository.js.map +1 -0
- package/dist/modules/admin/admin-store.d.ts +20 -0
- package/dist/modules/admin/admin-store.d.ts.map +1 -0
- package/dist/modules/admin/admin-store.js +28 -0
- package/dist/modules/admin/admin-store.js.map +1 -0
- package/dist/modules/admin/admin-users-repository.d.ts +12 -0
- package/dist/modules/admin/admin-users-repository.d.ts.map +1 -0
- package/dist/modules/admin/admin-users-repository.js +208 -0
- package/dist/modules/admin/admin-users-repository.js.map +1 -0
- package/dist/modules/admin/index.d.ts +27 -0
- package/dist/modules/admin/index.d.ts.map +1 -0
- package/dist/modules/admin/index.js +27 -0
- package/dist/modules/admin/index.js.map +1 -0
- package/dist/modules/admin/refresh-tokens-repository.d.ts +16 -0
- package/dist/modules/admin/refresh-tokens-repository.d.ts.map +1 -0
- package/dist/modules/admin/refresh-tokens-repository.js +132 -0
- package/dist/modules/admin/refresh-tokens-repository.js.map +1 -0
- package/dist/modules/admin/tests/auth-integration.test.d.ts +9 -0
- package/dist/modules/admin/tests/auth-integration.test.d.ts.map +1 -0
- package/dist/modules/admin/tests/auth-integration.test.js +392 -0
- package/dist/modules/admin/tests/auth-integration.test.js.map +1 -0
- package/dist/modules/admin/tests/session-provider.test.d.ts +9 -0
- package/dist/modules/admin/tests/session-provider.test.d.ts.map +1 -0
- package/dist/modules/admin/tests/session-provider.test.js +370 -0
- package/dist/modules/admin/tests/session-provider.test.js.map +1 -0
- package/dist/modules/storage/@types.d.ts +116 -0
- package/dist/modules/storage/@types.d.ts.map +1 -0
- package/dist/modules/storage/@types.js +9 -0
- package/dist/modules/storage/@types.js.map +1 -0
- package/dist/modules/storage/storage-commands.d.ts +136 -0
- package/dist/modules/storage/storage-commands.d.ts.map +1 -0
- package/dist/modules/storage/storage-commands.js +272 -0
- package/dist/modules/storage/storage-commands.js.map +1 -0
- package/dist/modules/storage/storage-flatten.d.ts +19 -0
- package/dist/modules/storage/storage-flatten.d.ts.map +1 -0
- package/dist/modules/storage/storage-flatten.js +261 -0
- package/dist/modules/storage/storage-flatten.js.map +1 -0
- package/dist/modules/storage/storage-insert.d.ts +22 -0
- package/dist/modules/storage/storage-insert.d.ts.map +1 -0
- package/dist/modules/storage/storage-insert.js +115 -0
- package/dist/modules/storage/storage-insert.js.map +1 -0
- package/dist/modules/storage/storage-queries.d.ts +377 -0
- package/dist/modules/storage/storage-queries.d.ts.map +1 -0
- package/dist/modules/storage/storage-queries.js +976 -0
- package/dist/modules/storage/storage-queries.js.map +1 -0
- package/dist/modules/storage/storage-restore.d.ts +19 -0
- package/dist/modules/storage/storage-restore.d.ts.map +1 -0
- package/dist/modules/storage/storage-restore.js +350 -0
- package/dist/modules/storage/storage-restore.js.map +1 -0
- package/dist/modules/storage/storage-store-manifest.d.ts +71 -0
- package/dist/modules/storage/storage-store-manifest.d.ts.map +1 -0
- package/dist/modules/storage/storage-store-manifest.js +294 -0
- package/dist/modules/storage/storage-store-manifest.js.map +1 -0
- package/dist/modules/storage/storage-utils.d.ts +23 -0
- package/dist/modules/storage/storage-utils.d.ts.map +1 -0
- package/dist/modules/storage/storage-utils.js +72 -0
- package/dist/modules/storage/storage-utils.js.map +1 -0
- package/dist/modules/storage/tests/storage-field-types.test.d.ts +9 -0
- package/dist/modules/storage/tests/storage-field-types.test.d.ts.map +1 -0
- package/dist/modules/storage/tests/storage-field-types.test.js +146 -0
- package/dist/modules/storage/tests/storage-field-types.test.js.map +1 -0
- package/dist/modules/storage/tests/storage-flatten-reconstruct.test.d.ts +9 -0
- package/dist/modules/storage/tests/storage-flatten-reconstruct.test.d.ts.map +1 -0
- package/dist/modules/storage/tests/storage-flatten-reconstruct.test.js +327 -0
- package/dist/modules/storage/tests/storage-flatten-reconstruct.test.js.map +1 -0
- package/dist/modules/storage/tests/storage-store-manifest.test.d.ts +9 -0
- package/dist/modules/storage/tests/storage-store-manifest.test.d.ts.map +1 -0
- package/dist/modules/storage/tests/storage-store-manifest.test.js +141 -0
- package/dist/modules/storage/tests/storage-store-manifest.test.js.map +1 -0
- package/dist/modules/storage/tests/storage-versioning.test.d.ts +9 -0
- package/dist/modules/storage/tests/storage-versioning.test.d.ts.map +1 -0
- package/dist/modules/storage/tests/storage-versioning.test.js +336 -0
- package/dist/modules/storage/tests/storage-versioning.test.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import assert from 'node:assert';
|
|
9
|
+
import { describe, it } from 'node:test';
|
|
10
|
+
import { defineCollection } from '@byline/core';
|
|
11
|
+
import { v7 as uuidv7 } from 'uuid';
|
|
12
|
+
import { flattenFieldSetData } from '../storage-flatten.js';
|
|
13
|
+
import { restoreFieldSetData } from '../storage-restore.js';
|
|
14
|
+
import { resolveStoreTypes } from '../storage-utils.js';
|
|
15
|
+
const DocsCollectionConfig = defineCollection({
|
|
16
|
+
path: 'docs',
|
|
17
|
+
labels: {
|
|
18
|
+
singular: 'Document',
|
|
19
|
+
plural: 'Documents',
|
|
20
|
+
},
|
|
21
|
+
fields: [
|
|
22
|
+
{ name: 'title', type: 'text', localized: true },
|
|
23
|
+
{ name: 'summary', type: 'text', localized: true },
|
|
24
|
+
{
|
|
25
|
+
name: 'publishedOn',
|
|
26
|
+
type: 'datetime',
|
|
27
|
+
mode: 'datetime',
|
|
28
|
+
optional: true,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'featured',
|
|
32
|
+
label: 'Featured',
|
|
33
|
+
type: 'checkbox',
|
|
34
|
+
optional: true,
|
|
35
|
+
helpText: 'Is this page featured on the home page?',
|
|
36
|
+
},
|
|
37
|
+
{ name: 'views', type: 'integer', optional: true },
|
|
38
|
+
{ name: 'price', label: 'Price', type: 'decimal', optional: true },
|
|
39
|
+
{
|
|
40
|
+
name: 'content',
|
|
41
|
+
type: 'blocks',
|
|
42
|
+
blocks: [
|
|
43
|
+
{
|
|
44
|
+
blockType: 'richTextBlock',
|
|
45
|
+
fields: [
|
|
46
|
+
{ name: 'constrainedWidth', type: 'boolean', optional: true },
|
|
47
|
+
{ name: 'richText', type: 'richText', localized: true },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
blockType: 'photoBlock',
|
|
52
|
+
fields: [
|
|
53
|
+
{ name: 'display', type: 'text', optional: true },
|
|
54
|
+
{ name: 'photo', type: 'image' },
|
|
55
|
+
{ name: 'alt', type: 'text', localized: false },
|
|
56
|
+
{ name: 'caption', type: 'richText', optional: true, localized: true },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'reviews',
|
|
63
|
+
type: 'array',
|
|
64
|
+
fields: [
|
|
65
|
+
{
|
|
66
|
+
name: 'reviewItem',
|
|
67
|
+
type: 'group',
|
|
68
|
+
fields: [
|
|
69
|
+
{ name: 'rating', type: 'integer' },
|
|
70
|
+
{ name: 'comment', type: 'richText', localized: false },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'links',
|
|
77
|
+
type: 'array',
|
|
78
|
+
fields: [{ name: 'link', type: 'text' }],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
const fileId = uuidv7();
|
|
83
|
+
// Test document using the flat blocks shape: { _type, ...fields }
|
|
84
|
+
// This is the shape used by the application layer (forms, patches, API).
|
|
85
|
+
const sampleDocument = {
|
|
86
|
+
title: {
|
|
87
|
+
en: 'My First Document',
|
|
88
|
+
es: 'Mi Primer Documento',
|
|
89
|
+
fr: 'Mon Premier Document',
|
|
90
|
+
},
|
|
91
|
+
summary: {
|
|
92
|
+
en: 'This is a sample document for testing purposes.',
|
|
93
|
+
es: 'Este es un documento de muestra para fines de prueba.',
|
|
94
|
+
fr: "Il s'agit d'un document d'exemple à des fins de test.",
|
|
95
|
+
},
|
|
96
|
+
publishedOn: new Date('2024-01-15T10:00:00Z'),
|
|
97
|
+
featured: true,
|
|
98
|
+
views: 100,
|
|
99
|
+
price: '19.99',
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
_id: 'block1',
|
|
103
|
+
_type: 'richTextBlock',
|
|
104
|
+
constrainedWidth: true,
|
|
105
|
+
richText: {
|
|
106
|
+
en: { root: { paragraph: 'Some text here...' } },
|
|
107
|
+
es: { root: { paragraph: 'Some spanish text here' } },
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
_id: 'block2',
|
|
112
|
+
_type: 'photoBlock',
|
|
113
|
+
display: 'wide',
|
|
114
|
+
photo: {
|
|
115
|
+
fileHash: undefined,
|
|
116
|
+
fileId: fileId,
|
|
117
|
+
filename: 'docs-photo-01.jpg',
|
|
118
|
+
imageFormat: undefined,
|
|
119
|
+
imageHeight: undefined,
|
|
120
|
+
imageWidth: undefined,
|
|
121
|
+
originalFilename: 'some-original-filename.jpg',
|
|
122
|
+
mimeType: 'image/jpeg',
|
|
123
|
+
fileSize: 123456,
|
|
124
|
+
storageProvider: 'local',
|
|
125
|
+
storagePath: 'uploads/docs-photo-01.jpg',
|
|
126
|
+
processingStatus: 'pending',
|
|
127
|
+
storageUrl: undefined,
|
|
128
|
+
thumbnailGenerated: undefined,
|
|
129
|
+
},
|
|
130
|
+
alt: 'Some alt text here',
|
|
131
|
+
caption: {
|
|
132
|
+
en: { root: { paragraph: 'Some text here...' } },
|
|
133
|
+
es: { root: { paragraph: 'Some spanish text here...' } },
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
reviews: [
|
|
138
|
+
{
|
|
139
|
+
_id: 'review1',
|
|
140
|
+
reviewItem: { rating: 6, comment: { root: { paragraph: 'Some review text here...' } } },
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
_id: 'review2',
|
|
144
|
+
reviewItem: {
|
|
145
|
+
rating: 2,
|
|
146
|
+
comment: { root: { paragraph: 'Some more reviews here...' } },
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
links: [
|
|
151
|
+
{ _id: 'link1', link: 'https://example.com' },
|
|
152
|
+
{ _id: 'link2', link: 'https://another-example.com' },
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
// restoreFieldSetData produces the flat block shape directly: { _id, _type, ...fields }
|
|
156
|
+
// This matches the application layer shape — no separate attachMetaToDocument step needed.
|
|
157
|
+
const expectedRestored = {
|
|
158
|
+
title: {
|
|
159
|
+
en: 'My First Document',
|
|
160
|
+
es: 'Mi Primer Documento',
|
|
161
|
+
fr: 'Mon Premier Document',
|
|
162
|
+
},
|
|
163
|
+
summary: {
|
|
164
|
+
en: 'This is a sample document for testing purposes.',
|
|
165
|
+
es: 'Este es un documento de muestra para fines de prueba.',
|
|
166
|
+
fr: "Il s'agit d'un document d'exemple à des fins de test.",
|
|
167
|
+
},
|
|
168
|
+
publishedOn: '2024-01-15T10:00:00.000Z',
|
|
169
|
+
featured: true,
|
|
170
|
+
views: 100,
|
|
171
|
+
price: '19.99',
|
|
172
|
+
content: [
|
|
173
|
+
{
|
|
174
|
+
_id: 'block1',
|
|
175
|
+
_type: 'richTextBlock',
|
|
176
|
+
constrainedWidth: true,
|
|
177
|
+
richText: {
|
|
178
|
+
en: { root: { paragraph: 'Some text here...' } },
|
|
179
|
+
es: { root: { paragraph: 'Some spanish text here' } },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
_id: 'block2',
|
|
184
|
+
_type: 'photoBlock',
|
|
185
|
+
display: 'wide',
|
|
186
|
+
photo: {
|
|
187
|
+
fileHash: undefined,
|
|
188
|
+
fileId: fileId,
|
|
189
|
+
filename: 'docs-photo-01.jpg',
|
|
190
|
+
imageFormat: undefined,
|
|
191
|
+
imageHeight: undefined,
|
|
192
|
+
imageWidth: undefined,
|
|
193
|
+
originalFilename: 'some-original-filename.jpg',
|
|
194
|
+
mimeType: 'image/jpeg',
|
|
195
|
+
fileSize: 123456,
|
|
196
|
+
storageProvider: 'local',
|
|
197
|
+
storagePath: 'uploads/docs-photo-01.jpg',
|
|
198
|
+
processingStatus: 'pending',
|
|
199
|
+
storageUrl: undefined,
|
|
200
|
+
thumbnailGenerated: undefined,
|
|
201
|
+
},
|
|
202
|
+
alt: 'Some alt text here',
|
|
203
|
+
caption: {
|
|
204
|
+
en: { root: { paragraph: 'Some text here...' } },
|
|
205
|
+
es: { root: { paragraph: 'Some spanish text here...' } },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
reviews: [
|
|
210
|
+
{
|
|
211
|
+
_id: 'review1',
|
|
212
|
+
reviewItem: { rating: 6, comment: { root: { paragraph: 'Some review text here...' } } },
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
_id: 'review2',
|
|
216
|
+
reviewItem: {
|
|
217
|
+
rating: 2,
|
|
218
|
+
comment: { root: { paragraph: 'Some more reviews here...' } },
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
links: [
|
|
223
|
+
{ _id: 'link1', link: 'https://example.com' },
|
|
224
|
+
{ _id: 'link2', link: 'https://another-example.com' },
|
|
225
|
+
],
|
|
226
|
+
};
|
|
227
|
+
describe('01 Document Flattening and Reconstruction', () => {
|
|
228
|
+
it('should flatten and reconstruct a document via schema-aware round-trip', () => {
|
|
229
|
+
const flattened = flattenFieldSetData(DocsCollectionConfig.fields, sampleDocument, 'all');
|
|
230
|
+
assert(flattened, 'Flattened document should not be null or undefined');
|
|
231
|
+
assert(flattened.length > 0, 'Flattened document should contain field values');
|
|
232
|
+
const restored = restoreFieldSetData(DocsCollectionConfig.fields, flattened);
|
|
233
|
+
assert(restored, 'Restored document should not be null or undefined');
|
|
234
|
+
const restoredJson = JSON.stringify(restored, null, 2);
|
|
235
|
+
const expectedJson = JSON.stringify(expectedRestored, null, 2);
|
|
236
|
+
assert.deepStrictEqual(JSON.parse(restoredJson), JSON.parse(expectedJson), 'Restored document should match the expected flat block shape');
|
|
237
|
+
});
|
|
238
|
+
it('should resolve localized fields when a specific locale is requested', () => {
|
|
239
|
+
const flattened = flattenFieldSetData(DocsCollectionConfig.fields, sampleDocument, 'all');
|
|
240
|
+
const restored = restoreFieldSetData(DocsCollectionConfig.fields, flattened, 'en');
|
|
241
|
+
assert.strictEqual(restored.title, 'My First Document');
|
|
242
|
+
assert.strictEqual(restored.summary, 'This is a sample document for testing purposes.');
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
describe('resolveStoreTypes', () => {
|
|
246
|
+
it('should resolve text fields to text store', () => {
|
|
247
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, ['path', 'title', 'summary']);
|
|
248
|
+
assert.deepStrictEqual([...stores].sort(), ['text']);
|
|
249
|
+
});
|
|
250
|
+
it('should resolve mixed field types to their respective stores', () => {
|
|
251
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, [
|
|
252
|
+
'title',
|
|
253
|
+
'publishedOn',
|
|
254
|
+
'featured',
|
|
255
|
+
'views',
|
|
256
|
+
'price',
|
|
257
|
+
]);
|
|
258
|
+
assert.deepStrictEqual([...stores].sort(), ['boolean', 'datetime', 'numeric', 'text']);
|
|
259
|
+
});
|
|
260
|
+
it('should resolve blocks field to all child store types', () => {
|
|
261
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, ['content']);
|
|
262
|
+
// content blocks contain: richText (json), boolean, text, image (file)
|
|
263
|
+
assert.ok(stores.has('json'), 'should include json for richText');
|
|
264
|
+
assert.ok(stores.has('boolean'), 'should include boolean for constrainedWidth');
|
|
265
|
+
assert.ok(stores.has('text'), 'should include text for display/alt');
|
|
266
|
+
assert.ok(stores.has('file'), 'should include file for photo/image');
|
|
267
|
+
});
|
|
268
|
+
it('should resolve array field to child store types', () => {
|
|
269
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, ['reviews']);
|
|
270
|
+
// reviews array contains group with: integer (numeric), richText (json)
|
|
271
|
+
assert.ok(stores.has('numeric'), 'should include numeric for rating');
|
|
272
|
+
assert.ok(stores.has('json'), 'should include json for comment richText');
|
|
273
|
+
});
|
|
274
|
+
it('should ignore field names that do not exist in the collection', () => {
|
|
275
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, [
|
|
276
|
+
'status',
|
|
277
|
+
'updated_at',
|
|
278
|
+
'nonexistent',
|
|
279
|
+
]);
|
|
280
|
+
assert.strictEqual(stores.size, 0, 'metadata fields should not resolve to any store');
|
|
281
|
+
});
|
|
282
|
+
it('should return empty set for empty field list', () => {
|
|
283
|
+
const stores = resolveStoreTypes(DocsCollectionConfig.fields, []);
|
|
284
|
+
assert.strictEqual(stores.size, 0);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe('reserved field-name tolerance on restore', () => {
|
|
288
|
+
// Installations that declared `path` as a user field before the
|
|
289
|
+
// promotion to a system attribute may have left orphan rows in
|
|
290
|
+
// `store_text` with `field_name = 'path'`. Those rows are not
|
|
291
|
+
// referenced by any current collection schema, but they are still
|
|
292
|
+
// read back by the UNION ALL. `restoreFieldSetData` must silently
|
|
293
|
+
// skip them — the alternative would be a hard
|
|
294
|
+
// "Field path not found" reconstruction failure that lights up
|
|
295
|
+
// every read.
|
|
296
|
+
it('silently skips orphan rows whose field_name is a reserved system attribute', () => {
|
|
297
|
+
const orphanPathRow = {
|
|
298
|
+
locale: 'all',
|
|
299
|
+
field_path: ['path'],
|
|
300
|
+
field_type: 'text',
|
|
301
|
+
value: 'leftover-from-legacy-schema',
|
|
302
|
+
};
|
|
303
|
+
// A normal row alongside the orphan so we can prove reconstruction
|
|
304
|
+
// succeeded rather than returning early.
|
|
305
|
+
const titleRow = {
|
|
306
|
+
locale: 'en',
|
|
307
|
+
field_path: ['title'],
|
|
308
|
+
field_type: 'text',
|
|
309
|
+
value: 'Hello',
|
|
310
|
+
};
|
|
311
|
+
const restored = restoreFieldSetData(DocsCollectionConfig.fields, [orphanPathRow, titleRow], 'en');
|
|
312
|
+
assert.strictEqual(restored.path, undefined, 'reserved-name row must not land on the reconstructed document');
|
|
313
|
+
assert.strictEqual(restored.title, 'Hello', 'non-reserved rows must still be restored');
|
|
314
|
+
});
|
|
315
|
+
it('does not throw when the only row present is a reserved-name orphan', () => {
|
|
316
|
+
const orphanPathRow = {
|
|
317
|
+
locale: 'all',
|
|
318
|
+
field_path: ['path'],
|
|
319
|
+
field_type: 'text',
|
|
320
|
+
value: 'whatever',
|
|
321
|
+
};
|
|
322
|
+
assert.doesNotThrow(() => {
|
|
323
|
+
restoreFieldSetData(DocsCollectionConfig.fields, [orphanPathRow]);
|
|
324
|
+
}, 'a reserved-name orphan must not be treated as an unknown field');
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
//# sourceMappingURL=storage-flatten-reconstruct.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-flatten-reconstruct.test.js","sourceRoot":"","sources":["../../../../src/modules/storage/tests/storage-flatten-reconstruct.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAsC,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACnF,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;IAC5C,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,WAAW;KACpB;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;QAChD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;QAClD;YACE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,yCAAyC;SACpD;QACD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QAClD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QAElE;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE;gBACN;oBACE,SAAS,EAAE,eAAe;oBAC1B,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC7D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;qBACxD;iBACF;gBACD;oBACE,SAAS,EAAE,YAAY;oBACvB,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;wBAChC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;wBAC/C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;qBACvE;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;wBACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;qBACxD;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACzC;KACF;CACF,CAAC,CAAA;AAIF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;AAEvB,kEAAkE;AAClE,yEAAyE;AACzE,MAAM,cAAc,GAAe;IACjC,KAAK,EAAE;QACL,EAAE,EAAE,mBAAmB;QACvB,EAAE,EAAE,qBAAqB;QACzB,EAAE,EAAE,sBAAsB;KAC3B;IACD,OAAO,EAAE;QACP,EAAE,EAAE,iDAAiD;QACrD,EAAE,EAAE,uDAAuD;QAC3D,EAAE,EAAE,uDAAuD;KAC5D;IACD,WAAW,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;IAC7C,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,OAAO;IACd,OAAO,EAAE;QACP;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,eAAe;YACtB,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE;gBACR,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE;gBAChD,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,EAAE;aACtD;SACF;QACD;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE;gBACL,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,mBAAmB;gBAC7B,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE,SAAS;gBACrB,gBAAgB,EAAE,4BAA4B;gBAC9C,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,MAAM;gBAChB,eAAe,EAAE,OAAO;gBACxB,WAAW,EAAE,2BAA2B;gBACxC,gBAAgB,EAAE,SAAS;gBAC3B,UAAU,EAAE,SAAS;gBACrB,kBAAkB,EAAE,SAAS;aAC9B;YACD,GAAG,EAAE,oBAAoB;YACzB,OAAO,EAAE;gBACP,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE;gBAChD,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE;aACzD;SACF;KACF;IACD,OAAO,EAAE;QACP;YACE,GAAG,EAAE,SAAS;YACd,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,EAAE;SACxF;QACD;YACE,GAAG,EAAE,SAAS;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE;aAC9D;SACF;KACF;IACD,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE;QAC7C,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE;KACtD;CACF,CAAA;AAED,wFAAwF;AACxF,2FAA2F;AAC3F,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE;QACL,EAAE,EAAE,mBAAmB;QACvB,EAAE,EAAE,qBAAqB;QACzB,EAAE,EAAE,sBAAsB;KAC3B;IACD,OAAO,EAAE;QACP,EAAE,EAAE,iDAAiD;QACrD,EAAE,EAAE,uDAAuD;QAC3D,EAAE,EAAE,uDAAuD;KAC5D;IACD,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,OAAO;IACd,OAAO,EAAE;QACP;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,eAAe;YACtB,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE;gBACR,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE;gBAChD,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,EAAE;aACtD;SACF;QACD;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE;gBACL,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,mBAAmB;gBAC7B,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE,SAAS;gBACrB,gBAAgB,EAAE,4BAA4B;gBAC9C,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,MAAM;gBAChB,eAAe,EAAE,OAAO;gBACxB,WAAW,EAAE,2BAA2B;gBACxC,gBAAgB,EAAE,SAAS;gBAC3B,UAAU,EAAE,SAAS;gBACrB,kBAAkB,EAAE,SAAS;aAC9B;YACD,GAAG,EAAE,oBAAoB;YACzB,OAAO,EAAE;gBACP,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE;gBAChD,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE;aACzD;SACF;KACF;IACD,OAAO,EAAE;QACP;YACE,GAAG,EAAE,SAAS;YACd,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,EAAE;SACxF;QACD;YACE,GAAG,EAAE,SAAS;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE;aAC9D;SACF;KACF;IACD,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE;QAC7C,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE;KACtD;CACF,CAAA;AAED,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,SAAS,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,cAAqB,EAAE,KAAK,CAAC,CAAA;QAChG,MAAM,CAAC,SAAS,EAAE,oDAAoD,CAAC,CAAA;QACvE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,gDAAgD,CAAC,CAAA;QAE9E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC5E,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC,CAAA;QAErE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAE9D,MAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EACxB,8DAA8D,CAC/D,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,SAAS,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,cAAqB,EAAE,KAAK,CAAC,CAAA;QAEhG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAClF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;QACvD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3F,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE;YAC5D,OAAO;YACP,aAAa;YACb,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC,CAAA;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAC1E,uEAAuE;QACvE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,kCAAkC,CAAC,CAAA;QACjE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,6CAA6C,CAAC,CAAA;QAC/E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,qCAAqC,CAAC,CAAA;QACpE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,qCAAqC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAC1E,wEAAwE;QACxE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,mCAAmC,CAAC,CAAA;QACrE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,0CAA0C,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE;YAC5D,QAAQ;YACR,YAAY;YACZ,aAAa;SACd,CAAC,CAAA;QACF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,gEAAgE;IAChE,+DAA+D;IAC/D,8DAA8D;IAC9D,kEAAkE;IAClE,kEAAkE;IAClE,8CAA8C;IAC9C,+DAA+D;IAC/D,cAAc;IACd,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,aAAa,GAAG;YACpB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,CAAC,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,6BAA6B;SAC5B,CAAA;QAEV,mEAAmE;QACnE,yCAAyC;QACzC,MAAM,QAAQ,GAAG;YACf,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,CAAC,OAAO,CAAC;YACrB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,OAAO;SACN,CAAA;QAEV,MAAM,QAAQ,GAAG,mBAAmB,CAClC,oBAAoB,CAAC,MAAM,EAC3B,CAAC,aAAa,EAAE,QAAQ,CAAQ,EAChC,IAAI,CACL,CAAA;QAED,MAAM,CAAC,WAAW,CAChB,QAAQ,CAAC,IAAI,EACb,SAAS,EACT,+DAA+D,CAChE,CAAA;QACD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,0CAA0C,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,aAAa,GAAG;YACpB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,CAAC,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,UAAU;SACT,CAAA;QAEV,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;YACvB,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,aAAa,CAAQ,CAAC,CAAA;QAC1E,CAAC,EAAE,gEAAgE,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=storage-store-manifest.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-store-manifest.test.d.ts","sourceRoot":"","sources":["../../../../src/modules/storage/tests/storage-store-manifest.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import assert from 'node:assert';
|
|
9
|
+
import { describe, it } from 'node:test';
|
|
10
|
+
import { allStoreTypes, buildSelectList, columns, fieldTypeLiterals, UNIFIED_COLUMN_COUNT, } from '../storage-store-manifest.js';
|
|
11
|
+
/**
|
|
12
|
+
* Parse a generated SELECT list into individual column expressions.
|
|
13
|
+
* Splits on commas that are not inside parentheses (to handle casts like
|
|
14
|
+
* NULL::decimal(10,2) if they ever appear).
|
|
15
|
+
*/
|
|
16
|
+
function parseColumns(selectList) {
|
|
17
|
+
return selectList
|
|
18
|
+
.split(',\n')
|
|
19
|
+
.map((s) => s.trim())
|
|
20
|
+
.filter((s) => s.length > 0);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract the output alias from a column expression.
|
|
24
|
+
* e.g. `value as "text_value"` → `text_value`
|
|
25
|
+
* `id` → `id`
|
|
26
|
+
* `NULL::boolean as "boolean_value"` → `boolean_value`
|
|
27
|
+
*/
|
|
28
|
+
function extractAlias(expr) {
|
|
29
|
+
const match = expr.match(/as\s+"([^"]+)"/);
|
|
30
|
+
if (match)
|
|
31
|
+
return match[1];
|
|
32
|
+
// No alias — the expression is just the column name
|
|
33
|
+
return expr.replace(/^NULL::\S+/, '').trim() || expr;
|
|
34
|
+
}
|
|
35
|
+
describe('storage-store-manifest', () => {
|
|
36
|
+
describe('column count', () => {
|
|
37
|
+
it('UNIFIED_COLUMN_COUNT matches manifest', () => {
|
|
38
|
+
// columns array has all columns except field_type, which is added during generation
|
|
39
|
+
assert.strictEqual(UNIFIED_COLUMN_COUNT, columns.length + 1);
|
|
40
|
+
});
|
|
41
|
+
for (const storeType of allStoreTypes) {
|
|
42
|
+
it(`${storeType} SELECT list has ${UNIFIED_COLUMN_COUNT} columns`, () => {
|
|
43
|
+
const selectList = buildSelectList(storeType);
|
|
44
|
+
const cols = parseColumns(selectList);
|
|
45
|
+
assert.strictEqual(cols.length, UNIFIED_COLUMN_COUNT, `Expected ${UNIFIED_COLUMN_COUNT} columns for ${storeType}, got ${cols.length}:\n${cols.map((c, i) => ` ${i + 1}. ${c}`).join('\n')}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
describe('column order consistency', () => {
|
|
50
|
+
it('all store types produce the same column aliases in the same order', () => {
|
|
51
|
+
const referenceAliases = parseColumns(buildSelectList('text')).map(extractAlias);
|
|
52
|
+
for (const storeType of allStoreTypes) {
|
|
53
|
+
if (storeType === 'text')
|
|
54
|
+
continue;
|
|
55
|
+
const aliases = parseColumns(buildSelectList(storeType)).map(extractAlias);
|
|
56
|
+
assert.deepStrictEqual(aliases, referenceAliases, `Column order mismatch between text and ${storeType}`);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('field_type literals', () => {
|
|
61
|
+
it('each store type emits the correct field_type literal', () => {
|
|
62
|
+
for (const storeType of allStoreTypes) {
|
|
63
|
+
const selectList = buildSelectList(storeType);
|
|
64
|
+
const expected = fieldTypeLiterals[storeType];
|
|
65
|
+
assert.ok(selectList.includes(`'${expected}' as "field_type"`), `Expected field_type '${expected}' for ${storeType}`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('field_type position', () => {
|
|
70
|
+
it('field_type is the 4th column (index 3) for all store types', () => {
|
|
71
|
+
for (const storeType of allStoreTypes) {
|
|
72
|
+
const cols = parseColumns(buildSelectList(storeType));
|
|
73
|
+
const fieldTypeCol = cols[3];
|
|
74
|
+
assert.ok(fieldTypeCol?.includes('field_type'), `Expected field_type at index 3 for ${storeType}, got: ${fieldTypeCol}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('source columns', () => {
|
|
79
|
+
it('text store maps value → text_value', () => {
|
|
80
|
+
const cols = parseColumns(buildSelectList('text'));
|
|
81
|
+
const textValueCol = cols.find((c) => c.includes('text_value'));
|
|
82
|
+
assert.ok(textValueCol, 'text_value column not found');
|
|
83
|
+
assert.ok(textValueCol.includes('value as "text_value"'), `Expected 'value as "text_value"', got: ${textValueCol}`);
|
|
84
|
+
});
|
|
85
|
+
it('boolean store maps value → boolean_value', () => {
|
|
86
|
+
const cols = parseColumns(buildSelectList('boolean'));
|
|
87
|
+
const boolCol = cols.find((c) => c.includes('boolean_value'));
|
|
88
|
+
assert.ok(boolCol, 'boolean_value column not found');
|
|
89
|
+
assert.ok(boolCol.includes('value as "boolean_value"'), `Expected 'value as "boolean_value"', got: ${boolCol}`);
|
|
90
|
+
});
|
|
91
|
+
it('numeric store includes number_type, value_integer, value_decimal, value_float', () => {
|
|
92
|
+
const cols = parseColumns(buildSelectList('numeric'));
|
|
93
|
+
const colText = cols.join(' ');
|
|
94
|
+
for (const field of ['number_type', 'value_integer', 'value_decimal', 'value_float']) {
|
|
95
|
+
assert.ok(colText.includes(field), `Expected ${field} in numeric SELECT list`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it('file store includes all file-specific columns', () => {
|
|
99
|
+
const cols = parseColumns(buildSelectList('file'));
|
|
100
|
+
const colText = cols.join(' ');
|
|
101
|
+
for (const field of [
|
|
102
|
+
'file_id',
|
|
103
|
+
'filename',
|
|
104
|
+
'original_filename',
|
|
105
|
+
'mime_type',
|
|
106
|
+
'file_size',
|
|
107
|
+
'storage_provider',
|
|
108
|
+
'storage_path',
|
|
109
|
+
]) {
|
|
110
|
+
assert.ok(colText.includes(field), `Expected ${field} in file SELECT list`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
it('non-owning stores emit NULL for type-specific columns', () => {
|
|
114
|
+
const cols = parseColumns(buildSelectList('text'));
|
|
115
|
+
const numericCol = cols.find((c) => c.includes('number_type'));
|
|
116
|
+
assert.ok(numericCol, 'number_type column not found');
|
|
117
|
+
assert.ok(numericCol.includes('NULL::varchar'), `Expected NULL for number_type in text store, got: ${numericCol}`);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('base columns', () => {
|
|
121
|
+
it('base columns are emitted as bare column names (no cast, no alias)', () => {
|
|
122
|
+
const baseNames = [
|
|
123
|
+
'id',
|
|
124
|
+
'document_version_id',
|
|
125
|
+
'collection_id',
|
|
126
|
+
'field_path',
|
|
127
|
+
'field_name',
|
|
128
|
+
'locale',
|
|
129
|
+
'parent_path',
|
|
130
|
+
];
|
|
131
|
+
for (const storeType of allStoreTypes) {
|
|
132
|
+
const cols = parseColumns(buildSelectList(storeType));
|
|
133
|
+
for (const baseName of baseNames) {
|
|
134
|
+
const col = cols.find((c) => c.trim() === baseName);
|
|
135
|
+
assert.ok(col, `Expected bare column '${baseName}' in ${storeType} SELECT list`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=storage-store-manifest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-store-manifest.test.js","sourceRoot":"","sources":["../../../../src/modules/storage/tests/storage-store-manifest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=storage-versioning.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-versioning.test.d.ts","sourceRoot":"","sources":["../../../../src/modules/storage/tests/storage-versioning.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|