@netlify/edge-bundler 5.4.0 → 6.0.0
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/dist/node/bundler.js +12 -1
- package/dist/node/bundler.test.js +8 -4
- package/dist/node/deno_config.d.ts +5 -0
- package/dist/node/deno_config.js +40 -0
- package/dist/node/deno_config.test.d.ts +1 -0
- package/dist/node/deno_config.test.js +91 -0
- package/dist/node/feature_flags.js +1 -0
- package/dist/node/formats/javascript.js +1 -1
- package/dist/node/import_map.js +1 -1
- package/dist/node/import_map.test.js +20 -0
- package/dist/node/server/server.d.ts +2 -1
- package/dist/node/server/server.js +11 -2
- package/dist/node/server/server.test.js +40 -12
- package/package.json +3 -2
package/dist/node/bundler.js
CHANGED
|
@@ -6,11 +6,12 @@ import { importMapSpecifier } from '../shared/consts.js';
|
|
|
6
6
|
import { DenoBridge } from './bridge.js';
|
|
7
7
|
import { getFunctionConfig } from './config.js';
|
|
8
8
|
import { getDeclarationsFromConfig } from './declaration.js';
|
|
9
|
+
import { getConfig as getDenoConfig } from './deno_config.js';
|
|
9
10
|
import { load as loadDeployConfig } from './deploy_config.js';
|
|
10
11
|
import { getFlags } from './feature_flags.js';
|
|
11
12
|
import { findFunctions } from './finder.js';
|
|
12
13
|
import { bundle as bundleESZIP } from './formats/eszip.js';
|
|
13
|
-
import { ImportMap } from './import_map.js';
|
|
14
|
+
import { ImportMap, readFile as readImportMapFile } from './import_map.js';
|
|
14
15
|
import { getLogger } from './logger.js';
|
|
15
16
|
import { writeManifest } from './manifest.js';
|
|
16
17
|
import { ensureLatestTypes } from './types.js';
|
|
@@ -44,6 +45,16 @@ const bundle = async (sourceDirectories, distDirectory, tomlDeclarations = [], {
|
|
|
44
45
|
if (deployConfig.importMap) {
|
|
45
46
|
importMap.add(deployConfig.importMap);
|
|
46
47
|
}
|
|
48
|
+
if (featureFlags.edge_functions_read_deno_config) {
|
|
49
|
+
// Look for a Deno config file and read it if one exists.
|
|
50
|
+
const denoConfig = await getDenoConfig(basePath);
|
|
51
|
+
// If the Deno config file defines an import map, read the file and add the
|
|
52
|
+
// imports to the global import map.
|
|
53
|
+
if (denoConfig === null || denoConfig === void 0 ? void 0 : denoConfig.importMap) {
|
|
54
|
+
const importMapFile = await readImportMapFile(denoConfig.importMap);
|
|
55
|
+
importMap.add(importMapFile);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
47
58
|
const functions = await findFunctions(sourceDirectories);
|
|
48
59
|
const functionBundle = await bundleESZIP({
|
|
49
60
|
basePath,
|
|
@@ -18,13 +18,17 @@ test('Produces an ESZIP bundle', async () => {
|
|
|
18
18
|
path: '/func1',
|
|
19
19
|
},
|
|
20
20
|
];
|
|
21
|
-
const
|
|
22
|
-
const
|
|
21
|
+
const userDirectory = join(basePath, 'user-functions');
|
|
22
|
+
const internalDirectory = join(basePath, 'functions');
|
|
23
|
+
const result = await bundle([userDirectory, internalDirectory], distPath, declarations, {
|
|
23
24
|
basePath,
|
|
24
|
-
configPath: join(
|
|
25
|
+
configPath: join(internalDirectory, 'config.json'),
|
|
26
|
+
featureFlags: {
|
|
27
|
+
edge_functions_read_deno_config: true,
|
|
28
|
+
},
|
|
25
29
|
});
|
|
26
30
|
const generatedFiles = await fs.readdir(distPath);
|
|
27
|
-
expect(result.functions.length).toBe(
|
|
31
|
+
expect(result.functions.length).toBe(2);
|
|
28
32
|
expect(generatedFiles.length).toBe(2);
|
|
29
33
|
const manifestFile = await fs.readFile(resolve(distPath, 'manifest.json'), 'utf8');
|
|
30
34
|
const manifest = JSON.parse(manifestFile);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { join, resolve } from 'path';
|
|
3
|
+
import { parse as parseJSONC } from 'jsonc-parser';
|
|
4
|
+
import { isNodeError } from './utils/error.js';
|
|
5
|
+
const filenames = ['deno.json', 'deno.jsonc'];
|
|
6
|
+
export const getConfig = async (basePath) => {
|
|
7
|
+
if (basePath === undefined) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
for (const filename of filenames) {
|
|
11
|
+
const candidatePath = join(basePath, filename);
|
|
12
|
+
const config = await getConfigFromFile(candidatePath);
|
|
13
|
+
if (config !== undefined) {
|
|
14
|
+
return normalizeConfig(config, basePath);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const getConfigFromFile = async (filePath) => {
|
|
19
|
+
try {
|
|
20
|
+
const data = await fs.readFile(filePath, 'utf8');
|
|
21
|
+
const config = parseJSONC(data);
|
|
22
|
+
return config;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (isNodeError(error) && error.code === 'ENOENT') {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const normalizeConfig = (rawConfig, basePath) => {
|
|
32
|
+
const config = {};
|
|
33
|
+
if (rawConfig.importMap) {
|
|
34
|
+
if (typeof rawConfig.importMap !== 'string') {
|
|
35
|
+
throw new TypeError(`'importMap' property in Deno config must be a string`);
|
|
36
|
+
}
|
|
37
|
+
config.importMap = resolve(basePath, rawConfig.importMap);
|
|
38
|
+
}
|
|
39
|
+
return config;
|
|
40
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import tmp from 'tmp-promise';
|
|
4
|
+
import { expect, test } from 'vitest';
|
|
5
|
+
import { getConfig } from './deno_config.js';
|
|
6
|
+
test('Returns `undefined` if no config file is found', async () => {
|
|
7
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
8
|
+
const config = await getConfig(path);
|
|
9
|
+
expect(config).toBeUndefined();
|
|
10
|
+
await cleanup();
|
|
11
|
+
});
|
|
12
|
+
test('Returns an empty object if the config file cannot be parsed', async () => {
|
|
13
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
14
|
+
const configPath = join(path, 'deno.json');
|
|
15
|
+
await fs.writeFile(configPath, '{');
|
|
16
|
+
const config = await getConfig(path);
|
|
17
|
+
expect(config).toEqual({});
|
|
18
|
+
await cleanup();
|
|
19
|
+
});
|
|
20
|
+
test('Throws a type error if the `importMap` contains anything other than a string', async () => {
|
|
21
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
22
|
+
const configPath = join(path, 'deno.json');
|
|
23
|
+
const data = JSON.stringify({ importMap: { imports: { foo: './bar/' } } });
|
|
24
|
+
await fs.writeFile(configPath, data);
|
|
25
|
+
await expect(getConfig(path)).rejects.toThrowError(TypeError);
|
|
26
|
+
await cleanup();
|
|
27
|
+
});
|
|
28
|
+
test('Excludes unsupported properties', async () => {
|
|
29
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
30
|
+
const configPath = join(path, 'deno.json');
|
|
31
|
+
const data = JSON.stringify({
|
|
32
|
+
compilerOptions: {
|
|
33
|
+
allowJs: true,
|
|
34
|
+
lib: ['deno.window'],
|
|
35
|
+
strict: true,
|
|
36
|
+
},
|
|
37
|
+
importMap: 'import_map.json',
|
|
38
|
+
lint: {
|
|
39
|
+
files: {
|
|
40
|
+
include: ['src/'],
|
|
41
|
+
exclude: ['src/testdata/'],
|
|
42
|
+
},
|
|
43
|
+
rules: {
|
|
44
|
+
tags: ['recommended'],
|
|
45
|
+
include: ['ban-untagged-todo'],
|
|
46
|
+
exclude: ['no-unused-vars'],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
fmt: {
|
|
50
|
+
files: {
|
|
51
|
+
include: ['src/'],
|
|
52
|
+
exclude: ['src/testdata/'],
|
|
53
|
+
},
|
|
54
|
+
options: {
|
|
55
|
+
useTabs: true,
|
|
56
|
+
lineWidth: 80,
|
|
57
|
+
indentWidth: 4,
|
|
58
|
+
singleQuote: true,
|
|
59
|
+
proseWrap: 'preserve',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
test: {
|
|
63
|
+
files: {
|
|
64
|
+
include: ['src/'],
|
|
65
|
+
exclude: ['src/testdata/'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
await fs.writeFile(configPath, data);
|
|
70
|
+
const config = await getConfig(path);
|
|
71
|
+
expect(Object.keys(config !== null && config !== void 0 ? config : {})).toEqual(['importMap']);
|
|
72
|
+
await cleanup();
|
|
73
|
+
});
|
|
74
|
+
test('Resolves `importMap` into an absolute path', async () => {
|
|
75
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
76
|
+
const configPath = join(path, 'deno.json');
|
|
77
|
+
const data = JSON.stringify({ importMap: 'import_map.json' });
|
|
78
|
+
await fs.writeFile(configPath, data);
|
|
79
|
+
const config = await getConfig(path);
|
|
80
|
+
expect(config).toEqual({ importMap: join(path, 'import_map.json') });
|
|
81
|
+
await cleanup();
|
|
82
|
+
});
|
|
83
|
+
test('Supports JSONC', async () => {
|
|
84
|
+
const { cleanup, path } = await tmp.dir({ unsafeCleanup: true });
|
|
85
|
+
const configPath = join(path, 'deno.jsonc');
|
|
86
|
+
const data = JSON.stringify({ importMap: 'import_map.json' });
|
|
87
|
+
await fs.writeFile(configPath, `// This is a comment\n${data}`);
|
|
88
|
+
const config = await getConfig(path);
|
|
89
|
+
expect(config).toEqual({ importMap: join(path, 'import_map.json') });
|
|
90
|
+
await cleanup();
|
|
91
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const defaultFlags = {
|
|
2
2
|
edge_functions_cache_deno_dir: false,
|
|
3
3
|
edge_functions_config_export: false,
|
|
4
|
+
edge_functions_read_deno_config: false,
|
|
4
5
|
};
|
|
5
6
|
const getFlags = (input = {}, flags = defaultFlags) => Object.entries(flags).reduce((result, [key, defaultValue]) => ({
|
|
6
7
|
...result,
|
|
@@ -3,7 +3,7 @@ import { join } from 'path';
|
|
|
3
3
|
import { env } from 'process';
|
|
4
4
|
import { pathToFileURL } from 'url';
|
|
5
5
|
import { deleteAsync } from 'del';
|
|
6
|
-
const BOOTSTRAP_LATEST = 'https://
|
|
6
|
+
const BOOTSTRAP_LATEST = 'https://639708f6d7f813000870695c--edge.netlify.com/bootstrap/index-combined.ts';
|
|
7
7
|
const defaultFormatExportTypeError = (name) => `The Edge Function "${name}" has failed to load. Does it have a function as the default export?`;
|
|
8
8
|
const defaultFormatImpoortError = (name) => `There was an error with Edge Function "${name}".`;
|
|
9
9
|
const generateStage2 = async ({ distDirectory, fileName, formatExportTypeError, formatImportError, functions, }) => {
|
package/dist/node/import_map.js
CHANGED
|
@@ -79,7 +79,7 @@ class ImportMap {
|
|
|
79
79
|
async writeToFile(path) {
|
|
80
80
|
const distDirectory = dirname(path);
|
|
81
81
|
await fs.mkdir(distDirectory, { recursive: true });
|
|
82
|
-
const contents = this.getContents(
|
|
82
|
+
const contents = this.getContents();
|
|
83
83
|
await fs.writeFile(path, JSON.stringify(contents));
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
1
2
|
import { join } from 'path';
|
|
2
3
|
import { cwd } from 'process';
|
|
3
4
|
import { pathToFileURL } from 'url';
|
|
5
|
+
import tmp from 'tmp-promise';
|
|
4
6
|
import { test, expect } from 'vitest';
|
|
5
7
|
import { ImportMap } from './import_map.js';
|
|
6
8
|
test('Handles import maps with full URLs without specifying a base URL', () => {
|
|
@@ -67,3 +69,21 @@ test('Throws when an import map uses a relative path to reference a file outside
|
|
|
67
69
|
const map = new ImportMap([inputFile1]);
|
|
68
70
|
expect(() => map.getContents(basePath)).toThrowError(`Import map cannot reference '${join(cwd(), 'file.js')}' as it's outside of the base directory '${basePath}'`);
|
|
69
71
|
});
|
|
72
|
+
test('Writes import map file to disk', async () => {
|
|
73
|
+
const file = await tmp.file();
|
|
74
|
+
const basePath = join(cwd(), 'my-cool-site', 'import-map.json');
|
|
75
|
+
const inputFile1 = {
|
|
76
|
+
baseURL: pathToFileURL(basePath),
|
|
77
|
+
imports: {
|
|
78
|
+
'alias:pets': './heart/pets/file.ts',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
const map = new ImportMap([inputFile1]);
|
|
82
|
+
await map.writeToFile(file.path);
|
|
83
|
+
const createdFile = await fs.readFile(file.path, 'utf8');
|
|
84
|
+
const { imports } = JSON.parse(createdFile);
|
|
85
|
+
const expectedPath = join(cwd(), 'my-cool-site', 'heart', 'pets', 'file.ts');
|
|
86
|
+
await file.cleanup();
|
|
87
|
+
expect(imports['netlify:edge']).toBe('https://edge.netlify.com/v1/index.ts');
|
|
88
|
+
expect(imports['alias:pets']).toBe(pathToFileURL(expectedPath).toString());
|
|
89
|
+
});
|
|
@@ -18,6 +18,7 @@ interface InspectSettings {
|
|
|
18
18
|
address?: string;
|
|
19
19
|
}
|
|
20
20
|
interface ServeOptions {
|
|
21
|
+
basePath: string;
|
|
21
22
|
certificatePath?: string;
|
|
22
23
|
debug?: boolean;
|
|
23
24
|
distImportMapPath?: string;
|
|
@@ -30,7 +31,7 @@ interface ServeOptions {
|
|
|
30
31
|
port: number;
|
|
31
32
|
systemLogger?: LogFunction;
|
|
32
33
|
}
|
|
33
|
-
declare const serve: ({ certificatePath, debug, distImportMapPath, inspectSettings, formatExportTypeError, formatImportError, importMaps, onAfterDownload, onBeforeDownload, port, systemLogger, }: ServeOptions) => Promise<(functions: EdgeFunction[], env?: NodeJS.ProcessEnv, options?: StartServerOptions) => Promise<{
|
|
34
|
+
declare const serve: ({ basePath, certificatePath, debug, distImportMapPath, inspectSettings, formatExportTypeError, formatImportError, importMaps, onAfterDownload, onBeforeDownload, port, systemLogger, }: ServeOptions) => Promise<(functions: EdgeFunction[], env?: NodeJS.ProcessEnv, options?: StartServerOptions) => Promise<{
|
|
34
35
|
functionsConfig: FunctionConfig[];
|
|
35
36
|
graph: any;
|
|
36
37
|
success: boolean;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { tmpName } from 'tmp-promise';
|
|
2
2
|
import { DenoBridge } from '../bridge.js';
|
|
3
3
|
import { getFunctionConfig } from '../config.js';
|
|
4
|
+
import { getConfig as getDenoConfig } from '../deno_config.js';
|
|
4
5
|
import { generateStage2 } from '../formats/javascript.js';
|
|
5
|
-
import { ImportMap } from '../import_map.js';
|
|
6
|
+
import { ImportMap, readFile as readImportMapFile } from '../import_map.js';
|
|
6
7
|
import { getLogger } from '../logger.js';
|
|
7
8
|
import { ensureLatestTypes } from '../types.js';
|
|
8
9
|
import { killProcess, waitForServer } from './util.js';
|
|
@@ -53,7 +54,7 @@ const prepareServer = ({ deno, distDirectory, flags: denoFlags, formatExportType
|
|
|
53
54
|
};
|
|
54
55
|
return startServer;
|
|
55
56
|
};
|
|
56
|
-
const serve = async ({ certificatePath, debug, distImportMapPath, inspectSettings, formatExportTypeError, formatImportError, importMaps, onAfterDownload, onBeforeDownload, port, systemLogger, }) => {
|
|
57
|
+
const serve = async ({ basePath, certificatePath, debug, distImportMapPath, inspectSettings, formatExportTypeError, formatImportError, importMaps, onAfterDownload, onBeforeDownload, port, systemLogger, }) => {
|
|
57
58
|
const logger = getLogger(systemLogger, debug);
|
|
58
59
|
const deno = new DenoBridge({
|
|
59
60
|
debug,
|
|
@@ -71,6 +72,14 @@ const serve = async ({ certificatePath, debug, distImportMapPath, inspectSetting
|
|
|
71
72
|
// Creating an ImportMap instance with any import maps supplied by the user,
|
|
72
73
|
// if any.
|
|
73
74
|
const importMap = new ImportMap(importMaps);
|
|
75
|
+
// Look for a Deno config file and read it if one exists.
|
|
76
|
+
const denoConfig = await getDenoConfig(basePath);
|
|
77
|
+
// If the Deno config file defines an import map, read the file and add the
|
|
78
|
+
// imports to the global import map.
|
|
79
|
+
if (denoConfig === null || denoConfig === void 0 ? void 0 : denoConfig.importMap) {
|
|
80
|
+
const importMapFile = await readImportMapFile(denoConfig.importMap);
|
|
81
|
+
importMap.add(importMapFile);
|
|
82
|
+
}
|
|
74
83
|
const flags = ['--allow-all', '--unstable', `--import-map=${importMap.toDataURL()}`, '--no-config'];
|
|
75
84
|
if (certificatePath) {
|
|
76
85
|
flags.push(`--cert=${certificatePath}`);
|
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
|
+
import { pathToFileURL } from 'url';
|
|
2
3
|
import getPort from 'get-port';
|
|
3
4
|
import fetch from 'node-fetch';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
6
|
import { test, expect } from 'vitest';
|
|
5
7
|
import { fixturesDir } from '../../test/util.js';
|
|
6
8
|
import { serve } from '../index.js';
|
|
7
9
|
test('Starts a server and serves requests for edge functions', async () => {
|
|
10
|
+
const basePath = join(fixturesDir, 'serve_test');
|
|
11
|
+
const functionPaths = {
|
|
12
|
+
internal: join(basePath, '.netlify', 'edge-functions', 'greet.ts'),
|
|
13
|
+
user: join(basePath, 'netlify', 'edge-functions', 'echo_env.ts'),
|
|
14
|
+
};
|
|
8
15
|
const port = await getPort();
|
|
16
|
+
const internalImportMap = {
|
|
17
|
+
baseURL: pathToFileURL(functionPaths.internal),
|
|
18
|
+
imports: {
|
|
19
|
+
'internal-helper': '../../helper.ts',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
9
22
|
const server = await serve({
|
|
23
|
+
basePath,
|
|
24
|
+
importMaps: [internalImportMap],
|
|
10
25
|
port,
|
|
11
26
|
});
|
|
12
|
-
const functionPath = join(fixturesDir, 'serve_test', 'echo_env.ts');
|
|
13
27
|
const functions = [
|
|
14
28
|
{
|
|
15
29
|
name: 'echo_env',
|
|
16
|
-
path:
|
|
30
|
+
path: functionPaths.user,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'greet',
|
|
34
|
+
path: functionPaths.internal,
|
|
17
35
|
},
|
|
18
36
|
];
|
|
19
37
|
const options = {
|
|
@@ -23,19 +41,29 @@ test('Starts a server and serves requests for edge functions', async () => {
|
|
|
23
41
|
very_secret_secret: 'i love netlify',
|
|
24
42
|
}, options);
|
|
25
43
|
expect(success).toBe(true);
|
|
26
|
-
expect(functionsConfig).toEqual([{ path: '/my-function' }]);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
expect(functionsConfig).toEqual([{ path: '/my-function' }, {}]);
|
|
45
|
+
for (const key in functionPaths) {
|
|
46
|
+
const graphEntry = graph === null || graph === void 0 ? void 0 : graph.modules.some(
|
|
47
|
+
// @ts-expect-error TODO: Module graph is currently not typed
|
|
48
|
+
({ kind, mediaType, local }) => kind === 'esm' && mediaType === 'TypeScript' && local === functionPaths[key]);
|
|
49
|
+
expect(graphEntry).toBe(true);
|
|
50
|
+
}
|
|
51
|
+
const response1 = await fetch(`http://0.0.0.0:${port}/foo`, {
|
|
32
52
|
headers: {
|
|
33
53
|
'x-deno-functions': 'echo_env',
|
|
34
54
|
'x-deno-pass': 'passthrough',
|
|
35
|
-
'X-NF-Request-ID':
|
|
55
|
+
'X-NF-Request-ID': uuidv4(),
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
expect(response1.status).toBe(200);
|
|
59
|
+
expect(await response1.text()).toBe('I LOVE NETLIFY');
|
|
60
|
+
const response2 = await fetch(`http://0.0.0.0:${port}/greet`, {
|
|
61
|
+
headers: {
|
|
62
|
+
'x-deno-functions': 'greet',
|
|
63
|
+
'x-deno-pass': 'passthrough',
|
|
64
|
+
'X-NF-Request-ID': uuidv4(),
|
|
36
65
|
},
|
|
37
66
|
});
|
|
38
|
-
expect(
|
|
39
|
-
|
|
40
|
-
expect(body.very_secret_secret).toBe('i love netlify');
|
|
67
|
+
expect(response2.status).toBe(200);
|
|
68
|
+
expect(await response2.text()).toBe('HELLO!');
|
|
41
69
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netlify/edge-bundler",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Intelligently prepare Netlify Edge Functions for deployment",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/node/index.js",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"nock": "^13.2.4",
|
|
67
67
|
"tar": "^6.1.11",
|
|
68
68
|
"typescript": "^4.5.4",
|
|
69
|
-
"vite": "^
|
|
69
|
+
"vite": "^4.0.0",
|
|
70
70
|
"vitest": "^0.25.0"
|
|
71
71
|
},
|
|
72
72
|
"engines": {
|
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
"find-up": "^6.3.0",
|
|
85
85
|
"get-port": "^6.1.2",
|
|
86
86
|
"glob-to-regexp": "^0.4.1",
|
|
87
|
+
"jsonc-parser": "^3.2.0",
|
|
87
88
|
"node-fetch": "^3.1.1",
|
|
88
89
|
"node-stream-zip": "^1.15.0",
|
|
89
90
|
"p-retry": "^5.1.1",
|