@netlify/edge-bundler 8.14.1 → 8.14.2

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.
@@ -53,7 +53,7 @@ test('Does not inherit environment variables if `extendEnv` is false', async ()
53
53
  });
54
54
  output = output.trim().replace(/\n+/g, '\n');
55
55
  expect(output).toBe('LULU=LALA');
56
- await rm(tmpDir.path, { force: true, recursive: true });
56
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
57
57
  });
58
58
  test('Does inherit environment variables if `extendEnv` is true', async () => {
59
59
  var _a;
@@ -78,7 +78,7 @@ test('Does inherit environment variables if `extendEnv` is true', async () => {
78
78
  // lets remove holes, split lines and sort lines by name, as different OSes might order them different
79
79
  const environmentVariables = output.trim().replace(/\n+/g, '\n').split('\n').sort();
80
80
  expect(environmentVariables).toEqual(['LULU=LALA', 'TADA=TUDU']);
81
- await rm(tmpDir.path, { force: true, recursive: true });
81
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
82
82
  });
83
83
  test('Does inherit environment variables if `extendEnv` is not set', async () => {
84
84
  var _a;
@@ -103,5 +103,5 @@ test('Does inherit environment variables if `extendEnv` is not set', async () =>
103
103
  // lets remove holes, split lines and sort lines by name, as different OSes might order them different
104
104
  const environmentVariables = output.trim().replace(/\n+/g, '\n').split('\n').sort();
105
105
  expect(environmentVariables).toEqual(['LULU=LALA', 'TADA=TUDU']);
106
- await rm(tmpDir.path, { force: true, recursive: true });
106
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
107
107
  });
@@ -1,8 +1,7 @@
1
- import { promises as fs } from 'fs';
1
+ import { access, readdir, readFile, rm, writeFile } from 'fs/promises';
2
2
  import { join, resolve } from 'path';
3
3
  import process from 'process';
4
4
  import { pathToFileURL } from 'url';
5
- import { deleteAsync } from 'del';
6
5
  import tmp from 'tmp-promise';
7
6
  import { test, expect, vi } from 'vitest';
8
7
  import { importMapSpecifier } from '../shared/consts.js';
@@ -26,10 +25,10 @@ test('Produces an ESZIP bundle', async () => {
26
25
  configPath: join(internalDirectory, 'config.json'),
27
26
  importMapPaths: [join(userDirectory, 'import_map.json')],
28
27
  });
29
- const generatedFiles = await fs.readdir(distPath);
28
+ const generatedFiles = await readdir(distPath);
30
29
  expect(result.functions.length).toBe(3);
31
30
  expect(generatedFiles.length).toBe(2);
32
- const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
31
+ const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8');
33
32
  const manifest = JSON.parse(manifestFile);
34
33
  expect(() => validateManifest(manifest)).not.toThrowError();
35
34
  const { bundles, import_map: importMapURL } = manifest;
@@ -57,10 +56,10 @@ test('Uses the vendored eszip module instead of fetching it from deno.land', asy
57
56
  basePath,
58
57
  configPath: join(sourceDirectory, 'config.json'),
59
58
  });
60
- const generatedFiles = await fs.readdir(distPath);
59
+ const generatedFiles = await readdir(distPath);
61
60
  expect(result.functions.length).toBe(1);
62
61
  expect(generatedFiles.length).toBe(2);
63
- const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
62
+ const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8');
64
63
  const manifest = JSON.parse(manifestFile);
65
64
  const { bundles } = manifest;
66
65
  expect(bundles.length).toBe(1);
@@ -164,10 +163,10 @@ test('Uses the cache directory as the `DENO_DIR` value', async () => {
164
163
  configPath: join(sourceDirectory, 'config.json'),
165
164
  };
166
165
  const result = await bundle([sourceDirectory], distPath, declarations, options);
167
- const outFiles = await fs.readdir(distPath);
166
+ const outFiles = await readdir(distPath);
168
167
  expect(result.functions.length).toBe(1);
169
168
  expect(outFiles.length).toBe(2);
170
- const denoDir = await fs.readdir(join(cacheDir.path, 'deno_dir'));
169
+ const denoDir = await readdir(join(cacheDir.path, 'deno_dir'));
171
170
  expect(denoDir.includes('gen')).toBe(true);
172
171
  await cleanup();
173
172
  });
@@ -184,10 +183,10 @@ test('Supports import maps with relative paths', async () => {
184
183
  basePath,
185
184
  configPath: join(sourceDirectory, 'config.json'),
186
185
  });
187
- const generatedFiles = await fs.readdir(distPath);
186
+ const generatedFiles = await readdir(distPath);
188
187
  expect(result.functions.length).toBe(1);
189
188
  expect(generatedFiles.length).toBe(2);
190
- const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
189
+ const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8');
191
190
  const manifest = JSON.parse(manifestFile);
192
191
  const { bundles } = manifest;
193
192
  expect(bundles.length).toBe(1);
@@ -212,7 +211,7 @@ test('Ignores any user-defined `deno.json` files', async () => {
212
211
  'https://deno.land/': 'https://black.hole/',
213
212
  },
214
213
  };
215
- await fs.writeFile(importMapFile.path, JSON.stringify(importMap));
214
+ await writeFile(importMapFile.path, JSON.stringify(importMap));
216
215
  // Deno configuration files need to be in the current working directory.
217
216
  // There's not a great way for us to set the working directory of the `deno`
218
217
  // process that we'll run, so our best bet is to write the file to whatever
@@ -222,7 +221,7 @@ test('Ignores any user-defined `deno.json` files', async () => {
222
221
  importMap: importMapFile.path,
223
222
  };
224
223
  try {
225
- await fs.access(denoConfigPath);
224
+ await access(denoConfigPath);
226
225
  throw new Error(`The file at '${denoConfigPath} would be overwritten by this test. Please move the file to a different location and try again.'`);
227
226
  }
228
227
  catch (error) {
@@ -230,13 +229,14 @@ test('Ignores any user-defined `deno.json` files', async () => {
230
229
  throw error;
231
230
  }
232
231
  }
233
- await fs.writeFile(denoConfigPath, JSON.stringify(denoConfig));
232
+ await writeFile(denoConfigPath, JSON.stringify(denoConfig));
234
233
  expect(() => bundle([sourceDirectory], distPath, declarations, {
235
234
  basePath,
236
235
  configPath: join(sourceDirectory, 'config.json'),
237
236
  })).not.toThrow();
238
237
  await cleanup();
239
- await deleteAsync([denoConfigPath, importMapFile.path], { force: true });
238
+ await rm(denoConfigPath, { force: true, recursive: true, maxRetries: 10 });
239
+ await rm(importMapFile.path, { force: true, recursive: true, maxRetries: 10 });
240
240
  });
241
241
  test('Processes a function that imports a custom layer', async () => {
242
242
  const { basePath, cleanup, distPath } = await useFixture('with_layers');
@@ -252,10 +252,10 @@ test('Processes a function that imports a custom layer', async () => {
252
252
  basePath,
253
253
  configPath: join(sourceDirectory, 'config.json'),
254
254
  });
255
- const generatedFiles = await fs.readdir(distPath);
255
+ const generatedFiles = await readdir(distPath);
256
256
  expect(result.functions.length).toBe(1);
257
257
  expect(generatedFiles.length).toBe(2);
258
- const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
258
+ const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8');
259
259
  const manifest = JSON.parse(manifestFile);
260
260
  const { bundles, layers } = manifest;
261
261
  expect(bundles.length).toBe(1);
@@ -278,10 +278,10 @@ test('Loads declarations and import maps from the deploy configuration and in-so
278
278
  configPath: join(basePath, '.netlify', 'edge-functions', 'manifest.json'),
279
279
  internalSrcFolder: directories[1],
280
280
  });
281
- const generatedFiles = await fs.readdir(distPath);
281
+ const generatedFiles = await readdir(distPath);
282
282
  expect(result.functions.length).toBe(3);
283
283
  expect(generatedFiles.length).toBe(2);
284
- const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
284
+ const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8');
285
285
  const manifest = JSON.parse(manifestFile);
286
286
  const { bundles, function_config: functionConfig } = manifest;
287
287
  expect(bundles.length).toBe(1);
@@ -317,7 +317,7 @@ test("Ignores entries in `importMapPaths` that don't point to an existing import
317
317
  },
318
318
  },
319
319
  };
