@nuxt/devtools 1.0.2 → 1.0.4

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 (120) hide show
  1. package/README.md +2 -1
  2. package/dist/chunks/module-main.mjs +145 -103
  3. package/dist/chunks/vscode.mjs +5 -5
  4. package/dist/client/200.html +35 -35
  5. package/dist/client/404.html +35 -35
  6. package/dist/client/_nuxt/{CodeDiff.vue.495a2700.js → CodeDiff.vue.d8722166.js} +2 -2
  7. package/dist/client/_nuxt/{ComposableItem.vue.09c56ec4.js → ComposableItem.vue.a0062ecc.js} +1 -1
  8. package/dist/client/_nuxt/{DataSchemaButton.vue.058ff215.js → DataSchemaButton.vue.baec9a00.js} +1 -1
  9. package/dist/client/_nuxt/{DataSchemaDrawer.d62bbda3.js → DataSchemaDrawer.b2c7e5f0.js} +3 -3
  10. package/dist/client/_nuxt/{DurationDisplay.vue.e7d2f90b.js → DurationDisplay.vue.75bf04c2.js} +1 -1
  11. package/dist/client/_nuxt/{FilepathItem.vue.feb8a13c.js → FilepathItem.vue.7a091e26.js} +1 -1
  12. package/dist/client/_nuxt/{HelpFab.vue.70bfd8f0.js → HelpFab.vue.07720a44.js} +1 -1
  13. package/dist/client/_nuxt/LaunchPage.vue.51fc4c47.js +1 -0
  14. package/dist/client/_nuxt/NBadge.ce033599.js +1 -0
  15. package/dist/client/_nuxt/NCheckbox.vue.0f5a8440.js +1 -0
  16. package/dist/client/_nuxt/{NCodeBlock.vue.c114d969.js → NCodeBlock.vue.4697f7e4.js} +2 -2
  17. package/dist/client/_nuxt/{NDrawer.vue.4bcebe5d.js → NDrawer.vue.4b4bd813.js} +1 -1
  18. package/dist/client/_nuxt/NDropdown.vue.ddbb4404.js +1 -0
  19. package/dist/client/_nuxt/{NIconTitle.vue.dcd70230.js → NIconTitle.vue.8be5866f.js} +1 -1
  20. package/dist/client/_nuxt/{NLink.vue.353afc82.js → NLink.vue.99516332.js} +1 -1
  21. package/dist/client/_nuxt/{NMarkdown.vue.4e215b1f.js → NMarkdown.vue.d386a844.js} +1 -1
  22. package/dist/client/_nuxt/{NNavbar.vue.29f03776.js → NNavbar.vue.a82b9c01.js} +1 -1
  23. package/dist/client/_nuxt/NSectionBlock.1609c1ec.js +1 -0
  24. package/dist/client/_nuxt/NSelect.vue.7cf27fe7.js +1 -0
  25. package/dist/client/_nuxt/NSelectTabs.vue.8f4924f6.js +1 -0
  26. package/dist/client/_nuxt/NSwitch.vue.6fd7c26d.js +1 -0
  27. package/dist/client/_nuxt/StacktraceList.vue.a2e4171d.js +1 -0
  28. package/dist/client/_nuxt/StateEditor.vue.777f604e.js +1 -0
  29. package/dist/client/_nuxt/{__blank.961dc152.js → __blank.2e21a1a7.js} +1 -1
  30. package/dist/client/_nuxt/analyze-build.371a5734.js +1 -0
  31. package/dist/client/_nuxt/assets.439f186c.js +16 -0
  32. package/dist/client/_nuxt/builds/latest.json +1 -1
  33. package/dist/client/_nuxt/builds/meta/f35e8543-749e-4b65-87f9-0ac9fa3dd3ab.json +1 -0
  34. package/dist/client/_nuxt/{client.4841a079.js → client.bd4053bc.js} +1 -1
  35. package/dist/client/_nuxt/{components.3821affe.js → components.ccf2fad3.js} +5 -5
  36. package/dist/client/_nuxt/{custom-_name_.45e0e481.js → custom-_name_.b0891a20.js} +1 -1
  37. package/dist/client/_nuxt/{default.551695d6.js → default.97700872.js} +1 -1
  38. package/dist/client/_nuxt/{entry.aa8c94e8.css → entry.2732f55b.css} +1 -1
  39. package/dist/client/_nuxt/entry.35c58391.js +27 -0
  40. package/dist/client/_nuxt/{error-404.c4b39504.js → error-404.576aef72.js} +1 -1
  41. package/dist/client/_nuxt/{error-500.4029de92.js → error-500.61e43a5a.js} +1 -1
  42. package/dist/client/_nuxt/error.82c66fee.js +9 -0
  43. package/dist/client/_nuxt/full.72d92407.js +1 -0
  44. package/dist/client/_nuxt/{hooks.ad652487.js → hooks.889b91ae.js} +1 -1
  45. package/dist/client/_nuxt/{imports.779c7207.js → imports.8a1177ed.js} +1 -1
  46. package/dist/client/_nuxt/{index.07112662.js → index.0214b01d.js} +1 -1
  47. package/dist/client/_nuxt/{index.8874e47c.js → index.11f08f78.js} +1 -1
  48. package/dist/client/_nuxt/{json-editor-vue.b1851782.js → json-editor-vue.24ac60a9.js} +1 -1
  49. package/dist/client/_nuxt/modules.0ea1264b.js +2 -0
  50. package/dist/client/_nuxt/{none.48f4e2a5.js → none.9d86a5c5.js} +1 -1
  51. package/dist/client/_nuxt/{open-graph.545307be.js → open-graph.ce924f19.js} +2 -2
  52. package/dist/client/_nuxt/overview.811117a6.js +1 -0
  53. package/dist/client/_nuxt/{pages.065c5174.js → pages.f870c402.js} +1 -1
  54. package/dist/client/_nuxt/{payload.f3ad6ba9.js → payload.ae9699f5.js} +1 -1
  55. package/dist/client/_nuxt/{plugins.97361fa6.js → plugins.a8eafa2c.js} +1 -1
  56. package/dist/client/_nuxt/{runtime-configs.04157e18.js → runtime-configs.344cb73a.js} +1 -1
  57. package/dist/client/_nuxt/server-routes.d5948352.js +9 -0
  58. package/dist/client/_nuxt/settings.a887e1c0.js +1 -0
  59. package/dist/client/_nuxt/{state-components.9496e3b2.js → state-components.295d8108.js} +1 -1
  60. package/dist/client/_nuxt/state-modules.a1a00874.js +1 -0
  61. package/dist/client/_nuxt/storage-options.835c9b2d.js +1 -0
  62. package/dist/client/_nuxt/storage.d4c1d127.js +1 -0
  63. package/dist/client/_nuxt/{terminals.ad730beb.js → terminals.3c6722c6.js} +1 -1
  64. package/dist/client/_nuxt/timeline.cebcddc5.js +29 -0
  65. package/dist/client/_nuxt/unocss-runtime.eab56c8d.js +2 -0
  66. package/dist/client/_nuxt/virtual-files.33dacdaf.js +1 -0
  67. package/dist/client/index.html +35 -35
  68. package/dist/module.json +1 -1
  69. package/dist/module.mjs +1 -1
  70. package/dist/runtime/plugins/devtools.client.mjs +2 -2
  71. package/dist/runtime/plugins/view/FrameBox.vue +1 -1
  72. package/dist/runtime/plugins/view/Main.vue +2 -0
  73. package/dist/runtime/plugins/view/client.mjs +3 -2
  74. package/dist/shared/devtools.371fa152.mjs +111 -0
  75. package/package.json +25 -25
  76. package/dist/client/__blank/index.html +0 -42
  77. package/dist/client/_nuxt/LaunchPage.vue.68d99ad2.js +0 -1
  78. package/dist/client/_nuxt/NBadge.b912de36.js +0 -1
  79. package/dist/client/_nuxt/NCheckbox.vue.a65a9466.js +0 -1
  80. package/dist/client/_nuxt/NDropdown.vue.32f13066.js +0 -1
  81. package/dist/client/_nuxt/NSectionBlock.56f7fa97.js +0 -1
  82. package/dist/client/_nuxt/NSelect.vue.d4b5d548.js +0 -1
  83. package/dist/client/_nuxt/NSelectTabs.vue.f4ae464e.js +0 -1
  84. package/dist/client/_nuxt/NSwitch.vue.95382b67.js +0 -1
  85. package/dist/client/_nuxt/NTip.vue.fbfe6de9.js +0 -1
  86. package/dist/client/_nuxt/StateEditor.vue.9d7dcb3f.js +0 -1
  87. package/dist/client/_nuxt/analyze-build.29ca822b.js +0 -1
  88. package/dist/client/_nuxt/assets.5182b2b7.js +0 -16
  89. package/dist/client/_nuxt/builds/meta/9c2bc90a-5134-40c2-becb-286bd0304a77.json +0 -1
  90. package/dist/client/_nuxt/entry.5d59ff5c.js +0 -27
  91. package/dist/client/_nuxt/full.b09bb7d2.js +0 -1
  92. package/dist/client/_nuxt/modules.53d23733.js +0 -2
  93. package/dist/client/_nuxt/overview.60692331.js +0 -1
  94. package/dist/client/_nuxt/server-routes.631067b9.js +0 -9
  95. package/dist/client/_nuxt/settings.72bdb2b5.js +0 -1
  96. package/dist/client/_nuxt/state-modules.3599ee72.js +0 -1
  97. package/dist/client/_nuxt/storage-options.5fca38da.js +0 -1
  98. package/dist/client/_nuxt/storage.be53a14a.js +0 -1
  99. package/dist/client/_nuxt/timeline.b8cc1d67.js +0 -29
  100. package/dist/client/_nuxt/unocss-runtime.55c74b5c.js +0 -2
  101. package/dist/client/_nuxt/virtual-files.7fd05201.js +0 -1
  102. package/dist/client/modules/analyze-build/index.html +0 -42
  103. package/dist/client/modules/assets/index.html +0 -42
  104. package/dist/client/modules/components/index.html +0 -42
  105. package/dist/client/modules/hooks/index.html +0 -42
  106. package/dist/client/modules/imports/index.html +0 -42
  107. package/dist/client/modules/modules/index.html +0 -42
  108. package/dist/client/modules/open-graph/index.html +0 -42
  109. package/dist/client/modules/overview/index.html +0 -42
  110. package/dist/client/modules/pages/index.html +0 -42
  111. package/dist/client/modules/payload/index.html +0 -42
  112. package/dist/client/modules/plugins/index.html +0 -42
  113. package/dist/client/modules/runtime-configs/index.html +0 -42
  114. package/dist/client/modules/server-routes/index.html +0 -42
  115. package/dist/client/modules/storage/index.html +0 -42
  116. package/dist/client/modules/terminals/index.html +0 -42
  117. package/dist/client/modules/timeline/index.html +0 -42
  118. package/dist/client/modules/virtual-files/index.html +0 -42
  119. package/dist/client/settings/index.html +0 -42
  120. package/dist/shared/devtools.ca660ec5.mjs +0 -114
