@luzzle/core 0.0.32 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luzzle/core",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "author": "eleith",
5
5
  "scripts": {
6
6
  "lint": "eslint src",
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "repository": {
15
15
  "type": "git",
16
- "url": "git+https://git.eleith.com/eleith/eleith.git"
16
+ "url": "git+https://github.com/eleith/luzzle.git"
17
17
  },
18
18
  "files": [
19
19
  "dist/*",
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "main": "./dist/src/index.js",
23
23
  "types": "./dist/src/index.d.ts",
24
- "homepage": "https://git.eleith.com/eleith/eleith.git",
24
+ "homepage": "https://github.com/eleith/luzzle",
25
25
  "description": "luzzle's core",
26
26
  "devDependencies": {
27
27
  "@types/async": "3.2.25",
@@ -1,10 +0,0 @@
1
- import { Readable } from 'stream';
2
- import { ReadStream } from 'fs';
3
- import { Request } from 'got';
4
- import type { PieceFrontmatterSchemaField } from './utils/frontmatter.js';
5
- import LuzzleStorage from '../storage/abstract.js';
6
- export declare const PieceFileType = "md";
7
- export declare function calculateHashFromFile(stream: Readable): Promise<string>;
8
- export declare function downloadToStream(fileOrUrl: string): Promise<unknown>;
9
- export declare function makePieceAttachment(file: string, field: PieceFrontmatterSchemaField, stream: Readable | ReadStream | Request, storage: LuzzleStorage, assetsDirectory: string): Promise<string>;
10
- export declare function makePieceValue(field: PieceFrontmatterSchemaField, value: number | string | boolean | Readable, assetsDirectory: string): Promise<string | number | boolean | Readable>;
@@ -1,101 +0,0 @@
1
- import { createHash, randomBytes } from 'crypto';
2
- import { Readable } from 'stream';
3
- import { stat } from 'fs/promises';
4
- import { createReadStream } from 'fs';
5
- import path from 'path';
6
- import got from 'got';
7
- import { fileTypeStream } from 'file-type';
8
- import { pipeline } from 'stream/promises';
9
- export const PieceFileType = 'md';
10
- export function calculateHashFromFile(stream) {
11
- const hash = createHash('md5');
12
- return new Promise((resolve, reject) => {
13
- stream.on('error', (err) => {
14
- reject(err);
15
- });
16
- stream.on('data', (data) => hash.update(data));
17
- stream.on('end', () => resolve(hash.digest('hex')));
18
- });
19
- }
20
- export async function downloadToStream(fileOrUrl) {
21
- if (/https?:\/\//i.test(fileOrUrl)) {
22
- return new Promise((resolve, reject) => {
23
- const download = got.stream(fileOrUrl, { throwHttpErrors: false });
24
- download.on('error', (err) => {
25
- reject(err);
26
- });
27
- download.on('response', (response) => {
28
- if (response.statusCode >= 400) {
29
- reject(new Error(`HTTP Error: ${response.statusCode}`));
30
- }
31
- else {
32
- resolve(download);
33
- }
34
- });
35
- });
36
- }
37
- const coverStat = await stat(fileOrUrl).catch(() => null);
38
- if (coverStat && coverStat.isFile()) {
39
- return new Promise((resolve, reject) => {
40
- const stream = createReadStream(fileOrUrl);
41
- stream.on('error', (err) => {
42
- reject(err);
43
- });
44
- stream.on('open', () => {
45
- resolve(stream);
46
- });
47
- });
48
- }
49
- throw new Error(`${fileOrUrl} is not a valid file`);
50
- }
51
- export async function makePieceAttachment(file, field, stream, storage, assetsDirectory) {
52
- const format = field.type === 'array' ? field.items.format : field.format;
53
- const fileDir = path.dirname(file);
54
- const random = randomBytes(4).toString('hex');
55
- const baseName = path.basename(file).replace(/\.[^.]+$/, '');
56
- const parts = [baseName, random];
57
- const attachDir = path.join(assetsDirectory, fileDir, field.name);
58
- const exists = await storage.exists(attachDir);
59
- /* c8 ignore next 3 */
60
- if (format !== 'asset') {
61
- throw new Error(`${field} is not an attachable field for ${file}`);
62
- }
63
- if (!exists) {
64
- await storage.makeDirectory(attachDir);
65
- }
66
- const ext = stream.requestUrl?.pathname || stream.path?.toString() || '';
67
- const streamWithFileType = await fileTypeStream(stream);
68
- const type = streamWithFileType?.fileType?.ext.replace(/^/, '.') || path.extname(ext);
69
- const filename = `${parts.filter((x) => x).join('-')}${type}`;
70
- const relPath = path.join(assetsDirectory, fileDir, field.name, filename);
71
- const writeStream = storage.createWriteStream(relPath);
72
- await pipeline(streamWithFileType, writeStream);
73
- return relPath;
74
- }
75
- export async function makePieceValue(field, value, assetsDirectory) {
76
- const isArray = field.type === 'array';
77
- const format = isArray ? field.items.format : field.format;
78
- const type = isArray ? field.items.type : field.type;
79
- if (format === 'asset') {
80
- if (typeof value === 'string') {
81
- if (value.startsWith(assetsDirectory)) {
82
- return value;
83
- }
84
- return downloadToStream(value);
85
- }
86
- else if (value instanceof Readable) {
87
- return value;
88
- }
89
- else {
90
- throw new Error(`${field} must be a string or stream`);
91
- }
92
- }
93
- else if (type === 'boolean') {
94
- return /1|true|yes/.test(value);
95
- }
96
- else if (type === 'integer') {
97
- return parseInt(value);
98
- }
99
- return value.toString();
100
- }
101
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/pieces/utils.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,372 +0,0 @@
1
- import { createReadStream, existsSync } from 'fs';
2
- import { copyFile, stat } from 'fs/promises';
3
- import { temporaryFile } from 'tempy';
4
- import { describe, expect, test, vi, afterEach } from 'vitest';
5
- import yargs from 'yargs';
6
- import { createHash, randomBytes } from 'crypto';
7
- import { PassThrough } from 'stream';
8
- import { makeContext } from '../commands/command/context.fixtures.js';
9
- import * as util from './utils.js';
10
- import Piece from './piece.js';
11
- import { makeMarkdownSample, makePieceMock, makeStorage } from './piece.fixtures.js';
12
- import got from 'got';
13
- import { ASSETS_DIRECTORY } from '../assets.js';
14
- import { fileTypeStream } from 'file-type';
15
- import { pipeline } from 'stream/promises';
16
- import log from '../log.js';
17
- vi.mock('fs');
18
- vi.mock('tempy');
19
- vi.mock('fs/promises');
20
- vi.mock('../web.js');
21
- vi.mock('crypto');
22
- vi.mock('file-type');
23
- vi.mock('stream/promises');
24
- vi.mock('got');
25
- vi.mock('../log.js');
26
- const mocks = {
27
- tempyFile: vi.mocked(temporaryFile),
28
- copyFile: vi.mocked(copyFile),
29
- stat: vi.mocked(stat),
30
- existsSync: vi.mocked(existsSync),
31
- createReadStream: vi.mocked(createReadStream),
32
- createHash: vi.mocked(createHash),
33
- fileType: vi.mocked(fileTypeStream),
34
- pipeline: vi.mocked(pipeline),
35
- randomBytes: vi.mocked(randomBytes),
36
- gotStream: vi.mocked(got.stream),
37
- logError: vi.mocked(log.error),
38
- };
39
- const spies = {};
40
- describe('lib/pieces/utils.ts', () => {
41
- afterEach(() => {
42
- Object.values(mocks).forEach((mock) => {
43
- mock.mockReset();
44
- });
45
- Object.keys(spies).forEach((key) => {
46
- spies[key].mockRestore();
47
- delete spies[key];
48
- });
49
- });
50
- test('makePieceOption', async () => {
51
- const args = yargs();
52
- spies.option = vi.spyOn(args, 'option');
53
- spies.positional = vi.spyOn(args, 'positional');
54
- util.makePieceOption(args);
55
- expect(spies.option).toHaveBeenCalledOnce();
56
- });
57
- test('makePiecePathPositional', async () => {
58
- const args = yargs();
59
- spies.option = vi.spyOn(args, 'option');
60
- spies.positional = vi.spyOn(args, 'positional');
61
- util.makePiecePathPositional(args);
62
- expect(spies.positional).toHaveBeenCalledOnce();
63
- });
64
- test('parsePieceOptionArgv', async () => {
65
- const name = 'books';
66
- const context = makeContext();
67
- const MockPiece = makePieceMock();
68
- const piece = new MockPiece();
69
- spies.getTypes = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce([name]);
70
- spies.getPiece = vi.spyOn(context.pieces, 'getPiece').mockResolvedValueOnce(piece);
71
- const result = await util.parsePieceOptionArgv(context, { piece: name });
72
- expect(result.piece).toBeInstanceOf(Piece);
73
- });
74
- test('parsePieceOptionArgv throws', async () => {
75
- const name = 'links';
76
- const context = makeContext();
77
- spies.getTypes = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce(['books']);
78
- const parsing = util.parsePieceOptionArgv(context, { piece: name });
79
- await expect(parsing).rejects.toThrow();
80
- });
81
- test('parsePiecePathPositionalArgv', async () => {
82
- const name = 'books';
83
- const context = makeContext();
84
- const MockPiece = makePieceMock();
85
- const path = `./path/file.${name}.md`;
86
- const piece = new MockPiece();
87
- const markdown = makeMarkdownSample();
88
- spies.findPieceNames = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce(['books']);
89
- spies.getPiece = vi.spyOn(context.pieces, 'getPiece').mockResolvedValueOnce(piece);
90
- spies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(markdown);
91
- const result = await util.parsePiecePathPositionalArgv(context, { piece: path });
92
- expect(result.markdown).toEqual(markdown);
93
- expect(result.piece).toEqual(piece);
94
- expect(result.file).toEqual(path);
95
- });
96
- test('parsePiecePathPositionalArgv needs at least one piece', async () => {
97
- const name = 'books';
98
- const context = makeContext();
99
- const MockPiece = makePieceMock();
100
- const path = `./path/file.${name}.md`;
101
- const piece = new MockPiece();
102
- const markdown = makeMarkdownSample();
103
- spies.findPieceNames = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce([]);
104
- spies.getPiece = vi.spyOn(context.pieces, 'getPiece').mockResolvedValueOnce(piece);
105
- spies.get = vi.spyOn(piece, 'get').mockResolvedValueOnce(markdown);
106
- const parsing = util.parsePiecePathPositionalArgv(context, { piece: path });
107
- await expect(parsing).rejects.toThrow();
108
- });
109
- test('parsePiecePathPositionalArgv does not exist', async () => {
110
- const name = 'books';
111
- const context = makeContext();
112
- const MockPiece = makePieceMock();
113
- const path = `./path/file.${name}.md`;
114
- const piece = new MockPiece();
115
- spies.findPieceNames = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce(['books']);
116
- spies.getPiece = vi.spyOn(context.pieces, 'getPiece').mockResolvedValueOnce(piece);
117
- spies.get = vi.spyOn(piece, 'get').mockRejectedValueOnce(new Error('error'));
118
- const resulting = util.parsePiecePathPositionalArgv(context, { piece: path });
119
- await expect(resulting).rejects.toThrow();
120
- });
121
- test('parsePiecePathPositionalArgv invalid piece type', async () => {
122
- const name = 'books';
123
- const context = makeContext();
124
- const MockPiece = makePieceMock();
125
- const path = `./path/file.${name}-2.md`;
126
- const piece = new MockPiece();
127
- spies.findPieceNames = vi.spyOn(context.pieces, 'getTypes').mockResolvedValueOnce(['books']);
128
- spies.getPiece = vi.spyOn(context.pieces, 'getPiece').mockResolvedValueOnce(piece);
129
- const resulting = util.parsePiecePathPositionalArgv(context, { piece: path });
130
- await expect(resulting).rejects.toThrow();
131
- });
132
- test('calculateHashFromFile', async () => {
133
- const data = 'data';
134
- const mockUpdate = vi.fn();
135
- const mockDigest = vi.fn().mockReturnValue(data);
136
- const mockReadStream = new PassThrough();
137
- mocks.createReadStream.mockReturnValueOnce(mockReadStream);
138
- mocks.createHash.mockReturnValueOnce({
139
- update: mockUpdate,
140
- digest: mockDigest,
141
- });
142
- const hashPromise = util.calculateHashFromFile(mockReadStream);
143
- mockReadStream.emit('data', data);
144
- mockReadStream.emit('end');
145
- const hash = await hashPromise;
146
- expect(mockUpdate).toHaveBeenCalled();
147
- expect(mockDigest).toHaveBeenCalledWith('hex');
148
- expect(hash).toEqual(data);
149
- });
150
- test('calculateHashFromFile error', async () => {
151
- const data = 'data';
152
- const mockUpdate = vi.fn();
153
- const mockDigest = vi.fn().mockReturnValue(data);
154
- const mockReadStream = new PassThrough();
155
- mocks.createReadStream.mockReturnValueOnce(mockReadStream);
156
- mocks.createHash.mockReturnValueOnce({
157
- update: mockUpdate,
158
- digest: mockDigest,
159
- });
160
- const hashPromise = util.calculateHashFromFile(mockReadStream);
161
- mockReadStream.emit('error', new Error('error'));
162
- await expect(hashPromise).rejects.toThrowError();
163
- });
164
- test('makePieceValue', async () => {
165
- const field = { name: 'title', type: 'string' };
166
- const value = 'new title';
167
- const pieceValue = await util.makePieceValue(field, value);
168
- expect(pieceValue).toEqual(value);
169
- });
170
- test('makePieceValue', async () => {
171
- const field = {
172
- name: 'title',
173
- type: 'array',
174
- items: { type: 'string' },
175
- };
176
- const value = 'new title';
177
- const pieceValue = await util.makePieceValue(field, value);
178
- expect(pieceValue).toEqual(value);
179
- });
180
- test('makePieceValue boolean', async () => {
181
- const field = { name: 'title', type: 'boolean' };
182
- const pieceValueT = await util.makePieceValue(field, 'true');
183
- const pieceValueF = await util.makePieceValue(field, 'false');
184
- expect(pieceValueT).toEqual(true);
185
- expect(pieceValueF).toEqual(false);
186
- });
187
- test('makePieceValue integer', async () => {
188
- const field = { name: 'title', type: 'integer' };
189
- const pieceValue = await util.makePieceValue(field, '101');
190
- expect(pieceValue).toEqual(101);
191
- });
192
- test('makePieceValue path asset', async () => {
193
- const field = { name: 'title', type: 'string', format: 'asset' };
194
- const asset = 'path/to/asset';
195
- const readable = new PassThrough();
196
- mocks.createReadStream.mockReturnValueOnce(readable);
197
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
198
- const pieceValuePromise = util.makePieceValue(field, asset);
199
- process.nextTick(() => {
200
- readable.emit('open');
201
- });
202
- const pieceValue = await pieceValuePromise;
203
- expect(pieceValue).toEqual(readable);
204
- });
205
- test('makePieceValue url asset', async () => {
206
- const field = { name: 'title', type: 'string', format: 'asset' };
207
- const asset = 'https://path/to/asset';
208
- const readable = new PassThrough();
209
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
210
- mocks.gotStream.mockReturnValueOnce(readable);
211
- const pieceValuePromise = util.makePieceValue(field, asset);
212
- process.nextTick(() => {
213
- readable.emit('response', { statusCode: 200 });
214
- });
215
- const pieceValue = await pieceValuePromise;
216
- expect(pieceValue).toEqual(readable);
217
- });
218
- test('makePieceValue url asset bad status Code', async () => {
219
- const field = { name: 'title', type: 'string', format: 'asset' };
220
- const asset = 'https://path/to/asset';
221
- const readable = new PassThrough();
222
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
223
- mocks.gotStream.mockReturnValueOnce(readable);
224
- const pieceValuePromise = util.makePieceValue(field, asset);
225
- process.nextTick(() => {
226
- readable.emit('response', { statusCode: 500 });
227
- });
228
- await expect(pieceValuePromise).rejects.toThrow();
229
- });
230
- test('makePieceValue bad url asset', async () => {
231
- const field = { name: 'title', type: 'string', format: 'asset' };
232
- const asset = 'https://path/to/asset';
233
- const readable = new PassThrough();
234
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
235
- mocks.gotStream.mockReturnValueOnce(readable);
236
- const pieceValuePromise = util.makePieceValue(field, asset);
237
- process.nextTick(() => {
238
- readable.emit('error', new Error('test error'));
239
- });
240
- await expect(pieceValuePromise).rejects.toThrow('test error');
241
- });
242
- test('makePieceValue bad file asset', async () => {
243
- const field = { name: 'title', type: 'string', format: 'asset' };
244
- const asset = '/path/to/bad/file.jpg';
245
- const readable = new PassThrough();
246
- mocks.createReadStream.mockReturnValueOnce(readable);
247
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
248
- const pieceValuePromise = util.makePieceValue(field, asset);
249
- process.nextTick(() => {
250
- readable.emit('error', new Error('test file error'));
251
- });
252
- await expect(pieceValuePromise).rejects.toThrow('test file error');
253
- expect(mocks.logError).toHaveBeenCalledWith('Error reading file from path: test file error');
254
- });
255
- test('makePieceValue existing asset', async () => {
256
- const field = { name: 'title', type: 'string', format: 'asset' };
257
- const asset = `${ASSETS_DIRECTORY}/path/to/asset`;
258
- const readable = new PassThrough();
259
- mocks.createReadStream.mockReturnValueOnce(readable);
260
- mocks.stat.mockResolvedValueOnce({ isFile: () => true });
261
- const pieceValue = await util.makePieceValue(field, asset);
262
- expect(pieceValue).toEqual(asset);
263
- });
264
- test('makePieceValue not-existant path', async () => {
265
- const field = { name: 'title', type: 'string', format: 'asset' };
266
- const asset = `path/to/asset`;
267
- const readable = new PassThrough();
268
- mocks.createReadStream.mockReturnValueOnce(readable);
269
- mocks.stat.mockResolvedValueOnce({ isFile: () => false });
270
- const waiting = util.makePieceValue(field, asset);
271
- await expect(waiting).rejects.toThrowError();
272
- });
273
- test('makePieceValue with stream', async () => {
274
- const field = { name: 'title', type: 'string', format: 'asset' };
275
- const readable = new PassThrough();
276
- const pieceValue = await util.makePieceValue(field, readable);
277
- expect(mocks.stat).not.toHaveBeenCalled();
278
- expect(pieceValue).toEqual(readable);
279
- });
280
- test('makePieceValue with invalid value', async () => {
281
- const field = { name: 'title', type: 'string', format: 'asset' };
282
- const making = util.makePieceValue(field, 55);
283
- await expect(making).rejects.toThrowError();
284
- });
285
- test('makePieceAttachment with request', async () => {
286
- const mockRequest = new PassThrough();
287
- const mockReadable = new PassThrough();
288
- const mockWritable = new PassThrough();
289
- const markdown = makeMarkdownSample();
290
- const field = { name: 'cover', type: 'string', format: 'asset' };
291
- const storage = makeStorage('root');
292
- const random = Buffer.from('random');
293
- spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValueOnce(undefined);
294
- spies.createWriteStream = vi
295
- .spyOn(storage, 'createWriteStream')
296
- .mockResolvedValueOnce(mockWritable);
297
- spies.exists = vi.spyOn(storage, 'exists').mockResolvedValueOnce(false);
298
- mocks.fileType.mockResolvedValueOnce(mockReadable);
299
- mocks.pipeline.mockResolvedValueOnce(undefined);
300
- mocks.randomBytes.mockImplementationOnce(() => random);
301
- mockRequest.requestUrl = { pathname: 'file.html' };
302
- const asset = await util.makePieceAttachment(markdown.filePath, field, mockRequest, storage);
303
- expect(asset).toBe(`${ASSETS_DIRECTORY}/cover/${markdown.filePath}-${random.toString('hex')}.html`);
304
- });
305
- test('makePieceAttachment with readable', async () => {
306
- const mockRequest = new PassThrough();
307
- const mockReadable = new PassThrough();
308
- const mockWritable = new PassThrough();
309
- const markdown = makeMarkdownSample();
310
- const field = { name: 'cover', type: 'string', format: 'asset' };
311
- const storage = makeStorage('root');
312
- const random = Buffer.from('random');
313
- spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValueOnce(undefined);
314
- spies.createWriteStream = vi
315
- .spyOn(storage, 'createWriteStream')
316
- .mockResolvedValueOnce(mockWritable);
317
- spies.exists = vi.spyOn(storage, 'exists').mockResolvedValueOnce(false);
318
- mocks.fileType.mockResolvedValueOnce(mockReadable);
319
- mocks.pipeline.mockResolvedValueOnce(undefined);
320
- mocks.randomBytes.mockImplementationOnce(() => random);
321
- mockRequest.path = 'file.html';
322
- const asset = await util.makePieceAttachment(markdown.filePath, field, mockRequest, storage);
323
- expect(asset).toBe(`${ASSETS_DIRECTORY}/cover/${markdown.filePath}-${random.toString('hex')}.html`);
324
- });
325
- test('makePieceAttachment with readable filetype found', async () => {
326
- const mockRequest = new PassThrough();
327
- const mockReadable = new PassThrough();
328
- const mockWritable = new PassThrough();
329
- const markdown = makeMarkdownSample();
330
- const field = { name: 'cover', type: 'string', format: 'asset' };
331
- const storage = makeStorage('root');
332
- const random = Buffer.from('random');
333
- spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValueOnce(undefined);
334
- spies.createWriteStream = vi
335
- .spyOn(storage, 'createWriteStream')
336
- .mockResolvedValueOnce(mockWritable);
337
- spies.exists = vi.spyOn(storage, 'exists').mockResolvedValueOnce(false);
338
- mocks.fileType.mockResolvedValueOnce({
339
- ...mockReadable,
340
- fileType: { ext: 'jpg', mime: 'image/jpeg' },
341
- });
342
- mocks.pipeline.mockResolvedValueOnce(undefined);
343
- mocks.randomBytes.mockImplementationOnce(() => random);
344
- const asset = await util.makePieceAttachment(markdown.filePath, field, mockRequest, storage);
345
- expect(asset).toBe(`${ASSETS_DIRECTORY}/cover/${markdown.filePath}-${random.toString('hex')}.jpg`);
346
- });
347
- test('makePieceAttachment on array filed', async () => {
348
- const mockRequest = new PassThrough();
349
- const mockReadable = new PassThrough();
350
- const mockWritable = new PassThrough();
351
- const markdown = makeMarkdownSample();
352
- const field = {
353
- name: 'cover',
354
- type: 'array',
355
- items: { format: 'asset' },
356
- };
357
- const storage = makeStorage('root');
358
- const random = Buffer.from('random');
359
- spies.makeDir = vi.spyOn(storage, 'makeDirectory').mockResolvedValueOnce(undefined);
360
- spies.createWriteStream = vi
361
- .spyOn(storage, 'createWriteStream')
362
- .mockResolvedValueOnce(mockWritable);
363
- spies.exists = vi.spyOn(storage, 'exists').mockResolvedValueOnce(false);
364
- mocks.fileType.mockResolvedValueOnce(mockReadable);
365
- mocks.pipeline.mockResolvedValueOnce(undefined);
366
- mocks.randomBytes.mockImplementationOnce(() => random);
367
- mockRequest.requestUrl = { pathname: 'file.html' };
368
- const asset = await util.makePieceAttachment(markdown.filePath, field, mockRequest, storage);
369
- expect(asset).toBe(`${ASSETS_DIRECTORY}/cover/${markdown.filePath}-${random.toString('hex')}.html`);
370
- });
371
- });
372
- //# sourceMappingURL=utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../src/pieces/utils.test.ts"],"names":[],"mappings":"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"}