320
- await fs.writeFile(importMap.path, JSON.stringify(importMapContents));
320
+ await writeFile(importMap.path, JSON.stringify(importMapContents));
321
321
  const nonExistingImportMapPath = join(distPath, 'some-file-that-does-not-exist.json');
322
322
  const result = await bundle([sourceDirectory], distPath, [
323
323
  {
@@ -329,7 +329,7 @@ test("Ignores entries in `importMapPaths` that don't point to an existing import
329
329
  importMapPaths: [nonExistingImportMapPath, importMap.path],
330
330
  systemLogger,
331
331
  });
332
- const generatedFiles = await fs.readdir(distPath);
332
+ const generatedFiles = await readdir(distPath);
333
333
  expect(result.functions.length).toBe(2);
334
334
  expect(generatedFiles.length).toBe(2);
335
335
  expect(systemLogger).toHaveBeenCalledWith(`Did not find an import map file at '${nonExistingImportMapPath}'.`);
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from 'fs';
2
+ import { rm } from 'fs/promises';
2
3
  import { join, resolve } from 'path';
3
4
  import { pathToFileURL } from 'url';
4
- import { deleteAsync } from 'del';
5
5
  import tmp from 'tmp-promise';
6
6
  import { test, expect, vi, describe } from 'vitest';
7
7
  import { fixturesDir, useFixture } from '../test/util.js';
@@ -129,7 +129,7 @@ describe('`getFunctionConfig` extracts configuration properties from function fi
129
129
  expect(config).toEqual(func.expectedConfig);
130
130
  expect(logger.user).not.toHaveBeenCalled();
131
131
  }
132
- await deleteAsync(tmpDir, { force: true });
132
+ await rm(tmpDir, { force: true, recursive: true, maxRetries: 10 });
133
133
  });
