@luzzle/core 0.0.33 → 0.0.35

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 (224) hide show
  1. package/dist/src/database/client.d.ts +4 -0
  2. package/dist/src/database/client.js +12 -0
  3. package/dist/src/database/client.js.map +1 -0
  4. package/dist/src/database/client.test.d.ts +1 -0
  5. package/dist/src/database/client.test.js +34 -0
  6. package/dist/src/database/client.test.js.map +1 -0
  7. package/dist/src/database/database.mock.d.ts +22 -0
  8. package/dist/src/database/database.mock.js +42 -0
  9. package/dist/src/database/database.mock.js.map +1 -0
  10. package/dist/src/database/migrations/2023-05-26T15:04:19.094Z.d.ts +3 -0
  11. package/dist/src/database/migrations/2023-05-26T15:04:19.094Z.js +49 -0
  12. package/dist/src/database/migrations/2023-05-26T15:04:19.094Z.js.map +1 -0
  13. package/dist/src/database/migrations/2023-10-30T23:24:40Z.d.ts +3 -0
  14. package/dist/src/database/migrations/2023-10-30T23:24:40Z.js +35 -0
  15. package/dist/src/database/migrations/2023-10-30T23:24:40Z.js.map +1 -0
  16. package/dist/src/database/migrations/2023-11-22T14:55:18Z.d.ts +3 -0
  17. package/dist/src/database/migrations/2023-11-22T14:55:18Z.js +16 -0
  18. package/dist/src/database/migrations/2023-11-22T14:55:18Z.js.map +1 -0
  19. package/dist/src/database/migrations/2023-11-27T04:32:07Z.d.ts +3 -0
  20. package/dist/src/database/migrations/2023-11-27T04:32:07Z.js +30 -0
  21. package/dist/src/database/migrations/2023-11-27T04:32:07Z.js.map +1 -0
  22. package/dist/src/database/migrations/2024-01-01T23:30:29Z.d.ts +3 -0
  23. package/dist/src/database/migrations/2024-01-01T23:30:29Z.js +11 -0
  24. package/dist/src/database/migrations/2024-01-01T23:30:29Z.js.map +1 -0
  25. package/dist/src/database/migrations/2024-01-06T15:52:43Z.d.ts +3 -0
  26. package/dist/src/database/migrations/2024-01-06T15:52:43Z.js +16 -0
  27. package/dist/src/database/migrations/2024-01-06T15:52:43Z.js.map +1 -0
  28. package/dist/src/database/migrations/2024-02-09T16:33:10Z.d.ts +3 -0
  29. package/dist/src/database/migrations/2024-02-09T16:33:10Z.js +37 -0
  30. package/dist/src/database/migrations/2024-02-09T16:33:10Z.js.map +1 -0
  31. package/dist/src/database/migrations/2024-02-13T05:56:43Z.d.ts +3 -0
  32. package/dist/src/database/migrations/2024-02-13T05:56:43Z.js +116 -0
  33. package/dist/src/database/migrations/2024-02-13T05:56:43Z.js.map +1 -0
  34. package/dist/src/database/migrations/2024-02-24T03:05:47Z-add-texts-table.d.ts +3 -0
  35. package/dist/src/database/migrations/2024-02-24T03:05:47Z-add-texts-table.js +42 -0
  36. package/dist/src/database/migrations/2024-02-24T03:05:47Z-add-texts-table.js.map +1 -0
  37. package/dist/src/database/migrations/2024-02-26T05:37:37Z-add-cache-table.d.ts +3 -0
  38. package/dist/src/database/migrations/2024-02-26T05:37:37Z-add-cache-table.js +20 -0
  39. package/dist/src/database/migrations/2024-02-26T05:37:37Z-add-cache-table.js.map +1 -0
  40. package/dist/src/database/migrations/2024-03-01T01:01:47Z-fix-trigger-bugs.d.ts +3 -0
  41. package/dist/src/database/migrations/2024-03-01T01:01:47Z-fix-trigger-bugs.js +43 -0
  42. package/dist/src/database/migrations/2024-03-01T01:01:47Z-fix-trigger-bugs.js.map +1 -0
  43. package/dist/src/database/migrations/2024-06-15T17:17:51Z-add-games-table.d.ts +3 -0
  44. package/dist/src/database/migrations/2024-06-15T17:17:51Z-add-games-table.js +54 -0
  45. package/dist/src/database/migrations/2024-06-15T17:17:51Z-add-games-table.js.map +1 -0
  46. package/dist/src/database/migrations/2024-06-24T20:16:48Z-remove-book-open-library-fields.d.ts +3 -0
  47. package/dist/src/database/migrations/2024-06-24T20:16:48Z-remove-book-open-library-fields.js +23 -0
  48. package/dist/src/database/migrations/2024-06-24T20:16:48Z-remove-book-open-library-fields.js.map +1 -0
  49. package/dist/src/database/migrations/2024-06-29T16:31:33Z-add-piece-manager-table.d.ts +3 -0
  50. package/dist/src/database/migrations/2024-06-29T16:31:33Z-add-piece-manager-table.js +17 -0
  51. package/dist/src/database/migrations/2024-06-29T16:31:33Z-add-piece-manager-table.js.map +1 -0
  52. package/dist/src/database/migrations/2024-07-14T06:59:07Z-remove-pieces.d.ts +3 -0
  53. package/dist/src/database/migrations/2024-07-14T06:59:07Z-remove-pieces.js +15 -0
  54. package/dist/src/database/migrations/2024-07-14T06:59:07Z-remove-pieces.js.map +1 -0
  55. package/dist/src/database/migrations/2024-11-06T15:27:05Z-remove-tags.d.ts +3 -0
  56. package/dist/src/database/migrations/2024-11-06T15:27:05Z-remove-tags.js +26 -0
  57. package/dist/src/database/migrations/2024-11-06T15:27:05Z-remove-tags.js.map +1 -0
  58. package/dist/src/database/migrations/2024-11-08T05:59:37Z-remove-pieces-items-unique-tables.d.ts +3 -0
  59. package/dist/src/database/migrations/2024-11-08T05:59:37Z-remove-pieces-items-unique-tables.js +24 -0
  60. package/dist/src/database/migrations/2024-11-08T05:59:37Z-remove-pieces-items-unique-tables.js.map +1 -0
  61. package/dist/src/database/migrations/2024-11-13T14:51:17Z-track-file-paths-on-piece.d.ts +3 -0
  62. package/dist/src/database/migrations/2024-11-13T14:51:17Z-track-file-paths-on-piece.js +54 -0
  63. package/dist/src/database/migrations/2024-11-13T14:51:17Z-track-file-paths-on-piece.js.map +1 -0
  64. package/dist/src/database/migrations/2024-12-15T06:35:24Z-track-assets-on-piece.d.ts +3 -0
  65. package/dist/src/database/migrations/2024-12-15T06:35:24Z-track-assets-on-piece.js +10 -0
  66. package/dist/src/database/migrations/2024-12-15T06:35:24Z-track-assets-on-piece.js.map +1 -0
  67. package/dist/src/database/migrations.d.ts +3 -0
  68. package/dist/src/database/migrations.js +16 -0
  69. package/dist/src/database/migrations.js.map +1 -0
  70. package/dist/src/database/migrations.test.d.ts +1 -0
  71. package/dist/src/database/migrations.test.js +37 -0
  72. package/dist/src/database/migrations.test.js.map +1 -0
  73. package/dist/src/database/tables/index.d.ts +21 -0
  74. package/dist/src/database/tables/index.js +7 -0
  75. package/dist/src/database/tables/index.js.map +1 -0
  76. package/dist/src/database/tables/pieces_cache.schema.d.ts +13 -0
  77. package/dist/src/database/tables/pieces_cache.schema.js +2 -0
  78. package/dist/src/database/tables/pieces_cache.schema.js.map +1 -0
  79. package/dist/src/database/tables/pieces_items.schema.d.ts +16 -0
  80. package/dist/src/database/tables/pieces_items.schema.js +2 -0
  81. package/dist/src/database/tables/pieces_items.schema.js.map +1 -0
  82. package/dist/src/database/tables/pieces_manager.schema.d.ts +13 -0
  83. package/dist/src/database/tables/pieces_manager.schema.js +2 -0
  84. package/dist/src/database/tables/pieces_manager.schema.js.map +1 -0
  85. package/dist/src/database/utils.d.ts +8 -0
  86. package/dist/src/database/utils.js +2 -0
  87. package/dist/src/database/utils.js.map +1 -0
  88. package/dist/src/database/utils.test.d.ts +1 -0
  89. package/dist/src/database/utils.test.js +9 -0
  90. package/dist/src/database/utils.test.js.map +1 -0
  91. package/dist/src/index.d.ts +11 -0
  92. package/dist/src/index.js +12 -0
  93. package/dist/src/index.js.map +1 -0
  94. package/dist/src/index.test.d.ts +1 -0
  95. package/dist/src/index.test.js +9 -0
  96. package/dist/src/index.test.js.map +1 -0
  97. package/dist/src/lib/ajv.d.ts +6 -0
  98. package/dist/src/lib/ajv.js +25 -0
  99. package/dist/src/lib/ajv.js.map +1 -0
  100. package/dist/src/lib/ajv.test.d.ts +1 -0
  101. package/dist/src/lib/ajv.test.js +43 -0
  102. package/dist/src/lib/ajv.test.js.map +1 -0
  103. package/dist/src/lib/frontmatter.d.ts +4 -0
  104. package/dist/src/lib/frontmatter.js +8 -0
  105. package/dist/src/lib/frontmatter.js.map +1 -0
  106. package/dist/src/lib/frontmatter.test.d.ts +1 -0
  107. package/dist/src/lib/frontmatter.test.js +37 -0
  108. package/dist/src/lib/frontmatter.test.js.map +1 -0
  109. package/dist/src/lib/markdown.d.ts +7 -0
  110. package/dist/src/lib/markdown.js +21 -0
  111. package/dist/src/lib/markdown.js.map +1 -0
  112. package/dist/src/lib/markdown.test.d.ts +1 -0
  113. package/dist/src/lib/markdown.test.js +34 -0
  114. package/dist/src/lib/markdown.test.js.map +1 -0
  115. package/dist/src/llm/google.d.ts +6 -0
  116. package/dist/src/llm/google.js +91 -0
  117. package/dist/src/llm/google.js.map +1 -0
  118. package/dist/src/llm/google.test.d.ts +1 -0
  119. package/dist/src/llm/google.test.js +253 -0
  120. package/dist/src/llm/google.test.js.map +1 -0
  121. package/dist/src/pieces/Piece.d.ts +66 -0
  122. package/dist/src/pieces/Piece.fixtures.d.ts +43 -0
  123. package/dist/src/pieces/Piece.fixtures.js +83 -0
  124. package/dist/src/pieces/Piece.fixtures.js.map +1 -0
  125. package/dist/src/pieces/Piece.js +256 -0
  126. package/dist/src/pieces/Piece.js.map +1 -0
  127. package/dist/src/pieces/Piece.test.d.ts +1 -0
  128. package/dist/src/pieces/Piece.test.js +839 -0
  129. package/dist/src/pieces/Piece.test.js.map +1 -0
  130. package/dist/src/pieces/Pieces.d.ts +55 -0
  131. package/dist/src/pieces/Pieces.js +144 -0
  132. package/dist/src/pieces/Pieces.js.map +1 -0
  133. package/dist/src/pieces/Pieces.test.d.ts +1 -0
  134. package/dist/src/pieces/Pieces.test.js +327 -0
  135. package/dist/src/pieces/Pieces.test.js.map +1 -0
  136. package/dist/src/pieces/assets.d.ts +5 -0
  137. package/dist/src/pieces/assets.js +6 -0
  138. package/dist/src/pieces/assets.js.map +1 -0
  139. package/dist/src/pieces/cache.d.ts +20 -0
  140. package/dist/src/pieces/cache.fixtures.d.ts +3 -0
  141. package/dist/src/pieces/cache.fixtures.js +12 -0
  142. package/dist/src/pieces/cache.fixtures.js.map +1 -0
  143. package/dist/src/pieces/cache.js +49 -0
  144. package/dist/src/pieces/cache.js.map +1 -0
  145. package/dist/src/pieces/cache.test.d.ts +1 -0
  146. package/dist/src/pieces/cache.test.js +98 -0
  147. package/dist/src/pieces/cache.test.js.map +1 -0
  148. package/dist/src/pieces/index.d.ts +8 -0
  149. package/dist/src/pieces/index.js +9 -0
  150. package/dist/src/pieces/index.js.map +1 -0
  151. package/dist/src/pieces/item.d.ts +9 -0
  152. package/dist/src/pieces/item.js +79 -0
  153. package/dist/src/pieces/item.js.map +1 -0
  154. package/dist/src/pieces/item.test.d.ts +1 -0
  155. package/dist/src/pieces/item.test.js +215 -0
  156. package/dist/src/pieces/item.test.js.map +1 -0
  157. package/dist/src/pieces/items.d.ts +39 -0
  158. package/dist/src/pieces/items.js +45 -0
  159. package/dist/src/pieces/items.js.map +1 -0
  160. package/dist/src/pieces/items.test.d.ts +1 -0
  161. package/dist/src/pieces/items.test.js +100 -0
  162. package/dist/src/pieces/items.test.js.map +1 -0
  163. package/dist/src/pieces/json.schema.d.ts +6 -0
  164. package/dist/src/pieces/json.schema.js +58 -0
  165. package/dist/src/pieces/json.schema.js.map +1 -0
  166. package/dist/src/pieces/json.schema.test.d.ts +1 -0
  167. package/dist/src/pieces/json.schema.test.js +27 -0
  168. package/dist/src/pieces/json.schema.test.js.map +1 -0
  169. package/dist/src/pieces/manager.d.ts +22 -0
  170. package/dist/src/pieces/manager.js +43 -0
  171. package/dist/src/pieces/manager.js.map +1 -0
  172. package/dist/src/pieces/manager.test.d.ts +1 -0
  173. package/dist/src/pieces/manager.test.js +72 -0
  174. package/dist/src/pieces/manager.test.js.map +1 -0
  175. package/dist/src/pieces/utils/frontmatter.d.ts +33 -0
  176. package/dist/src/pieces/utils/frontmatter.js +69 -0
  177. package/dist/src/pieces/utils/frontmatter.js.map +1 -0
  178. package/dist/src/pieces/utils/frontmatter.test.d.ts +1 -0
  179. package/dist/src/pieces/utils/frontmatter.test.js +185 -0
  180. package/dist/src/pieces/utils/frontmatter.test.js.map +1 -0
  181. package/dist/src/pieces/utils/markdown.d.ts +10 -0
  182. package/dist/src/pieces/utils/markdown.js +9 -0
  183. package/dist/src/pieces/utils/markdown.js.map +1 -0
  184. package/dist/src/pieces/utils/markdown.test.d.ts +1 -0
  185. package/dist/src/pieces/utils/markdown.test.js +38 -0
  186. package/dist/src/pieces/utils/markdown.test.js.map +1 -0
  187. package/dist/src/pieces/utils/piece.d.ts +13 -0
  188. package/dist/src/pieces/utils/piece.fixtures.d.ts +19 -0
  189. package/dist/src/pieces/utils/piece.fixtures.js +39 -0
  190. package/dist/src/pieces/utils/piece.fixtures.js.map +1 -0
  191. package/dist/src/pieces/utils/piece.js +142 -0
  192. package/dist/src/pieces/utils/piece.js.map +1 -0
  193. package/dist/src/pieces/utils/piece.test.d.ts +1 -0
  194. package/dist/src/pieces/utils/piece.test.js +333 -0
  195. package/dist/src/pieces/utils/piece.test.js.map +1 -0
  196. package/dist/src/storage/abstract.d.ts +19 -0
  197. package/dist/src/storage/abstract.js +4 -0
  198. package/dist/src/storage/abstract.js.map +1 -0
  199. package/dist/src/storage/fs.d.ts +22 -0
  200. package/dist/src/storage/fs.js +84 -0
  201. package/dist/src/storage/fs.js.map +1 -0
  202. package/dist/src/storage/fs.test.d.ts +1 -0
  203. package/dist/src/storage/fs.test.js +222 -0
  204. package/dist/src/storage/fs.test.js.map +1 -0
  205. package/dist/src/storage/index.d.ts +5 -0
  206. package/dist/src/storage/index.js +4 -0
  207. package/dist/src/storage/index.js.map +1 -0
  208. package/dist/src/storage/storage.mock.d.ts +2 -0
  209. package/dist/src/storage/storage.mock.js +18 -0
  210. package/dist/src/storage/storage.mock.js.map +1 -0
  211. package/dist/src/storage/types.d.ts +6 -0
  212. package/dist/src/storage/types.js +2 -0
  213. package/dist/src/storage/types.js.map +1 -0
  214. package/dist/src/storage/webdav.d.ts +25 -0
  215. package/dist/src/storage/webdav.js +65 -0
  216. package/dist/src/storage/webdav.js.map +1 -0
  217. package/dist/src/storage/webdav.test.d.ts +1 -0
  218. package/dist/src/storage/webdav.test.js +194 -0
  219. package/dist/src/storage/webdav.test.js.map +1 -0
  220. package/dist/tsconfig.tsbuildinfo +1 -0
  221. package/dist/vite.config.d.ts +2 -0
  222. package/dist/vite.config.js +36 -0
  223. package/dist/vite.config.js.map +1 -0
  224. package/package.json +2 -2
