@verdant-web/store 4.1.3 → 4.1.4
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/dist/bundle/index.js +3 -3
- package/dist/bundle/index.js.map +3 -3
- package/dist/esm/__tests__/fixtures/testStorage.js +5 -0
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/esm/__tests__/schema.test.d.ts +1 -0
- package/dist/esm/__tests__/schema.test.js +64 -0
- package/dist/esm/__tests__/schema.test.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/fixtures/testStorage.ts +7 -1
- package/src/__tests__/schema.test.ts +85 -0
|
@@ -2,6 +2,11 @@ import { createMigration, schema } from '@verdant-web/common';
|
|
|
2
2
|
// @ts-ignore
|
|
3
3
|
import { IDBFactory } from 'fake-indexeddb';
|
|
4
4
|
import { ClientDescriptor, IdbPersistence, } from '../../index.js';
|
|
5
|
+
const test = schema.fields.object({
|
|
6
|
+
fields: {
|
|
7
|
+
foo: schema.fields.string(),
|
|
8
|
+
},
|
|
9
|
+
});
|
|
5
10
|
export const todoCollection = schema.collection({
|
|
6
11
|
name: 'todo',
|
|
7
12
|
primaryKey: 'id',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testStorage.js","sourceRoot":"","sources":["../../../../src/__tests__/fixtures/testStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC9D,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"testStorage.js","sourceRoot":"","sources":["../../../../src/__tests__/fixtures/testStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createMigration, schema, } from '@verdant-web/common';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { ClientDescriptor } from '../client/ClientDescriptor.js';
|
|
4
|
+
import { IdbPersistence } from '../persistence/idb/idbPersistence.js';
|
|
5
|
+
describe('schema', () => {
|
|
6
|
+
it('supports recursive nested fields without breaking', async () => {
|
|
7
|
+
const baseField = schema.fields.object({
|
|
8
|
+
fields: {
|
|
9
|
+
foo: schema.fields.string(),
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
const nestedField = schema.fields.replaceObjectFields(baseField, {
|
|
13
|
+
foo: schema.fields.string(),
|
|
14
|
+
bar: schema.fields.map({
|
|
15
|
+
values: baseField,
|
|
16
|
+
}),
|
|
17
|
+
});
|
|
18
|
+
const tests = schema.collection({
|
|
19
|
+
name: 'tests',
|
|
20
|
+
primaryKey: 'id',
|
|
21
|
+
fields: {
|
|
22
|
+
id: schema.fields.string(),
|
|
23
|
+
nested: nestedField,
|
|
24
|
+
},
|
|
25
|
+
indexes: {
|
|
26
|
+
testLevel3: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
compute: (doc) => { var _a, _b, _c, _d, _e; return (_e = (_d = (_c = (_b = (_a = doc.nested.bar) === null || _a === void 0 ? void 0 : _a.baz) === null || _b === void 0 ? void 0 : _b.bar) === null || _c === void 0 ? void 0 : _c.baz) === null || _d === void 0 ? void 0 : _d.foo) !== null && _e !== void 0 ? _e : ''; },
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const testSchema = schema({
|
|
33
|
+
version: 1,
|
|
34
|
+
collections: {
|
|
35
|
+
tests,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const storage = (await new ClientDescriptor({
|
|
39
|
+
schema: testSchema,
|
|
40
|
+
migrations: [createMigration(testSchema)],
|
|
41
|
+
namespace: 'schematest',
|
|
42
|
+
oldSchemas: [testSchema],
|
|
43
|
+
persistence: new IdbPersistence(new IDBFactory()),
|
|
44
|
+
}).open());
|
|
45
|
+
const doc = await storage.tests.put({
|
|
46
|
+
id: 'test',
|
|
47
|
+
nested: {
|
|
48
|
+
foo: 'foo',
|
|
49
|
+
bar: {
|
|
50
|
+
baz: {
|
|
51
|
+
foo: 'bar',
|
|
52
|
+
bar: {
|
|
53
|
+
baz: {
|
|
54
|
+
foo: 'bar',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
expect(doc.get('nested').get('bar').get('baz').get('bar').get('baz').get('foo')).toBe('bar');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../../src/__tests__/schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,eAAe,EACf,MAAM,GAIN,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAKlE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACtC,MAAM,EAAE;gBACP,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;aAC3B;SACD,CAAC,CAAC;QACH,MAAM,WAAW,GAAgB,MAAM,CAAC,MAAM,CAAC,mBAAmB,CACjE,SAAS,EACT;YACC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACtB,MAAM,EAAE,SAAS;aACjB,CAAC;SACF,CACD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;YAC/B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE;gBACP,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC1B,MAAM,EAAE,WAAW;aACnB;YACD,OAAO,EAAE;gBACR,UAAU,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,2BAAC,OAAA,MAAA,MAAA,MAAA,MAAA,MAAA,GAAG,CAAC,MAAM,CAAC,GAAG,0CAAE,GAAG,0CAAE,GAAG,0CAAE,GAAG,0CAAE,GAAG,mCAAI,EAAE,CAAA,EAAA;iBAC1D;aACD;SACD,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE;gBACZ,KAAK;aACL;SACD,CAAC,CAAC;QAEH,MAAM,OAAO,GAA0B,CAAC,MAAM,IAAI,gBAAgB,CAAC;YAClE,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,CAAC,eAAe,CAAK,UAAU,CAAC,CAAC;YAC7C,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,WAAW,EAAE,IAAI,cAAc,CAAC,IAAI,UAAU,EAAE,CAAC;SACjD,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;QAElB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACnC,EAAE,EAAE,MAAM;YACV,MAAM,EAAE;gBACP,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE;oBACJ,GAAG,EAAE;wBACJ,GAAG,EAAE,KAAK;wBACV,GAAG,EAAE;4BACJ,GAAG,EAAE;gCACJ,GAAG,EAAE,KAAK;6BACV;yBACD;qBACD;iBACD;aACD;SACD,CAAC,CAAC;QAEH,MAAM,CACL,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CACxE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/store",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"jszip": "^3.10.1",
|
|
35
35
|
"jwt-decode": "^3.1.2",
|
|
36
36
|
"weak-event": "^2.0.5",
|
|
37
|
-
"@verdant-web/common": "2.7.
|
|
37
|
+
"@verdant-web/common": "2.7.1"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "20.10.5",
|
|
@@ -2,11 +2,17 @@ import { createMigration, schema } from '@verdant-web/common';
|
|
|
2
2
|
// @ts-ignore
|
|
3
3
|
import { IDBFactory } from 'fake-indexeddb';
|
|
4
4
|
import {
|
|
5
|
-
ClientWithCollections,
|
|
6
5
|
ClientDescriptor,
|
|
6
|
+
ClientWithCollections,
|
|
7
7
|
IdbPersistence,
|
|
8
8
|
} from '../../index.js';
|
|
9
9
|
|
|
10
|
+
const test = schema.fields.object({
|
|
11
|
+
fields: {
|
|
12
|
+
foo: schema.fields.string(),
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
10
16
|
export const todoCollection = schema.collection({
|
|
11
17
|
name: 'todo',
|
|
12
18
|
primaryKey: 'id',
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createMigration,
|
|
3
|
+
schema,
|
|
4
|
+
StorageMapFieldSchema,
|
|
5
|
+
StorageObjectFieldSchema,
|
|
6
|
+
StorageStringFieldSchema,
|
|
7
|
+
} from '@verdant-web/common';
|
|
8
|
+
import { describe, expect, it } from 'vitest';
|
|
9
|
+
import { ClientDescriptor } from '../client/ClientDescriptor.js';
|
|
10
|
+
import { ClientWithCollections } from '../index.js';
|
|
11
|
+
import { IdbPersistence } from '../persistence/idb/idbPersistence.js';
|
|
12
|
+
|
|
13
|
+
describe('schema', () => {
|
|
14
|
+
it('supports recursive nested fields without breaking', async () => {
|
|
15
|
+
type NestedField = StorageObjectFieldSchema<{
|
|
16
|
+
foo: StorageStringFieldSchema;
|
|
17
|
+
bar: StorageMapFieldSchema<NestedField>;
|
|
18
|
+
}>;
|
|
19
|
+
const baseField = schema.fields.object({
|
|
20
|
+
fields: {
|
|
21
|
+
foo: schema.fields.string(),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const nestedField: NestedField = schema.fields.replaceObjectFields(
|
|
25
|
+
baseField,
|
|
26
|
+
{
|
|
27
|
+
foo: schema.fields.string(),
|
|
28
|
+
bar: schema.fields.map({
|
|
29
|
+
values: baseField,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const tests = schema.collection({
|
|
35
|
+
name: 'tests',
|
|
36
|
+
primaryKey: 'id',
|
|
37
|
+
fields: {
|
|
38
|
+
id: schema.fields.string(),
|
|
39
|
+
nested: nestedField,
|
|
40
|
+
},
|
|
41
|
+
indexes: {
|
|
42
|
+
testLevel3: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
compute: (doc) => doc.nested.bar?.baz?.bar?.baz?.foo ?? '',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const testSchema = schema({
|
|
50
|
+
version: 1,
|
|
51
|
+
collections: {
|
|
52
|
+
tests,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const storage: ClientWithCollections = (await new ClientDescriptor({
|
|
57
|
+
schema: testSchema,
|
|
58
|
+
migrations: [createMigration<{}>(testSchema)],
|
|
59
|
+
namespace: 'schematest',
|
|
60
|
+
oldSchemas: [testSchema],
|
|
61
|
+
persistence: new IdbPersistence(new IDBFactory()),
|
|
62
|
+
}).open()) as any;
|
|
63
|
+
|
|
64
|
+
const doc = await storage.tests.put({
|
|
65
|
+
id: 'test',
|
|
66
|
+
nested: {
|
|
67
|
+
foo: 'foo',
|
|
68
|
+
bar: {
|
|
69
|
+
baz: {
|
|
70
|
+
foo: 'bar',
|
|
71
|
+
bar: {
|
|
72
|
+
baz: {
|
|
73
|
+
foo: 'bar',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
expect(
|
|
82
|
+
doc.get('nested').get('bar').get('baz').get('bar').get('baz').get('foo'),
|
|
83
|
+
).toBe('bar');
|
|
84
|
+
});
|
|
85
|
+
});
|