134
134
  });
135
135
  test('Loads function paths from the in-source `config` function', async () => {
@@ -196,7 +196,7 @@ test('Passes validation if default export exists and is a function', async () =>
196
196
  name: func.name,
197
197
  path,
198
198
  }, new ImportMap([importMapFile]), deno, logger)).resolves.not.toThrow();
199
- await deleteAsync(tmpDir, { force: true });
199
+ await rm(tmpDir, { force: true, recursive: true, maxRetries: 10 });
200
200
  });
201
201
  test('Fails validation if default export is not function', async () => {
202
202
  const { path: tmpDir } = await tmp.dir();
@@ -221,7 +221,7 @@ test('Fails validation if default export is not function', async () => {
221
221
  path,
222
222
  }, new ImportMap([importMapFile]), deno, logger);
223
223
  await expect(config).rejects.toThrowError(invalidDefaultExportErr(path));
224
- await deleteAsync(tmpDir, { force: true });
224
+ await rm(tmpDir, { force: true, recursive: true, maxRetries: 10 });
225
225
  });
226
226
  test('Fails validation if default export is not present', async () => {
227
227
  const { path: tmpDir } = await tmp.dir();
@@ -245,5 +245,5 @@ test('Fails validation if default export is not present', async () => {
245
245
  path,
246
246
  }, new ImportMap([importMapFile]), deno, logger);
247
247
  await expect(config).rejects.toThrowError(invalidDefaultExportErr(path));
248
- await deleteAsync(tmpDir, { force: true });
248
+ await rm(tmpDir, { force: true, recursive: true, maxRetries: 10 });
249
249
  });
