nuxt-security-module 0.0.0-stage → 4.1.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.
Files changed (137) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +21 -2
  3. package/dist/index.d.ts +17 -0
  4. package/dist/index.js +105 -0
  5. package/dist/models/AllowedMethodsRestricterOptions.d.ts +5 -0
  6. package/dist/models/BasicAuthOptions.d.ts +9 -0
  7. package/dist/models/ContentSecurityPolicy.d.ts +3 -0
  8. package/dist/models/CorsHandlerOptions.d.ts +13 -0
  9. package/dist/models/CrossOriginEmbedderPolicy.d.ts +8 -0
  10. package/dist/models/CrossOriginEmbedderPolicy.js +8 -0
  11. package/dist/models/CsrfOptions.d.ts +6 -0
  12. package/dist/models/ModuleOptions.d.ts +27 -0
  13. package/dist/models/PermissionsPolicy.d.ts +3 -0
  14. package/dist/models/RateLimitWindow.d.ts +6 -0
  15. package/dist/models/RateLimiterOptions.d.ts +6 -0
  16. package/dist/models/RateLimiterStore.d.ts +6 -0
  17. package/dist/models/RequestSizeLimiterOptions.d.ts +6 -0
  18. package/dist/models/SecurityHeaders.d.ts +22 -0
  19. package/dist/models/SecurityRouteRules.d.ts +4 -0
  20. package/dist/models/SecurityRules.d.ts +4 -0
  21. package/dist/models/SsgOptions.d.ts +9 -0
  22. package/dist/models/StrictTransportSecurity.d.ts +7 -0
  23. package/dist/models/XFrameOptions.d.ts +7 -0
  24. package/dist/models/XFrameOptions.js +7 -0
  25. package/dist/runtime/constants.d.ts +24 -0
  26. package/dist/runtime/constants.js +52 -0
  27. package/dist/runtime/nitro/plugins/hidePoweredBy.d.ts +5 -0
  28. package/dist/runtime/nitro/plugins/hidePoweredBy.js +13 -0
  29. package/dist/runtime/nitro/plugins/nonce.d.ts +5 -0
  30. package/dist/runtime/nitro/plugins/nonce.js +27 -0
  31. package/dist/runtime/nitro/plugins/routeRules.d.ts +5 -0
  32. package/dist/runtime/nitro/plugins/routeRules.js +17 -0
  33. package/dist/runtime/nitro/plugins/securityHeaders.d.ts +5 -0
  34. package/dist/runtime/nitro/plugins/securityHeaders.js +25 -0
  35. package/dist/runtime/nitro/plugins/ssgHashes.d.ts +5 -0
  36. package/dist/runtime/nitro/plugins/ssgHashes.js +27 -0
  37. package/dist/runtime/nitro/plugins/subresourceIntegrity.d.ts +4 -0
  38. package/dist/runtime/nitro/plugins/subresourceIntegrity.js +19 -0
  39. package/dist/runtime/server/middleware/allowedMethodsRestricter.d.ts +5 -0
  40. package/dist/runtime/server/middleware/allowedMethodsRestricter.js +15 -0
  41. package/dist/runtime/server/middleware/basicAuth.d.ts +5 -0
  42. package/dist/runtime/server/middleware/basicAuth.js +23 -0
  43. package/dist/runtime/server/middleware/corsHandler.d.ts +5 -0
  44. package/dist/runtime/server/middleware/corsHandler.js +20 -0
  45. package/dist/runtime/server/middleware/csrf.d.ts +5 -0
  46. package/dist/runtime/server/middleware/csrf.js +28 -0
  47. package/dist/runtime/server/middleware/rateLimiter.d.ts +5 -0
  48. package/dist/runtime/server/middleware/rateLimiter.js +22 -0
  49. package/dist/runtime/server/middleware/requestSizeLimiter.d.ts +5 -0
  50. package/dist/runtime/server/middleware/requestSizeLimiter.js +17 -0
  51. package/dist/runtime/services/checkIsBasicAuthorized.d.ts +4 -0
  52. package/dist/runtime/services/checkIsBasicAuthorized.js +12 -0
  53. package/dist/runtime/services/checkIsChallenged.d.ts +4 -0
  54. package/dist/runtime/services/checkIsChallenged.js +8 -0
  55. package/dist/runtime/services/checkIsCsrfTokenValid.d.ts +3 -0
  56. package/dist/runtime/services/checkIsCsrfTokenValid.js +8 -0
  57. package/dist/runtime/services/checkIsEqualInConstantTime.d.ts +3 -0
  58. package/dist/runtime/services/checkIsEqualInConstantTime.js +11 -0
  59. package/dist/runtime/services/checkIsMethodAllowed.d.ts +3 -0
  60. package/dist/runtime/services/checkIsMethodAllowed.js +4 -0
  61. package/dist/runtime/services/checkIsRecord.d.ts +3 -0
  62. package/dist/runtime/services/checkIsRecord.js +4 -0
  63. package/dist/runtime/services/checkIsRequestTooLarge.d.ts +4 -0
  64. package/dist/runtime/services/checkIsRequestTooLarge.js +9 -0
  65. package/dist/runtime/services/collectSsgHashes.d.ts +5 -0
  66. package/dist/runtime/services/collectSsgHashes.js +41 -0
  67. package/dist/runtime/services/createInMemoryRateLimiterStore.d.ts +4 -0
  68. package/dist/runtime/services/createInMemoryRateLimiterStore.js +22 -0
  69. package/dist/runtime/services/generateHash.d.ts +3 -0
  70. package/dist/runtime/services/generateHash.js +9 -0
  71. package/dist/runtime/services/generateNonce.d.ts +3 -0
  72. package/dist/runtime/services/generateNonce.js +6 -0
  73. package/dist/runtime/services/generateRandomToken.d.ts +3 -0
  74. package/dist/runtime/services/generateRandomToken.js +8 -0
  75. package/dist/runtime/services/getBasicAuthCredentials.d.ts +6 -0
  76. package/dist/runtime/services/getBasicAuthCredentials.js +19 -0
  77. package/dist/runtime/services/getBasicAuthOptions.d.ts +4 -0
  78. package/dist/runtime/services/getBasicAuthOptions.js +17 -0
  79. package/dist/runtime/services/getRetryAfterSeconds.d.ts +5 -0
  80. package/dist/runtime/services/getRetryAfterSeconds.js +9 -0
  81. package/dist/runtime/services/getSecurityRules.d.ts +5 -0
  82. package/dist/runtime/services/getSecurityRules.js +15 -0
  83. package/dist/runtime/services/getSecurityState.d.ts +11 -0
  84. package/dist/runtime/services/getSecurityState.js +14 -0
  85. package/dist/runtime/services/injectNonce.d.ts +3 -0
  86. package/dist/runtime/services/injectNonce.js +7 -0
  87. package/dist/runtime/services/injectSubresourceIntegrity.d.ts +3 -0
  88. package/dist/runtime/services/injectSubresourceIntegrity.js +22 -0
  89. package/dist/runtime/services/insertContentSecurityPolicyMeta.d.ts +4 -0
  90. package/dist/runtime/services/insertContentSecurityPolicyMeta.js +17 -0
  91. package/dist/runtime/services/mergeSecurityRules.d.ts +4 -0
  92. package/dist/runtime/services/mergeSecurityRules.js +11 -0
  93. package/dist/runtime/services/readHtmlTagAttribute.d.ts +3 -0
  94. package/dist/runtime/services/readHtmlTagAttribute.js +8 -0
  95. package/dist/runtime/services/rewriteHtmlTags.d.ts +3 -0
  96. package/dist/runtime/services/rewriteHtmlTags.js +9 -0
  97. package/dist/runtime/services/securityRouteMatcher.d.ts +5 -0
  98. package/dist/runtime/services/securityRouteMatcher.js +11 -0
  99. package/dist/runtime/services/serializeBasicAuthChallenge.d.ts +3 -0
  100. package/dist/runtime/services/serializeBasicAuthChallenge.js +4 -0
  101. package/dist/runtime/services/serializeContentSecurityPolicy.d.ts +4 -0
  102. package/dist/runtime/services/serializeContentSecurityPolicy.js +7 -0
  103. package/dist/runtime/services/serializePermissionsPolicy.d.ts +4 -0
  104. package/dist/runtime/services/serializePermissionsPolicy.js +4 -0
  105. package/dist/runtime/services/serializeSecurityHeaders.d.ts +4 -0
  106. package/dist/runtime/services/serializeSecurityHeaders.js +19 -0
  107. package/dist/runtime/services/serializeStrictTransportSecurity.d.ts +4 -0
  108. package/dist/runtime/services/serializeStrictTransportSecurity.js +8 -0
  109. package/dist/runtime/services/stripHtmlTagAttribute.d.ts +3 -0
  110. package/dist/runtime/services/stripHtmlTagAttribute.js +5 -0
  111. package/dist/runtime/services/updateContentSecurityPolicy.d.ts +5 -0
  112. package/dist/runtime/services/updateContentSecurityPolicy.js +15 -0
  113. package/dist/schemas/allowedMethodsRestricterOptionsSchema.js +5 -0
  114. package/dist/schemas/basicAuthOptionsSchema.js +12 -0
  115. package/dist/schemas/contentSecurityPolicySchema.js +5 -0
  116. package/dist/schemas/corsHandlerOptionsSchema.js +14 -0
  117. package/dist/schemas/csrfOptionsSchema.js +9 -0
  118. package/dist/schemas/moduleOptionsSchema.js +29 -0
  119. package/dist/schemas/permissionsPolicySchema.js +5 -0
  120. package/dist/schemas/rateLimiterOptionsSchema.js +8 -0
  121. package/dist/schemas/requestSizeLimiterOptionsSchema.js +8 -0
  122. package/dist/schemas/securityHeadersSchema.js +25 -0
  123. package/dist/schemas/ssgOptionsSchema.js +11 -0
  124. package/dist/schemas/strictTransportSecurityOptionsSchema.js +9 -0
  125. package/dist/services/computeSubresourceIntegrityHashes.js +29 -0
  126. package/dist/services/formatZodIssues.js +16 -0
  127. package/dist/services/getDefaultModuleOptions.js +41 -0
  128. package/dist/services/getDefaultSecurityHeaders.js +85 -0
  129. package/dist/services/getPluginTemplate.js +10 -0
  130. package/dist/services/getRemoveLoggersViteConfig.js +4 -0
  131. package/dist/services/getRouteRulesTemplate.js +4 -0
  132. package/dist/services/getRouteSecurityRules.js +17 -0
  133. package/dist/services/getStaticResourceHeaders.js +12 -0
  134. package/dist/services/getTypeTemplate.js +25 -0
  135. package/dist/services/mergeModuleOptions.js +39 -0
  136. package/dist/services/parseModuleOptions.js +10 -0
  137. package/package.json +70 -4
