@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":"Piece.test.js","sourceRoot":"","sources":["../../../src/pieces/Piece.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, vi, afterEach, beforeEach } from 'vitest'\nimport {\n\tmakeMarkdownSample,\n\tmakePieceItemSelectable,\n\tmakePieceMock,\n\tmakeSchema,\n\tmakeStorage,\n} from './Piece.fixtures.js'\nimport { setupDatabase, teardownDatabase } from '../../test/db.js'\nimport { type LuzzleDatabase } from '../database/tables/index.js'\nimport * as cache from './cache.js'\nimport * as item from './item.js'\nimport * as items from './items.js'\nimport * as pieceUtils from './utils/piece.js'\nimport slugify from '@sindresorhus/slugify'\nimport { StorageStat, LuzzleInsertable } from '../index.js'\nimport { PassThrough } from 'stream'\nimport { CpuInfo, cpus } from 'os'\nimport { makeCache } from './cache.fixtures.js'\nimport { ReadStream } from 'fs'\n\nvi.mock('./cache.js')\nvi.mock('./item.js')\nvi.mock('./items.js')\nvi.mock('./utils/piece.js')\nvi.mock('os')\nvi.mock('@sindresorhus/slugify')\n\nconst mocks = {\n\tcache: vi.mocked(cache),\n\titem: vi.mocked(item),\n\titems: vi.mocked(items),\n\tpieceUtils: vi.mocked(pieceUtils),\n\tslugify: vi.mocked(slugify),\n\tcpus: vi.mocked(cpus),\n}\n\nlet db: LuzzleDatabase\n\nbeforeEach(async () => {\n\tdb = await setupDatabase()\n})\n\ndescribe('pieces/Piece.ts', () => {\n\tafterEach(async () => {\n\t\tawait teardownDatabase(db)\n\t\tvi.clearAllMocks()\n\t})\n\n\ttest('constructor throws on name mismatch', () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema('table')\n\t\tconst storage = makeStorage()\n\t\texpect(() => new PieceType('mismatch', storage, schema)).toThrow(\n\t\t\t'does not match the schema title'\n\t\t)\n\t})\n\n\ttest('create generates a new markdown piece', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tmocks.slugify.mockReturnValue('my-title')\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(false)\n\n\t\tconst result = await piece.create('dir', 'My Title')\n\t\texpect(result.piece).toBe('table')\n\t\texpect(result.frontmatter.title).toBe('title')\n\t})\n\n\ttest('create throws if file already exists', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tmocks.slugify.mockReturnValue('my-title')\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(true)\n\n\t\tawait expect(piece.create('dir', 'My Title')).rejects.toThrow('file already exists')\n\t})\n\n\ttest('delete removes file if it exists', async () => {\n\t\tconst storage = makeStorage()\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(true)\n\t\tvi.spyOn(storage, 'delete').mockResolvedValue(undefined)\n\n\t\tawait piece.delete('file.md')\n\t\texpect(storage.delete).toHaveBeenCalledWith('file.md')\n\t})\n\n\ttest('delete throws if file missing', async () => {\n\t\tconst storage = makeStorage()\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(false)\n\n\t\tawait expect(piece.delete('file.md')).rejects.toThrow('does not exist')\n\t})\n\n\ttest('get schema', () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst type = 'table'\n\t\tconst schema = makeSchema(type)\n\t\tconst storage = makeStorage('root')\n\n\t\tconst piece = new PieceType(type, storage, schema)\n\n\t\texpect(piece.schema).toEqual(schema)\n\t})\n\n\ttest('isOutdated returns true if file is newer than cache', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tmocks.cache.getCache.mockResolvedValue(\n\t\t\tmakeCache({\n\t\t\t\tdate_updated: 1000,\n\t\t\t\tdate_added: 1000,\n\t\t\t})\n\t\t)\n\t\tvi.spyOn(storage, 'stat').mockResolvedValue({ last_modified: new Date(2000) } as StorageStat)\n\n\t\texpect(await piece.isOutdated('file.md', db)).toBe(true)\n\t})\n\n\ttest('isOutdated by date_added', async () => {\n\t\tconst filename = '/path/to/slug.books.md'\n\t\tconst PieceType = makePieceMock()\n\t\tconst cacheDate = new Date('11-11-2000').getTime()\n\t\tconst fileDate = new Date('11-11-2001')\n\t\tconst storage = makeStorage()\n\t\tconst pieceTest = new PieceType('table', storage)\n\n\t\tmocks.cache.getCache.mockResolvedValue(\n\t\t\tmakeCache({\n\t\t\t\tdate_added: cacheDate,\n\t\t\t\tdate_updated: null,\n\t\t\t\tid: '1',\n\t\t\t\tfile_path: filename,\n\t\t\t\tcontent_hash: 'h',\n\t\t\t})\n\t\t)\n\t\tvi.spyOn(storage, 'stat').mockResolvedValue({ last_modified: fileDate } as StorageStat)\n\n\t\tconst isOutdated = await pieceTest.isOutdated(filename, db)\n\t\texpect(isOutdated).toEqual(true)\n\t})\n\n\ttest('isOutdated returns false if cache is current', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\n\t\tmocks.cache.getCache.mockResolvedValue(\n\t\t\tmakeCache({\n\t\t\t\tdate_updated: 3000,\n\t\t\t\tdate_added: 3000,\n\t\t\t})\n\t\t)\n\t\tvi.spyOn(storage, 'stat').mockResolvedValue({ last_modified: new Date(2000) } as StorageStat)\n\n\t\texpect(await piece.isOutdated('file.md', db)).toBe(false)\n\t})\n\n\ttest('isOutdated throws', async () => {\n\t\tconst filename = 'file.md'\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst pieceTest = new PieceType('table', storage)\n\n\t\tvi.spyOn(storage, 'stat').mockRejectedValue(new Error('oof'))\n\t\tawait expect(pieceTest.isOutdated(filename, db)).rejects.toThrow()\n\t})\n\n\ttest('validate calls item.validatePieceItem', () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType()\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.item.validatePieceItem.mockReturnValue(true)\n\t\tconst result = piece.validate(markdown)\n\t\texpect(result.isValid).toBe(true)\n\t})\n\n\ttest('validate returns errors on failure', () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType()\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.item.validatePieceItem.mockReturnValue(false)\n\t\tmocks.item.getValidatePieceItemErrors.mockReturnValue(['error'])\n\n\t\tconst result = piece.validate(markdown)\n\t\texpect(result.isValid).toBe(false)\n\t\tif (!result.isValid) {\n\t\t\texpect(result.errors).toEqual(['error'])\n\t\t}\n\t})\n\n\ttest('get reads and extracts markdown', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst fm = { title: 'sample' }\n\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(true)\n\t\tvi.spyOn(storage, 'readFile').mockResolvedValue('---\\ntitle: sample\\n---\\nbody')\n\n\t\tconst result = await piece.get('file.md')\n\t\texpect(result.frontmatter.title).toBe(fm.title)\n\t\texpect(result.note).toBe('body')\n\t})\n\n\ttest('get throws if file missing', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tvi.spyOn(storage, 'exists').mockResolvedValue(false)\n\t\tawait expect(piece.get('file.md')).rejects.toThrow('does not exist')\n\t})\n\n\ttest('write saves markdown if valid', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.item.validatePieceItem.mockReturnValue(true)\n\t\tvi.spyOn(storage, 'writeFile').mockResolvedValue(undefined)\n\n\t\tawait piece.write(markdown)\n\t\texpect(storage.writeFile).toHaveBeenCalled()\n\t})\n\n\ttest('write throws if invalid', async () => {\n\t\tconst piece = new (makePieceMock())()\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.item.validatePieceItem.mockReturnValue(false)\n\t\tmocks.item.getValidatePieceItemErrors.mockReturnValue(['bad'])\n\n\t\tawait expect(piece.write(markdown)).rejects.toThrow('Could not write')\n\t})\n\n\ttest('prune deletes missing pieces from DB', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tmocks.items.selectItems.mockResolvedValue([\n\t\t\tmakePieceItemSelectable({ file_path: 'missing.md' }),\n\t\t])\n\t\tmocks.items.deleteItem.mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.prune(db, ['exists.md'])\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('pruned')\n\t\t\t}\n\t\t}\n\t\texpect(mocks.items.deleteItem).toHaveBeenCalledWith(db, 'missing.md')\n\t})\n\n\ttest('prune handles dryRun', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tmocks.items.selectItems.mockResolvedValue([\n\t\t\tmakePieceItemSelectable({ file_path: 'missing.md' }),\n\t\t])\n\n\t\tconst stream = await piece.prune(db, [], { dryRun: true })\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('pruned')\n\t\t\t}\n\t\t}\n\t\texpect(mocks.items.deleteItem).not.toHaveBeenCalled()\n\t})\n\n\ttest('prune handles error', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tmocks.items.selectItems.mockResolvedValue([makePieceItemSelectable({ file_path: 'm.md' })])\n\t\tmocks.items.deleteItem.mockRejectedValue(new Error('oof'))\n\n\t\tconst stream = await piece.prune(db, [])\n\t\tfor await (const result of stream) {\n\t\t\texpect(result.error).toBe(true)\n\t\t}\n\t})\n\n\ttest('syncMarkdownAdd inserts piece and adds cache', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.item.makePieceItemInsertable.mockReturnValue({} as LuzzleInsertable<'pieces_items'>)\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('hash')\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tawait piece.syncMarkdownAdd(db, markdown)\n\t\texpect(mocks.items.insertItem).toHaveBeenCalled()\n\t\texpect(mocks.cache.addCache).toHaveBeenCalledWith(db, markdown.filePath, 'hash')\n\t})\n\n\ttest('syncMarkdown handles update or add', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tconst syncAddSpy = vi.spyOn(piece, 'syncMarkdownAdd').mockResolvedValue(undefined)\n\t\tconst syncUpdateSpy = vi.spyOn(piece, 'syncMarkdownUpdate').mockResolvedValue(undefined)\n\n\t\tmocks.items.selectItem.mockResolvedValueOnce(undefined)\n\t\tawait piece.syncMarkdown(db, markdown)\n\t\texpect(syncAddSpy).toHaveBeenCalled()\n\n\t\tmocks.items.selectItem.mockResolvedValueOnce(makePieceItemSelectable({ id: '1' }))\n\t\tawait piece.syncMarkdown(db, markdown)\n\t\texpect(syncUpdateSpy).toHaveBeenCalled()\n\t})\n\n\ttest('syncMarkdownUpdate updates item and cache', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample()\n\t\tconst data = makePieceItemSelectable()\n\n\t\tmocks.item.makePieceItemUpdatable.mockReturnValue({})\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('new-hash')\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tawait piece.syncMarkdownUpdate(db, markdown, data)\n\t\texpect(mocks.items.updateItem).toHaveBeenCalled()\n\t\texpect(mocks.cache.updateCache).toHaveBeenCalledWith(db, data.file_path, 'new-hash')\n\t})\n\n\ttest('sync adds new pieces to DB', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 'new.md' })\n\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(undefined)\n\n\t\tconst syncAddSpy = vi.spyOn(piece, 'syncMarkdownAdd').mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.sync(db, ['new.md'])\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('added')\n\t\t\t}\n\t\t}\n\t\texpect(syncAddSpy).toHaveBeenCalled()\n\t})\n\n\ttest('sync updates existing pieces if hash changed', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 'u.md' })\n\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(makePieceItemSelectable({ id: '1' }))\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('new-hash')\n\t\tmocks.cache.getCache.mockResolvedValue(makeCache({ content_hash: 'old-hash' }))\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tconst syncUpdateSpy = vi.spyOn(piece, 'syncMarkdownUpdate').mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.sync(db, ['u.md'])\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('updated')\n\t\t\t}\n\t\t}\n\t\texpect(syncUpdateSpy).toHaveBeenCalled()\n\t})\n\n\ttest('sync skips unchanged pieces', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 's.md' })\n\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(makePieceItemSelectable({ id: '1' }))\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('same-hash')\n\t\tmocks.cache.getCache.mockResolvedValue(makeCache({ content_hash: 'same-hash' }))\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tconst stream = await piece.sync(db, ['s.md'])\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('skipped')\n\t\t\t}\n\t\t}\n\t\texpect(mocks.cache.updateCache).toHaveBeenCalledWith(db, 's.md', 'same-hash')\n\t})\n\n\ttest('sync handles dryRun', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 'new.md' })\n\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(undefined)\n\t\tconst syncAddSpy = vi.spyOn(piece, 'syncMarkdownAdd').mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.sync(db, ['new.md'], { dryRun: true })\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('added')\n\t\t\t}\n\t\t}\n\t\texpect(syncAddSpy).not.toHaveBeenCalled()\n\t})\n\n\ttest('sync handles dryRun update', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 'u.md' })\n\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(makePieceItemSelectable({ id: '1' }))\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('new-hash')\n\t\tmocks.cache.getCache.mockResolvedValue(makeCache({ content_hash: 'old-hash' }))\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tconst syncUpdateSpy = vi.spyOn(piece, 'syncMarkdownUpdate').mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.sync(db, ['u.md'], { dryRun: true })\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('updated')\n\t\t\t}\n\t\t}\n\t\texpect(syncUpdateSpy).not.toHaveBeenCalled()\n\t})\n\n\ttest('sync handles dryRun skip', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 's.md' })\n\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(makePieceItemSelectable({ id: '1' }))\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('same-hash')\n\t\tmocks.cache.getCache.mockResolvedValue(makeCache({ content_hash: 'same-hash' }))\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tconst stream = await piece.sync(db, ['s.md'], { dryRun: true })\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('skipped')\n\t\t\t}\n\t\t}\n\t\texpect(mocks.cache.updateCache).not.toHaveBeenCalled()\n\t})\n\n\ttest('sync handles force update even if hash same', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage)\n\t\tconst markdown = makeMarkdownSample({ filePath: 'u.md' })\n\n\t\tvi.spyOn(piece, 'get').mockResolvedValue(markdown)\n\t\tmocks.items.selectItem.mockResolvedValue(makePieceItemSelectable({ id: '1' }))\n\t\tmocks.pieceUtils.calculateHashFromFile.mockResolvedValue('same-hash')\n\t\tmocks.cache.getCache.mockResolvedValue(makeCache({ content_hash: 'same-hash' }))\n\t\tvi.spyOn(storage, 'createReadStream').mockReturnValue({} as ReadStream)\n\n\t\tconst syncUpdateSpy = vi.spyOn(piece, 'syncMarkdownUpdate').mockResolvedValue(undefined)\n\n\t\tconst stream = await piece.sync(db, ['u.md'], { force: true })\n\t\tfor await (const result of stream) {\n\t\t\tif (!result.error) {\n\t\t\t\texpect(result.action).toBe('updated')\n\t\t\t}\n\t\t}\n\t\texpect(syncUpdateSpy).toHaveBeenCalled()\n\t})\n\n\ttest('sync handles errors', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tmocks.cpus.mockReturnValue([{} as CpuInfo])\n\t\tvi.spyOn(piece, 'get').mockRejectedValue(new Error('oof'))\n\n\t\tconst stream = await piece.sync(db, ['e.md'])\n\t\tfor await (const result of stream) {\n\t\t\texpect(result.error).toBe(true)\n\t\t}\n\t})\n\n\ttest('toMarkdown restores frontmatter from DB JSON', () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tconst dbPiece = makePieceItemSelectable({\n\t\t\tfrontmatter_json: JSON.stringify({ title: 'db-title', keywords: ['a', 'b'] }),\n\t\t})\n\n\t\tconst result = piece.toMarkdown(dbPiece)\n\t\texpect(result.frontmatter.title).toBe('db-title')\n\t\texpect((result.frontmatter as Record<string, unknown>).keywords).toEqual(['a', 'b'])\n\t})\n\n\ttest('getField', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string' },\n\t\t\tsubtitle: { type: 'string', nullable: true },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 'old', subtitle: 'old' } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst field = piece.getField(markdown, 'subtitle')\n\t\texpect(field).toBe('old')\n\t})\n\n\ttest('setFields updates multiple fields', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string' },\n\t\t\tsubtitle: { type: 'string', nullable: true },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 'old', subtitle: 'old' } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.setFields(markdown, { title: 'new', subtitle: 'new' })\n\t\texpect(updated.frontmatter.title).toBe('new')\n\t\texpect((updated.frontmatter as Record<string, unknown>).subtitle).toBe('new')\n\t})\n\n\ttest('setField with nested path', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\tmeta: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { author: { type: 'string' } },\n\t\t\t},\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't' } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.setField(markdown, 'meta.author', 'Bob')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, Record<string, unknown>>\n\t\texpect(fm.meta.author).toBe('Bob')\n\t})\n\n\ttest('setField appends to nested array', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\tmeta: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { tags: { type: 'array', items: { type: 'string' } } },\n\t\t\t},\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 'title', meta: { tags: ['a'] } } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.setField(markdown, 'meta.tags', 'b')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, Record<string, string[]>>\n\t\texpect(fm.meta.tags).toEqual(['a', 'b'])\n\t})\n\n\ttest('setField initializes missing array field', async () => {\n\t\tconst PieceType = makePieceMock()\n\n\t\tconst schema = makeSchema({ tags: { type: 'array', items: { type: 'string' } } })\n\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't' } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.setField(markdown, 'tags', 'tag1')\n\n\t\tconst fm = updated.frontmatter as unknown as Record<string, string[]>\n\n\t\texpect(fm.tags).toEqual(['tag1'])\n\t})\n\n\ttest('setField handles an array of values', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttags: { type: 'array', items: { type: 'string' } },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', tags: ['a'] } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.setField(markdown, 'tags', ['b', 'c'])\n\t\tconst fm = updated.frontmatter as unknown as Record<string, string[]>\n\t\texpect(fm.tags).toEqual(['a', 'b', 'c'])\n\t})\n\n\ttest('setField attaches assets even in nested paths', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\tmeta: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { cover: { type: 'string', format: 'asset' } },\n\t\t\t},\n\t\t})\n\t\tconst storage = makeStorage()\n\t\tconst piece = new PieceType('table', storage, schema)\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tmocks.pieceUtils.makePieceValue.mockResolvedValue({\n\t\t\tstream: new PassThrough() as unknown as ReadStream,\n\t\t})\n\t\tmocks.pieceUtils.isAttachableStream.mockReturnValueOnce(true)\n\t\tmocks.pieceUtils.makePieceAttachment.mockResolvedValue('assets/cover.jpg')\n\n\t\tconst updated = await piece.setField(markdown, 'meta.cover', 'upload-me')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, Record<string, string>>\n\t\texpect(fm.meta.cover).toBe('assets/cover.jpg')\n\t\texpect(mocks.pieceUtils.makePieceAttachment).toHaveBeenCalled()\n\t})\n\n\ttest('setField handles set error', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tconst markdown = makeMarkdownSample()\n\t\tmocks.pieceUtils.makePieceValue.mockRejectedValue(new Error('bad'))\n\n\t\tconst result = await piece.setField(markdown, 'title', 'new')\n\t\texpect(result).toBe(markdown)\n\t})\n\n\ttest('setField throws on bad field', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst piece = new PieceType('table')\n\t\tconst markdown = makeMarkdownSample()\n\n\t\tconst setting = piece.setField(markdown, 'title2', 'new')\n\t\tawait expect(setting).rejects.toThrow()\n\t})\n\n\ttest('removeField unsets a nested value', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\tmeta: {\n\t\t\t\ttype: 'object',\n\t\t\t\tnullable: true,\n\t\t\t\tproperties: { author: { type: 'string', nullable: true } },\n\t\t\t},\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', meta: { author: 'Alice' } } })\n\n\t\tconst updated = await piece.removeField(markdown, 'meta.author')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, Record<string, unknown>>\n\t\texpect(fm.meta).toBeUndefined()\n\t})\n\ttest('removeField removes specific array index', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttags: { type: 'array', nullable: true, items: { type: 'string', nullable: true } },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', tags: ['a', 'b', 'c'] } })\n\n\t\tconst updated = await piece.removeField(markdown, 'tags.1')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, string[]>\n\t\texpect(fm.tags).toEqual(['a', 'c'])\n\t})\n\n\ttest('removeField removes by value from array', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttags: { type: 'array', nullable: true, items: { type: 'string', nullable: true } },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', tags: ['a', 'b'] } })\n\n\t\tmocks.pieceUtils.makePieceValue.mockImplementation(async (_, v) => v as string)\n\n\t\tconst updated = await piece.removeField(markdown, 'tags', 'a')\n\t\tconst fm = updated.frontmatter as unknown as Record<string, string[]>\n\t\texpect(fm.tags).toEqual(['b'])\n\t})\n\n\ttest('removeField returns markdown if array value missing', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttags: { type: 'array', nullable: true, items: { type: 'string', nullable: true } },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', tags: ['a'] } })\n\t\tmocks.pieceUtils.makePieceValue.mockResolvedValue('b')\n\n\t\tconst result = await piece.removeField(markdown, 'tags', 'b')\n\t\texpect(result).toStrictEqual(markdown)\n\t})\n\n\ttest('removeField handles scalars by value', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({ subtitle: { type: 'string', nullable: true } })\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', subtitle: 's' } })\n\t\tmocks.pieceUtils.makePieceValue.mockResolvedValue('s')\n\n\t\tconst updated = await piece.removeField(markdown, 'subtitle', 's')\n\t\texpect((updated.frontmatter as Record<string, unknown>).subtitle).toBeUndefined()\n\t})\n\n\ttest('removeField skips removal if scalar value mismatch', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({ subtitle: { type: 'string', nullable: true } })\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', subtitle: 's' } })\n\n\t\t// Setup markdown so current value is 's'\n\t\t// Our mock return value will be 'mismatch'\n\t\tmocks.pieceUtils.makePieceValue.mockResolvedValue('mismatch')\n\n\t\tconst result = await piece.removeField(markdown, 'subtitle', 'mismatch')\n\t\texpect(result).toStrictEqual(markdown)\n\t})\n\n\ttest('removeField throws on required field', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string', nullable: false },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't' } })\n\n\t\tawait expect(piece.removeField(markdown, 'title')).rejects.toThrow('is a required field')\n\t})\n\n\ttest('removeField throws on bad field', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ttitle: { type: 'string', nullable: false },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't' } })\n\n\t\tawait expect(piece.removeField(markdown, 'title2')).rejects.toThrow()\n\t})\n\n\ttest('removeFields updates multiple fields', async () => {\n\t\tconst PieceType = makePieceMock()\n\t\tconst schema = makeSchema({\n\t\t\ts1: { type: 'string', nullable: true },\n\t\t\ts2: { type: 'string', nullable: true },\n\t\t})\n\t\tconst piece = new PieceType('table', makeStorage(), schema)\n\t\tconst markdown = makeMarkdownSample({ frontmatter: { title: 't', s1: 'v', s2: 'v' } })\n\n\t\tconst updated = await piece.removeFields(markdown, ['s1', 's2'])\n\t\tconst fm = updated.frontmatter as Record<string, unknown>\n\t\texpect(fm.s1).toBeUndefined()\n\t\texpect(fm.s2).toBeUndefined()\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,325 +0,0 @@
1
- import { describe, expect, test, vi, afterEach, beforeEach } from 'vitest';
2
- import Pieces from './Pieces.js';
3
- import Piece from './Piece.js';
4
- import { addPiece, deletePiece, getPiece, getPieces, updatePiece } from './manager.js';
5
- import { jsonToPieceSchema } from './json.schema.js';
6
- import { makePieceMarkdown } from './utils/markdown.js';
7
- import { makePieceMock, makeRegisteredPiece, makeSchema, makeStorage } from './Piece.fixtures.js';
8
- import { setupDatabase, teardownDatabase } from '../../test/db.js';
9
- vi.mock('./Piece.js');
10
- vi.mock('./manager.js');
11
- vi.mock('./json.schema.js');
12
- vi.mock('./utils/markdown.js');
13
- const spies = {};
14
- const mocks = {
15
- getPiece: vi.mocked(getPiece),
16
- getPieces: vi.mocked(getPieces),
17
- addPiece: vi.mocked(addPiece),
18
- updatePiece: vi.mocked(updatePiece),
19
- deletePiece: vi.mocked(deletePiece),
20
- jsonToPieceSchema: vi.mocked(jsonToPieceSchema),
21
- };
22
- let db;
23
- beforeEach(async () => {
24
- db = await setupDatabase();
25
- });
26
- afterEach(async () => {
27
- await teardownDatabase(db);
28
- Object.values(mocks).forEach((mock) => {
29
- mock.mockReset();
30
- });
31
- Object.keys(spies).forEach((key) => {
32
- spies[key].mockRestore();
33
- delete spies[key];
34
- });
35
- });
36
- describe('pieces/Pieces.ts', () => {
37
- test('getPiece', async () => {
38
- const storage = makeStorage('root');
39
- const pieces = new Pieces(storage);
40
- const piece = await pieces.getPiece('books');
41
- expect(piece).toBeInstanceOf(Piece);
42
- });
43
- test('getPieceMarkdown', async () => {
44
- const storage = makeStorage('root');
45
- const pieces = new Pieces(storage);
46
- const type = 'books';
47
- const file = '/path/to/slug.books.md';
48
- const frontmatter = { title: 'Hello', date: '2020-01-01' };
49
- const content = 'This is the content';
50
- const pieceMarkdown = makePieceMarkdown(file, type, content, frontmatter);
51
- const pieceMock = makePieceMock();
52
- const piece = new pieceMock();
53
- spies.getPiece = vi.spyOn(pieces, 'getPiece').mockResolvedValueOnce(piece);
54
- spies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(pieceMarkdown);
55
- const getMarkdown = await pieces.getPieceMarkdown(file);
56
- expect(getMarkdown).toEqual(pieceMarkdown);
57
- });
58
- test('getPieceMarkdown throws if no type is found', async () => {
59
- const storage = makeStorage('root');
60
- const pieces = new Pieces(storage);
61
- const type = 'books';
62
- const file = '/path/to/slug.md';
63
- const frontmatter = { title: 'Hello', date: '2020-01-01' };
64
- const content = 'This is the content';
65
- const pieceMarkdown = makePieceMarkdown(file, type, content, frontmatter);
66
- const pieceMock = makePieceMock();
67
- const piece = new pieceMock();
68
- spies.getPiece = vi.spyOn(pieces, 'getPiece').mockResolvedValueOnce(piece);
69
- spies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(pieceMarkdown);
70
- const getMarkdownAwait = pieces.getPieceMarkdown(file);
71
- await expect(getMarkdownAwait).rejects.toThrow();
72
- });
73
- test('getPieceAsset', async () => {
74
- const storage = makeStorage('root');
75
- const pieces = new Pieces(storage);
76
- const file = '.assets/path/to/asset.jpg';
77
- const buffer = Buffer.from('filedata');
78
- spies.readFiel = vi.spyOn(storage, 'readFile').mockResolvedValueOnce(buffer);
79
- const getAsset = await pieces.getPieceAsset(file);
80
- expect(getAsset).toEqual(buffer);
81
- });
82
- test('getSchemas', async () => {
83
- const storage = makeStorage('root');
84
- const pieces = new Pieces(storage);
85
- const schemaPaths = ['path/to/books.json', 'path/to/authors.json'];
86
- spies.readdir = vi.spyOn(storage, 'getFilesIn').mockResolvedValueOnce(schemaPaths);
87
- const schemas = await pieces.getSchemas();
88
- expect(schemas).toEqual(schemaPaths);
89
- });
90
- test('getSchema', async () => {
91
- const storage = makeStorage('root');
92
- const pieces = new Pieces(storage);
93
- const type = 'books';
94
- const schema = makeSchema(type);
95
- mocks.jsonToPieceSchema.mockReturnValueOnce(schema);
96
- const getSchema = await pieces.getSchema(type);
97
- expect(getSchema).toEqual(schema);
98
- });
99
- test('parseFilename', () => {
100
- const storage = makeStorage('root');
101
- const pieces = new Pieces(storage);
102
- const type = 'books';
103
- const file = `/path/to/slug.${type}.md`;
104
- const result = pieces.parseFilename(file);
105
- expect(result.type).toEqual(type);
106
- });
107
- test('parseFilename returns null', () => {
108
- const storage = makeStorage('root');
109
- const pieces = new Pieces(storage);
110
- const file = `/path/to/slug.md`;
111
- const result = pieces.parseFilename(file);
112
- expect(result.type).toBeNull();
113
- });
114
- test('getTypes', async () => {
115
- const storage = makeStorage('root');
116
- const schemaNames = ['one', 'two'];
117
- const pieces = new Pieces(storage);
118
- const schemas = schemaNames.map((x) => `path/to/${x}.json`);
119
- spies.getSchemas = vi.spyOn(pieces, 'getSchemas').mockResolvedValueOnce(schemas);
120
- const types = await pieces.getTypes();
121
- expect(types).toEqual(schemaNames);
122
- });
123
- test('getFilesIn', async () => {
124
- const storage = makeStorage('root');
125
- const pieces = new Pieces(storage);
126
- const type = 'books';
127
- const onDisk = [
128
- '/path/to/hi.books.md',
129
- '/path/to/bye.books.md',
130
- '.assets/hi.jpg',
131
- '.hidden/books.md',
132
- '/path/dir/',
133
- ];
134
- spies.readdir = vi.spyOn(storage, 'getFilesIn').mockResolvedValueOnce(onDisk);
135
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([type]);
136
- const items = await pieces.getFilesIn('.');
137
- expect(items).toEqual({
138
- pieces: [onDisk[0], onDisk[1]],
139
- assets: [onDisk[2]],
140
- types: [type],
141
- directories: [onDisk[4]],
142
- });
143
- });
144
- test('syncGenerator', async () => {
145
- const storage = makeStorage('root');
146
- const pieces = new Pieces(storage);
147
- const dateAdded = new Date('2020-02-02');
148
- const dateModified = new Date('2021-02-02');
149
- const piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded.getTime() });
150
- mocks.getPiece
151
- .mockResolvedValueOnce(piece)
152
- .mockResolvedValueOnce(null)
153
- .mockResolvedValueOnce(piece);
154
- mocks.updatePiece.mockResolvedValueOnce();
155
- mocks.addPiece.mockResolvedValueOnce();
156
- spies.getTypes = vi
157
- .spyOn(pieces, 'getTypes')
158
- .mockResolvedValueOnce([piece.name, piece.name, piece.name]);
159
- spies.getSchema = vi
160
- .spyOn(pieces, 'getSchema')
161
- .mockResolvedValueOnce(piece.schema)
162
- .mockResolvedValueOnce(piece.schema)
163
- .mockResolvedValueOnce(piece.schema);
164
- spies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath');
165
- spies.stat = vi
166
- .spyOn(storage, 'stat')
167
- .mockResolvedValueOnce({ last_modified: dateModified })
168
- .mockResolvedValueOnce({ last_modified: dateModified })
169
- .mockResolvedValueOnce({ last_modified: dateAdded });
170
- const gen = await pieces.sync(db);
171
- const added = [];
172
- const updated = [];
173
- for await (const result of gen) {
174
- if (!result.error) {
175
- if (result.action === 'added') {
176
- added.push(result.name);
177
- }
178
- else if (result.action === 'updated') {
179
- updated.push(result.name);
180
- }
181
- }
182
- }
183
- expect(added).toHaveLength(1);
184
- expect(updated).toHaveLength(1);
185
- expect(mocks.addPiece).toHaveBeenCalledOnce();
186
- expect(mocks.updatePiece).toHaveBeenCalledOnce();
187
- });
188
- test('syncGenerator dryRun', async () => {
189
- const storage = makeStorage('root');
190
- const pieces = new Pieces(storage);
191
- const dateAdded = new Date('2020-02-02').getTime();
192
- const dateModified = new Date('2021-02-02');
193
- const piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded });
194
- mocks.getPiece.mockResolvedValueOnce(piece).mockResolvedValueOnce(null);
195
- mocks.updatePiece.mockResolvedValueOnce();
196
- mocks.addPiece.mockResolvedValueOnce();
197
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name, piece.name]);
198
- spies.getSchema = vi
199
- .spyOn(pieces, 'getSchema')
200
- .mockResolvedValueOnce(piece.schema)
201
- .mockResolvedValueOnce(piece.schema);
202
- spies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath');
203
- spies.stat = vi
204
- .spyOn(storage, 'stat')
205
- .mockResolvedValueOnce({ last_modified: dateModified })
206
- .mockResolvedValueOnce({ last_modified: dateModified });
207
- const gen = await pieces.sync(db, { dryRun: true });
208
- const added = [];
209
- const updated = [];
210
- for await (const result of gen) {
211
- if (!result.error) {
212
- if (result.action === 'added') {
213
- added.push(result.name);
214
- }
215
- else if (result.action === 'updated') {
216
- updated.push(result.name);
217
- }
218
- }
219
- }
220
- expect(added).toHaveLength(1);
221
- expect(updated).toHaveLength(1);
222
- expect(mocks.addPiece).not.toHaveBeenCalledOnce();
223
- expect(mocks.updatePiece).not.toHaveBeenCalledOnce();
224
- });
225
- test('syncGenerator error add', async () => {
226
- const storage = makeStorage('root');
227
- const pieces = new Pieces(storage);
228
- const dateAdded = new Date('2020-02-02').getTime();
229
- const dateModified = new Date('2021-02-02');
230
- const piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded });
231
- mocks.getPiece.mockResolvedValueOnce(null);
232
- mocks.addPiece.mockRejectedValueOnce(new Error('Error adding piece'));
233
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name]);
234
- spies.getSchema = vi.spyOn(pieces, 'getSchema').mockResolvedValueOnce(piece.schema);
235
- spies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath');
236
- spies.stat = vi
237
- .spyOn(storage, 'stat')
238
- .mockResolvedValueOnce({ last_modified: dateModified });
239
- const gen = await pieces.sync(db);
240
- const errors = [];
241
- for await (const result of gen) {
242
- if (result.error) {
243
- errors.push(result.name);
244
- }
245
- }
246
- expect(errors).toHaveLength(1);
247
- expect(mocks.addPiece).toHaveBeenCalledOnce();
248
- });
249
- test('syncGenerator error schema', async () => {
250
- const storage = makeStorage('root');
251
- const pieces = new Pieces(storage);
252
- const dateAdded = new Date('2020-02-02').getTime();
253
- const piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded });
254
- mocks.getPiece.mockResolvedValueOnce(null);
255
- mocks.addPiece.mockRejectedValueOnce(new Error('Error adding piece'));
256
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name]);
257
- spies.getSchema = vi.spyOn(pieces, 'getSchema').mockResolvedValueOnce(piece.schema);
258
- spies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath');
259
- spies.stat = vi.spyOn(storage, 'stat').mockRejectedValueOnce(new Error('File not found'));
260
- const gen = await pieces.sync(db);
261
- const errors = [];
262
- for await (const result of gen) {
263
- if (result.error) {
264
- errors.push(result.name);
265
- }
266
- }
267
- expect(errors).toHaveLength(1);
268
- expect(mocks.addPiece).not.toHaveBeenCalledOnce();
269
- });
270
- test('pruneGenerator', async () => {
271
- const storage = makeStorage('root');
272
- const pieces = new Pieces(storage);
273
- const type = 'books';
274
- const piece = makeRegisteredPiece({ name: type });
275
- mocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }]);
276
- mocks.deletePiece.mockResolvedValueOnce();
277
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([]);
278
- const gen = await pieces.prune(db);
279
- const processed = [];
280
- for await (const result of gen) {
281
- if (!result.error && result.action === 'pruned') {
282
- processed.push(result.name);
283
- }
284
- }
285
- expect(processed).toHaveLength(1);
286
- expect(mocks.deletePiece).toHaveBeenCalledOnce();
287
- });
288
- test('pruneGenerator dryRun', async () => {
289
- const storage = makeStorage('root');
290
- const pieces = new Pieces(storage);
291
- const type = 'books';
292
- const piece = makeRegisteredPiece({ name: type });
293
- mocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }]);
294
- mocks.deletePiece.mockResolvedValueOnce();
295
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([]);
296
- const gen = await pieces.prune(db, { dryRun: true });
297
- const processed = [];
298
- for await (const result of gen) {
299
- if (!result.error && result.action === 'pruned') {
300
- processed.push(result.name);
301
- }
302
- }
303
- expect(processed).toHaveLength(1);
304
- expect(mocks.deletePiece).not.toHaveBeenCalledOnce();
305
- });
306
- test('pruneGenerator error', async () => {
307
- const storage = makeStorage('root');
308
- const pieces = new Pieces(storage);
309
- const type = 'books';
310
- const piece = makeRegisteredPiece({ name: type });
311
- mocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }]);
312
- mocks.deletePiece.mockRejectedValueOnce(new Error('Error deleting piece'));
313
- spies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([]);
314
- const gen = await pieces.prune(db);
315
- const processed = [];
316
- for await (const result of gen) {
317
- if (result.error) {
318
- processed.push(result.name);
319
- }
320
- }
321
- expect(processed).toHaveLength(1);
322
- expect(mocks.deletePiece).toHaveBeenCalledOnce();
323
- });
324
- });
325
- //# sourceMappingURL=Pieces.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Pieces.test.js","sourceRoot":"","sources":["../../../src/pieces/Pieces.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, vi, afterEach, beforeEach, MockInstance } from 'vitest'\nimport Pieces from './Pieces.js'\nimport Piece from './Piece.js'\nimport { addPiece, deletePiece, getPiece, getPieces, updatePiece } from './manager.js'\nimport { jsonToPieceSchema } from './json.schema.js'\nimport { makePieceMarkdown } from './utils/markdown.js'\nimport { type PieceFrontmatter } from './utils/frontmatter.js'\nimport { makePieceMock, makeRegisteredPiece, makeSchema, makeStorage } from './Piece.fixtures.js'\nimport { setupDatabase, teardownDatabase } from '../../test/db.js'\nimport { type LuzzleDatabase } from '../database/tables/index.js'\nimport { StorageStat } from '../index.js'\n\nvi.mock('./Piece.js')\nvi.mock('./manager.js')\nvi.mock('./json.schema.js')\nvi.mock('./utils/markdown.js')\n\nconst spies: { [key: string]: MockInstance } = {}\nconst mocks = {\n\tgetPiece: vi.mocked(getPiece),\n\tgetPieces: vi.mocked(getPieces),\n\taddPiece: vi.mocked(addPiece),\n\tupdatePiece: vi.mocked(updatePiece),\n\tdeletePiece: vi.mocked(deletePiece),\n\tjsonToPieceSchema: vi.mocked(jsonToPieceSchema),\n}\n\nlet db: LuzzleDatabase\n\nbeforeEach(async () => {\n\tdb = await setupDatabase()\n})\n\nafterEach(async () => {\n\tawait teardownDatabase(db)\n\n\tObject.values(mocks).forEach((mock) => {\n\t\tmock.mockReset()\n\t})\n\n\tObject.keys(spies).forEach((key) => {\n\t\tspies[key].mockRestore()\n\t\tdelete spies[key]\n\t})\n})\n\ndescribe('pieces/Pieces.ts', () => {\n\ttest('getPiece', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst piece = await pieces.getPiece('books')\n\n\t\texpect(piece).toBeInstanceOf(Piece)\n\t})\n\n\ttest('getPieceMarkdown', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst file = '/path/to/slug.books.md'\n\t\tconst frontmatter: PieceFrontmatter = { title: 'Hello', date: '2020-01-01' }\n\t\tconst content = 'This is the content'\n\t\tconst pieceMarkdown = makePieceMarkdown(file, type, content, frontmatter)\n\t\tconst pieceMock = makePieceMock()\n\t\tconst piece = new pieceMock()\n\n\t\tspies.getPiece = vi.spyOn(pieces, 'getPiece').mockResolvedValueOnce(piece)\n\t\tspies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(pieceMarkdown)\n\n\t\tconst getMarkdown = await pieces.getPieceMarkdown(file)\n\n\t\texpect(getMarkdown).toEqual(pieceMarkdown)\n\t})\n\n\ttest('getPieceMarkdown throws if no type is found', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst file = '/path/to/slug.md'\n\t\tconst frontmatter: PieceFrontmatter = { title: 'Hello', date: '2020-01-01' }\n\t\tconst content = 'This is the content'\n\t\tconst pieceMarkdown = makePieceMarkdown(file, type, content, frontmatter)\n\t\tconst pieceMock = makePieceMock()\n\t\tconst piece = new pieceMock()\n\n\t\tspies.getPiece = vi.spyOn(pieces, 'getPiece').mockResolvedValueOnce(piece)\n\t\tspies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(pieceMarkdown)\n\n\t\tconst getMarkdownAwait = pieces.getPieceMarkdown(file)\n\n\t\tawait expect(getMarkdownAwait).rejects.toThrow()\n\t})\n\n\ttest('getPieceAsset', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst file = '.assets/path/to/asset.jpg'\n\t\tconst buffer = Buffer.from('filedata')\n\n\t\tspies.readFiel = vi.spyOn(storage, 'readFile').mockResolvedValueOnce(buffer)\n\n\t\tconst getAsset = await pieces.getPieceAsset(file)\n\n\t\texpect(getAsset).toEqual(buffer)\n\t})\n\n\ttest('getSchemas', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst schemaPaths = ['path/to/books.json', 'path/to/authors.json']\n\n\t\tspies.readdir = vi.spyOn(storage, 'getFilesIn').mockResolvedValueOnce(schemaPaths)\n\n\t\tconst schemas = await pieces.getSchemas()\n\n\t\texpect(schemas).toEqual(schemaPaths)\n\t})\n\n\ttest('getSchema', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst schema = makeSchema(type)\n\n\t\tmocks.jsonToPieceSchema.mockReturnValueOnce(schema)\n\n\t\tconst getSchema = await pieces.getSchema(type)\n\n\t\texpect(getSchema).toEqual(schema)\n\t})\n\n\ttest('parseFilename', () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst file = `/path/to/slug.${type}.md`\n\n\t\tconst result = pieces.parseFilename(file)\n\n\t\texpect(result.type).toEqual(type)\n\t})\n\n\ttest('parseFilename returns null', () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst file = `/path/to/slug.md`\n\n\t\tconst result = pieces.parseFilename(file)\n\n\t\texpect(result.type).toBeNull()\n\t})\n\n\ttest('getTypes', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst schemaNames = ['one', 'two']\n\t\tconst pieces = new Pieces(storage)\n\t\tconst schemas = schemaNames.map((x) => `path/to/${x}.json`)\n\n\t\tspies.getSchemas = vi.spyOn(pieces, 'getSchemas').mockResolvedValueOnce(schemas)\n\n\t\tconst types = await pieces.getTypes()\n\n\t\texpect(types).toEqual(schemaNames)\n\t})\n\n\ttest('getFilesIn', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst onDisk = [\n\t\t\t'/path/to/hi.books.md',\n\t\t\t'/path/to/bye.books.md',\n\t\t\t'.assets/hi.jpg',\n\t\t\t'.hidden/books.md',\n\t\t\t'/path/dir/',\n\t\t]\n\n\t\tspies.readdir = vi.spyOn(storage, 'getFilesIn').mockResolvedValueOnce(onDisk)\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([type])\n\n\t\tconst items = await pieces.getFilesIn('.')\n\n\t\texpect(items).toEqual({\n\t\t\tpieces: [onDisk[0], onDisk[1]],\n\t\t\tassets: [onDisk[2]],\n\t\t\ttypes: [type],\n\t\t\tdirectories: [onDisk[4]],\n\t\t})\n\t})\n\n\ttest('syncGenerator', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst dateAdded = new Date('2020-02-02')\n\t\tconst dateModified = new Date('2021-02-02')\n\t\tconst piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded.getTime() })\n\n\t\tmocks.getPiece\n\t\t\t.mockResolvedValueOnce(piece)\n\t\t\t.mockResolvedValueOnce(null)\n\t\t\t.mockResolvedValueOnce(piece)\n\t\tmocks.updatePiece.mockResolvedValueOnce()\n\t\tmocks.addPiece.mockResolvedValueOnce()\n\n\t\tspies.getTypes = vi\n\t\t\t.spyOn(pieces, 'getTypes')\n\t\t\t.mockResolvedValueOnce([piece.name, piece.name, piece.name])\n\t\tspies.getSchema = vi\n\t\t\t.spyOn(pieces, 'getSchema')\n\t\t\t.mockResolvedValueOnce(piece.schema)\n\t\t\t.mockResolvedValueOnce(piece.schema)\n\t\t\t.mockResolvedValueOnce(piece.schema)\n\t\tspies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath')\n\t\tspies.stat = vi\n\t\t\t.spyOn(storage, 'stat')\n\t\t\t.mockResolvedValueOnce({ last_modified: dateModified } as StorageStat)\n\t\t\t.mockResolvedValueOnce({ last_modified: dateModified } as StorageStat)\n\t\t\t.mockResolvedValueOnce({ last_modified: dateAdded } as StorageStat)\n\n\t\tconst gen = await pieces.sync(db)\n\t\tconst added: string[] = []\n\t\tconst updated: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (!result.error) {\n\t\t\t\tif (result.action === 'added') {\n\t\t\t\t\tadded.push(result.name)\n\t\t\t\t} else if (result.action === 'updated') {\n\t\t\t\t\tupdated.push(result.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\texpect(added).toHaveLength(1)\n\t\texpect(updated).toHaveLength(1)\n\t\texpect(mocks.addPiece).toHaveBeenCalledOnce()\n\t\texpect(mocks.updatePiece).toHaveBeenCalledOnce()\n\t})\n\n\ttest('syncGenerator dryRun', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst dateAdded = new Date('2020-02-02').getTime()\n\t\tconst dateModified = new Date('2021-02-02')\n\t\tconst piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded })\n\n\t\tmocks.getPiece.mockResolvedValueOnce(piece).mockResolvedValueOnce(null)\n\t\tmocks.updatePiece.mockResolvedValueOnce()\n\t\tmocks.addPiece.mockResolvedValueOnce()\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name, piece.name])\n\t\tspies.getSchema = vi\n\t\t\t.spyOn(pieces, 'getSchema')\n\t\t\t.mockResolvedValueOnce(piece.schema)\n\t\t\t.mockResolvedValueOnce(piece.schema)\n\t\tspies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath')\n\t\tspies.stat = vi\n\t\t\t.spyOn(storage, 'stat')\n\t\t\t.mockResolvedValueOnce({ last_modified: dateModified } as StorageStat)\n\t\t\t.mockResolvedValueOnce({ last_modified: dateModified } as StorageStat)\n\n\t\tconst gen = await pieces.sync(db, { dryRun: true })\n\t\tconst added: string[] = []\n\t\tconst updated: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (!result.error) {\n\t\t\t\tif (result.action === 'added') {\n\t\t\t\t\tadded.push(result.name)\n\t\t\t\t} else if (result.action === 'updated') {\n\t\t\t\t\tupdated.push(result.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\texpect(added).toHaveLength(1)\n\t\texpect(updated).toHaveLength(1)\n\t\texpect(mocks.addPiece).not.toHaveBeenCalledOnce()\n\t\texpect(mocks.updatePiece).not.toHaveBeenCalledOnce()\n\t})\n\n\ttest('syncGenerator error add', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst dateAdded = new Date('2020-02-02').getTime()\n\t\tconst dateModified = new Date('2021-02-02')\n\t\tconst piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded })\n\n\t\tmocks.getPiece.mockResolvedValueOnce(null)\n\t\tmocks.addPiece.mockRejectedValueOnce(new Error('Error adding piece'))\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name])\n\t\tspies.getSchema = vi.spyOn(pieces, 'getSchema').mockResolvedValueOnce(piece.schema)\n\t\tspies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath')\n\t\tspies.stat = vi\n\t\t\t.spyOn(storage, 'stat')\n\t\t\t.mockResolvedValueOnce({ last_modified: dateModified } as StorageStat)\n\n\t\tconst gen = await pieces.sync(db)\n\t\tconst errors: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (result.error) {\n\t\t\t\terrors.push(result.name)\n\t\t\t}\n\t\t}\n\n\t\texpect(errors).toHaveLength(1)\n\t\texpect(mocks.addPiece).toHaveBeenCalledOnce()\n\t})\n\n\ttest('syncGenerator error schema', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst dateAdded = new Date('2020-02-02').getTime()\n\t\tconst piece = makeRegisteredPiece({ name: 'books', date_added: dateAdded })\n\n\t\tmocks.getPiece.mockResolvedValueOnce(null)\n\t\tmocks.addPiece.mockRejectedValueOnce(new Error('Error adding piece'))\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([piece.name])\n\t\tspies.getSchema = vi.spyOn(pieces, 'getSchema').mockResolvedValueOnce(piece.schema)\n\t\tspies.getSchemaPath = vi.spyOn(pieces, 'getSchemaPath').mockReturnValue('schemaPath')\n\t\tspies.stat = vi.spyOn(storage, 'stat').mockRejectedValueOnce(new Error('File not found'))\n\n\t\tconst gen = await pieces.sync(db)\n\t\tconst errors: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (result.error) {\n\t\t\t\terrors.push(result.name)\n\t\t\t}\n\t\t}\n\n\t\texpect(errors).toHaveLength(1)\n\t\texpect(mocks.addPiece).not.toHaveBeenCalledOnce()\n\t})\n\n\ttest('pruneGenerator', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst piece = makeRegisteredPiece({ name: type })\n\n\t\tmocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }])\n\t\tmocks.deletePiece.mockResolvedValueOnce()\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([])\n\n\t\tconst gen = await pieces.prune(db)\n\t\tconst processed: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (!result.error && result.action === 'pruned') {\n\t\t\t\tprocessed.push(result.name)\n\t\t\t}\n\t\t}\n\n\t\texpect(processed).toHaveLength(1)\n\t\texpect(mocks.deletePiece).toHaveBeenCalledOnce()\n\t})\n\n\ttest('pruneGenerator dryRun', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst piece = makeRegisteredPiece({ name: type })\n\n\t\tmocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }])\n\t\tmocks.deletePiece.mockResolvedValueOnce()\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([])\n\n\t\tconst gen = await pieces.prune(db, { dryRun: true })\n\t\tconst processed: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (!result.error && result.action === 'pruned') {\n\t\t\t\tprocessed.push(result.name)\n\t\t\t}\n\t\t}\n\n\t\texpect(processed).toHaveLength(1)\n\t\texpect(mocks.deletePiece).not.toHaveBeenCalledOnce()\n\t})\n\n\ttest('pruneGenerator error', async () => {\n\t\tconst storage = makeStorage('root')\n\t\tconst pieces = new Pieces(storage)\n\t\tconst type = 'books'\n\t\tconst piece = makeRegisteredPiece({ name: type })\n\n\t\tmocks.getPieces.mockResolvedValueOnce([{ ...piece, schema: 'schema' }])\n\t\tmocks.deletePiece.mockRejectedValueOnce(new Error('Error deleting piece'))\n\n\t\tspies.getTypes = vi.spyOn(pieces, 'getTypes').mockResolvedValueOnce([])\n\n\t\tconst gen = await pieces.prune(db)\n\t\tconst processed: string[] = []\n\n\t\tfor await (const result of gen) {\n\t\t\tif (result.error) {\n\t\t\t\tprocessed.push(result.name)\n\t\t\t}\n\t\t}\n\n\t\texpect(processed).toHaveLength(1)\n\t\texpect(mocks.deletePiece).toHaveBeenCalledOnce()\n\t})\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,72 +0,0 @@
1
- import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
- import * as cache from './cache.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
- describe('pieces/cache.ts', () => {
12
- test('getCache returns cached entry by file_path', async () => {
13
- await cache.addCache(db, 'book.md', 'hash1');
14
- const result = await cache.getCache(db, 'book.md');
15
- expect(result).toMatchObject({
16
- file_path: 'book.md',
17
- content_hash: 'hash1',
18
- });
19
- });
20
- test('getCache returns null when not found', async () => {
21
- const result = await cache.getCache(db, 'missing.md');
22
- expect(result).toBeNull();
23
- });
24
- test('getCacheAll returns all entries', async () => {
25
- await cache.addCache(db, 'a.md', 'hash_a');
26
- await cache.addCache(db, 'b.md', 'hash_b');
27
- const result = await cache.getCacheAll(db);
28
- expect(result).toHaveLength(2);
29
- });
30
- test('addCache inserts and upserts on conflict', async () => {
31
- await cache.addCache(db, 'book.md', 'hash1');
32
- await cache.addCache(db, 'book.md', 'hash2');
33
- const result = await cache.getCache(db, 'book.md');
34
- expect(result).toMatchObject({
35
- file_path: 'book.md',
36
- content_hash: 'hash2',
37
- });
38
- const all = await cache.getCacheAll(db);
39
- expect(all).toHaveLength(1);
40
- });
41
- test('updateCache updates existing entry', async () => {
42
- await cache.addCache(db, 'book.md', 'hash1');
43
- await cache.updateCache(db, 'book.md', 'hash2');
44
- const result = await cache.getCache(db, 'book.md');
45
- expect(result).toMatchObject({
46
- file_path: 'book.md',
47
- content_hash: 'hash2',
48
- });
49
- });
50
- test('updateCache inserts when entry does not exist', async () => {
51
- await cache.updateCache(db, 'new.md', 'hash_new');
52
- const result = await cache.getCache(db, 'new.md');
53
- expect(result).toMatchObject({
54
- file_path: 'new.md',
55
- content_hash: 'hash_new',
56
- });
57
- });
58
- test('removeCache deletes by file_path', async () => {
59
- await cache.addCache(db, 'book.md', 'hash1');
60
- await cache.removeCache(db, 'book.md');
61
- const result = await cache.getCache(db, 'book.md');
62
- expect(result).toBeNull();
63
- });
64
- test('clearCache deletes all entries', async () => {
65
- await cache.addCache(db, 'a.md', 'hash_a');
66
- await cache.addCache(db, 'b.md', 'hash_b');
67
- await cache.clearCache(db);
68
- const all = await cache.getCacheAll(db);
69
- expect(all).toHaveLength(0);
70
- });
71
- });
72
- //# sourceMappingURL=cache.test.js.map