@@ -42,7 +42,6 @@ const downloadVersion = async (versionRange) => {
42
42
  const version = await getLatestVersionForRange(versionRange);
43
43
  const url = getReleaseURL(version);
44
44
  const res = await fetch(url);
45
- // eslint-disable-next-line no-magic-numbers
46
45
  if (res.body === null || res.status < 200 || res.status > 299) {
47
46
  throw new Error(`Download failed with status code ${res.status}`);
48
47
  }
@@ -30,7 +30,7 @@ beforeEach(async (ctx) => {
30
30
  ctx.tmpDir = tmpDir.path;
31
31
  });
32
32
  afterEach(async (ctx) => {
33
- await rm(ctx.tmpDir, { force: true, recursive: true });
33
+ await rm(ctx.tmpDir, { force: true, recursive: true, maxRetries: 10 });
34
34
  });
35
35
  test('tries downloading binary up to 4 times', async (ctx) => {
36
36
  nock.disableNetConnect();
@@ -1,15 +1,14 @@
1
- import { promises as fs } from 'fs';
1
+ import { mkdir, rm, writeFile } from 'fs/promises';
2
2
  import { join } from 'path';
3
3
  import { pathToFileURL } from 'url';
4
- import { deleteAsync } from 'del';
5
4
  const defaultFormatExportTypeError = (name) => `The Edge Function "${name}" has failed to load. Does it have a function as the default export?`;
6
5
  const defaultFormatImportError = (name) => `There was an error with Edge Function "${name}".`;
7
6
  const generateStage2 = async ({ bootstrapURL, distDirectory, fileName, formatExportTypeError, formatImportError, functions, }) => {
8
- await deleteAsync(distDirectory, { force: true });
9
- await fs.mkdir(distDirectory, { recursive: true });
7
+ await rm(distDirectory, { force: true, recursive: true, maxRetries: 3 });
8
+ await mkdir(distDirectory, { recursive: true });
10
9
  const entryPoint = getLocalEntryPoint(functions, { bootstrapURL, formatExportTypeError, formatImportError });
11
10
  const stage2Path = join(distDirectory, fileName);
12
- await fs.writeFile(stage2Path, entryPoint);
11
+ await writeFile(stage2Path, entryPoint);
13
12
  return stage2Path;
14
13
  };
15
14
  // For the local development environment, we import the user functions with
@@ -43,5 +43,5 @@ test('Downloads the Deno CLI on demand and caches it for subsequent calls', asyn
43
43
  expect((_d = output2 === null || output2 === void 0 ? void 0 : output2.stdout) !== null && _d !== void 0 ? _d : '').toMatch(expectedOutput);
44
44
  expect(beforeDownload).toHaveBeenCalledTimes(1);
45
45
  expect(afterDownload).toHaveBeenCalledTimes(1);
46
- await rm(tmpDir.path, { force: true, recursive: true });
46
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
47
47
  });
@@ -1,7 +1,6 @@
1
- import { promises as fs } from 'fs';
1
+ import { rm, writeFile } from 'fs/promises';
2
2
  import { join } from 'path';
3
3
  import { pathToFileURL } from 'url';
4
- import { deleteAsync } from 'del';
5
4
  import { execa } from 'execa';
6
5
  import tmp from 'tmp-promise';
7
6
  import { test, expect } from 'vitest';
@@ -23,18 +22,18 @@ test('`getLocalEntryPoint` returns a valid stage 2 file for local development',
23
22
  `;
24
23
  const printerPath = join(tmpDir, 'printer.mjs');
25
24
  const bootstrapURL = pathToFileURL(printerPath).toString();
26
- await fs.writeFile(printerPath, printer);
25
+ await writeFile(printerPath, printer);
27
26
  const functions = [
28
27
  { name: 'func1', path: join(tmpDir, 'func1.mjs'), response: 'Hello from function 1' },
29
28
  { name: 'func2', path: join(tmpDir, 'func2.mjs'), response: 'Hello from function 2' },
30
29
  ];
31
30
  for (const func of functions) {
32
31
  const contents = `export default () => ${JSON.stringify(func.response)}`;
33
- await fs.writeFile(func.path, contents);
32
+ await writeFile(func.path, contents);
34
33
  }
35
34
  const stage2 = getLocalEntryPoint(functions.map(({ name, path }) => ({ name, path })), { bootstrapURL });
36
35
  const stage2Path = join(tmpDir, 'stage2.mjs');
37
- await fs.writeFile(stage2Path, stage2);
36
+ await writeFile(stage2Path, stage2);
38
37
  const { stdout, stderr } = await execa('deno', ['run', '--allow-all', stage2Path]);
39
38
  expect(stderr).toBe('');
40
39
  const { metadata, responses } = JSON.parse(stdout);
@@ -42,5 +41,5 @@ test('`getLocalEntryPoint` returns a valid stage 2 file for local development',
42
41
  expect(responses[func.name]).toBe(func.response);
43
42
  expect(metadata.functions[func.name].url).toBe(pathToFileURL(func.path).toString());
44
43
  }
45
- await deleteAsync(tmpDir, { force: true });
44
+ await rm(tmpDir, { force: true, recursive: true });
46
45
  });
@@ -24,7 +24,7 @@ test('`ensureLatestTypes` updates the Deno CLI cache if the local version of typ
24
24
  expect(mock).toHaveBeenCalledWith(['cache', '-r', mockURL]);
25
25
  expect(versionFile).toBe(mockVersion);
26
26
  mock.mockRestore();
27
- await rm(tmpDir.path, { force: true, recursive: true });
27
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
28
28
  });
29
29
  test('`ensureLatestTypes` does not update the Deno CLI cache if the local version of types is up-to-date', async () => {
30
30
  const mockURL = 'https://edge.netlify';
@@ -43,7 +43,7 @@ test('`ensureLatestTypes` does not update the Deno CLI cache if the local versio
43
43
  expect(latestVersionMock.isDone()).toBe(true);
44
44
  expect(mock).not.toHaveBeenCalled();
45
45
  mock.mockRestore();
46
- await rm(tmpDir.path, { force: true, recursive: true });
46
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
47
47
  });
48
48
  test('`ensureLatestTypes` does not throw if the types URL is not available', async () => {
49
49
  const mockURL = 'https://edge.netlify';
@@ -59,5 +59,5 @@ test('`ensureLatestTypes` does not throw if the types URL is not available', asy
59
59
  expect(latestVersionMock.isDone()).toBe(true);
60
60
  expect(mock).not.toHaveBeenCalled();
61
61
  mock.mockRestore();
62
- await rm(tmpDir.path, { force: true, recursive: true });
62
+ await rm(tmpDir.path, { force: true, recursive: true, maxRetries: 10 });
63
63
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netlify/edge-bundler",
3
- "version": "8.14.1",
3
+ "version": "8.14.2",
4
4
  "description": "Intelligently prepare Netlify Edge Functions for deployment",
5
5
  "type": "module",
6
6
  "main": "./dist/node/index.js",
@@ -78,7 +78,6 @@
78
78
  "ajv-errors": "^3.0.0",
79
79
  "better-ajv-errors": "^1.2.0",
80
80
  "common-path-prefix": "^3.0.0",
81
- "del": "^7.0.0",
82
81
  "env-paths": "^3.0.0",
83
82
  "execa": "^6.0.0",
84
83
  "find-up": "^6.3.0",