@@ -0,0 +1,85 @@
1
+ import { NONCE_PLACEHOLDER } from "../runtime/constants.js";
2
+ import { CrossOriginEmbedderPolicy } from "../models/CrossOriginEmbedderPolicy.js";
3
+ import { XFrameOptions } from "../models/XFrameOptions.js";
4
+ //#region src/services/getDefaultSecurityHeaders.ts
5
+ const getDefaultSecurityHeaders = (isDevelopment, isStrict) => ({
6
+ contentSecurityPolicy: {
7
+ "base-uri": ["'none'"],
8
+ "default-src": ["'self'"],
9
+ "font-src": [
10
+ "'self'",
11
+ "https:",
12
+ "data:"
13
+ ],
14
+ "form-action": ["'self'"],
15
+ "frame-ancestors": ["'self'"],
16
+ "img-src": ["'self'", "data:"],
17
+ "object-src": ["'none'"],
18
+ "script-src": isStrict ? [
19
+ "'self'",
20
+ "'strict-dynamic'",
21
+ NONCE_PLACEHOLDER
22
+ ] : [
23
+ "'self'",
24
+ "https:",
25
+ "'unsafe-inline'",
26
+ "'strict-dynamic'",
27
+ NONCE_PLACEHOLDER
28
+ ],
29
+ "script-src-attr": ["'none'"],
30
+ "style-src": [
31
+ "'self'",
32
+ "https:",
33
+ "'unsafe-inline'"
34
+ ],
35
+ "upgrade-insecure-requests": true
36
+ },
37
+ crossOriginEmbedderPolicy: isDevelopment ? CrossOriginEmbedderPolicy.UnsafeNone : CrossOriginEmbedderPolicy.Credentialless,
38
+ crossOriginOpenerPolicy: "same-origin",
39
+ crossOriginResourcePolicy: "same-origin",
40
+ originAgentCluster: "?1",
41
+ permissionsPolicy: {
42
+ accelerometer: [],
43
+ autoplay: [],
44
+ camera: [],
45
+ "clipboard-read": [],
46
+ "clipboard-write": [],
47
+ "cross-origin-isolated": [],
48
+ "display-capture": [],
49
+ "encrypted-media": [],
50
+ fullscreen: [],
51
+ gamepad: [],
52
+ geolocation: [],
53
+ gyroscope: [],
54
+ hid: [],
55
+ "idle-detection": [],
56
+ "interest-cohort": [],
57
+ "keyboard-map": [],
58
+ magnetometer: [],
59
+ microphone: [],
60
+ midi: [],
61
+ payment: [],
62
+ "picture-in-picture": [],
63
+ "publickey-credentials-get": [],
64
+ "screen-wake-lock": [],
65
+ serial: [],
66
+ "sync-xhr": ["self"],
67
+ unload: [],
68
+ usb: [],
69
+ "web-share": [],
70
+ "xr-spatial-tracking": []
71
+ },
72
+ referrerPolicy: "no-referrer",
73
+ strictTransportSecurity: {
74
+ includeSubdomains: true,
75
+ maxAge: 63072e3,
76
+ preload: false
77
+ },
78
+ xContentTypeOptions: "nosniff",
79
+ xDNSPrefetchControl: "off",
80
+ xDownloadOptions: "noopen",
81
+ xFrameOptions: XFrameOptions.SameOrigin,
82
+ xPermittedCrossDomainPolicies: "none"
83
+ });
84
+ //#endregion
85
+ export { getDefaultSecurityHeaders };
@@ -0,0 +1,10 @@
1
+ //#region src/services/getPluginTemplate.ts
2
+ const getPluginTemplate = (factoryPath, factoryName, dataPath) => [
3
+ `import { ${factoryName} } from ${JSON.stringify(factoryPath)};`,
4
+ `import data from ${JSON.stringify(dataPath)};`,
5
+ "",
6
+ `export default ${factoryName}(data);`,
7
+ ""
8
+ ].join("\n");
9
+ //#endregion
10
+ export { getPluginTemplate };
@@ -0,0 +1,4 @@
1
+ //#region src/services/getRemoveLoggersViteConfig.ts
2
+ const getRemoveLoggersViteConfig = () => ({ build: { rolldownOptions: { output: { minify: { compress: { dropConsole: true } } } } } });
3
+ //#endregion
4
+ export { getRemoveLoggersViteConfig };
@@ -0,0 +1,4 @@
1
+ //#region src/services/getRouteRulesTemplate.ts
2
+ const getRouteRulesTemplate = (routes) => `export default ${JSON.stringify(routes)}\n`;
3
+ //#endregion
4
+ export { getRouteRulesTemplate };
@@ -0,0 +1,17 @@
1
+ import { moduleOptionsSchema } from "../schemas/moduleOptionsSchema.js";
2
+ import { formatZodIssues } from "./formatZodIssues.js";
3
+ import { mergeModuleOptions } from "./mergeModuleOptions.js";
4
+ //#region src/services/getRouteSecurityRules.ts
5
+ const getRouteSecurityRules = (routeRules, options) => {
6
+ const routeSecurityRules = {};
7
+ for (const [route, { security }] of Object.entries(routeRules)) {
8
+ if (security === void 0) continue;
9
+ if (Object.hasOwn(security, "basicAuth")) throw new TypeError(`nuxt-security-module: route ${route}: basicAuth cannot be set in a route rule`);
10
+ const result = moduleOptionsSchema.safeParse(mergeModuleOptions(options, security));
11
+ if (!result.success) throw new TypeError(`nuxt-security-module: route ${route}: ${formatZodIssues(result.error.issues)}`);
12
+ routeSecurityRules[route] = security;
13
+ }
14
+ return routeSecurityRules;
15
+ };
16
+ //#endregion
17
+ export { getRouteSecurityRules };
@@ -0,0 +1,12 @@
1
+ import { serializeSecurityHeaders } from "../runtime/services/serializeSecurityHeaders.js";
2
+ //#region src/services/getStaticResourceHeaders.ts
3
+ const getStaticResourceHeaders = (headers) => serializeSecurityHeaders({
4
+ referrerPolicy: headers.referrerPolicy,
5
+ strictTransportSecurity: headers.strictTransportSecurity,
6
+ xContentTypeOptions: headers.xContentTypeOptions,
7
+ xDownloadOptions: headers.xDownloadOptions,
8
+ xFrameOptions: headers.xFrameOptions,
9
+ xPermittedCrossDomainPolicies: headers.xPermittedCrossDomainPolicies
10
+ });
11
+ //#endregion
12
+ export { getStaticResourceHeaders };
@@ -0,0 +1,25 @@
1
+ import { MODULE_NAME, ROUTE_RULES_HOOK } from "../runtime/constants.js";
2
+ //#region src/services/getTypeTemplate.ts
3
+ const getTypeTemplate = () => `// Generated by ${MODULE_NAME}
4
+ import type { ModuleOptions } from '${MODULE_NAME}'
5
+
6
+ declare module '#${MODULE_NAME}/route-rules.mjs' {
7
+ const routeRules: Record<string, Partial<ModuleOptions>>
8
+ export default routeRules
9
+ }
10
+
11
+ declare module '#${MODULE_NAME}/sri-hashes.mjs' {
12
+ const sriHashes: Record<string, string>
13
+ export default sriHashes
14
+ }
15
+
16
+ declare module 'nitro/types' {
17
+ interface NitroRuntimeHooks {
18
+ '${ROUTE_RULES_HOOK}': (routeRules: Record<string, Partial<ModuleOptions>>) => void | Promise<void>
19
+ }
20
+ }
21
+
22
+ export {}
23
+ `;
24
+ //#endregion
25
+ export { getTypeTemplate };
@@ -0,0 +1,39 @@
1
+ //#region src/services/mergeModuleOptions.ts
2
+ const mergeModuleOptions = (defaults, overrides) => ({
3
+ ...defaults,
4
+ ...overrides,
5
+ headers: mergeHeaders(defaults.headers, overrides.headers),
6
+ ssg: overrides.ssg === false ? false : {
7
+ ...defaults.ssg,
8
+ ...overrides.ssg
9
+ }
10
+ });
11
+ const mergeHeaders = (defaults, overrides) => {
12
+ if (overrides === false || defaults === false) return overrides ?? defaults;
13
+ if (overrides === void 0) return defaults;
14
+ return {
15
+ ...defaults,
16
+ ...overrides,
17
+ contentSecurityPolicy: mergeDirectives(defaults.contentSecurityPolicy, overrides.contentSecurityPolicy),
18
+ permissionsPolicy: mergeFeatures(defaults.permissionsPolicy, overrides.permissionsPolicy)
19
+ };
20
+ };
21
+ const mergeDirectives = (defaults, overrides) => {
22
+ if (overrides === false || defaults === false) return overrides ?? defaults;
23
+ if (overrides === void 0) return defaults;
24
+ const merged = { ...defaults };
25
+ for (const [directive, value] of Object.entries(overrides)) if (value === false) delete merged[directive];
26
+ else if (Array.isArray(value)) merged[directive] = [.../* @__PURE__ */ new Set([...Array.isArray(merged[directive]) ? merged[directive] : [], ...value])];
27
+ else merged[directive] = value;
28
+ return merged;
29
+ };
30
+ const mergeFeatures = (defaults, overrides) => {
31
+ if (overrides === false || defaults === false) return overrides ?? defaults;
32
+ if (overrides === void 0) return defaults;
33
+ const merged = { ...defaults };
34
+ for (const [feature, sources] of Object.entries(overrides)) if (sources === false) delete merged[feature];
35
+ else merged[feature] = [.../* @__PURE__ */ new Set([...merged[feature] || [], ...sources || []])];
36
+ return merged;
37
+ };
38
+ //#endregion
39
+ export { mergeModuleOptions };
@@ -0,0 +1,10 @@
1
+ import { moduleOptionsSchema } from "../schemas/moduleOptionsSchema.js";
2
+ import { formatZodIssues } from "./formatZodIssues.js";
3
+ //#region src/services/parseModuleOptions.ts
4
+ const parseModuleOptions = (options) => {
5
+ const result = moduleOptionsSchema.safeParse(options);
6
+ if (!result.success) throw new TypeError(`nuxt-security-module: ${formatZodIssues(result.error.issues)}`);
7
+ return result.data;
8
+ };
9
+ //#endregion
10
+ export { parseModuleOptions };
package/package.json CHANGED
@@ -1,6 +1,72 @@
1
1
  {
2
2
  "name": "nuxt-security-module",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "4.1.0",
4
+ "description": "Nuxt security module for Nitro 3 and h3 2 — security headers, a per-request nonce Content Security Policy, subresource integrity, CORS, allowed methods, basic auth and a request size limit.",
5
+ "license": "Apache-2.0",
6
+ "author": "Jimmy Chen",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Esposter/Esposter.git"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "types": "dist/index.d.ts",
17
+ "imports": {
18
+ "#src/*": "./src/*.ts"
19
+ },
20
+ "exports": {
21
+ ".": "./dist/index.js",
22
+ "./runtime/constants": "./dist/runtime/constants.js",
23
+ "./runtime/nitro/plugins/hidePoweredBy": "./dist/runtime/nitro/plugins/hidePoweredBy.js",
24
+ "./runtime/nitro/plugins/nonce": "./dist/runtime/nitro/plugins/nonce.js",
25
+ "./runtime/nitro/plugins/routeRules": "./dist/runtime/nitro/plugins/routeRules.js",
26
+ "./runtime/nitro/plugins/securityHeaders": "./dist/runtime/nitro/plugins/securityHeaders.js",
27
+ "./runtime/nitro/plugins/ssgHashes": "./dist/runtime/nitro/plugins/ssgHashes.js",
28
+ "./runtime/nitro/plugins/subresourceIntegrity": "./dist/runtime/nitro/plugins/subresourceIntegrity.js",
29
+ "./runtime/server/middleware/allowedMethodsRestricter": "./dist/runtime/server/middleware/allowedMethodsRestricter.js",
30
+ "./runtime/server/middleware/basicAuth": "./dist/runtime/server/middleware/basicAuth.js",
31
+ "./runtime/server/middleware/corsHandler": "./dist/runtime/server/middleware/corsHandler.js",
32
+ "./runtime/server/middleware/csrf": "./dist/runtime/server/middleware/csrf.js",
33
+ "./runtime/server/middleware/rateLimiter": "./dist/runtime/server/middleware/rateLimiter.js",
34
+ "./runtime/server/middleware/requestSizeLimiter": "./dist/runtime/server/middleware/requestSizeLimiter.js",
35
+ "./package.json": "./package.json"
36
+ },
37
+ "scripts": {
38
+ "build": "tsdown",
39
+ "bench": "vitest bench --run",
40
+ "format": "oxfmt",
41
+ "format:check": "oxfmt --check",
42
+ "lint": "eslint .",
43
+ "lint:fix": "eslint --fix .",
44
+ "test": "vitest",
45
+ "typecheck": "tsc"
46
+ },
47
+ "dependencies": {
48
+ "@nuxt/kit": "npm:@nuxt/kit-nightly@5x",
49
+ "@nuxt/schema": "npm:@nuxt/schema-nightly@5x",
50
+ "defu": "^6.1.7",
51
+ "rou3": "^1.0.0",
52
+ "zod": "^4.6.7"
53
+ },
54
+ "devDependencies": {
55
+ "@arethetypeswrong/core": "^0.18.5",
56
+ "@esposter/configuration": "4.1.0",
57
+ "@esposter/shared-node": "4.1.0",
58
+ "@nuxt/nitro-server": "npm:@nuxt/nitro-server-nightly@5x",
59
+ "@types/node": "^26.6.5",
60
+ "fast-check": "^4.10.2",
61
+ "h3": "^2.0.2",
62
+ "nitro": "npm:nitro-nightly@latest",
63
+ "publint": "^0.3.25",
64
+ "tsdown": "^0.23.1",
65
+ "vitest": "^5.0.4"
66
+ },
67
+ "peerDependencies": {
68
+ "nitro": "npm:nitro-nightly@latest",
69
+ "nuxt": "npm:nuxt-nightly@5x"
70
+ },
71
+ "gitHead": "68de4c22fa7591bf6f6cc0fab2c9a906d8c4d71a"
72
+ }