@luzzle/core 0.0.62 → 0.0.63
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/README.md +38 -8
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/pieces/Piece.js +2 -2
- package/dist/src/pieces/Piece.js.map +1 -1
- package/dist/src/pieces/index.d.ts +1 -0
- package/dist/src/pieces/index.js +1 -0
- package/dist/src/pieces/index.js.map +1 -1
- package/dist/src/pieces/utils/piece.d.ts +3 -2
- package/dist/src/pieces/utils/piece.js +17 -14
- package/dist/src/pieces/utils/piece.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/dist/src/database/NodeSqliteDialect.test.d.ts +0 -1
- package/dist/src/database/NodeSqliteDialect.test.js +0 -104
- package/dist/src/database/NodeSqliteDialect.test.js.map +0 -1
- package/dist/src/database/client.test.d.ts +0 -1
- package/dist/src/database/client.test.js +0 -36
- package/dist/src/database/client.test.js.map +0 -1
- package/dist/src/database/migrations.test.d.ts +0 -1
- package/dist/src/database/migrations.test.js +0 -19
- package/dist/src/database/migrations.test.js.map +0 -1
- package/dist/src/database/utils.test.d.ts +0 -1
- package/dist/src/database/utils.test.js +0 -9
- package/dist/src/database/utils.test.js.map +0 -1
- package/dist/src/index.test.d.ts +0 -1
- package/dist/src/index.test.js +0 -9
- package/dist/src/index.test.js.map +0 -1
- package/dist/src/lib/ajv.test.d.ts +0 -1
- package/dist/src/lib/ajv.test.js +0 -49
- package/dist/src/lib/ajv.test.js.map +0 -1
- package/dist/src/lib/frontmatter.test.d.ts +0 -1
- package/dist/src/lib/frontmatter.test.js +0 -37
- package/dist/src/lib/frontmatter.test.js.map +0 -1
- package/dist/src/lib/markdown.test.d.ts +0 -1
- package/dist/src/lib/markdown.test.js +0 -34
- package/dist/src/lib/markdown.test.js.map +0 -1
- package/dist/src/llm/google.test.d.ts +0 -1
- package/dist/src/llm/google.test.js +0 -253
- package/dist/src/llm/google.test.js.map +0 -1
- package/dist/src/pieces/Piece.test.d.ts +0 -1
- package/dist/src/pieces/Piece.test.js +0 -628
- package/dist/src/pieces/Piece.test.js.map +0 -1
- package/dist/src/pieces/Pieces.test.d.ts +0 -1
- package/dist/src/pieces/Pieces.test.js +0 -325
- package/dist/src/pieces/Pieces.test.js.map +0 -1
- package/dist/src/pieces/cache.test.d.ts +0 -1
- package/dist/src/pieces/cache.test.js +0 -72
- package/dist/src/pieces/cache.test.js.map +0 -1
- package/dist/src/pieces/item.test.d.ts +0 -1
- package/dist/src/pieces/item.test.js +0 -243
- package/dist/src/pieces/item.test.js.map +0 -1
- package/dist/src/pieces/items.test.d.ts +0 -1
- package/dist/src/pieces/items.test.js +0 -103
- package/dist/src/pieces/items.test.js.map +0 -1
- package/dist/src/pieces/json.schema.test.d.ts +0 -1
- package/dist/src/pieces/json.schema.test.js +0 -27
- package/dist/src/pieces/json.schema.test.js.map +0 -1
- package/dist/src/pieces/manager.test.d.ts +0 -1
- package/dist/src/pieces/manager.test.js +0 -55
- package/dist/src/pieces/manager.test.js.map +0 -1
- package/dist/src/pieces/utils/frontmatter.path.test.d.ts +0 -1
- package/dist/src/pieces/utils/frontmatter.path.test.js +0 -319
- package/dist/src/pieces/utils/frontmatter.path.test.js.map +0 -1
- package/dist/src/pieces/utils/frontmatter.test.d.ts +0 -1
- package/dist/src/pieces/utils/frontmatter.test.js +0 -335
- package/dist/src/pieces/utils/frontmatter.test.js.map +0 -1
- package/dist/src/pieces/utils/markdown.test.d.ts +0 -1
- package/dist/src/pieces/utils/markdown.test.js +0 -38
- package/dist/src/pieces/utils/markdown.test.js.map +0 -1
- package/dist/src/pieces/utils/piece.test.d.ts +0 -1
- package/dist/src/pieces/utils/piece.test.js +0 -348
- package/dist/src/pieces/utils/piece.test.js.map +0 -1
- package/dist/src/storage/fs.test.d.ts +0 -1
- package/dist/src/storage/fs.test.js +0 -212
- package/dist/src/storage/fs.test.js.map +0 -1
- package/dist/test/db.d.ts +0 -3
- package/dist/test/db.js +0 -19
- package/dist/test/db.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import * as paths from './frontmatter.path.js';
|
|
3
|
-
describe('pieces/utils/frontmatter.path.ts', () => {
|
|
4
|
-
describe('getFrontmatterValue', () => {
|
|
5
|
-
test('gets top level value', () => {
|
|
6
|
-
const obj = { title: 'hello' };
|
|
7
|
-
expect(paths.getFrontmatterValue(obj, 'title')).toBe('hello');
|
|
8
|
-
});
|
|
9
|
-
test('gets nested value', () => {
|
|
10
|
-
const obj = { meta: { author: 'Bob' } };
|
|
11
|
-
expect(paths.getFrontmatterValue(obj, 'meta.author')).toBe('Bob');
|
|
12
|
-
});
|
|
13
|
-
test('gets array value', () => {
|
|
14
|
-
const obj = { tags: ['a', 'b'] };
|
|
15
|
-
expect(paths.getFrontmatterValue(obj, 'tags.1')).toBe('b');
|
|
16
|
-
});
|
|
17
|
-
test('returns undefined for missing path', () => {
|
|
18
|
-
const obj = { title: 'hello' };
|
|
19
|
-
expect(paths.getFrontmatterValue(obj, 'missing')).toBeUndefined();
|
|
20
|
-
expect(paths.getFrontmatterValue(obj, 'title.sub')).toBeUndefined();
|
|
21
|
-
});
|
|
22
|
-
test('returns first item for collection-like queries', () => {
|
|
23
|
-
const obj = { gallery: [{ src: '1.jpg' }, { src: '2.jpg' }] };
|
|
24
|
-
expect(paths.getFrontmatterValue(obj, 'gallery.*.src')).toBe('1.jpg');
|
|
25
|
-
expect(paths.getFrontmatterValue(obj, '$..src')).toBe('1.jpg');
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
describe('getFrontmatterValues', () => {
|
|
29
|
-
const obj = {
|
|
30
|
-
title: 'Piece',
|
|
31
|
-
tags: ['a', 'b'],
|
|
32
|
-
gallery: [{ src: '1.jpg' }, { src: '2.jpg' }],
|
|
33
|
-
};
|
|
34
|
-
test('returns array for singular match', () => {
|
|
35
|
-
expect(paths.getFrontmatterValues(obj, 'title')).toEqual(['Piece']);
|
|
36
|
-
});
|
|
37
|
-
test('returns items for wildcard query', () => {
|
|
38
|
-
expect(paths.getFrontmatterValues(obj, 'gallery[*].src')).toEqual(['1.jpg', '2.jpg']);
|
|
39
|
-
});
|
|
40
|
-
test('returns items for recursive descent', () => {
|
|
41
|
-
expect(paths.getFrontmatterValues(obj, '$..src')).toEqual(['1.jpg', '2.jpg']);
|
|
42
|
-
});
|
|
43
|
-
test('returns empty array for missing path', () => {
|
|
44
|
-
expect(paths.getFrontmatterValues(obj, 'missing')).toEqual([]);
|
|
45
|
-
});
|
|
46
|
-
test('returns direct array if pointed to directly with wildcard', () => {
|
|
47
|
-
expect(paths.getFrontmatterValues(obj, 'tags[*]')).toEqual(['a', 'b']);
|
|
48
|
-
});
|
|
49
|
-
test('returns wrapped array if pointed to directly without brackets or wildcard', () => {
|
|
50
|
-
expect(paths.getFrontmatterValues(obj, 'tags')).toEqual([['a', 'b']]);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
describe('setFrontmatterValue', () => {
|
|
54
|
-
test('sets top level value', () => {
|
|
55
|
-
const obj = { title: 'old' };
|
|
56
|
-
paths.setFrontmatterValue(obj, 'title', 'new');
|
|
57
|
-
expect(obj.title).toBe('new');
|
|
58
|
-
});
|
|
59
|
-
test('sets nested value (creates objects)', () => {
|
|
60
|
-
const obj = { title: 't' };
|
|
61
|
-
paths.setFrontmatterValue(obj, 'meta.author', 'Bob');
|
|
62
|
-
expect(obj.meta.author).toBe('Bob');
|
|
63
|
-
});
|
|
64
|
-
test('sets nested value (creates arrays for indices)', () => {
|
|
65
|
-
const obj = { title: 't' };
|
|
66
|
-
paths.setFrontmatterValue(obj, 'list.0', 'item');
|
|
67
|
-
expect(Array.isArray(obj.list)).toBe(true);
|
|
68
|
-
expect(obj.list[0]).toBe('item');
|
|
69
|
-
});
|
|
70
|
-
test('throws on an unsafe integer value', () => {
|
|
71
|
-
const obj = { title: 't', list: ['a'] };
|
|
72
|
-
expect(() => paths.setFrontmatterValue(obj, 'list.100000000000000000', 'item')).toThrow();
|
|
73
|
-
});
|
|
74
|
-
test('appends to existing array', () => {
|
|
75
|
-
const obj = { tags: ['a'] };
|
|
76
|
-
paths.setFrontmatterValue(obj, 'tags', 'b');
|
|
77
|
-
expect(obj.tags).toEqual(['a', 'b']);
|
|
78
|
-
});
|
|
79
|
-
test('overwrites non-object intermediate paths', () => {
|
|
80
|
-
const obj = { meta: 'not-an-object' };
|
|
81
|
-
paths.setFrontmatterValue(obj, 'meta.author', 'Bob');
|
|
82
|
-
expect(obj.meta.author).toBe('Bob');
|
|
83
|
-
});
|
|
84
|
-
test('throws error when accessing property on array', () => {
|
|
85
|
-
const obj = { tags: ['a'] };
|
|
86
|
-
expect(() => paths.setFrontmatterValue(obj, 'tags.name', 'Bob')).toThrow(/Cannot access property 'name' on Array/);
|
|
87
|
-
});
|
|
88
|
-
test('throws error when creating sparse array (index > length)', () => {
|
|
89
|
-
const obj = { tags: ['a'] };
|
|
90
|
-
expect(() => paths.setFrontmatterValue(obj, 'tags.2', 'c')).toThrow(/Index 2 out of bounds/);
|
|
91
|
-
});
|
|
92
|
-
test('throws error when creating sparse array in nested path (index > length)', () => {
|
|
93
|
-
const obj = { authors: [{ name: 'A' }] };
|
|
94
|
-
expect(() => paths.setFrontmatterValue(obj, 'authors.2.name', 'C')).toThrow(/Index 2 out of bounds/);
|
|
95
|
-
});
|
|
96
|
-
test('allows creating next index (index == length)', () => {
|
|
97
|
-
const obj = { tags: ['a'] };
|
|
98
|
-
paths.setFrontmatterValue(obj, 'tags.1', 'b');
|
|
99
|
-
expect(obj.tags).toEqual(['a', 'b']);
|
|
100
|
-
});
|
|
101
|
-
test('allows creating deeply nested next index', () => {
|
|
102
|
-
const obj = { authors: [{ name: 'A' }] };
|
|
103
|
-
paths.setFrontmatterValue(obj, 'authors.1.name', 'B');
|
|
104
|
-
expect(obj.authors[1]).toEqual({ name: 'B' });
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
describe('unsetFrontmatterValue', () => {
|
|
108
|
-
test('unsets top level value', () => {
|
|
109
|
-
const obj = { title: 'hello', other: 'v' };
|
|
110
|
-
paths.unsetFrontmatterValue(obj, 'title');
|
|
111
|
-
expect(obj.title).toBeUndefined();
|
|
112
|
-
expect(obj.other).toBe('v');
|
|
113
|
-
});
|
|
114
|
-
test('unsets nested value and prunes empty parents', () => {
|
|
115
|
-
const obj = { meta: { author: 'Bob' } };
|
|
116
|
-
paths.unsetFrontmatterValue(obj, 'meta.author');
|
|
117
|
-
expect(obj.meta).toBeUndefined();
|
|
118
|
-
});
|
|
119
|
-
test('handles missing paths gracefully', () => {
|
|
120
|
-
const obj = { title: 't' };
|
|
121
|
-
expect(() => paths.unsetFrontmatterValue(obj, 'missing.path')).not.toThrow();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
describe('findFrontmatterField', () => {
|
|
125
|
-
const fields = [
|
|
126
|
-
{ name: 'title', type: 'string' },
|
|
127
|
-
{
|
|
128
|
-
name: 'meta',
|
|
129
|
-
type: 'object',
|
|
130
|
-
properties: {
|
|
131
|
-
author: { type: 'string' },
|
|
132
|
-
tags: { type: 'array', items: { type: 'string' } },
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
name: 'gallery',
|
|
137
|
-
type: 'array',
|
|
138
|
-
items: {
|
|
139
|
-
type: 'object',
|
|
140
|
-
properties: {
|
|
141
|
-
url: { type: 'string' },
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
name: 'places',
|
|
147
|
-
type: 'array',
|
|
148
|
-
items: {
|
|
149
|
-
type: 'object',
|
|
150
|
-
properties: {
|
|
151
|
-
url: { type: 'string' },
|
|
152
|
-
},
|
|
153
|
-
required: ['url'],
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
];
|
|
157
|
-
test('finds top level field', () => {
|
|
158
|
-
const field = paths.findFrontmatterField(fields, 'title');
|
|
159
|
-
expect(field?.name).toBe('title');
|
|
160
|
-
expect(field?.type).toBe('string');
|
|
161
|
-
});
|
|
162
|
-
test('finds nested field', () => {
|
|
163
|
-
const field = paths.findFrontmatterField(fields, 'meta.author');
|
|
164
|
-
expect(field?.name).toBe('author');
|
|
165
|
-
expect(field?.type).toBe('string');
|
|
166
|
-
});
|
|
167
|
-
test('finds array item field via index', () => {
|
|
168
|
-
const field = paths.findFrontmatterField(fields, 'meta.tags.0');
|
|
169
|
-
expect(field?.type).toBe('string');
|
|
170
|
-
});
|
|
171
|
-
test('finds nested field inside array of objects via index', () => {
|
|
172
|
-
const field = paths.findFrontmatterField(fields, 'gallery.0.url');
|
|
173
|
-
expect(field?.name).toBe('url');
|
|
174
|
-
});
|
|
175
|
-
test('finds nested field inside array of objects without index', () => {
|
|
176
|
-
const field = paths.findFrontmatterField(fields, 'gallery.url');
|
|
177
|
-
expect(field?.name).toBe('url');
|
|
178
|
-
});
|
|
179
|
-
test('finds nested required field inside array of objects via index', () => {
|
|
180
|
-
const field = paths.findFrontmatterField(fields, 'places.0.url');
|
|
181
|
-
expect(field?.name).toBe('url');
|
|
182
|
-
});
|
|
183
|
-
test('returns undefined for non-numeric index on scalar array', () => {
|
|
184
|
-
expect(paths.findFrontmatterField(fields, 'meta.tags.oops')).toBeUndefined();
|
|
185
|
-
});
|
|
186
|
-
test('returns undefined for invalid paths', () => {
|
|
187
|
-
expect(paths.findFrontmatterField(fields, 'missing')).toBeUndefined();
|
|
188
|
-
expect(paths.findFrontmatterField(fields, 'title.nested')).toBeUndefined();
|
|
189
|
-
expect(paths.findFrontmatterField(fields, 'meta.missing')).toBeUndefined();
|
|
190
|
-
});
|
|
191
|
-
test('returns undefined for index on non-array', () => {
|
|
192
|
-
expect(paths.findFrontmatterField(fields, 'title.0')).toBeUndefined();
|
|
193
|
-
});
|
|
194
|
-
test('returns undefined for scalar subpath', () => {
|
|
195
|
-
expect(paths.findFrontmatterField(fields, 'meta.author.deep')).toBeUndefined();
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
describe('filterFrontmatterFields', () => {
|
|
199
|
-
const fields = [
|
|
200
|
-
{ name: 'title', type: 'string' },
|
|
201
|
-
{ name: 'description', type: 'string', format: 'markdown' },
|
|
202
|
-
{ name: 'sections', type: 'array', items: { type: 'string', format: 'markdown' } },
|
|
203
|
-
{
|
|
204
|
-
name: 'chapters',
|
|
205
|
-
type: 'array',
|
|
206
|
-
items: {
|
|
207
|
-
type: 'object',
|
|
208
|
-
properties: {
|
|
209
|
-
title: { type: 'string' },
|
|
210
|
-
body: { type: 'string', format: 'markdown' },
|
|
211
|
-
},
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
name: 'meta',
|
|
216
|
-
type: 'object',
|
|
217
|
-
properties: {
|
|
218
|
-
bio: { type: 'string', format: 'markdown' },
|
|
219
|
-
url: { type: 'string' },
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
{ name: 'tags', type: 'array', items: { type: 'string' } },
|
|
223
|
-
];
|
|
224
|
-
const isMarkdown = (f) => f.type === 'string' && f.format === 'markdown';
|
|
225
|
-
test('finds scalar markdown fields', () => {
|
|
226
|
-
expect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('description');
|
|
227
|
-
});
|
|
228
|
-
test('finds array of markdown strings', () => {
|
|
229
|
-
expect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('sections');
|
|
230
|
-
});
|
|
231
|
-
test('finds markdown inside object', () => {
|
|
232
|
-
expect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('meta.bio');
|
|
233
|
-
});
|
|
234
|
-
test('finds markdown inside array of objects', () => {
|
|
235
|
-
expect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('chapters.body');
|
|
236
|
-
});
|
|
237
|
-
test('returns all markdown paths', () => {
|
|
238
|
-
expect(paths.filterFrontmatterFields(fields, isMarkdown)).toEqual([
|
|
239
|
-
'description',
|
|
240
|
-
'sections',
|
|
241
|
-
'chapters.body',
|
|
242
|
-
'meta.bio',
|
|
243
|
-
]);
|
|
244
|
-
});
|
|
245
|
-
test('excludes non-matching fields', () => {
|
|
246
|
-
const result = paths.filterFrontmatterFields(fields, isMarkdown);
|
|
247
|
-
expect(result).not.toContain('title');
|
|
248
|
-
expect(result).not.toContain('tags');
|
|
249
|
-
expect(result).not.toContain('meta.url');
|
|
250
|
-
expect(result).not.toContain('chapters.title');
|
|
251
|
-
});
|
|
252
|
-
test('returns empty for no matches', () => {
|
|
253
|
-
expect(paths.filterFrontmatterFields(fields, (f) => f.type === 'boolean')).toEqual([]);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('resolveFieldPaths', () => {
|
|
257
|
-
const fields = [
|
|
258
|
-
{ name: 'description', type: 'string', format: 'markdown' },
|
|
259
|
-
{ name: 'sections', type: 'array', items: { type: 'string', format: 'markdown' } },
|
|
260
|
-
{
|
|
261
|
-
name: 'chapters',
|
|
262
|
-
type: 'array',
|
|
263
|
-
items: {
|
|
264
|
-
type: 'object',
|
|
265
|
-
properties: {
|
|
266
|
-
body: { type: 'string', format: 'markdown' },
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
name: 'meta',
|
|
272
|
-
type: 'object',
|
|
273
|
-
properties: {
|
|
274
|
-
bio: { type: 'string', format: 'markdown' },
|
|
275
|
-
},
|
|
276
|
-
},
|
|
277
|
-
];
|
|
278
|
-
test('resolves scalar path', () => {
|
|
279
|
-
const data = { description: 'hello' };
|
|
280
|
-
expect(paths.resolveFieldPaths(fields, data, 'description')).toEqual(['description']);
|
|
281
|
-
});
|
|
282
|
-
test('resolves nested object path', () => {
|
|
283
|
-
const data = { meta: { bio: 'hello' } };
|
|
284
|
-
expect(paths.resolveFieldPaths(fields, data, 'meta.bio')).toEqual(['meta.bio']);
|
|
285
|
-
});
|
|
286
|
-
test('resolves array of strings', () => {
|
|
287
|
-
const data = { sections: ['first', 'second', 'third'] };
|
|
288
|
-
expect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([
|
|
289
|
-
'sections.0',
|
|
290
|
-
'sections.1',
|
|
291
|
-
'sections.2',
|
|
292
|
-
]);
|
|
293
|
-
});
|
|
294
|
-
test('resolves array of objects with sub-path', () => {
|
|
295
|
-
const data = { chapters: [{ body: 'ch1' }, { body: 'ch2' }] };
|
|
296
|
-
expect(paths.resolveFieldPaths(fields, data, 'chapters.body')).toEqual([
|
|
297
|
-
'chapters.0.body',
|
|
298
|
-
'chapters.1.body',
|
|
299
|
-
]);
|
|
300
|
-
});
|
|
301
|
-
test('returns empty for empty array', () => {
|
|
302
|
-
const data = { sections: [] };
|
|
303
|
-
expect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([]);
|
|
304
|
-
});
|
|
305
|
-
test('returns empty for missing field in schema', () => {
|
|
306
|
-
const data = { unknown: 'value' };
|
|
307
|
-
expect(paths.resolveFieldPaths(fields, data, 'unknown')).toEqual([]);
|
|
308
|
-
});
|
|
309
|
-
test('returns empty when frontmatter value is not an array', () => {
|
|
310
|
-
const data = { sections: 'not-an-array' };
|
|
311
|
-
expect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([]);
|
|
312
|
-
});
|
|
313
|
-
test('returns empty when data is missing', () => {
|
|
314
|
-
const data = {};
|
|
315
|
-
expect(paths.resolveFieldPaths(fields, data, 'meta.bio')).toEqual([]);
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
//# sourceMappingURL=frontmatter.path.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.path.test.js","sourceRoot":"","sources":["../../../../src/pieces/utils/frontmatter.path.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test } from 'vitest'\nimport * as paths from './frontmatter.path.js'\nimport { PieceFrontmatter, PieceFrontmatterSchemaField } from './frontmatter.js'\n\ndescribe('pieces/utils/frontmatter.path.ts', () => {\n\tdescribe('getFrontmatterValue', () => {\n\t\ttest('gets top level value', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 'hello' }\n\t\t\texpect(paths.getFrontmatterValue(obj, 'title')).toBe('hello')\n\t\t})\n\n\t\ttest('gets nested value', () => {\n\t\t\tconst obj: PieceFrontmatter = { meta: { author: 'Bob' } }\n\t\t\texpect(paths.getFrontmatterValue(obj, 'meta.author')).toBe('Bob')\n\t\t})\n\n\t\ttest('gets array value', () => {\n\t\t\tconst obj: PieceFrontmatter = { tags: ['a', 'b'] }\n\t\t\texpect(paths.getFrontmatterValue(obj, 'tags.1')).toBe('b')\n\t\t})\n\n\t\ttest('returns undefined for missing path', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 'hello' }\n\t\t\texpect(paths.getFrontmatterValue(obj, 'missing')).toBeUndefined()\n\t\t\texpect(paths.getFrontmatterValue(obj, 'title.sub')).toBeUndefined()\n\t\t})\n\n\t\ttest('returns first item for collection-like queries', () => {\n\t\t\tconst obj: PieceFrontmatter = { gallery: [{ src: '1.jpg' }, { src: '2.jpg' }] }\n\t\t\texpect(paths.getFrontmatterValue(obj, 'gallery.*.src')).toBe('1.jpg')\n\t\t\texpect(paths.getFrontmatterValue(obj, '$..src')).toBe('1.jpg')\n\t\t})\n\t})\n\n\tdescribe('getFrontmatterValues', () => {\n\t\tconst obj: PieceFrontmatter = {\n\t\t\ttitle: 'Piece',\n\t\t\ttags: ['a', 'b'],\n\t\t\tgallery: [{ src: '1.jpg' }, { src: '2.jpg' }],\n\t\t}\n\n\t\ttest('returns array for singular match', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, 'title')).toEqual(['Piece'])\n\t\t})\n\n\t\ttest('returns items for wildcard query', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, 'gallery[*].src')).toEqual(['1.jpg', '2.jpg'])\n\t\t})\n\n\t\ttest('returns items for recursive descent', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, '$..src')).toEqual(['1.jpg', '2.jpg'])\n\t\t})\n\n\t\ttest('returns empty array for missing path', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, 'missing')).toEqual([])\n\t\t})\n\n\t\ttest('returns direct array if pointed to directly with wildcard', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, 'tags[*]')).toEqual(['a', 'b'])\n\t\t})\n\n\t\ttest('returns wrapped array if pointed to directly without brackets or wildcard', () => {\n\t\t\texpect(paths.getFrontmatterValues(obj, 'tags')).toEqual([['a', 'b']])\n\t\t})\n\t})\n\n\tdescribe('setFrontmatterValue', () => {\n\t\ttest('sets top level value', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 'old' }\n\t\t\tpaths.setFrontmatterValue(obj, 'title', 'new')\n\t\t\texpect(obj.title).toBe('new')\n\t\t})\n\n\t\ttest('sets nested value (creates objects)', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 't' }\n\t\t\tpaths.setFrontmatterValue(obj, 'meta.author', 'Bob')\n\t\t\texpect((obj as unknown as Record<string, Record<string, unknown>>).meta.author).toBe('Bob')\n\t\t})\n\n\t\ttest('sets nested value (creates arrays for indices)', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 't' }\n\t\t\tpaths.setFrontmatterValue(obj, 'list.0', 'item')\n\t\t\texpect(Array.isArray((obj as unknown as Record<string, unknown[]>).list)).toBe(true)\n\t\t\texpect((obj as unknown as Record<string, unknown[]>).list[0]).toBe('item')\n\t\t})\n\n\t\ttest('throws on an unsafe integer value', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 't', list: ['a'] }\n\t\t\texpect(() => paths.setFrontmatterValue(obj, 'list.100000000000000000', 'item')).toThrow()\n\t\t})\n\n\t\ttest('appends to existing array', () => {\n\t\t\tconst obj: PieceFrontmatter = { tags: ['a'] }\n\t\t\tpaths.setFrontmatterValue(obj, 'tags', 'b')\n\t\t\texpect(obj.tags).toEqual(['a', 'b'])\n\t\t})\n\n\t\ttest('overwrites non-object intermediate paths', () => {\n\t\t\tconst obj: PieceFrontmatter = { meta: 'not-an-object' }\n\t\t\tpaths.setFrontmatterValue(obj, 'meta.author', 'Bob')\n\t\t\texpect((obj as unknown as Record<string, Record<string, unknown>>).meta.author).toBe('Bob')\n\t\t})\n\n\t\ttest('throws error when accessing property on array', () => {\n\t\t\tconst obj: PieceFrontmatter = { tags: ['a'] }\n\t\t\texpect(() => paths.setFrontmatterValue(obj, 'tags.name', 'Bob')).toThrow(\n\t\t\t\t/Cannot access property 'name' on Array/\n\t\t\t)\n\t\t})\n\n\t\ttest('throws error when creating sparse array (index > length)', () => {\n\t\t\tconst obj: PieceFrontmatter = { tags: ['a'] }\n\t\t\texpect(() => paths.setFrontmatterValue(obj, 'tags.2', 'c')).toThrow(/Index 2 out of bounds/)\n\t\t})\n\n\t\ttest('throws error when creating sparse array in nested path (index > length)', () => {\n\t\t\tconst obj: PieceFrontmatter = { authors: [{ name: 'A' }] }\n\t\t\texpect(() => paths.setFrontmatterValue(obj, 'authors.2.name', 'C')).toThrow(\n\t\t\t\t/Index 2 out of bounds/\n\t\t\t)\n\t\t})\n\n\t\ttest('allows creating next index (index == length)', () => {\n\t\t\tconst obj: PieceFrontmatter = { tags: ['a'] }\n\t\t\tpaths.setFrontmatterValue(obj, 'tags.1', 'b')\n\t\t\texpect(obj.tags).toEqual(['a', 'b'])\n\t\t})\n\n\t\ttest('allows creating deeply nested next index', () => {\n\t\t\tconst obj: PieceFrontmatter = { authors: [{ name: 'A' }] }\n\t\t\tpaths.setFrontmatterValue(obj, 'authors.1.name', 'B')\n\n\t\t\texpect((obj.authors as unknown[])[1]).toEqual({ name: 'B' })\n\t\t})\n\t})\n\n\tdescribe('unsetFrontmatterValue', () => {\n\t\ttest('unsets top level value', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 'hello', other: 'v' }\n\t\t\tpaths.unsetFrontmatterValue(obj, 'title')\n\t\t\texpect(obj.title).toBeUndefined()\n\t\t\texpect(obj.other).toBe('v')\n\t\t})\n\n\t\ttest('unsets nested value and prunes empty parents', () => {\n\t\t\tconst obj: PieceFrontmatter = { meta: { author: 'Bob' } }\n\t\t\tpaths.unsetFrontmatterValue(obj, 'meta.author')\n\t\t\texpect(obj.meta).toBeUndefined()\n\t\t})\n\n\t\ttest('handles missing paths gracefully', () => {\n\t\t\tconst obj: PieceFrontmatter = { title: 't' }\n\t\t\texpect(() => paths.unsetFrontmatterValue(obj, 'missing.path')).not.toThrow()\n\t\t})\n\t})\n\n\tdescribe('findFrontmatterField', () => {\n\t\tconst fields: PieceFrontmatterSchemaField[] = [\n\t\t\t{ name: 'title', type: 'string' },\n\t\t\t{\n\t\t\t\tname: 'meta',\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tauthor: { type: 'string' },\n\t\t\t\t\ttags: { type: 'array', items: { type: 'string' } },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'gallery',\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\turl: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'places',\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\turl: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: ['url'],\n\t\t\t\t},\n\t\t\t},\n\t\t] as unknown as PieceFrontmatterSchemaField[]\n\n\t\ttest('finds top level field', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'title')\n\t\t\texpect(field?.name).toBe('title')\n\t\t\texpect(field?.type).toBe('string')\n\t\t})\n\n\t\ttest('finds nested field', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'meta.author')\n\t\t\texpect(field?.name).toBe('author')\n\t\t\texpect(field?.type).toBe('string')\n\t\t})\n\n\t\ttest('finds array item field via index', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'meta.tags.0')\n\t\t\texpect(field?.type).toBe('string')\n\t\t})\n\n\t\ttest('finds nested field inside array of objects via index', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'gallery.0.url')\n\t\t\texpect(field?.name).toBe('url')\n\t\t})\n\n\t\ttest('finds nested field inside array of objects without index', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'gallery.url')\n\t\t\texpect(field?.name).toBe('url')\n\t\t})\n\n\t\ttest('finds nested required field inside array of objects via index', () => {\n\t\t\tconst field = paths.findFrontmatterField(fields, 'places.0.url')\n\t\t\texpect(field?.name).toBe('url')\n\t\t})\n\n\t\ttest('returns undefined for non-numeric index on scalar array', () => {\n\t\t\texpect(paths.findFrontmatterField(fields, 'meta.tags.oops')).toBeUndefined()\n\t\t})\n\n\t\ttest('returns undefined for invalid paths', () => {\n\t\t\texpect(paths.findFrontmatterField(fields, 'missing')).toBeUndefined()\n\t\t\texpect(paths.findFrontmatterField(fields, 'title.nested')).toBeUndefined()\n\t\t\texpect(paths.findFrontmatterField(fields, 'meta.missing')).toBeUndefined()\n\t\t})\n\n\t\ttest('returns undefined for index on non-array', () => {\n\t\t\texpect(paths.findFrontmatterField(fields, 'title.0')).toBeUndefined()\n\t\t})\n\n\t\ttest('returns undefined for scalar subpath', () => {\n\t\t\texpect(paths.findFrontmatterField(fields, 'meta.author.deep')).toBeUndefined()\n\t\t})\n\t})\n\n\tdescribe('filterFrontmatterFields', () => {\n\t\tconst fields: PieceFrontmatterSchemaField[] = [\n\t\t\t{ name: 'title', type: 'string' },\n\t\t\t{ name: 'description', type: 'string', format: 'markdown' },\n\t\t\t{ name: 'sections', type: 'array', items: { type: 'string', format: 'markdown' } },\n\t\t\t{\n\t\t\t\tname: 'chapters',\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\ttitle: { type: 'string' },\n\t\t\t\t\t\tbody: { type: 'string', format: 'markdown' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'meta',\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tbio: { type: 'string', format: 'markdown' },\n\t\t\t\t\turl: { type: 'string' },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ name: 'tags', type: 'array', items: { type: 'string' } },\n\t\t] as unknown as PieceFrontmatterSchemaField[]\n\n\t\tconst isMarkdown = (f: { type?: string; format?: string }) =>\n\t\t\tf.type === 'string' && f.format === 'markdown'\n\n\t\ttest('finds scalar markdown fields', () => {\n\t\t\texpect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('description')\n\t\t})\n\n\t\ttest('finds array of markdown strings', () => {\n\t\t\texpect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('sections')\n\t\t})\n\n\t\ttest('finds markdown inside object', () => {\n\t\t\texpect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('meta.bio')\n\t\t})\n\n\t\ttest('finds markdown inside array of objects', () => {\n\t\t\texpect(paths.filterFrontmatterFields(fields, isMarkdown)).toContain('chapters.body')\n\t\t})\n\n\t\ttest('returns all markdown paths', () => {\n\t\t\texpect(paths.filterFrontmatterFields(fields, isMarkdown)).toEqual([\n\t\t\t\t'description',\n\t\t\t\t'sections',\n\t\t\t\t'chapters.body',\n\t\t\t\t'meta.bio',\n\t\t\t])\n\t\t})\n\n\t\ttest('excludes non-matching fields', () => {\n\t\t\tconst result = paths.filterFrontmatterFields(fields, isMarkdown)\n\t\t\texpect(result).not.toContain('title')\n\t\t\texpect(result).not.toContain('tags')\n\t\t\texpect(result).not.toContain('meta.url')\n\t\t\texpect(result).not.toContain('chapters.title')\n\t\t})\n\n\t\ttest('returns empty for no matches', () => {\n\t\t\texpect(\n\t\t\t\tpaths.filterFrontmatterFields(fields, (f) => f.type === 'boolean')\n\t\t\t).toEqual([])\n\t\t})\n\t})\n\n\tdescribe('resolveFieldPaths', () => {\n\t\tconst fields: PieceFrontmatterSchemaField[] = [\n\t\t\t{ name: 'description', type: 'string', format: 'markdown' },\n\t\t\t{ name: 'sections', type: 'array', items: { type: 'string', format: 'markdown' } },\n\t\t\t{\n\t\t\t\tname: 'chapters',\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\tbody: { type: 'string', format: 'markdown' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'meta',\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tbio: { type: 'string', format: 'markdown' },\n\t\t\t\t},\n\t\t\t},\n\t\t] as unknown as PieceFrontmatterSchemaField[]\n\n\t\ttest('resolves scalar path', () => {\n\t\t\tconst data = { description: 'hello' }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'description')).toEqual(['description'])\n\t\t})\n\n\t\ttest('resolves nested object path', () => {\n\t\t\tconst data = { meta: { bio: 'hello' } }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'meta.bio')).toEqual(['meta.bio'])\n\t\t})\n\n\t\ttest('resolves array of strings', () => {\n\t\t\tconst data = { sections: ['first', 'second', 'third'] }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([\n\t\t\t\t'sections.0',\n\t\t\t\t'sections.1',\n\t\t\t\t'sections.2',\n\t\t\t])\n\t\t})\n\n\t\ttest('resolves array of objects with sub-path', () => {\n\t\t\tconst data = { chapters: [{ body: 'ch1' }, { body: 'ch2' }] }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'chapters.body')).toEqual([\n\t\t\t\t'chapters.0.body',\n\t\t\t\t'chapters.1.body',\n\t\t\t])\n\t\t})\n\n\t\ttest('returns empty for empty array', () => {\n\t\t\tconst data = { sections: [] }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([])\n\t\t})\n\n\t\ttest('returns empty for missing field in schema', () => {\n\t\t\tconst data = { unknown: 'value' }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'unknown')).toEqual([])\n\t\t})\n\n\t\ttest('returns empty when frontmatter value is not an array', () => {\n\t\t\tconst data = { sections: 'not-an-array' }\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'sections')).toEqual([])\n\t\t})\n\n\t\ttest('returns empty when data is missing', () => {\n\t\t\tconst data = {}\n\t\t\texpect(paths.resolveFieldPaths(fields, data, 'meta.bio')).toEqual([])\n\t\t})\n\t})\n})\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|