@@ -0,0 +1,333 @@
1
+ import { createReadStream, existsSync } from 'fs';
2
+ import { copyFile, stat } from 'fs/promises'; // Direct import matching source
3
+ import { describe, expect, test, vi, afterEach, beforeAll } from 'vitest';
4
+ import { createHash, randomBytes } from 'crypto';
5
+ import { PassThrough, Readable } from 'stream';
6
+ import got from 'got';
7
+ import path from 'path';
8
+ import { ASSETS_DIRECTORY } from '../assets.js';
9
+ import { calculateHashFromFile, makePieceAttachment, makePieceValue, detectStreamFileType } from './piece.js';
10
+ import { makeStorage } from '../../storage/storage.mock.js';
11
+ import { makeMarkdownSample } from './piece.fixtures.js';
12
+ vi.mock('fs/promises');
13
+ vi.mock('crypto');
14
+ vi.mock('fs');
15
+ vi.mock('got');
16
+ const mocks = {
17
+ copyFile: vi.mocked(copyFile),
18
+ stat: vi.mocked(stat),
19
+ existsSync: vi.mocked(existsSync),
20
+ createReadStream: vi.mocked(createReadStream),
21
+ createHash: vi.mocked(createHash),
22
+ randomBytes: vi.mocked(randomBytes),
23
+ gotStream: vi.mocked(got.stream),
24
+ };
25
+ const spies = {};
26
+ let fullPngBuffer;
27
+ describe('pieces/utils/piece.ts', () => {
28
+ beforeAll(async () => {
29
+ const { readFile } = await vi.importActual('fs/promises');
30
+ const assetPath = path.resolve('test/assets/favicon.png');
31
+ fullPngBuffer = await readFile(assetPath);
32
+ });
33
+ afterEach(() => {
34
+ Object.values(mocks).forEach((mock) => {
35
+ mock.mockReset();
36
+ });
37
+ Object.keys(spies).forEach((key) => {
38
+ spies[key].mockRestore();
39
+ delete spies[key];
40
+ });
41
+ vi.restoreAllMocks();
42
+ });
43
+ test('calculateHashFromFile', async () => {
44
+ const data = 'data';
45
+ const mockUpdate = vi.fn();
46
+ const mockDigest = vi.fn().mockReturnValue(data);
47
+ const mockReadStream = new PassThrough();
48
+ mocks.createReadStream.mockReturnValueOnce(mockReadStream);
49
+ mocks.createHash.mockReturnValueOnce({
50
+ update: mockUpdate,
51
+ digest: mockDigest,
52
+ });
53
+ const hashPromise = calculateHashFromFile(mockReadStream);
54
+ mockReadStream.emit('data', data);
55
+ mockReadStream.emit('end');
56
+ const hash = await hashPromise;
57
+ expect(mockUpdate).toHaveBeenCalled();
58
+ expect(mockDigest).toHaveBeenCalledWith('hex');
59
+ expect(hash).toEqual(data);
60
+ });
61
+ test('calculateHashFromFile error', async () => {
62
+ const data = 'data';
63
+ const mockUpdate = vi.fn();
64
+ const mockDigest = vi.fn().mockReturnValue(data);
65
+ const mockReadStream = new PassThrough();
66
+ mocks.createReadStream.mockReturnValueOnce(mockReadStream);
67
+ mocks.createHash.mockReturnValueOnce({
68
+ update: mockUpdate,
69
+ digest: mockDigest,
70
+ });
71
+ spies.consoleError = vi.spyOn(console, 'error');
72
+ const hashPromise = calculateHashFromFile(mockReadStream);
73
+ mockReadStream.emit('error', new Error('error'));
74
+ await expect(hashPromise).rejects.toThrowError();
75
+ expect(spies.consoleError).toHaveBeenCalled();
76
+ });
77
+ test('detectStreamFileType should correctly identify PNG from full buffer', async () => {
78
+ const stream = Readable.from([fullPngBuffer]);
79
+ const result = await detectStreamFileType(stream);
80
+ expect(result.type).toEqual({ ext: 'png', mime: 'image/png' });
81
+ const resultChunks = [];
82
+ for await (const chunk of result.stream) {
83
+ resultChunks.push(chunk);
84
+ }
85
+ const finalBuffer = Buffer.concat(resultChunks);
86
+ expect(finalBuffer.toString('hex')).toEqual(fullPngBuffer.toString('hex'));
87
+ });
88
+ test('detectStreamFileType with string chunks (non-Buffer)', async () => {
89
+ const stream = Readable.from(['hello ', 'world']);
90
+ const result = await detectStreamFileType(stream);
91
+ expect(result.type).toBeUndefined();
92
+ const resultChunks = [];
93
+ for await (const chunk of result.stream) {
94
+ resultChunks.push(chunk);
95
+ }
96
+ const finalString = Buffer.concat(resultChunks).toString();
97
+ expect(finalString).toEqual('hello world');
98
+ });
99
+ test('detectStreamFileType with custom maxBytes and multiple chunks', async () => {
100
+ const chunk1 = Buffer.from('hello ');
101
+ const chunk2 = Buffer.from('world');
102
+ const chunk3 = Buffer.from('!');
103
+ const stream = Readable.from([chunk1, chunk2, chunk3]);
104
+ const result = await detectStreamFileType(stream, 5);
105
+ const resultChunks = [];
106
+ for await (const chunk of result.stream) {
107
+ resultChunks.push(chunk);
108
+ }
109
+ const finalString = Buffer.concat(resultChunks).toString();
110
+ expect(finalString).toEqual('hello world!');
111
+ });
112
+ test('makePieceValue', async () => {
113
+ const field = { name: 'title', type: 'string' };
114
+ const value = 'new title';
115
+ const pieceValue = await makePieceValue(field, value);
116
+ expect(pieceValue).toEqual(value);
117
+ });
118
+ test('makePieceValue array', async () => {
119
+ const field = {
120
+ name: 'title',
121
+ type: 'array',
122
+ items: { type: 'string' },
123
+ };
124
+ const value = 'new title';
125
+ const pieceValue = await makePieceValue(field, value);
126
+ expect(pieceValue).toEqual(value);
127
+ });
128
+ test('makePieceValue boolean', async () => {
129
+ const field = { name: 'title', type: 'boolean' };
130
+ const pieceValueT = await makePieceValue(field, 'true');
131
+ const pieceValueF = await makePieceValue(field, 'false');
132
+ expect(pieceValueT).toEqual(true);
133
+ expect(pieceValueF).toEqual(false);
134
+ });
135
+ test('makePieceValue integer', async () => {
136
+ const field = { name: 'title', type: 'integer' };
137
+ const pieceValue = await makePieceValue(field, '101');
138
+ expect(pieceValue).toEqual(101);
139
+ });
140
+ test('makePieceValue path asset', async () => {
141
+ const field = { name: 'title', type: 'string', format: 'asset' };
142
+ const asset = '/path/to/asset';
143
+ const readable = new PassThrough();
144
+ mocks.createReadStream.mockReturnValueOnce(readable);
145
+ mocks.stat.mockResolvedValueOnce({ isFile: () => true }); // Properly mock resolved value
146
+ const pieceValuePromise = makePieceValue(field, asset);
147
+ process.nextTick(() => {
148
+ readable.emit('open');
149
+ });
150
+ const pieceValue = await pieceValuePromise;
151
+ expect(pieceValue).toEqual(readable);
152
+ });
153
+ test('makePieceValue url asset', async () => {
154
+ const field = { name: 'title', type: 'string', format: 'asset' };
155
+ const asset = 'https://path/to/asset';
156
+ const readable = new PassThrough();
157
+ mocks.gotStream.mockReturnValueOnce(readable);
158
+ const pieceValuePromise = makePieceValue(field, asset);
159
+ readable.emit('response', { statusCode: 200 });
160
+ const pieceValue = await pieceValuePromise;
161
+ expect(pieceValue).toEqual(readable);
162
+ });
163
+ test('makePieceValue url asset bad status Code', async () => {
164
+ const field = { name: 'title', type: 'string', format: 'asset' };
165
+ const asset = 'https://path/to/asset';
166
+ const readable = new PassThrough();
167
+ mocks.gotStream.mockReturnValueOnce(readable);
168
+ const pieceValuePromise = makePieceValue(field, asset);
169
+ readable.emit('response', { statusCode: 500 });
170
+ await expect(pieceValuePromise).rejects.toThrow();
171
+ });
172
+ test('makePieceValue bad url asset', async () => {
173
+ const field = { name: 'title', type: 'string', format: 'asset' };
174
+ const asset = 'https://path/to/asset';
175
+ const readable = new PassThrough();
176
+ mocks.gotStream.mockReturnValueOnce(readable);
177
+ const pieceValuePromise = makePieceValue(field, asset);
178
+ readable.emit('error', new Error('test error'));
179
+ await expect(pieceValuePromise).rejects.toThrow('test error');
180
+ });
181
+ test('makePieceValue bad file asset', async () => {
182
+ const field = { name: 'title', type: 'string', format: 'asset' };
183
+ const asset = '/path/to/bad/file.jpg';
184
+ const readable = new PassThrough();
185
+ mocks.createReadStream.mockReturnValueOnce(readable);
186
+ mocks.stat.mockResolvedValueOnce({ isFile: () => true });
187
+ spies.consoleError = vi.spyOn(console, 'error');
188
+ const pieceValuePromise = makePieceValue(field, asset);
189
+ // Emit error synchronously or ensure the promise chain catches it
190
+ setTimeout(() => {
191
+ readable.emit('error', new Error('test file error'));
192
+ }, 0);
193
+ await expect(pieceValuePromise).rejects.toThrow('test file error');
194
+ expect(spies.consoleError).toHaveBeenCalled();
195
+ });
196
+ test('makePieceValue existing asset', async () => {
197
+ const field = { name: 'title', type: 'string', format: 'asset' };
198
+ const asset = `${ASSETS_DIRECTORY}/path/to/asset`;
199
+ const readable = new PassThrough();
200
+ mocks.createReadStream.mockReturnValueOnce(readable);
201
+ mocks.stat.mockResolvedValueOnce({ isFile: () => true });
202
+ const pieceValue = await makePieceValue(field, asset);
203
+ expect(pieceValue).toEqual(asset);
204
+ });
205
+ test('makePieceValue not-existant path', async () => {
206
+ const field = { name: 'title', type: 'string', format: 'asset' };
207
+ const asset = `path/to/asset`;
208
+ const readable = new PassThrough();
209
+ mocks.createReadStream.mockReturnValueOnce(readable);
210
+ mocks.stat.mockResolvedValueOnce(null);
211
+ const waiting = makePieceValue(field, asset);
212
+ await expect(waiting).rejects.toThrowError();
213
+ });
214
+ test('makePieceValue with stream', async () => {
215
+ const field = { name: 'title', type: 'string', format: 'asset' };
216
+ const readable = new PassThrough();
217
+ const pieceValue = await makePieceValue(field, readable);
218
+ expect(mocks.stat).not.toHaveBeenCalled();
219
+ expect(pieceValue).toEqual(readable);
220
+ });
221
+ test('makePieceValue with invalid value', async () => {
222
+ const field = { name: 'title', type: 'string', format: 'asset' };
223
+ const making = makePieceValue(field, 55);
224
+ await expect(making).rejects.toThrowError();
225
+ });
226
+ test('makePieceAttachment should create an asset from a stream (PNG)', async () => {
227
+ const field = {
228
+ name: 'cover',
229
+ type: 'string',
230
+ format: 'asset',
231
+ };
232
+ const storage = makeStorage('root');
233
+ const random = 'randomhex';
234
+ const fieldName = 'cover';
235
+ const fileName = 'samplePath';
236
+ const markdown = makeMarkdownSample(fileName, 'books', '', { [fieldName]: 'cover.jpg' });
237
+ const expectedFilename = `${fileName}-${random}.png`;
238
+ const mocksWriteStream = new PassThrough();
239
+ const mockStream = Readable.from([fullPngBuffer]);
240
+ mockStream.requestUrl = { pathname: 'file.jpg' };
241
+ mocks.randomBytes.mockImplementation(() => ({ toString: () => random }));
242
+ spies.createWriteStream = vi
243
+ .spyOn(storage, 'createWriteStream')
244
+ .mockReturnValue(mocksWriteStream);
245
+ spies.exists = vi.spyOn(storage, 'exists').mockResolvedValue(false);
246
+ spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValue(undefined);
247
+ const asset = await makePieceAttachment(markdown.filePath, field, mockStream, storage);
248
+ expect(asset).toBe(path.join(ASSETS_DIRECTORY, path.dirname(markdown.filePath), fieldName, `${expectedFilename}`));
249
+ });
250
+ test('makePieceAttachment should work with field arrays (PNG)', async () => {
251
+ const field = {
252
+ name: 'cover',
253
+ type: 'array',
254
+ items: {
255
+ format: 'asset',
256
+ }
257
+ };
258
+ const storage = makeStorage('root');
259
+ const random = 'randomhex';
260
+ const fieldName = 'cover';
261
+ const fileName = 'samplePath';
262
+ const markdown = makeMarkdownSample(fileName, 'books', '', { [fieldName]: 'cover.jpg' });
263
+ const expectedFilename = `${fileName}-${random}.png`;
264
+ const mocksWriteStream = new PassThrough();
265
+ const mockStream = Readable.from([fullPngBuffer]);
266
+ mockStream.requestUrl = { pathname: 'file.jpg' };
267
+ mocks.randomBytes.mockImplementation(() => ({ toString: () => random }));
268
+ spies.createWriteStream = vi
269
+ .spyOn(storage, 'createWriteStream')
270
+ .mockReturnValue(mocksWriteStream);
271
+ spies.exists = vi.spyOn(storage, 'exists').mockResolvedValue(false);
272
+ spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValue(undefined);
273
+ const asset = await makePieceAttachment(markdown.filePath, field, mockStream, storage);
274
+ expect(asset).toBe(path.join(ASSETS_DIRECTORY, path.dirname(markdown.filePath), fieldName, `${expectedFilename}`));
275
+ });
276
+ test('makePieceAttachment should use path and path stream for file type (fallback)', async () => {
277
+ const field = {
278
+ name: 'cover',
279
+ type: 'string',
280
+ format: 'asset',
281
+ };
282
+ const storage = makeStorage('root');
283
+ const random = 'randomhex';
284
+ const fieldName = 'cover';
285
+ const fileName = 'samplePath';
286
+ const markdown = makeMarkdownSample(fileName, 'books', '', { [fieldName]: 'cover.jpg' });
287
+ const expectedFilename = `${fileName}-${random}.jpg`;
288
+ const mocksWriteStream = new PassThrough();
289
+ // Use Readable.from
290
+ const mockStream = Readable.from([Buffer.from('some data')]);
291
+ mockStream.path = Buffer.from('file.jpg');
292
+ mocks.randomBytes.mockImplementation(() => ({ toString: () => random }));
293
+ spies.createWriteStream = vi
294
+ .spyOn(storage, 'createWriteStream')
295
+ .mockReturnValue(mocksWriteStream);
296
+ spies.exists = vi.spyOn(storage, 'exists').mockResolvedValue(false);
297
+ spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValue(undefined);
298
+ const asset = await makePieceAttachment(markdown.filePath, field, mockStream, storage);
299
+ expect(asset).toBe(path.join(ASSETS_DIRECTORY, path.dirname(markdown.filePath), fieldName, `${expectedFilename}`));
300
+ });
301
+ test('makePieceAttachment should use a generic readable stream with no path or url info (fallback)', async () => {
302
+ const field = {
303
+ name: 'cover',
304
+ type: 'string',
305
+ format: 'asset',
306
+ };
307
+ const storage = makeStorage('root');
308
+ const random = 'randomhex';
309
+ const fieldName = 'cover';
310
+ const fileName = 'samplePath.md'; // Must have extension for fallback to work
311
+ const markdown = makeMarkdownSample(fileName, 'books', '', { [fieldName]: 'cover.bin' });
312
+ const expectedFilename = `${fileName.replace('.md', '')}-${random}.md`; // Fallback to markdown.filePath ext .md
313
+ const mocksWriteStream = new PassThrough();
314
+ // Use Readable.from
315
+ const mockGenericReadable = Readable.from([Buffer.from('some binary data')]);
316
+ mocks.randomBytes.mockImplementation(() => ({ toString: () => random }));
317
+ spies.createWriteStream = vi
318
+ .spyOn(storage, 'createWriteStream')
319
+ .mockReturnValue(mocksWriteStream);
320
+ spies.exists = vi.spyOn(storage, 'exists').mockResolvedValue(false);
321
+ spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValue(undefined);
322
+ const asset = await makePieceAttachment(markdown.filePath, field, mockGenericReadable, storage);
323
+ expect(asset).toBe(path.join(ASSETS_DIRECTORY, path.dirname(markdown.filePath), fieldName, `${expectedFilename}`));
324
+ });
325
+ test('makePieceAttachment throws for non-asset field', async () => {
326
+ const field = { name: 'title', type: 'string' };
327
+ const stream = new PassThrough();
328
+ const storage = makeStorage('root');
329
+ const asset = makePieceAttachment('file', field, stream, storage);
330
+ await expect(asset).rejects.toThrowError();
331
+ });
332
+ });
333
+ //# sourceMappingURL=piece.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piece.test.js","sourceRoot":"","sources":["../../../../src/pieces/utils/piece.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ReadStream, WriteStream } from 'fs';
2
+ import type { StorageStat, StorageType } from './types.js';
3
+ declare abstract class LuzzleStorage {
4
+ abstract type: StorageType;
5
+ abstract root: string;
6
+ abstract parseArgPath(path: string): string;
7
+ abstract readFile(path: string, format?: 'text'): Promise<string | Buffer>;
8
+ abstract writeFile(path: string, contents: string | Buffer | ReadStream): Promise<void>;
9
+ abstract getFilesIn(path: string, options?: {
10
+ deep?: boolean;
11
+ }): Promise<string[]>;
12
+ abstract exists(path: string): Promise<boolean>;
13
+ abstract delete(path: string): Promise<void>;
14
+ abstract stat(path: string): Promise<StorageStat>;
15
+ abstract createReadStream(path: string): ReadStream;
16
+ abstract createWriteStream(path: string): WriteStream;
17
+ abstract makeDirectory(path: string): Promise<void>;
18
+ }
19
+ export default LuzzleStorage;
@@ -0,0 +1,4 @@
1
+ class LuzzleStorage {
2
+ }
3
+ export default LuzzleStorage;
4
+ //# sourceMappingURL=abstract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/storage/abstract.ts"],"names":[],"mappings":"AAGA,MAAe,aAAa;CAa3B;AAED,eAAe,aAAa,CAAA"}
@@ -0,0 +1,22 @@
1
+ import type { StorageStat, StorageType } from './types.js';
2
+ import { Readable } from 'stream';
3
+ import LuzzleStorage from './abstract.js';
4
+ declare class StorageFileSystem extends LuzzleStorage {
5
+ type: StorageType;
6
+ root: string;
7
+ constructor(root: string);
8
+ private resolvePath;
9
+ parseArgPath(argPath: string): string;
10
+ readFile(path: string, format?: 'text'): Promise<string | Buffer>;
11
+ writeFile(path: string, contents: string | Buffer | Readable): Promise<void>;
12
+ getFilesIn(dir: string, options?: {
13
+ deep?: boolean;
14
+ }): Promise<string[]>;
15
+ exists(path: string): Promise<boolean>;
16
+ delete(path: string): Promise<void>;
17
+ stat(path: string): Promise<StorageStat>;
18
+ createReadStream(path: string): import("fs").ReadStream;
19
+ createWriteStream(path: string): import("fs").WriteStream;
20
+ makeDirectory(path: string): Promise<void>;
21
+ }
22
+ export default StorageFileSystem;
@@ -0,0 +1,84 @@
1
+ import { readFile, writeFile, stat, unlink, mkdir, readdir } from 'fs/promises';
2
+ import { fdir } from 'fdir';
3
+ import { createReadStream, createWriteStream, existsSync } from 'fs';
4
+ import path from 'path';
5
+ import LuzzleStorage from './abstract.js';
6
+ class StorageFileSystem extends LuzzleStorage {
7
+ type = 'fs';
8
+ root;
9
+ constructor(root) {
10
+ super();
11
+ this.root = root;
12
+ if (!existsSync(this.root)) {
13
+ throw new Error(`root directory ${this.root} not found`);
14
+ }
15
+ }
16
+ resolvePath(_path) {
17
+ return path.resolve(this.root, _path);
18
+ }
19
+ parseArgPath(argPath) {
20
+ return path.relative(this.root, argPath);
21
+ }
22
+ async readFile(path, format) {
23
+ const resolvedPath = this.resolvePath(path);
24
+ if (format === 'text') {
25
+ return readFile(resolvedPath, 'utf-8');
26
+ }
27
+ else {
28
+ return readFile(resolvedPath);
29
+ }
30
+ }
31
+ async writeFile(path, contents) {
32
+ const resolvedPath = this.resolvePath(path);
33
+ if (Buffer.isBuffer(contents)) {
34
+ writeFile(resolvedPath, contents, 'binary');
35
+ }
36
+ else {
37
+ writeFile(resolvedPath, contents, 'utf8');
38
+ }
39
+ }
40
+ async getFilesIn(dir, options) {
41
+ const resolvedPath = this.resolvePath(dir);
42
+ if (options?.deep) {
43
+ return new fdir().withRelativePaths().crawl(resolvedPath).withPromise();
44
+ }
45
+ else {
46
+ const files = await readdir(resolvedPath, { withFileTypes: true });
47
+ return files.map((file) => (file.isFile() ? file.name : file.name + '/'));
48
+ }
49
+ }
50
+ async exists(path) {
51
+ const resolvedPath = this.resolvePath(path);
52
+ return stat(resolvedPath)
53
+ .catch(() => null)
54
+ .then(Boolean);
55
+ }
56
+ async delete(path) {
57
+ const resolvedPath = this.resolvePath(path);
58
+ unlink(resolvedPath);
59
+ }
60
+ async stat(path) {
61
+ const resolvedPath = this.resolvePath(path);
62
+ const stats = await stat(resolvedPath);
63
+ const storageStat = {
64
+ size: stats.size,
65
+ type: stats.isFile() ? 'file' : 'directory',
66
+ last_modified: stats.mtime,
67
+ };
68
+ return storageStat;
69
+ }
70
+ createReadStream(path) {
71
+ const resolvedPath = this.resolvePath(path);
72
+ return createReadStream(resolvedPath);
73
+ }
74
+ createWriteStream(path) {
75
+ const resolvedPath = this.resolvePath(path);
76
+ return createWriteStream(resolvedPath);
77
+ }
78
+ async makeDirectory(path) {
79
+ const resolvedPath = this.resolvePath(path);
80
+ await mkdir(resolvedPath, { recursive: true });
81
+ }
82
+ }
83
+ export default StorageFileSystem;
84
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/storage/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};