@edgeone/nuxt-pages 1.0.0-beta.1

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.
@@ -0,0 +1,439 @@
1
+
2
+ var require = await (async () => {
3
+ var { createRequire } = await import("node:module");
4
+ return createRequire(import.meta.url);
5
+ })();
6
+
7
+ import {
8
+ getModulesWithAST,
9
+ getPrerenderRoutesWithAST,
10
+ getRouteRulesWithAST,
11
+ getRoutesArrayWithAST
12
+ } from "./chunk-5JK44IEA.js";
13
+
14
+ // src/build/plugin-context.ts
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { readFile } from "node:fs/promises";
17
+ import { createRequire } from "node:module";
18
+ import { join, relative, resolve } from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+ var MODULE_DIR = fileURLToPath(new URL(".", import.meta.url));
21
+ var PLUGIN_DIR = join(MODULE_DIR, "../..");
22
+ var DEFAULT_BUILD_DIR = ".nuxt";
23
+ var DEFAULT_OUTPUT_DIR = ".edgeone";
24
+ var SERVER_HANDLER_NAME = "cloud-functions/ssr-node";
25
+ var PluginContext = class {
26
+ edgeoneConfig;
27
+ pluginName;
28
+ pluginVersion;
29
+ utils;
30
+ constants;
31
+ packageJSON;
32
+ _nuxtConfigPath = null;
33
+ _nuxtServerFile = null;
34
+ /** The directory where the plugin is located */
35
+ pluginDir = PLUGIN_DIR;
36
+ serverlessWrapHandler;
37
+ get relPublishDir() {
38
+ return this.constants.PUBLISH_DIR ?? join(this.constants.PACKAGE_PATH || "", DEFAULT_OUTPUT_DIR);
39
+ }
40
+ /** Absolute path of the publish directory */
41
+ get publishDir() {
42
+ return resolve(this.relPublishDir);
43
+ }
44
+ /**
45
+ * Relative package path in non monorepo setups this is an empty string
46
+ * This path is provided by Nuxt build manifest
47
+ * @example ''
48
+ * @example 'apps/my-app'
49
+ */
50
+ get relativeAppDir() {
51
+ return this.buildManifest?.buildDir ?? "";
52
+ }
53
+ /**
54
+ * The working directory inside the lambda that is used for monorepos to execute the serverless function
55
+ */
56
+ get lambdaWorkingDirectory() {
57
+ return "";
58
+ }
59
+ /**
60
+ * The resolved relative nuxt build directory defaults to `.nuxt`,
61
+ * but can be configured through the nuxt.config.js. For monorepos this will include the packagePath
62
+ * If we need just the plain build dir use the `nuxtBuildDir`
63
+ */
64
+ get buildDir() {
65
+ const dir = this.buildConfig?.buildDir ?? DEFAULT_BUILD_DIR;
66
+ return relative(process.cwd(), resolve(this.relativeAppDir, dir));
67
+ }
68
+ /** The directory where the Nuxt output is stored */
69
+ get outputDir() {
70
+ return DEFAULT_OUTPUT_DIR;
71
+ }
72
+ get buildVersion() {
73
+ return this.constants.BUILD_VERSION || "v0.0.0";
74
+ }
75
+ get useRegionalBlobs() {
76
+ const REQUIRED_BUILD_VERSION = ">=29.41.5";
77
+ const currentVersion = this.buildVersion.replace("v", "");
78
+ const requiredVersion = REQUIRED_BUILD_VERSION.replace(">=", "");
79
+ return currentVersion >= requiredVersion;
80
+ }
81
+ /**
82
+ * Absolute path of the directory containing the files for the serverless lambda function
83
+ * `.edgeone/functions-internal`
84
+ */
85
+ get serverFunctionsDir() {
86
+ return this.resolveFromPackagePath(".edgeone");
87
+ }
88
+ /** Absolute path of the server handler */
89
+ get serverHandlerRootDir() {
90
+ return join(this.serverFunctionsDir, SERVER_HANDLER_NAME);
91
+ }
92
+ get serverHandlerDir() {
93
+ return this.serverHandlerRootDir;
94
+ }
95
+ get serverHandlerRuntimeModulesDir() {
96
+ return join(this.serverHandlerDir, ".edgeone");
97
+ }
98
+ get nuxtServerHandler() {
99
+ return "./.edgeone/dist/run/handlers/server.js";
100
+ }
101
+ constructor(options) {
102
+ options = {
103
+ ...options,
104
+ functions: {
105
+ "*": {}
106
+ },
107
+ constants: {
108
+ // BUILD_VERSION: '32.1.4',
109
+ ...options.constants,
110
+ PUBLISH_DIR: options.constants?.PUBLISH_DIR || ".output"
111
+ }
112
+ };
113
+ this.constants = options.constants;
114
+ this.packageJSON = JSON.parse(readFileSync(join(PLUGIN_DIR, "package.json"), "utf-8"));
115
+ this.pluginName = this.packageJSON.name;
116
+ this.pluginVersion = this.packageJSON.version;
117
+ }
118
+ /** Resolves a path correctly with mono repository awareness for .edgeone directories mainly */
119
+ resolveFromPackagePath(...args) {
120
+ return resolve(this.constants.PACKAGE_PATH || "", ...args);
121
+ }
122
+ /** Get the nuxt routes manifest */
123
+ async getRoutesManifest() {
124
+ try {
125
+ let routesData = await this.getRouteRules();
126
+ if (!routesData) {
127
+ return { routes: [], prerendered: [] };
128
+ }
129
+ const routes = Array.isArray(routesData) ? routesData.map((route) => ({
130
+ path: route.path || route.route,
131
+ file: route.file || "",
132
+ prerender: route.prerender || false,
133
+ ssr: route.ssr !== false,
134
+ swr: route.swr ? route.swr : route.isr ? route.isr : false
135
+ })) : [];
136
+ return { routes, prerendered: routes.filter((r) => r.prerender).map((r) => r.path) };
137
+ } catch (error) {
138
+ return { routes: [], prerendered: [] };
139
+ }
140
+ }
141
+ /**
142
+ * Uses various heuristics to try to find the .output dir.
143
+ * Works by looking for nitro.json, so requires the site to have been built
144
+ */
145
+ findDotOutput() {
146
+ for (const dir of [
147
+ // The publish directory
148
+ this.publishDir,
149
+ // In the root
150
+ resolve(DEFAULT_OUTPUT_DIR),
151
+ // The sibling of the publish directory
152
+ resolve(this.publishDir, "..", DEFAULT_OUTPUT_DIR),
153
+ // In the package dir
154
+ resolve(this.constants.PACKAGE_PATH || "", DEFAULT_OUTPUT_DIR)
155
+ ]) {
156
+ if (existsSync(join(dir, "nitro.json"))) {
157
+ return dir;
158
+ }
159
+ }
160
+ return false;
161
+ }
162
+ // don't make private as it is handy inside testing to override the config
163
+ _buildManifest = null;
164
+ /** Get Build manifest from build output **/
165
+ get buildManifest() {
166
+ if (!this._buildManifest) {
167
+ let buildManifestJson = join(this.publishDir, "build-manifest.json");
168
+ if (!existsSync(buildManifestJson)) {
169
+ const dotOutput = this.findDotOutput();
170
+ if (dotOutput) {
171
+ buildManifestJson = join(dotOutput, "build-manifest.json");
172
+ }
173
+ }
174
+ if (existsSync(buildManifestJson)) {
175
+ this._buildManifest = JSON.parse(
176
+ readFileSync(buildManifestJson, "utf-8")
177
+ );
178
+ } else {
179
+ this._buildManifest = {
180
+ version: "1.0.0",
181
+ config: {},
182
+ buildDir: DEFAULT_BUILD_DIR,
183
+ outputDir: DEFAULT_OUTPUT_DIR,
184
+ routes: {},
185
+ assets: {}
186
+ };
187
+ }
188
+ }
189
+ return this._buildManifest;
190
+ }
191
+ #exportDetail = null;
192
+ /** Get metadata when output = static */
193
+ get exportDetail() {
194
+ if (this.buildConfig?.nitro?.prerender !== true) {
195
+ return null;
196
+ }
197
+ if (!this.#exportDetail) {
198
+ const detailFile = join(
199
+ this.buildManifest.buildDir,
200
+ "export-detail.json"
201
+ );
202
+ if (!existsSync(detailFile)) {
203
+ return null;
204
+ }
205
+ try {
206
+ this.#exportDetail = JSON.parse(readFileSync(detailFile, "utf-8"));
207
+ } catch {
208
+ }
209
+ }
210
+ return this.#exportDetail;
211
+ }
212
+ /** Get Nuxt Config from build output **/
213
+ get buildConfig() {
214
+ return this.buildManifest.config;
215
+ }
216
+ /** Get the path to nuxt.config.ts file */
217
+ get nuxtConfigPath() {
218
+ if (!this._nuxtConfigPath) {
219
+ this._nuxtConfigPath = this.detectNuxtConfigPath();
220
+ }
221
+ return this._nuxtConfigPath;
222
+ }
223
+ get nuxtServerFile() {
224
+ if (!this._nuxtServerFile) {
225
+ this._nuxtServerFile = this.detectNuxtServerFile();
226
+ }
227
+ return this._nuxtServerFile;
228
+ }
229
+ /** Detect and locate nuxt.config.ts file */
230
+ detectNuxtConfigPath() {
231
+ const configFiles = ["nuxt.config.ts", "nuxt.config.js", "nuxt.config.mjs"];
232
+ for (const configFile of configFiles) {
233
+ const configPath = this.resolveFromPackagePath(configFile);
234
+ if (existsSync(configPath)) {
235
+ return configPath;
236
+ }
237
+ }
238
+ console.log("Can't find nuxt.config.ts file");
239
+ return null;
240
+ }
241
+ /** Detect and locate server.mjs file */
242
+ detectNuxtServerFile() {
243
+ const serverFilePath = this.resolveFromPackagePath(".edgeone", "cloud-functions", "ssr-node", "chunks", "build", "server.mjs");
244
+ if (existsSync(serverFilePath)) {
245
+ return serverFilePath;
246
+ }
247
+ return null;
248
+ }
249
+ /** Read and parse nuxt.config.ts file content */
250
+ async getNuxtConfig() {
251
+ const configPath = this.nuxtConfigPath;
252
+ if (!configPath) {
253
+ console.warn("No Nuxt config file found");
254
+ return null;
255
+ }
256
+ try {
257
+ console.log("Loading Nuxt config from:", configPath);
258
+ const configContent = readFileSync(configPath, "utf-8");
259
+ console.log("Reading config file content...");
260
+ return configContent;
261
+ } catch (error) {
262
+ console.warn(`Failed to load Nuxt config from ${configPath}:`, error);
263
+ return null;
264
+ }
265
+ }
266
+ async getNuxtServerFile() {
267
+ const serverFilePath = this.nuxtServerFile;
268
+ if (!serverFilePath) {
269
+ console.warn("No Nuxt server file found");
270
+ return null;
271
+ }
272
+ try {
273
+ console.log("Loading Nuxt server file from:", serverFilePath);
274
+ const serverContent = readFileSync(serverFilePath, "utf-8");
275
+ console.log("Reading server file content...");
276
+ return serverContent;
277
+ } catch (error) {
278
+ console.warn(`Failed to load Nuxt server file from ${serverFilePath}:`, error);
279
+ return null;
280
+ }
281
+ }
282
+ /** Get routeRules from nuxt.config.ts */
283
+ async getRouteRules() {
284
+ const nitroPrerenderRoutes = await this.getPrerenderRoutes();
285
+ const nuxtConfigRoutes = getRouteRulesWithAST(await this.getNuxtConfig() || "");
286
+ const result = [];
287
+ for (const key in nuxtConfigRoutes) {
288
+ const obj = {
289
+ path: key,
290
+ prerender: nuxtConfigRoutes[key].prerender === true,
291
+ ssr: !nuxtConfigRoutes[key].prerender && !(nuxtConfigRoutes[key].hasOwnProperty("swr") || nuxtConfigRoutes[key].hasOwnProperty("isr")),
292
+ swr: false
293
+ };
294
+ if (nuxtConfigRoutes[key].hasOwnProperty("swr")) {
295
+ obj.swr = nuxtConfigRoutes[key].swr;
296
+ }
297
+ if (nuxtConfigRoutes[key].hasOwnProperty("isr")) {
298
+ obj.swr = nuxtConfigRoutes[key].isr;
299
+ }
300
+ if (nuxtConfigRoutes[key].hasOwnProperty("prerender") && nuxtConfigRoutes[key].prerender) {
301
+ Object.defineProperty(obj, "file", {
302
+ value: `asset${key}/index.html`,
303
+ enumerable: true
304
+ });
305
+ }
306
+ result.push(obj);
307
+ }
308
+ const serverRoutes = getRoutesArrayWithAST(await this.getNuxtServerFile() || "");
309
+ serverRoutes.forEach((item) => {
310
+ const keys = result.map((obj) => obj.path);
311
+ const pathWithoutBracket = item.path.replace(/\[|\]$/g, "").replace(/\(|\)$/g, "");
312
+ if (!keys.includes(pathWithoutBracket)) {
313
+ if (nitroPrerenderRoutes.includes(item.path)) {
314
+ result.push({
315
+ path: item.path,
316
+ prerender: true,
317
+ ssr: false,
318
+ swr: false
319
+ });
320
+ } else {
321
+ result.push({
322
+ path: item.path,
323
+ prerender: false,
324
+ ssr: true,
325
+ swr: false
326
+ });
327
+ }
328
+ }
329
+ });
330
+ return result;
331
+ }
332
+ #nuxtVersion = void 0;
333
+ /**
334
+ * Get the exact Nuxt version installed in the project.
335
+ *
336
+ * Prefer resolving `nuxt/package.json` from the app root (works for monorepo and Yarn PnP),
337
+ * then fall back to node_modules.
338
+ */
339
+ get nuxtVersion() {
340
+ if (this.#nuxtVersion !== void 0) return this.#nuxtVersion;
341
+ const roots = [this.constants.PACKAGE_PATH || process.cwd()].filter(Boolean);
342
+ const readJsonVersion = (pkgJsonPath) => {
343
+ try {
344
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
345
+ return typeof pkg.version === "string" && pkg.version.trim() ? pkg.version.trim() : null;
346
+ } catch {
347
+ return null;
348
+ }
349
+ };
350
+ try {
351
+ const require2 = createRequire(import.meta.url);
352
+ const resolved = require2.resolve("nuxt/package.json", { paths: roots });
353
+ const v = readJsonVersion(resolved);
354
+ if (v) {
355
+ this.#nuxtVersion = v;
356
+ return this.#nuxtVersion;
357
+ }
358
+ } catch {
359
+ }
360
+ for (const root of roots) {
361
+ const candidate = resolve(root, "node_modules", "nuxt", "package.json");
362
+ if (existsSync(candidate)) {
363
+ const v = readJsonVersion(candidate);
364
+ if (v) {
365
+ this.#nuxtVersion = v;
366
+ return this.#nuxtVersion;
367
+ }
368
+ }
369
+ }
370
+ this.#nuxtVersion = null;
371
+ return this.#nuxtVersion;
372
+ }
373
+ #nuxtModules = null;
374
+ async nuxtModules() {
375
+ if (!this.#nuxtModules) {
376
+ const nuxtConfig = await this.getNuxtConfig();
377
+ if (!nuxtConfig) {
378
+ this.#nuxtModules = null;
379
+ return this.#nuxtModules;
380
+ }
381
+ try {
382
+ const modules = getModulesWithAST(nuxtConfig);
383
+ this.#nuxtModules = modules;
384
+ } catch (error) {
385
+ console.error("Error extracting modules from nuxt.config.ts:", error);
386
+ this.#nuxtModules = null;
387
+ }
388
+ }
389
+ return this.#nuxtModules;
390
+ }
391
+ #staticPages = null;
392
+ /**
393
+ * Get an array of static pages that are fully prerendered.
394
+ * Those are being served as-is without involving server-side rendering
395
+ */
396
+ async getStaticPages() {
397
+ if (!this.#staticPages) {
398
+ const routesManifest = await this.getRoutesManifest();
399
+ this.#staticPages = routesManifest.routes.filter((route) => route.prerender === true).map((route) => route.path);
400
+ }
401
+ return this.#staticPages;
402
+ }
403
+ /** Get prerender routes from nuxt.config.ts */
404
+ async getPrerenderRoutes() {
405
+ try {
406
+ const configPath = join(process.cwd(), "nuxt.config.ts");
407
+ if (!existsSync(configPath)) {
408
+ console.warn("nuxt.config.ts not found, returning empty prerender routes");
409
+ return [];
410
+ }
411
+ const configContent = await readFile(configPath, "utf-8");
412
+ const prerenderRoutes = getPrerenderRoutesWithAST(configContent);
413
+ return prerenderRoutes;
414
+ } catch (error) {
415
+ console.error("Error reading prerender routes from nuxt.config.ts:", error);
416
+ return [];
417
+ }
418
+ }
419
+ async nuxtStaticGeneration() {
420
+ const nitroJSON = await readFile(join(this.outputDir, "nitro.json"), "utf-8") || "{}";
421
+ if (!nitroJSON) return false;
422
+ const nitroJSONData = JSON.parse(nitroJSON);
423
+ if (nitroJSONData.preset && nitroJSONData.preset === "static") return true;
424
+ return false;
425
+ }
426
+ /** Fails a build with a message and an optional error */
427
+ failBuild(message, error) {
428
+ console.error(message);
429
+ if (error) {
430
+ console.error(error);
431
+ }
432
+ process.exit(1);
433
+ }
434
+ };
435
+
436
+ export {
437
+ SERVER_HANDLER_NAME,
438
+ PluginContext
439
+ };
package/dist/index.js ADDED
@@ -0,0 +1,89 @@
1
+
2
+ var require = await (async () => {
3
+ var { createRequire } = await import("node:module");
4
+ return createRequire(import.meta.url);
5
+ })();
6
+
7
+ import {
8
+ PluginContext
9
+ } from "./esm-chunks/chunk-Y3YAV6NZ.js";
10
+ import {
11
+ createNuxtRoutesMeta
12
+ } from "./esm-chunks/chunk-UFRAZNP3.js";
13
+ import {
14
+ createServerHandler,
15
+ patchNitroHandler
16
+ } from "./esm-chunks/chunk-L23O2KDO.js";
17
+ import "./esm-chunks/chunk-TP3RAVPL.js";
18
+ import {
19
+ addNitroBuildOutputConfig,
20
+ resetNitroConfig
21
+ } from "./esm-chunks/chunk-7RNB5RB6.js";
22
+ import {
23
+ resetEdgeOneConfig,
24
+ useStaticBuild
25
+ } from "./esm-chunks/chunk-5JK44IEA.js";
26
+ import "./esm-chunks/chunk-V2LFVP3C.js";
27
+ import "./esm-chunks/chunk-6BT4RYQJ.js";
28
+
29
+ // src/index.ts
30
+ import { rm } from "node:fs/promises";
31
+ import { join } from "node:path";
32
+ import { existsSync } from "node:fs";
33
+ async function checkModules(ctx, targetModules) {
34
+ const modules = await ctx.nuxtModules();
35
+ if (!modules) return false;
36
+ return modules.includes(targetModules);
37
+ }
38
+ var removeServerHandler = async (ctx) => {
39
+ await rm(ctx.serverHandlerDir, { recursive: true, force: true });
40
+ };
41
+ var removeIndexMJS = async (ctx) => {
42
+ if (existsSync(join(ctx.serverHandlerDir, "index.mjs"))) {
43
+ await rm(join(ctx.serverHandlerDir, "index.mjs"), { force: true });
44
+ }
45
+ };
46
+ var recordOldNitroConfig = null;
47
+ var recordOldEdgeOneConfig = -1;
48
+ var onPreBuild = async (options) => {
49
+ console.log("\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C}\u{1F62C} ======= new nuxt pages 1.1.0+ ============");
50
+ try {
51
+ const ctx = new PluginContext(options);
52
+ recordOldNitroConfig = await addNitroBuildOutputConfig(ctx);
53
+ const packagePath = ctx.resolveFromPackagePath("");
54
+ const cwd = packagePath || process.cwd();
55
+ if (await checkModules(ctx, "@nuxt/content")) {
56
+ console.warn("\u26A0\uFE0F @nuxt/content detected, switching to static deployment.");
57
+ recordOldEdgeOneConfig = useStaticBuild(cwd);
58
+ }
59
+ } catch (error) {
60
+ console.error("onPreBuild failed:", error);
61
+ }
62
+ };
63
+ var onBuild = async (options) => {
64
+ const ctx = new PluginContext(options);
65
+ const isStaticGeneration = await ctx.nuxtStaticGeneration();
66
+ if (isStaticGeneration) {
67
+ await removeServerHandler(ctx);
68
+ return;
69
+ }
70
+ await createServerHandler(ctx), await createNuxtRoutesMeta(ctx);
71
+ await patchNitroHandler(ctx);
72
+ };
73
+ var onPostBuild = async (options) => {
74
+ const ctx = new PluginContext(options);
75
+ const packagePath = ctx.resolveFromPackagePath("");
76
+ const cwd = packagePath || process.cwd();
77
+ if (recordOldNitroConfig) {
78
+ await resetNitroConfig(recordOldNitroConfig.oldOutput, recordOldNitroConfig.oldPreset);
79
+ await removeIndexMJS(ctx);
80
+ }
81
+ if (recordOldEdgeOneConfig !== -1) {
82
+ resetEdgeOneConfig(cwd, recordOldEdgeOneConfig);
83
+ }
84
+ };
85
+ export {
86
+ onBuild,
87
+ onPostBuild,
88
+ onPreBuild
89
+ };
@@ -0,0 +1,6 @@
1
+
2
+ var require = await (async () => {
3
+ var { createRequire } = await import("node:module");
4
+ return createRequire(import.meta.url);
5
+ })();
6
+
package/dist/utils.js ADDED
@@ -0,0 +1,29 @@
1
+
2
+ var require = await (async () => {
3
+ var { createRequire } = await import("node:module");
4
+ return createRequire(import.meta.url);
5
+ })();
6
+
7
+ import {
8
+ addCodeToGenerateEdgeoneWithAST,
9
+ getHandlersArrayWithAST,
10
+ getModulesWithAST,
11
+ getPrerenderRoutesWithAST,
12
+ getRouteRulesWithAST,
13
+ getRoutesArrayWithAST,
14
+ resetEdgeOneConfig,
15
+ resetNitroConfigWithAST,
16
+ useStaticBuild
17
+ } from "./esm-chunks/chunk-5JK44IEA.js";
18
+ import "./esm-chunks/chunk-6BT4RYQJ.js";
19
+ export {
20
+ addCodeToGenerateEdgeoneWithAST,
21
+ getHandlersArrayWithAST,
22
+ getModulesWithAST,
23
+ getPrerenderRoutesWithAST,
24
+ getRouteRulesWithAST,
25
+ getRoutesArrayWithAST,
26
+ resetEdgeOneConfig,
27
+ resetNitroConfigWithAST,
28
+ useStaticBuild
29
+ };
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@edgeone/nuxt-pages",
3
+ "version": "1.0.0-beta.1",
4
+ "main": "./dist/index.js",
5
+ "scripts": {
6
+ "test": "vitest run --passWithNoTests",
7
+ "build": "node ./tools/build.js",
8
+ "build:watch": "node ./tools/build.js --watch",
9
+ "start": "node dist/index.js",
10
+ "audit": "npm audit",
11
+ "audit:fix": "npm audit fix",
12
+ "security": "npm audit && npm outdated"
13
+ },
14
+ "type": "module",
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "keywords": [
23
+ "nuxt",
24
+ "deploy",
25
+ "edgeone"
26
+ ],
27
+ "author": "Venzil",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/q153877011/edgeone-nuxt-deploy.git"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/q153877011/edgeone-nuxt-deploy/issues"
34
+ },
35
+ "homepage": "https://github.com/q153877011/edgeone-nuxt-deploy#readme",
36
+ "license": "ISC",
37
+ "description": "",
38
+ "dependencies": {
39
+ "@babel/parser": "^7.28.4",
40
+ "@babel/traverse": "^7.28.4",
41
+ "@babel/types": "^7.28.4",
42
+ "@netlify/functions": "^3.1.10",
43
+ "@nuxt/kit": "^3.14.0",
44
+ "@opentelemetry/api": "^1.9.0",
45
+ "fast-glob": "^3.3.3",
46
+ "lru-cache": "^10.4.3",
47
+ "vitest": "^3.2.4"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^20.19.23",
51
+ "@types/picomatch": "^3.0.2",
52
+ "@types/uuid": "^10.0.0",
53
+ "esbuild": "^0.25.11",
54
+ "execa": "^8.0.1",
55
+ "ts-node": "^10.9.2",
56
+ "typescript": "^5.9.3"
57
+ }
58
+ }