@luzzle/core 0.0.62 → 0.0.64

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 (81) hide show
  1. package/README.md +38 -8
  2. package/dist/src/index.d.ts +2 -2
  3. package/dist/src/index.js +2 -2
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/pieces/Piece.js +2 -2
  6. package/dist/src/pieces/Piece.js.map +1 -1
  7. package/dist/src/pieces/index.d.ts +1 -0
  8. package/dist/src/pieces/index.js +1 -0
  9. package/dist/src/pieces/index.js.map +1 -1
  10. package/dist/src/pieces/utils/piece.d.ts +6 -2
  11. package/dist/src/pieces/utils/piece.js +43 -14
  12. package/dist/src/pieces/utils/piece.js.map +1 -1
  13. package/dist/tsconfig.build.tsbuildinfo +1 -0
  14. package/package.json +3 -3
  15. package/dist/src/database/NodeSqliteDialect.test.d.ts +0 -1
  16. package/dist/src/database/NodeSqliteDialect.test.js +0 -104
  17. package/dist/src/database/NodeSqliteDialect.test.js.map +0 -1
  18. package/dist/src/database/client.test.d.ts +0 -1
  19. package/dist/src/database/client.test.js +0 -36
  20. package/dist/src/database/client.test.js.map +0 -1
  21. package/dist/src/database/migrations.test.d.ts +0 -1
  22. package/dist/src/database/migrations.test.js +0 -19
  23. package/dist/src/database/migrations.test.js.map +0 -1
  24. package/dist/src/database/utils.test.d.ts +0 -1
  25. package/dist/src/database/utils.test.js +0 -9
  26. package/dist/src/database/utils.test.js.map +0 -1
  27. package/dist/src/index.test.d.ts +0 -1
  28. package/dist/src/index.test.js +0 -9
  29. package/dist/src/index.test.js.map +0 -1
  30. package/dist/src/lib/ajv.test.d.ts +0 -1
  31. package/dist/src/lib/ajv.test.js +0 -49
  32. package/dist/src/lib/ajv.test.js.map +0 -1
  33. package/dist/src/lib/frontmatter.test.d.ts +0 -1
  34. package/dist/src/lib/frontmatter.test.js +0 -37
  35. package/dist/src/lib/frontmatter.test.js.map +0 -1
  36. package/dist/src/lib/markdown.test.d.ts +0 -1
  37. package/dist/src/lib/markdown.test.js +0 -34
  38. package/dist/src/lib/markdown.test.js.map +0 -1
  39. package/dist/src/llm/google.test.d.ts +0 -1
  40. package/dist/src/llm/google.test.js +0 -253
  41. package/dist/src/llm/google.test.js.map +0 -1
  42. package/dist/src/pieces/Piece.test.d.ts +0 -1
  43. package/dist/src/pieces/Piece.test.js +0 -628
  44. package/dist/src/pieces/Piece.test.js.map +0 -1
  45. package/dist/src/pieces/Pieces.test.d.ts +0 -1
  46. package/dist/src/pieces/Pieces.test.js +0 -325
  47. package/dist/src/pieces/Pieces.test.js.map +0 -1
  48. package/dist/src/pieces/cache.test.d.ts +0 -1
  49. package/dist/src/pieces/cache.test.js +0 -72
  50. package/dist/src/pieces/cache.test.js.map +0 -1
  51. package/dist/src/pieces/item.test.d.ts +0 -1
  52. package/dist/src/pieces/item.test.js +0 -243
  53. package/dist/src/pieces/item.test.js.map +0 -1
  54. package/dist/src/pieces/items.test.d.ts +0 -1
  55. package/dist/src/pieces/items.test.js +0 -103
  56. package/dist/src/pieces/items.test.js.map +0 -1
  57. package/dist/src/pieces/json.schema.test.d.ts +0 -1
  58. package/dist/src/pieces/json.schema.test.js +0 -27
  59. package/dist/src/pieces/json.schema.test.js.map +0 -1
  60. package/dist/src/pieces/manager.test.d.ts +0 -1
  61. package/dist/src/pieces/manager.test.js +0 -55
  62. package/dist/src/pieces/manager.test.js.map +0 -1
  63. package/dist/src/pieces/utils/frontmatter.path.test.d.ts +0 -1
  64. package/dist/src/pieces/utils/frontmatter.path.test.js +0 -319
  65. package/dist/src/pieces/utils/frontmatter.path.test.js.map +0 -1
  66. package/dist/src/pieces/utils/frontmatter.test.d.ts +0 -1
  67. package/dist/src/pieces/utils/frontmatter.test.js +0 -335
  68. package/dist/src/pieces/utils/frontmatter.test.js.map +0 -1
  69. package/dist/src/pieces/utils/markdown.test.d.ts +0 -1
  70. package/dist/src/pieces/utils/markdown.test.js +0 -38
  71. package/dist/src/pieces/utils/markdown.test.js.map +0 -1
  72. package/dist/src/pieces/utils/piece.test.d.ts +0 -1
  73. package/dist/src/pieces/utils/piece.test.js +0 -348
  74. package/dist/src/pieces/utils/piece.test.js.map +0 -1
  75. package/dist/src/storage/fs.test.d.ts +0 -1
  76. package/dist/src/storage/fs.test.js +0 -212
  77. package/dist/src/storage/fs.test.js.map +0 -1
  78. package/dist/test/db.d.ts +0 -3
  79. package/dist/test/db.js +0 -19
  80. package/dist/test/db.js.map +0 -1
  81. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../src/pieces/cache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from 'vitest'\nimport * as cache from './cache.js'\nimport { setupDatabase, teardownDatabase } from '../../test/db.js'\nimport { type LuzzleDatabase } from '../database/tables/index.js'\n\nlet db: LuzzleDatabase\n\nbeforeEach(async () => {\n\tdb = await setupDatabase()\n})\n\nafterEach(async () => {\n\tawait teardownDatabase(db)\n})\n\ndescribe('pieces/cache.ts', () => {\n\ttest('getCache returns cached entry by file_path', async () => {\n\t\tawait cache.addCache(db, 'book.md', 'hash1')\n\n\t\tconst result = await cache.getCache(db, 'book.md')\n\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'book.md',\n\t\t\tcontent_hash: 'hash1',\n\t\t})\n\t})\n\n\ttest('getCache returns null when not found', async () => {\n\t\tconst result = await cache.getCache(db, 'missing.md')\n\n\t\texpect(result).toBeNull()\n\t})\n\n\ttest('getCacheAll returns all entries', async () => {\n\t\tawait cache.addCache(db, 'a.md', 'hash_a')\n\t\tawait cache.addCache(db, 'b.md', 'hash_b')\n\n\t\tconst result = await cache.getCacheAll(db)\n\n\t\texpect(result).toHaveLength(2)\n\t})\n\n\ttest('addCache inserts and upserts on conflict', async () => {\n\t\tawait cache.addCache(db, 'book.md', 'hash1')\n\t\tawait cache.addCache(db, 'book.md', 'hash2')\n\n\t\tconst result = await cache.getCache(db, 'book.md')\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'book.md',\n\t\t\tcontent_hash: 'hash2',\n\t\t})\n\n\t\tconst all = await cache.getCacheAll(db)\n\t\texpect(all).toHaveLength(1)\n\t})\n\n\ttest('updateCache updates existing entry', async () => {\n\t\tawait cache.addCache(db, 'book.md', 'hash1')\n\n\t\tawait cache.updateCache(db, 'book.md', 'hash2')\n\n\t\tconst result = await cache.getCache(db, 'book.md')\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'book.md',\n\t\t\tcontent_hash: 'hash2',\n\t\t})\n\t})\n\n\ttest('updateCache inserts when entry does not exist', async () => {\n\t\tawait cache.updateCache(db, 'new.md', 'hash_new')\n\n\t\tconst result = await cache.getCache(db, 'new.md')\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'new.md',\n\t\t\tcontent_hash: 'hash_new',\n\t\t})\n\t})\n\n\ttest('removeCache deletes by file_path', async () => {\n\t\tawait cache.addCache(db, 'book.md', 'hash1')\n\n\t\tawait cache.removeCache(db, 'book.md')\n\n\t\tconst result = await cache.getCache(db, 'book.md')\n\t\texpect(result).toBeNull()\n\t})\n\n\ttest('clearCache deletes all entries', async () => {\n\t\tawait cache.addCache(db, 'a.md', 'hash_a')\n\t\tawait cache.addCache(db, 'b.md', 'hash_b')\n\n\t\tawait cache.clearCache(db)\n\n\t\tconst all = await cache.getCacheAll(db)\n\t\texpect(all).toHaveLength(0)\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,243 +0,0 @@
1
- import { describe, expect, test, vi, afterEach } from 'vitest';
2
- import { makeMarkdownSample, makePieceItemSelectable, makeSchema } from './Piece.fixtures.js';
3
- import * as database from './item.js';
4
- describe('src/pieces/item.ts', () => {
5
- afterEach(() => {
6
- vi.resetAllMocks();
7
- });
8
- test('makePieceItemInsertable', () => {
9
- const note = 'note';
10
- const piece = 'books';
11
- const path = 'path';
12
- const frontmatter = {
13
- title: 'title',
14
- keywords: 'keys',
15
- subtitle: 'subtitle',
16
- };
17
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
18
- const schema = makeSchema({
19
- title: { type: 'string' },
20
- keywords: { type: 'string' },
21
- subtitle: { type: 'string' },
22
- });
23
- const input = database.makePieceItemInsertable(piece, markdown, schema);
24
- expect(input).toEqual({
25
- id: expect.any(String),
26
- file_path: path,
27
- note_markdown: markdown.note,
28
- frontmatter_json: JSON.stringify(frontmatter),
29
- type: piece,
30
- });
31
- });
32
- test('makePieceItemInsertable with recursive assets', () => {
33
- const note = 'note';
34
- const piece = 'books';
35
- const path = 'path';
36
- const frontmatter = {
37
- title: 'title',
38
- metadata: {
39
- poster: 'poster.jpg',
40
- gallery: ['img1.png', 'img2.png'],
41
- deep: {
42
- icon: 'icon.svg'
43
- }
44
- }
45
- };
46
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
47
- const schema = makeSchema({
48
- metadata: {
49
- type: 'object',
50
- properties: {
51
- poster: { type: 'string', format: 'asset' },
52
- gallery: { type: 'array', items: { type: 'string', format: 'asset' } },
53
- deep: {
54
- type: 'object',
55
- properties: {
56
- icon: { type: 'string', format: 'asset' }
57
- }
58
- }
59
- }
60
- }
61
- });
62
- const input = database.makePieceItemInsertable(piece, markdown, schema);
63
- expect(input.assets_json_array).toBeDefined();
64
- const assets = JSON.parse(input.assets_json_array);
65
- expect(assets).toContain('poster.jpg');
66
- expect(assets).toContain('img1.png');
67
- expect(assets).toContain('img2.png');
68
- expect(assets).toContain('icon.svg');
69
- expect(assets).toHaveLength(4);
70
- });
71
- test('makePieceItemInsertable with array of objects containing assets', () => {
72
- const piece = 'books';
73
- const frontmatter = {
74
- title: 'title',
75
- items: [
76
- { image: 'a.jpg' },
77
- { image: 'b.jpg' }
78
- ]
79
- };
80
- const markdown = makeMarkdownSample('path', piece, 'note', frontmatter);
81
- const schema = makeSchema({
82
- items: {
83
- type: 'array',
84
- items: {
85
- type: 'object',
86
- properties: {
87
- image: { type: 'string', format: 'asset' }
88
- }
89
- }
90
- }
91
- });
92
- const input = database.makePieceItemInsertable(piece, markdown, schema);
93
- expect(input.assets_json_array).toBe(JSON.stringify(['a.jpg', 'b.jpg']));
94
- });
95
- test('makePieceItemInsertable with deep array assets', () => {
96
- const piece = 'books';
97
- const frontmatter = {
98
- title: 'title',
99
- galleries: [
100
- ['a.jpg', 'b.jpg'],
101
- ['c.jpg']
102
- ]
103
- };
104
- const markdown = makeMarkdownSample('path', piece, 'note', frontmatter);
105
- const schema = makeSchema({
106
- galleries: {
107
- type: 'array',
108
- items: {
109
- type: 'array',
110
- items: { type: 'string', format: 'asset' }
111
- }
112
- }
113
- });
114
- const input = database.makePieceItemInsertable(piece, markdown, schema);
115
- const assets = JSON.parse(input.assets_json_array);
116
- expect(assets).toEqual(['a.jpg', 'b.jpg', 'c.jpg']);
117
- });
118
- test('makePieceItemUpdatable', () => {
119
- const data = makePieceItemSelectable();
120
- const note = 'note';
121
- const path = 'path';
122
- const piece = 'books';
123
- const frontmatter = {
124
- title: 'title',
125
- keywords: 'keys',
126
- subtitle: 'subtitle',
127
- };
128
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
129
- const schema = makeSchema({
130
- title: { type: 'string' },
131
- keywords: { type: 'string' },
132
- subtitle: { type: 'string' },
133
- });
134
- data.note_markdown = 'old note';
135
- const update = database.makePieceItemUpdatable(markdown, schema, data);
136
- expect(update).toEqual({
137
- date_updated: expect.any(Number),
138
- file_path: path,
139
- note_markdown: note,
140
- frontmatter_json: JSON.stringify(frontmatter),
141
- });
142
- });
143
- test('makePieceItemUpdatable with recursive assets', () => {
144
- const data = makePieceItemSelectable();
145
- const note = 'note';
146
- const path = 'path';
147
- const piece = 'books';
148
- const frontmatter = {
149
- title: 'title',
150
- metadata: {
151
- poster: 'new-poster.jpg'
152
- }
153
- };
154
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
155
- const schema = makeSchema({
156
- metadata: {
157
- type: 'object',
158
- properties: {
159
- poster: { type: 'string', format: 'asset' }
160
- }
161
- }
162
- });
163
- const update = database.makePieceItemUpdatable(markdown, schema, data);
164
- expect(update.assets_json_array).toBe(JSON.stringify(['new-poster.jpg']));
165
- });
166
- test('makePieceItemUpdatable with asset changes but no frontmatter change', () => {
167
- const data = makePieceItemSelectable();
168
- const note = 'note';
169
- const path = data.file_path;
170
- const piece = 'books';
171
- const frontmatter = { title: 'title', poster: 'new.jpg' };
172
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
173
- const schema = makeSchema({
174
- poster: { type: 'string', format: 'asset' }
175
- });
176
- data.frontmatter_json = JSON.stringify({ title: 'title' });
177
- data.assets_json_array = JSON.stringify(['old.jpg']);
178
- const update = database.makePieceItemUpdatable(markdown, schema, data);
179
- expect(update.assets_json_array).toBe(JSON.stringify(['new.jpg']));
180
- expect(update.frontmatter_json).toBeDefined();
181
- });
182
- test('makePieceItemUpdatable with force and new path', () => {
183
- const data = makePieceItemSelectable();
184
- const note = 'note';
185
- const path = 'new-path';
186
- const piece = 'books';
187
- const frontmatter = { title: 'title' };
188
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
189
- const schema = makeSchema({});
190
- const update = database.makePieceItemUpdatable(markdown, schema, data, true);
191
- expect(update.file_path).toBe(path);
192
- });
193
- test('makePieceItemUpdatable with same path and no force', () => {
194
- const data = makePieceItemSelectable();
195
- const note = 'note';
196
- const path = data.file_path;
197
- const piece = 'books';
198
- const frontmatter = { title: 'title' };
199
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
200
- const schema = makeSchema({});
201
- const update = database.makePieceItemUpdatable(markdown, schema, data);
202
- expect(update.file_path).toBeUndefined();
203
- });
204
- test('validatePieceItem', () => {
205
- const note = 'note';
206
- const piece = 'books';
207
- const path = 'path';
208
- const frontmatter = {
209
- title: 'title',
210
- };
211
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
212
- const validator = vi.fn(() => true);
213
- const valid = database.validatePieceItem(markdown, validator);
214
- expect(valid).toBe(true);
215
- expect(validator).toHaveBeenCalledOnce();
216
- });
217
- test('validatePieceItem fails', () => {
218
- const note = 'note';
219
- const piece = 'books';
220
- const path = 'path';
221
- const frontmatter = {
222
- title: 'title',
223
- };
224
- const markdown = makeMarkdownSample(path, piece, note, frontmatter);
225
- const validator = vi.fn(() => false);
226
- const valid = database.validatePieceItem(markdown, validator);
227
- expect(valid).toBe(false);
228
- expect(validator).toHaveBeenCalledOnce();
229
- });
230
- test('getValidatePieceItemErrors', () => {
231
- const errors = [{ instancePath: '/title', message: 'is required' }];
232
- const validator = { errors };
233
- const getErrors = database.getValidatePieceItemErrors(validator);
234
- expect(getErrors[0]).toContain('/title is required');
235
- });
236
- test('getValidatePieceItemErrors with no errors', () => {
237
- const errors = undefined;
238
- const validator = { errors };
239
- const getErrors = database.getValidatePieceItemErrors(validator);
240
- expect(getErrors).toStrictEqual([]);
241
- });
242
- });
243
- //# sourceMappingURL=item.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"item.test.js","sourceRoot":"","sources":["../../../src/pieces/item.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, vi, afterEach } from 'vitest'\nimport { makeMarkdownSample, makePieceItemSelectable, makeSchema } from './Piece.fixtures.js'\nimport * as database from './item.js'\nimport { ValidateFunction } from 'ajv'\nimport { PieceFrontmatter } from './utils/frontmatter.js'\n\ndescribe('src/pieces/item.ts', () => {\n\tafterEach(() => {\n\t\tvi.resetAllMocks()\n\t})\n\n\ttest('makePieceItemInsertable', () => {\n\t\tconst note = 'note'\n\t\tconst piece = 'books'\n\t\tconst path = 'path'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\tkeywords: 'keys',\n\t\t\tsubtitle: 'subtitle',\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string' },\n\t\t\tkeywords: { type: 'string' },\n\t\t\tsubtitle: { type: 'string' },\n\t\t})\n\n\t\tconst input = database.makePieceItemInsertable(piece, markdown, schema)\n\n\t\texpect(input).toEqual({\n\t\t\tid: expect.any(String),\n\t\t\tfile_path: path,\n\t\t\tnote_markdown: markdown.note,\n\t\t\tfrontmatter_json: JSON.stringify(frontmatter),\n\t\t\ttype: piece,\n\t\t})\n\t})\n\n\ttest('makePieceItemInsertable with recursive assets', () => {\n\t\tconst note = 'note'\n\t\tconst piece = 'books'\n\t\tconst path = 'path'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\tmetadata: {\n\t\t\t\tposter: 'poster.jpg',\n\t\t\t\tgallery: ['img1.png', 'img2.png'],\n\t\t\t\tdeep: {\n\t\t\t\t\ticon: 'icon.svg'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\t\n\t\tconst schema = makeSchema({\n\t\t\tmetadata: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tposter: { type: 'string', format: 'asset' },\n\t\t\t\t\tgallery: { type: 'array', items: { type: 'string', format: 'asset' } },\n\t\t\t\t\tdeep: {\n\t\t\t\t\t\ttype: 'object',\n\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\ticon: { type: 'string', format: 'asset' }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tconst input = database.makePieceItemInsertable(piece, markdown, schema)\n\n\t\texpect(input.assets_json_array).toBeDefined()\n\t\tconst assets = JSON.parse(input.assets_json_array!)\n\t\texpect(assets).toContain('poster.jpg')\n\t\texpect(assets).toContain('img1.png')\n\t\texpect(assets).toContain('img2.png')\n\t\texpect(assets).toContain('icon.svg')\n\t\texpect(assets).toHaveLength(4)\n\t})\n\n\ttest('makePieceItemInsertable with array of objects containing assets', () => {\n\t\tconst piece = 'books'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\titems: [\n\t\t\t\t{ image: 'a.jpg' },\n\t\t\t\t{ image: 'b.jpg' }\n\t\t\t]\n\t\t}\n\t\tconst markdown = makeMarkdownSample('path', piece, 'note', frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\titems: {\n\t\t\t\ttype: 'array',\n\t\t\t\titems: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\timage: { type: 'string', format: 'asset' }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tconst input = database.makePieceItemInsertable(piece, markdown, schema)\n\t\texpect(input.assets_json_array).toBe(JSON.stringify(['a.jpg', 'b.jpg']))\n\t})\n\n\ttest('makePieceItemInsertable with deep array assets', () => {\n\t\tconst piece = 'books'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\tgalleries: [\n\t\t\t\t['a.jpg', 'b.jpg'],\n\t\t\t\t['c.jpg']\n\t\t\t]\n\t\t}\n\t\tconst markdown = makeMarkdownSample('path', piece, 'note', frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\tgalleries: {\n\t\t\t\ttype: 'array',\n\t\t\t\titems: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\titems: { type: 'string', format: 'asset' }\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tconst input = database.makePieceItemInsertable(piece, markdown, schema)\n\t\tconst assets = JSON.parse(input.assets_json_array!)\n\t\texpect(assets).toEqual(['a.jpg', 'b.jpg', 'c.jpg'])\n\t})\n\n\ttest('makePieceItemUpdatable', () => {\n\t\tconst data = makePieceItemSelectable()\n\t\tconst note = 'note'\n\t\tconst path = 'path'\n\t\tconst piece = 'books'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\tkeywords: 'keys',\n\t\t\tsubtitle: 'subtitle',\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string' },\n\t\t\tkeywords: { type: 'string' },\n\t\t\tsubtitle: { type: 'string' },\n\t\t})\n\n\t\tdata.note_markdown = 'old note'\n\n\t\tconst update = database.makePieceItemUpdatable(markdown, schema, data)\n\n\t\texpect(update).toEqual({\n\t\t\tdate_updated: expect.any(Number),\n\t\t\tfile_path: path,\n\t\t\tnote_markdown: note,\n\t\t\tfrontmatter_json: JSON.stringify(frontmatter),\n\t\t})\n\t})\n\n\ttest('makePieceItemUpdatable with recursive assets', () => {\n\t\tconst data = makePieceItemSelectable()\n\t\tconst note = 'note'\n\t\tconst path = 'path'\n\t\tconst piece = 'books'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t\tmetadata: {\n\t\t\t\tposter: 'new-poster.jpg'\n\t\t\t}\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\tmetadata: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tposter: { type: 'string', format: 'asset' }\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tconst update = database.makePieceItemUpdatable(markdown, schema, data)\n\n\t\texpect(update.assets_json_array).toBe(JSON.stringify(['new-poster.jpg']))\n\t})\n\n\ttest('makePieceItemUpdatable with asset changes but no frontmatter change', () => {\n\t\tconst data = makePieceItemSelectable()\n\t\tconst note = 'note'\n\t\tconst path = data.file_path\n\t\tconst piece = 'books'\n\t\tconst frontmatter = { title: 'title', poster: 'new.jpg' }\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({\n\t\t\tposter: { type: 'string', format: 'asset' }\n\t\t})\n\n\t\tdata.frontmatter_json = JSON.stringify({ title: 'title' })\n\t\tdata.assets_json_array = JSON.stringify(['old.jpg'])\n\n\t\tconst update = database.makePieceItemUpdatable(markdown, schema, data)\n\n\t\texpect(update.assets_json_array).toBe(JSON.stringify(['new.jpg']))\n\t\texpect(update.frontmatter_json).toBeDefined()\n\t})\n\n\ttest('makePieceItemUpdatable with force and new path', () => {\n\t\tconst data = makePieceItemSelectable()\n\t\tconst note = 'note'\n\t\tconst path = 'new-path'\n\t\tconst piece = 'books'\n\t\tconst frontmatter = { title: 'title' }\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({})\n\n\t\tconst update = database.makePieceItemUpdatable(markdown, schema, data, true)\n\n\t\texpect(update.file_path).toBe(path)\n\t})\n\n\ttest('makePieceItemUpdatable with same path and no force', () => {\n\t\tconst data = makePieceItemSelectable()\n\t\tconst note = 'note'\n\t\tconst path = data.file_path\n\t\tconst piece = 'books'\n\t\tconst frontmatter = { title: 'title' }\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst schema = makeSchema({})\n\n\t\tconst update = database.makePieceItemUpdatable(markdown, schema, data)\n\n\t\texpect(update.file_path).toBeUndefined()\n\t})\n\n\ttest('validatePieceItem', () => {\n\t\tconst note = 'note'\n\t\tconst piece = 'books'\n\t\tconst path = 'path'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst validator = vi.fn(() => true) as unknown as ValidateFunction<PieceFrontmatter>\n\n\t\tconst valid = database.validatePieceItem(markdown, validator)\n\n\t\texpect(valid).toBe(true)\n\t\texpect(validator).toHaveBeenCalledOnce()\n\t})\n\n\ttest('validatePieceItem fails', () => {\n\t\tconst note = 'note'\n\t\tconst piece = 'books'\n\t\tconst path = 'path'\n\t\tconst frontmatter = {\n\t\t\ttitle: 'title',\n\t\t}\n\t\tconst markdown = makeMarkdownSample(path, piece, note, frontmatter)\n\t\tconst validator = vi.fn(() => false) as unknown as ValidateFunction<PieceFrontmatter>\n\n\t\tconst valid = database.validatePieceItem(markdown, validator)\n\n\t\texpect(valid).toBe(false)\n\t\texpect(validator).toHaveBeenCalledOnce()\n\t})\n\n\ttest('getValidatePieceItemErrors', () => {\n\t\tconst errors = [{ instancePath: '/title', message: 'is required' }]\n\t\tconst validator = { errors } as unknown as ValidateFunction<PieceFrontmatter>\n\t\tconst getErrors = database.getValidatePieceItemErrors(validator)\n\n\t\texpect(getErrors[0]).toContain('/title is required')\n\t})\n\n\ttest('getValidatePieceItemErrors with no errors', () => {\n\t\tconst errors = undefined\n\t\tconst validator = { errors } as unknown as ValidateFunction<PieceFrontmatter>\n\t\tconst getErrors = database.getValidatePieceItemErrors(validator)\n\n\t\texpect(getErrors).toStrictEqual([])\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,103 +0,0 @@
1
- import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
- import * as items from './items.js';
3
- import { setupDatabase, teardownDatabase } from '../../test/db.js';
4
- let db;
5
- beforeEach(async () => {
6
- db = await setupDatabase();
7
- });
8
- afterEach(async () => {
9
- await teardownDatabase(db);
10
- });
11
- const itemData = {
12
- file_path: 'book.md',
13
- type: 'books',
14
- id: 'item1',
15
- frontmatter_json: '{"title":"My Book"}',
16
- note_markdown: '# My Book',
17
- };
18
- describe('src/pieces/items.ts', () => {
19
- test('insertItem inserts and returns the item', async () => {
20
- const result = await items.insertItem(db, itemData);
21
- expect(result).toMatchObject({
22
- file_path: 'book.md',
23
- type: 'books',
24
- note_markdown: '# My Book',
25
- });
26
- });
27
- test('selectItem returns item by file_path', async () => {
28
- await items.insertItem(db, itemData);
29
- const result = await items.selectItem(db, 'book.md');
30
- expect(result).toMatchObject({
31
- file_path: 'book.md',
32
- type: 'books',
33
- });
34
- });
35
- test('selectItem returns undefined when not found', async () => {
36
- const result = await items.selectItem(db, 'missing.md');
37
- expect(result).toBeUndefined();
38
- });
39
- test('updateItem updates by file_path', async () => {
40
- await items.insertItem(db, itemData);
41
- await items.updateItem(db, 'book.md', { note_markdown: '# Updated' });
42
- const result = await items.selectItem(db, 'book.md');
43
- expect(result.note_markdown).toBe('# Updated');
44
- });
45
- test('selectItems returns all items', async () => {
46
- await items.insertItem(db, itemData);
47
- await items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' });
48
- const result = await items.selectItems(db);
49
- expect(result).toHaveLength(2);
50
- });
51
- test('selectItems filters by type', async () => {
52
- await items.insertItem(db, itemData);
53
- await items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' });
54
- const result = await items.selectItems(db, { type: 'books' });
55
- expect(result).toHaveLength(1);
56
- expect(result[0].file_path).toBe('book.md');
57
- });
58
- test('selectItems filters by asset', async () => {
59
- await items.insertItem(db, {
60
- ...itemData,
61
- assets_json_array: JSON.stringify(['poster.jpg', 'cover.png']),
62
- });
63
- await items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' });
64
- const result = await items.selectItems(db, { asset: 'poster.jpg' });
65
- expect(result).toHaveLength(1);
66
- expect(result[0].file_path).toBe('book.md');
67
- });
68
- test('selectItemAssets returns distinct assets across all items', async () => {
69
- await items.insertItem(db, {
70
- ...itemData,
71
- assets_json_array: JSON.stringify(['poster.jpg', 'cover.png']),
72
- });
73
- await items.insertItem(db, {
74
- ...itemData,
75
- file_path: 'film.md',
76
- type: 'films',
77
- id: 'item2',
78
- assets_json_array: JSON.stringify(['poster.jpg', 'trailer.mp4']),
79
- });
80
- const assets = await items.selectItemAssets(db);
81
- expect(assets).toHaveLength(3);
82
- expect(assets.sort()).toEqual(['cover.png', 'poster.jpg', 'trailer.mp4']);
83
- });
84
- test('selectItemAssets returns empty when no assets', async () => {
85
- await items.insertItem(db, itemData);
86
- const assets = await items.selectItemAssets(db);
87
- expect(assets).toHaveLength(0);
88
- });
89
- test('deleteItem removes by file_path', async () => {
90
- await items.insertItem(db, itemData);
91
- await items.deleteItem(db, 'book.md');
92
- const result = await items.selectItem(db, 'book.md');
93
- expect(result).toBeUndefined();
94
- });
95
- test('deleteItems removes multiple by file_path', async () => {
96
- await items.insertItem(db, itemData);
97
- await items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' });
98
- await items.deleteItems(db, ['book.md', 'film.md']);
99
- const result = await items.selectItems(db);
100
- expect(result).toHaveLength(0);
101
- });
102
- });
103
- //# sourceMappingURL=items.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"items.test.js","sourceRoot":"","sources":["../../../src/pieces/items.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from 'vitest'\nimport * as items from './items.js'\nimport { setupDatabase, teardownDatabase } from '../../test/db.js'\nimport { type LuzzleDatabase } from '../database/tables/index.js'\n\nlet db: LuzzleDatabase\n\nbeforeEach(async () => {\n\tdb = await setupDatabase()\n})\n\nafterEach(async () => {\n\tawait teardownDatabase(db)\n})\n\nconst itemData = {\n\tfile_path: 'book.md',\n\ttype: 'books',\n\tid: 'item1',\n\tfrontmatter_json: '{\"title\":\"My Book\"}',\n\tnote_markdown: '# My Book',\n}\n\ndescribe('src/pieces/items.ts', () => {\n\ttest('insertItem inserts and returns the item', async () => {\n\t\tconst result = await items.insertItem(db, itemData)\n\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'book.md',\n\t\t\ttype: 'books',\n\t\t\tnote_markdown: '# My Book',\n\t\t})\n\t})\n\n\ttest('selectItem returns item by file_path', async () => {\n\t\tawait items.insertItem(db, itemData)\n\n\t\tconst result = await items.selectItem(db, 'book.md')\n\n\t\texpect(result).toMatchObject({\n\t\t\tfile_path: 'book.md',\n\t\t\ttype: 'books',\n\t\t})\n\t})\n\n\ttest('selectItem returns undefined when not found', async () => {\n\t\tconst result = await items.selectItem(db, 'missing.md')\n\n\t\texpect(result).toBeUndefined()\n\t})\n\n\ttest('updateItem updates by file_path', async () => {\n\t\tawait items.insertItem(db, itemData)\n\n\t\tawait items.updateItem(db, 'book.md', { note_markdown: '# Updated' })\n\n\t\tconst result = await items.selectItem(db, 'book.md')\n\t\texpect(result!.note_markdown).toBe('# Updated')\n\t})\n\n\ttest('selectItems returns all items', async () => {\n\t\tawait items.insertItem(db, itemData)\n\t\tawait items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' })\n\n\t\tconst result = await items.selectItems(db)\n\n\t\texpect(result).toHaveLength(2)\n\t})\n\n\ttest('selectItems filters by type', async () => {\n\t\tawait items.insertItem(db, itemData)\n\t\tawait items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' })\n\n\t\tconst result = await items.selectItems(db, { type: 'books' })\n\n\t\texpect(result).toHaveLength(1)\n\t\texpect(result[0].file_path).toBe('book.md')\n\t})\n\n\ttest('selectItems filters by asset', async () => {\n\t\tawait items.insertItem(db, {\n\t\t\t...itemData,\n\t\t\tassets_json_array: JSON.stringify(['poster.jpg', 'cover.png']),\n\t\t})\n\t\tawait items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' })\n\n\t\tconst result = await items.selectItems(db, { asset: 'poster.jpg' })\n\n\t\texpect(result).toHaveLength(1)\n\t\texpect(result[0].file_path).toBe('book.md')\n\t})\n\n\ttest('selectItemAssets returns distinct assets across all items', async () => {\n\t\tawait items.insertItem(db, {\n\t\t\t...itemData,\n\t\t\tassets_json_array: JSON.stringify(['poster.jpg', 'cover.png']),\n\t\t})\n\t\tawait items.insertItem(db, {\n\t\t\t...itemData,\n\t\t\tfile_path: 'film.md',\n\t\t\ttype: 'films',\n\t\t\tid: 'item2',\n\t\t\tassets_json_array: JSON.stringify(['poster.jpg', 'trailer.mp4']),\n\t\t})\n\n\t\tconst assets = await items.selectItemAssets(db)\n\n\t\texpect(assets).toHaveLength(3)\n\t\texpect(assets.sort()).toEqual(['cover.png', 'poster.jpg', 'trailer.mp4'])\n\t})\n\n\ttest('selectItemAssets returns empty when no assets', async () => {\n\t\tawait items.insertItem(db, itemData)\n\n\t\tconst assets = await items.selectItemAssets(db)\n\n\t\texpect(assets).toHaveLength(0)\n\t})\n\n\ttest('deleteItem removes by file_path', async () => {\n\t\tawait items.insertItem(db, itemData)\n\n\t\tawait items.deleteItem(db, 'book.md')\n\n\t\tconst result = await items.selectItem(db, 'book.md')\n\t\texpect(result).toBeUndefined()\n\t})\n\n\ttest('deleteItems removes multiple by file_path', async () => {\n\t\tawait items.insertItem(db, itemData)\n\t\tawait items.insertItem(db, { ...itemData, file_path: 'film.md', type: 'films', id: 'item2' })\n\n\t\tawait items.deleteItems(db, ['book.md', 'film.md'])\n\n\t\tconst result = await items.selectItems(db)\n\t\texpect(result).toHaveLength(0)\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,27 +0,0 @@
1
- import { describe, afterEach, test, vi, expect } from 'vitest';
2
- import { jsonToPieceSchema } from './json.schema.js';
3
- import { existsSync, readFileSync } from 'fs';
4
- vi.mock('fs');
5
- const spies = {};
6
- const mocks = {
7
- existsSync: vi.mocked(existsSync),
8
- readFileSync: vi.mocked(readFileSync),
9
- };
10
- describe('./pieces/json.schema.ts', () => {
11
- afterEach(() => {
12
- Object.values(mocks).forEach((mock) => {
13
- mock.mockReset();
14
- });
15
- Object.keys(spies).forEach((key) => {
16
- spies[key].mockRestore();
17
- delete spies[key];
18
- });
19
- });
20
- test('jsonToPieceSchema', () => {
21
- const jsonObj = { type: 'object' };
22
- const json = JSON.stringify(jsonObj);
23
- const schema = jsonToPieceSchema(json);
24
- expect(schema).toEqual(jsonObj);
25
- });
26
- });
27
- //# sourceMappingURL=json.schema.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json.schema.test.js","sourceRoot":"","sources":["../../../src/pieces/json.schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAE7C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEb,MAAM,KAAK,GAAoC,EAAE,CAAA;AAEjD,MAAM,KAAK,GAAG;IACb,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;IACjC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;CACrC,CAAA;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACxC,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,CAAC,SAAS,EAAE,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC9B,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAEpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["import { describe, afterEach, test, vi, expect, MockInstance } from 'vitest'\nimport { jsonToPieceSchema } from './json.schema.js'\nimport { existsSync, readFileSync } from 'fs'\n\nvi.mock('fs')\n\nconst spies: { [key: string]: MockInstance } = {}\n\nconst mocks = {\n\texistsSync: vi.mocked(existsSync),\n\treadFileSync: vi.mocked(readFileSync),\n}\n\ndescribe('./pieces/json.schema.ts', () => {\n\tafterEach(() => {\n\t\tObject.values(mocks).forEach((mock) => {\n\t\t\tmock.mockReset()\n\t\t})\n\n\t\tObject.keys(spies).forEach((key) => {\n\t\t\tspies[key].mockRestore()\n\t\t\tdelete spies[key]\n\t\t})\n\t})\n\n\ttest('jsonToPieceSchema', () => {\n\t\tconst jsonObj = { type: 'object' }\n\t\tconst json = JSON.stringify(jsonObj)\n\n\t\tconst schema = jsonToPieceSchema(json)\n\n\t\texpect(schema).toEqual(jsonObj)\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,55 +0,0 @@
1
- import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
- import * as manager from './manager.js';
3
- import { makeSchema } from './Piece.fixtures.js';
4
- import { setupDatabase, teardownDatabase } from '../../test/db.js';
5
- let db;
6
- beforeEach(async () => {
7
- db = await setupDatabase();
8
- });
9
- afterEach(async () => {
10
- await teardownDatabase(db);
11
- });
12
- describe('src/pieces/manager.ts', () => {
13
- test('addPiece inserts a managed piece', async () => {
14
- const schema = makeSchema();
15
- await manager.addPiece(db, 'books', schema);
16
- const piece = await manager.getPiece(db, 'books');
17
- expect(piece).toMatchObject({
18
- name: 'books',
19
- schema,
20
- });
21
- });
22
- test('updatePiece updates schema for existing piece', async () => {
23
- const schema = makeSchema();
24
- await manager.addPiece(db, 'books', schema);
25
- const updated = makeSchema({ rating: { type: 'number', nullable: true } });
26
- await manager.updatePiece(db, 'books', updated);
27
- const piece = await manager.getPiece(db, 'books');
28
- expect(piece.schema).toEqual(updated);
29
- });
30
- test('getPiece returns piece with parsed schema', async () => {
31
- const schema = makeSchema();
32
- await manager.addPiece(db, 'books', schema);
33
- const piece = await manager.getPiece(db, 'books');
34
- expect(piece).not.toBeNull();
35
- expect(piece.name).toBe('books');
36
- expect(piece.schema).toEqual(schema);
37
- });
38
- test('getPiece returns null when not found', async () => {
39
- const piece = await manager.getPiece(db, 'missing');
40
- expect(piece).toBeNull();
41
- });
42
- test('getPieces returns all managed pieces', async () => {
43
- await manager.addPiece(db, 'books', makeSchema());
44
- await manager.addPiece(db, 'films', makeSchema());
45
- const pieces = await manager.getPieces(db);
46
- expect(pieces).toHaveLength(2);
47
- });
48
- test('deletePiece removes by name', async () => {
49
- await manager.addPiece(db, 'books', makeSchema());
50
- await manager.deletePiece(db, 'books');
51
- const piece = await manager.getPiece(db, 'books');
52
- expect(piece).toBeNull();
53
- });
54
- });
55
- //# sourceMappingURL=manager.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/pieces/manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from 'vitest'\nimport * as manager from './manager.js'\nimport { makeSchema } from './Piece.fixtures.js'\nimport { setupDatabase, teardownDatabase } from '../../test/db.js'\nimport { type LuzzleDatabase } from '../database/tables/index.js'\n\nlet db: LuzzleDatabase\n\nbeforeEach(async () => {\n\tdb = await setupDatabase()\n})\n\nafterEach(async () => {\n\tawait teardownDatabase(db)\n})\n\ndescribe('src/pieces/manager.ts', () => {\n\ttest('addPiece inserts a managed piece', async () => {\n\t\tconst schema = makeSchema()\n\n\t\tawait manager.addPiece(db, 'books', schema)\n\n\t\tconst piece = await manager.getPiece(db, 'books')\n\t\texpect(piece).toMatchObject({\n\t\t\tname: 'books',\n\t\t\tschema,\n\t\t})\n\t})\n\n\ttest('updatePiece updates schema for existing piece', async () => {\n\t\tconst schema = makeSchema()\n\t\tawait manager.addPiece(db, 'books', schema)\n\n\t\tconst updated = makeSchema({ rating: { type: 'number', nullable: true } })\n\t\tawait manager.updatePiece(db, 'books', updated)\n\n\t\tconst piece = await manager.getPiece(db, 'books')\n\t\texpect(piece!.schema).toEqual(updated)\n\t})\n\n\ttest('getPiece returns piece with parsed schema', async () => {\n\t\tconst schema = makeSchema()\n\t\tawait manager.addPiece(db, 'books', schema)\n\n\t\tconst piece = await manager.getPiece(db, 'books')\n\n\t\texpect(piece).not.toBeNull()\n\t\texpect(piece!.name).toBe('books')\n\t\texpect(piece!.schema).toEqual(schema)\n\t})\n\n\ttest('getPiece returns null when not found', async () => {\n\t\tconst piece = await manager.getPiece(db, 'missing')\n\n\t\texpect(piece).toBeNull()\n\t})\n\n\ttest('getPieces returns all managed pieces', async () => {\n\t\tawait manager.addPiece(db, 'books', makeSchema())\n\t\tawait manager.addPiece(db, 'films', makeSchema())\n\n\t\tconst pieces = await manager.getPieces(db)\n\n\t\texpect(pieces).toHaveLength(2)\n\t})\n\n\ttest('deletePiece removes by name', async () => {\n\t\tawait manager.addPiece(db, 'books', makeSchema())\n\n\t\tawait manager.deletePiece(db, 'books')\n\n\t\tconst piece = await manager.getPiece(db, 'books')\n\t\texpect(piece).toBeNull()\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};