package/README.md CHANGED
@@ -16,6 +16,7 @@ Unleash Nuxt Developer Experience.
16
16
  </p>
17
17
 
18
18
  <p>
19
+ <a href="https://nuxt.com/blog/nuxt-devtools-v1-0">👋 Introduction</a> |
19
20
  <a href="https://github.com/nuxt/devtools/discussions/29">💡 Ideas & Suggestions</a> |
20
21
  <a href="https://github.com/nuxt/devtools/discussions/31">🗺️ Project Roadmap</a> |
21
22
  <a href="https://devtools.nuxt.com/">📚 Documentation</a>
@@ -77,7 +78,7 @@ For all options available, please refer to TSDocs in your IDE, or the [type defi
77
78
 
78
79
  ## Features
79
80
 
80
- Read the [**Announcement Blog Post 🎊**](https://nuxt.com/blog/introducing-nuxt-devtools) for why we built Nuxt DevTools and what it can do!
81
+ Read the [**Announcement Blog Post 🎊**](https://nuxt.com/blog/nuxt-devtools-v1-0) for why we built Nuxt DevTools and what it can do!
81
82
 
82
83
  ## Module Authors
83
84
 
@@ -1,16 +1,17 @@
1
- import fs, { existsSync } from 'node:fs';
1
+ import fs$1, { existsSync } from 'node:fs';
2
2
  import os, { homedir } from 'node:os';
3
- import { resolve, join as join$1, dirname } from 'pathe';
3
+ import fs from 'node:fs/promises';
4
+ import { join, resolve, dirname as dirname$1 } from 'pathe';
4
5
  import { logger, useNuxt, addPlugin, addTemplate, addVitePlugin } from '@nuxt/kit';
5
6
  import { searchForWorkspaceRoot } from 'vite';
6
7
  import sirv from 'sirv';
7
8
  import { colors } from 'consola/utils';
8
9
  import { createBirpcGroup } from 'birpc';
9
10
  import { stringify, parse as parse$1 } from 'flatted';
10
- import { d as defaultAllowedExtensions, R as ROUTE_AUTH, a as defaultTabOptions, W as WS_EVENT_NAME, b as ROUTE_ANALYZE, c as ROUTE_CLIENT, e as ROUTE_AUTH_VERIFY } from '../shared/devtools.ca660ec5.mjs';
11
- import { join, parse, dirname as dirname$1 } from 'node:path';
12
- import fsp from 'node:fs/promises';
11
+ import { d as defaultAllowedExtensions, a as defaultTabOptions, W as WS_EVENT_NAME } from '../shared/devtools.371fa152.mjs';
12
+ import { dirname, join as join$1, parse } from 'node:path';
13
13
  import { randomStr } from '@antfu/utils';
14
+ import { hash } from 'ohash';
14
15
  import { imageMeta } from 'image-meta';
15
16
  import { debounce } from 'perfect-debounce';
16
17
  import fg from 'fast-glob';
@@ -27,24 +28,80 @@ import { resolveBuiltinPresets } from 'unimport';
27
28
  import destr from 'destr';
28
29
  import { snakeCase } from 'scule';
29
30
  import Git from 'simple-git';
30
- import { hash } from 'ohash';
31
31
  import { runtimeDir, clientDir, packageDir, isGlobalInstall } from '../dirs.mjs';
32
32
 
33
- const version = "1.0.2";
33
+ const version = "1.0.4";
34
+
35
+ function getHomeDir() {
36
+ return process.env.XDG_CONFIG_HOME || homedir();
37
+ }
38
+ async function readLocalOptions(defaults, options) {
39
+ const { filePath } = getOptionsFilepath(options);
40
+ if (existsSync(filePath)) {
41
+ try {
42
+ const options2 = {
43
+ ...defaults,
44
+ ...JSON.parse(await fs.readFile(filePath, "utf-8")).settings || {}
45
+ };
46
+ return options2;
47
+ } catch (e) {
48
+ console.error(`[DevTools] failed to parse local options file: ${filePath}, fallback to defaults`);
49
+ console.error(e);
50
+ return { ...defaults };
51
+ }
52
+ } else {
53
+ return { ...defaults };
54
+ }
55
+ }
56
+ function getOptionsFilepath(options) {
57
+ let hashedKey;
58
+ if (options.key)
59
+ hashedKey = hash(`${options.root}:${options.key}`);
60
+ else
61
+ hashedKey = hash(options.root);
62
+ const home = getHomeDir();
63
+ const filePath = join(home, ".nuxt/devtools", `${hashedKey}.json`);
64
+ return {
65
+ filePath,
66
+ hashedKey
67
+ };
68
+ }
69
+ async function clearLocalOptions(options) {
70
+ const { filePath } = getOptionsFilepath(options);
71
+ if (existsSync(filePath))
72
+ await fs.unlink(filePath);
73
+ }
74
+ async function writeLocalOptions(settings, options) {
75
+ const { filePath, hashedKey } = getOptionsFilepath(options);
76
+ await fs.mkdir(dirname(filePath), { recursive: true });
77
+ await fs.writeFile(
78
+ filePath,
79
+ JSON.stringify(
80
+ {
81
+ root: options.root,
82
+ hash: hashedKey,
83
+ settings
84
+ },
85
+ null,
86
+ 2
87
+ ),
88
+ "utf-8"
89
+ );
90
+ }
34
91
 
35
92
  let token;
36
93
  async function getDevAuthToken() {
37
94
  if (token)
38
95
  return token;
39
- const home = homedir();
40
- const dir = join(home, ".nuxt/devtools");
41
- const filepath = join(dir, "dev-auth-token.txt");
96
+ const home = getHomeDir();
97
+ const dir = join$1(home, ".nuxt/devtools");
98
+ const filepath = join$1(dir, "dev-auth-token.txt");
42
99
  if (existsSync(filepath))
43
- token = (await fsp.readFile(filepath, "utf-8")).trim();
100
+ token = (await fs.readFile(filepath, "utf-8")).trim();
44
101
  if (!token)
45
102
  token = randomStr(16);
46
- await fsp.mkdir(dir, { recursive: true });
47
- await fsp.writeFile(filepath, token, "utf-8");
103
+ await fs.mkdir(dir, { recursive: true });
104
+ await fs.writeFile(filepath, token, "utf-8");
48
105
  return token;
49
106
  }
50
107
 
@@ -150,10 +207,10 @@ function setupAssetsRPC({ nuxt, ensureDevAuthToken, refresh, options }) {
150
207
  }
151
208
  cache = await Promise.all(files.map(async (path) => {
152
209
  const filePath = resolve(publicDir, path);
153
- const stat = await fsp.lstat(filePath);
210
+ const stat = await fs.lstat(filePath);
154
211
  return {
155
212
  path,
156
- publicPath: join$1(baseURL, path),
213
+ publicPath: join(baseURL, path),
157
214
  filePath,
158
215
  type: guessType(path),
159
216
  size: stat.size,
@@ -166,11 +223,12 @@ function setupAssetsRPC({ nuxt, ensureDevAuthToken, refresh, options }) {
166
223
  async getStaticAssets() {
167
224
  return await scan();
168
225
  },
169
- async getImageMeta(filepath) {
226
+ async getImageMeta(token, filepath) {
227
+ await ensureDevAuthToken(token);
170
228
  if (_imageMetaCache.has(filepath))
171
229
  return _imageMetaCache.get(filepath);
172
230
  try {
173
- const meta = imageMeta(await fsp.readFile(filepath));
231
+ const meta = imageMeta(await fs.readFile(filepath));
174
232
  _imageMetaCache.set(filepath, meta);
175
233
  return meta;
176
234
  } catch (e) {
@@ -179,9 +237,10 @@ function setupAssetsRPC({ nuxt, ensureDevAuthToken, refresh, options }) {
179
237
  return void 0;
180
238
  }
181
239
  },
182
- async getTextAssetContent(filepath, limit = 300) {
240
+ async getTextAssetContent(token, filepath, limit = 300) {
241
+ await ensureDevAuthToken(token);
183
242
  try {
184
- const content = await fsp.readFile(filepath, "utf-8");
243
+ const content = await fs.readFile(filepath, "utf-8");
185
244
  return content.slice(0, limit);
186
245
  } catch (e) {
187
246
  console.error(e);
@@ -202,16 +261,16 @@ You can configure it in Nuxt config at \`devtools.assets.uploadExtensions\`.`);
202
261
  }
203
262
  if (!override) {
204
263
  try {
205
- await fsp.stat(finalPath);
264
+ await fs.stat(finalPath);
206
265
  const base = finalPath.slice(0, finalPath.length - ext.length - 1);
207
266
  let i = 1;
208
- while (await fsp.access(`${base}-${i}.${ext}`).then(() => true).catch(() => false))
267
+ while (await fs.access(`${base}-${i}.${ext}`).then(() => true).catch(() => false))
209
268
  i++;
210
269
  finalPath = `${base}-${i}.${ext}`;
211
270
  } catch (err) {
212
271
  }
213
272
  }
214
- await fsp.writeFile(finalPath, content, {
273
+ await fs.writeFile(finalPath, content, {
215
274
  encoding: encoding ?? "utf-8"
216
275
  });
217
276
  return finalPath;
@@ -220,14 +279,14 @@ You can configure it in Nuxt config at \`devtools.assets.uploadExtensions\`.`);
220
279
  },
221
280
  async deleteStaticAsset(token, path) {
222
281
  await ensureDevAuthToken(token);
223
- return await fsp.unlink(path);
282
+ return await fs.unlink(path);
224
283
  },
225
284
  async renameStaticAsset(token, oldPath, newPath) {
226
285
  await ensureDevAuthToken(token);
227
286
  const exist = cache?.find((asset) => asset.filePath === newPath);
228
287
  if (exist)
229
288
  throw new Error(`File ${newPath} already exists`);
230
- return await fsp.rename(oldPath, newPath);
289
+ return await fs.rename(oldPath, newPath);
231
290
  }
232
291
  };
233
292
  }
@@ -341,7 +400,7 @@ function setupNpmRPC({ nuxt, ensureDevAuthToken }) {
341
400
  const filepath = nuxt.options._nuxtConfigFile;
342
401
  let source = latestGenerated;
343
402
  if (source == null)
344
- source = await fsp.readFile(filepath, "utf-8");
403
+ source = await fs.readFile(filepath, "utf-8");
345
404
  const generated = await magicastGuard(async () => {
346
405
  const mod = parseModule(source, { sourceFileName: filepath });
347
406
  addNuxtModule(mod, name);
@@ -371,7 +430,7 @@ function setupNpmRPC({ nuxt, ensureDevAuthToken }) {
371
430
  }
372
431
  if (installSet.size === 0) {
373
432
  latestGenerated = null;
374
- await fsp.writeFile(filepath, generated, "utf-8");
433
+ await fs.writeFile(filepath, generated, "utf-8");
375
434
  }
376
435
  }
377
436
  return {
@@ -385,7 +444,7 @@ function setupNpmRPC({ nuxt, ensureDevAuthToken }) {
385
444
  await ensureDevAuthToken(token);
386
445
  const commands = await getNpmCommand("uninstall", name);
387
446
  const filepath = nuxt.options._nuxtConfigFile;
388
- const source = await fsp.readFile(filepath, "utf-8");
447
+ const source = await fs.readFile(filepath, "utf-8");
389
448
  const generated = await magicastGuard(async () => {
390
449
  const mod = parseModule(source, { sourceFileName: filepath });
391
450
  const config = getDefaultExportOptions(mod);
@@ -417,7 +476,7 @@ function setupNpmRPC({ nuxt, ensureDevAuthToken }) {
417
476
  console.error(result.stderr);
418
477
  throw new Error(`Failed to uninstall module', process exited with ${code}`);
419
478
  }
420
- await fsp.writeFile(filepath, generated, "utf-8");
479
+ await fs.writeFile(filepath, generated, "utf-8");
421
480
  }
422
481
  return {
423
482
  configOriginal: source,
@@ -513,7 +572,13 @@ function setupHooksDebug(hooks) {
513
572
  return serverHooks;
514
573
  }
515
574
 
516
- function setupGeneralRPC({ nuxt, options, refresh, openInEditorHooks }) {
575
+ function setupGeneralRPC({
576
+ nuxt,
577
+ options,
578
+ refresh,
579
+ ensureDevAuthToken,
580
+ openInEditorHooks
581
+ }) {
517
582
  const components = [];
518
583
  const imports = [];
519
584
  const importPresets = [];
@@ -660,7 +725,8 @@ function setupGeneralRPC({ nuxt, options, refresh, openInEditorHooks }) {
660
725
  return false;
661
726
  }
662
727
  },
663
- restartNuxt(hard = true) {
728
+ async restartNuxt(token, hard = true) {
729
+ await ensureDevAuthToken(token);
664
730
  logger.info("Restarting Nuxt...");
665
731
  return nuxt.callHook("restart", { hard });
666
732
  },
@@ -669,6 +735,7 @@ function setupGeneralRPC({ nuxt, options, refresh, openInEditorHooks }) {
669
735
  return;
670
736
  const token = await getDevAuthToken();
671
737
  origin ||= `${nuxt.options.devServer.https ? "https" : "http"}://${nuxt.options.devServer.host === "::" ? "localhost" : nuxt.options.devServer.host || "localhost"}:${nuxt.options.devServer.port}`;
738
+ const ROUTE_AUTH = `${nuxt.options.app.baseURL || "/"}/__nuxt_devtools__/auth`.replace(/\/+/g, "/");
672
739
  const message = [
673
740
  `A browser is requesting permissions of ${colors.bold(colors.yellow("writing files and running commands"))} from the DevTools UI.`,
674
741
  colors.bold(info),
@@ -709,18 +776,18 @@ const route = useRoute()
709
776
  </template>
710
777
  `;
711
778
  async function enablePages(nuxt) {
712
- const pathApp = join$1(nuxt.options.srcDir, "app.vue");
713
- const pathPageIndex = join$1(nuxt.options.srcDir, "pages/index.vue");
714
- if (fs.existsSync(pathPageIndex)) {
779
+ const pathApp = join(nuxt.options.srcDir, "app.vue");
780
+ const pathPageIndex = join(nuxt.options.srcDir, "pages/index.vue");
781
+ if (fs$1.existsSync(pathPageIndex)) {
715
782
  logger.warn("pages/index.vue already exists, skipping");
716
783
  return;
717
784
  }
718
- let appContent = fs.existsSync(pathApp) ? await fsp.readFile(pathApp, "utf-8") : void 0;
719
- await fsp.mkdir(dirname(pathPageIndex), { recursive: true });
720
- await fsp.writeFile(pathPageIndex, pagesIndexTemplate, "utf-8");
785
+ let appContent = fs$1.existsSync(pathApp) ? await fs.readFile(pathApp, "utf-8") : void 0;
786
+ await fs.mkdir(dirname$1(pathPageIndex), { recursive: true });
787
+ await fs.writeFile(pathPageIndex, pagesIndexTemplate, "utf-8");
721
788
  if (appContent && !appContent.includes("<NuxtPage")) {
722
789
  appContent = appContent.replace("</template>", " <NuxtPage />\n</template>").replace(/<NuxtWelcome\s*\/>/, "");
723
- await fsp.writeFile(pathApp, appContent, "utf-8");
790
+ await fs.writeFile(pathApp, appContent, "utf-8");
724
791
  }
725
792
  logger.success("Routing creation wizard completed");
726
793
  }
@@ -879,7 +946,7 @@ function setupAnalyzeBuildRPC({ nuxt, refresh, ensureDevAuthToken }) {
879
946
  let promise;
880
947
  let initalized;
881
948
  const processId = "devtools:analyze-build";
882
- const analyzeDir = join$1(nuxt.options.rootDir, ".nuxt/analyze");
949
+ const analyzeDir = join(nuxt.options.rootDir, ".nuxt/analyze");
883
950
  async function startAnalyzeBuild(name) {
884
951
  if (promise)
885
952
  throw new Error("Already building");
@@ -906,14 +973,14 @@ function setupAnalyzeBuildRPC({ nuxt, refresh, ensureDevAuthToken }) {
906
973
  async function readBuildInfo() {
907
974
  const files = await fg("*/meta.json", { cwd: analyzeDir, onlyFiles: true, absolute: true });
908
975
  builds = await Promise.all(files.map(async (file) => {
909
- const dir = dirname(file);
910
- const json = JSON.parse(await fsp.readFile(file, "utf-8"));
976
+ const dir = dirname$1(file);
977
+ const json = JSON.parse(await fs.readFile(file, "utf-8"));
911
978
  return {
912
979
  ...json,
913
980
  features: {
914
- bundleClient: fs.existsSync(join$1(dir, "client.html")),
915
- bundleNitro: fs.existsSync(join$1(dir, "nitro.html")),
916
- viteInspect: fs.existsSync(join$1(dir, ".vite-inspect"))
981
+ bundleClient: fs$1.existsSync(join(dir, "client.html")),
982
+ bundleNitro: fs$1.existsSync(join(dir, "nitro.html")),
983
+ viteInspect: fs$1.existsSync(join(dir, ".vite-inspect"))
917
984
  }
918
985
  };
919
986
  }));
@@ -946,10 +1013,10 @@ function setupAnalyzeBuildRPC({ nuxt, refresh, ensureDevAuthToken }) {
946
1013
  async clearAnalyzeBuilds(token, names) {
947
1014
  await ensureDevAuthToken(token);
948
1015
  if (!names) {
949
- await fsp.rm(analyzeDir, { recursive: true, force: true });
1016
+ await fs.rm(analyzeDir, { recursive: true, force: true });
950
1017
  } else {
951
1018
  const targets = builds.filter((build) => names.includes(build.name));
952
- await Promise.all(targets.map((target) => fsp.rm(join$1(analyzeDir, target.slug), { recursive: true, force: true })));
1019
+ await Promise.all(targets.map((target) => fs.rm(join(analyzeDir, target.slug), { recursive: true, force: true })));
953
1020
  }
954
1021
  initalized = readBuildInfo();
955
1022
  refresh("getAnalyzeBuildInfo");
@@ -962,53 +1029,6 @@ function setupAnalyzeBuildRPC({ nuxt, refresh, ensureDevAuthToken }) {
962
1029
  };
963
1030
  }
964
1031
 
965
- async function readLocalOptions(defaults, options) {
966
- const { filePath } = getOptionsFilepath(options);
967
- if (existsSync(filePath)) {
968
- const options2 = {
969
- ...defaults,
970
- ...JSON.parse(await fsp.readFile(filePath, "utf-8")).settings || {}
971
- };
972
- return options2;
973
- } else {
974
- return { ...defaults };
975
- }
976
- }
977
- function getOptionsFilepath(options) {
978
- let hashedKey;
979
- if (options.key)
980
- hashedKey = hash(`${options.root}:${options.key}`);
981
- else
982
- hashedKey = hash(options.root);
983
- const filePath = join$1(homedir(), ".nuxt/devtools", `${hashedKey}.json`);
984
- return {
985
- filePath,
986
- hashedKey
987
- };
988
- }
989
- async function clearLocalOptions(options) {
990
- const { filePath } = getOptionsFilepath(options);
991
- if (existsSync(filePath))
992
- await fsp.unlink(filePath);
993
- }
994
- async function writeLocalOptions(settings, options) {
995
- const { filePath, hashedKey } = getOptionsFilepath(options);
996
- await fsp.mkdir(dirname$1(filePath), { recursive: true });
997
- await fsp.writeFile(
998
- filePath,
999
- JSON.stringify(
1000
- {
1001
- root: options.root,
1002
- hash: hashedKey,
1003
- settings
1004
- },
1005
- null,
1006
- 2
1007
- ),
1008
- "utf-8"
1009
- );
1010
- }
1011
-
1012
1032
  let options;
1013
1033
  function getOptions() {
1014
1034
  return options;
@@ -1061,7 +1081,7 @@ function setupTimelineRPC({ nuxt }) {
1061
1081
  return {
1062
1082
  async enableTimeline(dry) {
1063
1083
  const filepath = nuxt.options._nuxtConfigFile;
1064
- const source = await fsp.readFile(filepath, "utf-8");
1084
+ const source = await fs.readFile(filepath, "utf-8");
1065
1085
  const generated = await magicastGuard(async () => {
1066
1086
  const mod = parseModule(source, { sourceFileName: filepath });
1067
1087
  const options = getDefaultExportOptions(mod);
@@ -1071,7 +1091,7 @@ function setupTimelineRPC({ nuxt }) {
1071
1091
  return mod.generate().code;
1072
1092
  }, "\nYou can enable timeline manually by adding `devtools: { timeline: { enabled: true } }`");
1073
1093
  if (!dry) {
1074
- await fsp.writeFile(filepath, generated, "utf-8");
1094
+ await fs.writeFile(filepath, generated, "utf-8");
1075
1095
  await nuxt.callHook("restart", { hard: true });
1076
1096
  }
1077
1097
  return [source, generated];
@@ -1257,11 +1277,11 @@ async function enableModule(options, nuxt) {
1257
1277
  await nuxt.callHook("devtools:before");
1258
1278
  nuxt.options.imports.collectMeta = true;
1259
1279
  addPlugin({
1260
- src: join$1(runtimeDir, "plugins/devtools.client"),
1280
+ src: join(runtimeDir, "plugins/devtools.client"),
1261
1281
  mode: "client"
1262
1282
  });
1263
1283
  addPlugin({
1264
- src: join$1(runtimeDir, "plugins/devtools.server"),
1284
+ src: join(runtimeDir, "plugins/devtools.server"),
1265
1285
  mode: "server"
1266
1286
  });
1267
1287
  addTemplate({
@@ -1283,7 +1303,7 @@ async function enableModule(options, nuxt) {
1283
1303
  nuxt.hook("nitro:config", (config) => {
1284
1304
  config.externals = config.externals || {};
1285
1305
  config.externals.inline = config.externals.inline || [];
1286
- config.externals.inline.push(join$1(runtimeDir, "nitro"));
1306
+ config.externals.inline.push(join(runtimeDir, "nitro"));
1287
1307
  config.virtual = config.virtual || {};
1288
1308
  config.virtual["#nuxt-devtools-inline"] = `export const script = \`
1289
1309
  if (!window.__NUXT_DEVTOOLS_TIME_METRIC__) {
@@ -1296,7 +1316,7 @@ if (!window.__NUXT_DEVTOOLS_TIME_METRIC__) {
1296
1316
  window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
1297
1317
  \``;
1298
1318
  config.plugins = config.plugins || [];
1299
- config.plugins.unshift(join$1(runtimeDir, "nitro/inline"));
1319
+ config.plugins.unshift(join(runtimeDir, "nitro/inline"));
1300
1320
  });
1301
1321
  const {
1302
1322
  vitePlugin,
@@ -1304,7 +1324,7 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
1304
1324
  } = setupRPC(nuxt, options);
1305
1325
  addVitePlugin(vitePlugin);
1306
1326
  const clientDirExists = existsSync(clientDir);
1307
- const analyzeDir = join$1(nuxt.options.rootDir, ".nuxt/analyze");
1327
+ const analyzeDir = join(nuxt.options.rootDir, ".nuxt/analyze");
1308
1328
  nuxt.hook("vite:extendConfig", (config) => {
1309
1329
  config.server ||= {};
1310
1330
  config.server.fs ||= {};
@@ -1321,14 +1341,36 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
1321
1341
  nuxt.hook("imports:extend", (imports) => {
1322
1342
  imports.push({
1323
1343
  name: "useNuxtDevTools",
1324
- from: join$1(runtimeDir, "use-nuxt-devtools")
1344
+ from: join(runtimeDir, "use-nuxt-devtools")
1325
1345
  });
1326
1346
  });
1347
+ const ROUTE_PATH = `${nuxt.options.app.baseURL || "/"}/__nuxt_devtools__`.replace(/\/+/g, "/");
1348
+ const ROUTE_CLIENT = `${ROUTE_PATH}/client`;
1349
+ const ROUTE_AUTH = `${ROUTE_PATH}/auth`;
1350
+ const ROUTE_AUTH_VERIFY = `${ROUTE_PATH}/auth-verify`;
1351
+ const ROUTE_ANALYZE = `${ROUTE_PATH}/analyze`;
1327
1352
  nuxt.hook("vite:serverCreated", (server) => {
1328
1353
  server.middlewares.use(ROUTE_ANALYZE, sirv(analyzeDir, { single: false, dev: true }));
1329
- if (clientDirExists)
1330
- server.middlewares.use(ROUTE_CLIENT, sirv(clientDir, { single: true, dev: true }));
1331
- server.middlewares.use(ROUTE_AUTH, sirv(join$1(runtimeDir, "auth"), { single: true, dev: true }));
1354
+ if (clientDirExists) {
1355
+ const indexHtmlPath = join(clientDir, "index.html");
1356
+ const indexContent = fs.readFile(indexHtmlPath, "utf-8");
1357
+ const handleStatic = sirv(clientDir, {
1358
+ dev: true,
1359
+ single: false
1360
+ });
1361
+ const handleIndex = async (res) => {
1362
+ res.setHeader("Content-Type", "text/html");
1363
+ res.statusCode = 200;
1364
+ res.write((await indexContent).replace(/\/__NUXT_DEVTOOLS_BASE__\//g, `${ROUTE_CLIENT}/`));
1365
+ res.end();
1366
+ };
1367
+ server.middlewares.use(ROUTE_CLIENT, (req, res) => {
1368
+ if (req.url === "/")
1369
+ return handleIndex(res);
1370
+ return handleStatic(req, res, () => handleIndex(res));
1371
+ });
1372
+ }
1373
+ server.middlewares.use(ROUTE_AUTH, sirv(join(runtimeDir, "auth"), { single: true, dev: true }));
1332
1374
  server.middlewares.use(ROUTE_AUTH_VERIFY, async (req, res) => {
1333
1375
  const search = req.url?.split("?")[1];
1334
1376
  if (!search) {
@@ -1,6 +1,6 @@
1
1
  import { hostname } from 'node:os';
2
2
  import { resolve } from 'node:path';
3
- import fsp from 'node:fs/promises';
3
+ import fs from 'node:fs/promises';
4
4
  import { existsSync } from 'node:fs';
5
5
  import { logger } from '@nuxt/kit';
6
6
  import { execa } from 'execa';
@@ -14,11 +14,12 @@ import 'sirv';
14
14
  import 'consola/utils';
15
15
  import 'birpc';
16
16
  import 'flatted';
17
- import '../shared/devtools.ca660ec5.mjs';
17
+ import '../shared/devtools.371fa152.mjs';
18
18
  import '../dirs.mjs';
19
19
  import 'node:url';
20
20
  import 'is-installed-globally';
21
21
  import '@antfu/utils';
22
+ import 'ohash';
22
23
  import 'image-meta';
23
24
  import 'perfect-debounce';
24
25
  import 'fast-glob';
@@ -33,7 +34,6 @@ import 'unimport';
33
34
  import 'destr';
34
35
  import 'scule';
35
36
  import 'simple-git';
36
- import 'ohash';
37
37
 
38
38
  async function setup({ nuxt, options, openInEditorHooks, rpc }) {
39
39
  const installed = !!await which("code-server").catch(() => null);
@@ -50,7 +50,7 @@ async function setup({ nuxt, options, openInEditorHooks, rpc }) {
50
50
  if (!existsSync(vscodeServerControllerFile))
51
51
  return false;
52
52
  try {
53
- const { port: port2 } = JSON.parse(await fsp.readFile(vscodeServerControllerFile, "utf-8"));
53
+ const { port: port2 } = JSON.parse(await fs.readFile(vscodeServerControllerFile, "utf-8"));
54
54
  const url2 = `http://localhost:${port2}/open?path=${encodeURIComponent(file)}`;
55
55
  await fetch(url2);
56
56
  rpc.broadcast.navigateTo("/modules/custom-builtin-vscode");
@@ -63,7 +63,7 @@ async function setup({ nuxt, options, openInEditorHooks, rpc }) {
63
63
  });
64
64
  async function startCodeServer() {
65
65
  if (existsSync(vscodeServerControllerFile))
66
- await fsp.rm(vscodeServerControllerFile, { force: true });
66
+ await fs.rm(vscodeServerControllerFile, { force: true });
67
67
  if (vsOptions?.reuseExistingServer && !await checkPort(port)) {
68
68
  loaded = true;
69
69
  url = `http://localhost:${port}/?folder=${encodeURIComponent(root)}`;
@@ -2,41 +2,41 @@
2
2
  <html >
3
3
  <head><meta charset="utf-8">
4
4
  <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <link rel="stylesheet" href="/__nuxt_devtools__/client/_nuxt/entry.aa8c94e8.css">
6
- <link rel="modulepreload" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/entry.5d59ff5c.js">
7
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/index.8874e47c.js">
8
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/onig.0c57a370.js">
9
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/vitesse-dark.ff0e7dcb.js">
10
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/vitesse-light.c6996724.js">
11
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/json.709f1c4d.js">
12
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/yaml.b29e536f.js">
13
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/css.f61fd02b.js">
14
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/javascript.b7d6d348.js">
15
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/typescript.24e7badf.js">
16
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/vue.7ad3b25a.js">
17
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/html.14085b69.js">
18
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/vue-html.88dda4a8.js">
19
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/diff.22e0b108.js">
20
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/shellscript.e25d1410.js">
21
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/default.551695d6.js">
22
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/full.b09bb7d2.js">
23
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/none.48f4e2a5.js">
24
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/nuxt-docs.100caa70.js">
25
- <link rel="prefetch" as="style" href="/__nuxt_devtools__/client/_nuxt/NCodeBlock.6994516c.css">
26
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/DataSchemaDrawer.d62bbda3.js">
27
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/NSelect.vue.d4b5d548.js">
28
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/NSwitch.vue.95382b67.js">
29
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/NDropdown.vue.32f13066.js">
30
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/NCodeBlock.vue.c114d969.js">
31
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/client.4841a079.js">
32
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/NDrawer.vue.4bcebe5d.js">
33
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/unocss-runtime.55c74b5c.js">
34
- <link rel="prefetch" as="style" href="/__nuxt_devtools__/client/_nuxt/error-404.82ac0ec5.css">
35
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/error-404.c4b39504.js">
36
- <link rel="prefetch" as="style" href="/__nuxt_devtools__/client/_nuxt/error-500.ff959f66.css">
37
- <link rel="prefetch" as="script" crossorigin href="/__nuxt_devtools__/client/_nuxt/error-500.4029de92.js">
38
- <script type="module" src="/__nuxt_devtools__/client/_nuxt/entry.5d59ff5c.js" crossorigin></script><script>"use strict";(()=>{const a=window,e=document.documentElement,m=["dark","light"],c=window.localStorage.getItem("nuxt-color-mode")||"system";let n=c==="system"?f():c;const l=e.getAttribute("data-color-mode-forced");l&&(n=l),i(n),a["__NUXT_COLOR_MODE__"]={preference:c,value:n,getColorScheme:f,addColorScheme:i,removeColorScheme:d};function i(o){const t=""+o+"",s="";e.classList?e.classList.add(t):e.className+=" "+t,s&&e.setAttribute("data-"+s,o)}function d(o){const t=""+o+"",s="";e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp(t,"g"),""),s&&e.removeAttribute("data-"+s)}function r(o){return a.matchMedia("(prefers-color-scheme"+o+")")}function f(){if(a.matchMedia&&r("").media!=="not all"){for(const o of m)if(r(":"+o).matches)return o}return"light"}})();
5
+ <link rel="stylesheet" href="/__NUXT_DEVTOOLS_BASE__/_nuxt/entry.2732f55b.css">
6
+ <link rel="modulepreload" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/entry.35c58391.js">
7
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/index.11f08f78.js">
8
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/onig.0c57a370.js">
9
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/vitesse-dark.ff0e7dcb.js">
10
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/vitesse-light.c6996724.js">
11
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/json.709f1c4d.js">
12
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/yaml.b29e536f.js">
13
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/css.f61fd02b.js">
14
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/javascript.b7d6d348.js">
15
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/typescript.24e7badf.js">
16
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/vue.7ad3b25a.js">
17
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/html.14085b69.js">
18
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/vue-html.88dda4a8.js">
19
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/diff.22e0b108.js">
20
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/shellscript.e25d1410.js">
21
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/default.97700872.js">
22
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/full.72d92407.js">
23
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/none.9d86a5c5.js">
24
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/nuxt-docs.100caa70.js">
25
+ <link rel="prefetch" as="style" href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NCodeBlock.6994516c.css">
26
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/DataSchemaDrawer.b2c7e5f0.js">
27
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NSelect.vue.7cf27fe7.js">
28
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NSwitch.vue.6fd7c26d.js">
29
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NDropdown.vue.ddbb4404.js">
30
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NCodeBlock.vue.4697f7e4.js">
31
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/client.bd4053bc.js">
32
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/NDrawer.vue.4b4bd813.js">
33
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/unocss-runtime.eab56c8d.js">
34
+ <link rel="prefetch" as="style" href="/__NUXT_DEVTOOLS_BASE__/_nuxt/error-404.82ac0ec5.css">
35
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/error-404.576aef72.js">
36
+ <link rel="prefetch" as="style" href="/__NUXT_DEVTOOLS_BASE__/_nuxt/error-500.ff959f66.css">
37
+ <link rel="prefetch" as="script" crossorigin href="/__NUXT_DEVTOOLS_BASE__/_nuxt/error-500.61e43a5a.js">
38
+ <script type="module" src="/__NUXT_DEVTOOLS_BASE__/_nuxt/entry.35c58391.js" crossorigin></script><script>"use strict";(()=>{const a=window,e=document.documentElement,m=["dark","light"],c=window&&window.localStorage&&window.localStorage.getItem&&window.localStorage.getItem("nuxt-color-mode")||"system";let n=c==="system"?d():c;const l=e.getAttribute("data-color-mode-forced");l&&(n=l),i(n),a["__NUXT_COLOR_MODE__"]={preference:c,value:n,getColorScheme:d,addColorScheme:i,removeColorScheme:f};function i(o){const t=""+o+"",s="";e.classList?e.classList.add(t):e.className+=" "+t,s&&e.setAttribute("data-"+s,o)}function f(o){const t=""+o+"",s="";e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp(t,"g"),""),s&&e.removeAttribute("data-"+s)}function r(o){return a.matchMedia("(prefers-color-scheme"+o+")")}function d(){if(a.matchMedia&&r("").media!=="not all"){for(const o of m)if(r(":"+o).matches)return o}return"light"}})();
39
39
  </script></head>
40
40
  <body ><div id="__nuxt"></div><script type="application/json" id="__NUXT_DATA__" data-ssr="false">[{"_errors":1,"serverRendered":2,"data":3,"state":4},{},false,{},{}]</script>
41
- <script>window.__NUXT__={};window.__NUXT__.config={public:{fixture4:"public runtime config from nuxt.config.ts"},app:{baseURL:"/__nuxt_devtools__/client",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body>
41
+ <script>window.__NUXT__={};window.__NUXT__.config={public:{fixture4:"public runtime config from nuxt.config.ts"},app:{baseURL:"/__NUXT_DEVTOOLS_BASE__/",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body>
42
42
  </html>