nuxt-security-module 4.3.3 → 4.4.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 (136) hide show
  1. package/README.md +23 -8
  2. package/package.json +9 -20
  3. package/dist/index.d.ts +0 -15
  4. package/dist/index.js +0 -104
  5. package/dist/models/AllowedMethodsRestricterOptions.d.ts +0 -3
  6. package/dist/models/BasicAuthOptions.d.ts +0 -7
  7. package/dist/models/ContentSecurityPolicy.d.ts +0 -1
  8. package/dist/models/CorsHandlerOptions.d.ts +0 -11
  9. package/dist/models/CrossOriginEmbedderPolicy.d.ts +0 -6
  10. package/dist/models/CrossOriginEmbedderPolicy.js +0 -7
  11. package/dist/models/CsrfOptions.d.ts +0 -4
  12. package/dist/models/ModuleOptions.d.ts +0 -25
  13. package/dist/models/PermissionsPolicy.d.ts +0 -1
  14. package/dist/models/RateLimitWindow.d.ts +0 -4
  15. package/dist/models/RateLimiterOptions.d.ts +0 -4
  16. package/dist/models/RateLimiterStore.d.ts +0 -4
  17. package/dist/models/RequestSizeLimiterOptions.d.ts +0 -4
  18. package/dist/models/SecurityHeaders.d.ts +0 -20
  19. package/dist/models/SecurityRouteRules.d.ts +0 -2
  20. package/dist/models/SecurityRules.d.ts +0 -2
  21. package/dist/models/SsgOptions.d.ts +0 -7
  22. package/dist/models/StrictTransportSecurity.d.ts +0 -5
  23. package/dist/models/XFrameOptions.d.ts +0 -5
  24. package/dist/models/XFrameOptions.js +0 -6
  25. package/dist/runtime/constants.d.ts +0 -22
  26. package/dist/runtime/constants.js +0 -51
  27. package/dist/runtime/nitro/plugins/hidePoweredBy.d.ts +0 -3
  28. package/dist/runtime/nitro/plugins/hidePoweredBy.js +0 -12
  29. package/dist/runtime/nitro/plugins/nonce.d.ts +0 -3
  30. package/dist/runtime/nitro/plugins/nonce.js +0 -26
  31. package/dist/runtime/nitro/plugins/routeRules.d.ts +0 -3
  32. package/dist/runtime/nitro/plugins/routeRules.js +0 -16
  33. package/dist/runtime/nitro/plugins/securityHeaders.d.ts +0 -3
  34. package/dist/runtime/nitro/plugins/securityHeaders.js +0 -24
  35. package/dist/runtime/nitro/plugins/ssgHashes.d.ts +0 -3
  36. package/dist/runtime/nitro/plugins/ssgHashes.js +0 -26
  37. package/dist/runtime/nitro/plugins/subresourceIntegrity.d.ts +0 -2
  38. package/dist/runtime/nitro/plugins/subresourceIntegrity.js +0 -18
  39. package/dist/runtime/server/middleware/allowedMethodsRestricter.d.ts +0 -3
  40. package/dist/runtime/server/middleware/allowedMethodsRestricter.js +0 -14
  41. package/dist/runtime/server/middleware/basicAuth.d.ts +0 -3
  42. package/dist/runtime/server/middleware/basicAuth.js +0 -22
  43. package/dist/runtime/server/middleware/corsHandler.d.ts +0 -3
  44. package/dist/runtime/server/middleware/corsHandler.js +0 -19
  45. package/dist/runtime/server/middleware/csrf.d.ts +0 -3
  46. package/dist/runtime/server/middleware/csrf.js +0 -27
  47. package/dist/runtime/server/middleware/rateLimiter.d.ts +0 -3
  48. package/dist/runtime/server/middleware/rateLimiter.js +0 -21
  49. package/dist/runtime/server/middleware/requestSizeLimiter.d.ts +0 -3
  50. package/dist/runtime/server/middleware/requestSizeLimiter.js +0 -16
  51. package/dist/runtime/services/checkIsBasicAuthorized.d.ts +0 -2
  52. package/dist/runtime/services/checkIsBasicAuthorized.js +0 -11
  53. package/dist/runtime/services/checkIsChallenged.d.ts +0 -2
  54. package/dist/runtime/services/checkIsChallenged.js +0 -7
  55. package/dist/runtime/services/checkIsCsrfTokenValid.d.ts +0 -1
  56. package/dist/runtime/services/checkIsCsrfTokenValid.js +0 -7
  57. package/dist/runtime/services/checkIsEqualInConstantTime.d.ts +0 -1
  58. package/dist/runtime/services/checkIsEqualInConstantTime.js +0 -10
  59. package/dist/runtime/services/checkIsMethodAllowed.d.ts +0 -1
  60. package/dist/runtime/services/checkIsMethodAllowed.js +0 -3
  61. package/dist/runtime/services/checkIsRecord.d.ts +0 -1
  62. package/dist/runtime/services/checkIsRecord.js +0 -3
  63. package/dist/runtime/services/checkIsRequestTooLarge.d.ts +0 -2
  64. package/dist/runtime/services/checkIsRequestTooLarge.js +0 -8
  65. package/dist/runtime/services/collectSsgHashes.d.ts +0 -3
  66. package/dist/runtime/services/collectSsgHashes.js +0 -40
  67. package/dist/runtime/services/createInMemoryRateLimiterStore.d.ts +0 -2
  68. package/dist/runtime/services/createInMemoryRateLimiterStore.js +0 -21
  69. package/dist/runtime/services/generateHash.d.ts +0 -1
  70. package/dist/runtime/services/generateHash.js +0 -8
  71. package/dist/runtime/services/generateNonce.d.ts +0 -1
  72. package/dist/runtime/services/generateNonce.js +0 -5
  73. package/dist/runtime/services/generateRandomToken.d.ts +0 -1
  74. package/dist/runtime/services/generateRandomToken.js +0 -7
  75. package/dist/runtime/services/getBasicAuthCredentials.d.ts +0 -4
  76. package/dist/runtime/services/getBasicAuthCredentials.js +0 -18
  77. package/dist/runtime/services/getBasicAuthOptions.d.ts +0 -2
  78. package/dist/runtime/services/getBasicAuthOptions.js +0 -16
  79. package/dist/runtime/services/getRetryAfterSeconds.d.ts +0 -3
  80. package/dist/runtime/services/getRetryAfterSeconds.js +0 -8
  81. package/dist/runtime/services/getSecurityRules.d.ts +0 -3
  82. package/dist/runtime/services/getSecurityRules.js +0 -14
  83. package/dist/runtime/services/getSecurityState.d.ts +0 -9
  84. package/dist/runtime/services/getSecurityState.js +0 -13
  85. package/dist/runtime/services/injectNonce.d.ts +0 -1
  86. package/dist/runtime/services/injectNonce.js +0 -6
  87. package/dist/runtime/services/injectSubresourceIntegrity.d.ts +0 -1
  88. package/dist/runtime/services/injectSubresourceIntegrity.js +0 -21
  89. package/dist/runtime/services/insertContentSecurityPolicyMeta.d.ts +0 -2
  90. package/dist/runtime/services/insertContentSecurityPolicyMeta.js +0 -16
  91. package/dist/runtime/services/mergeSecurityRules.d.ts +0 -2
  92. package/dist/runtime/services/mergeSecurityRules.js +0 -10
  93. package/dist/runtime/services/readHtmlTagAttribute.d.ts +0 -1
  94. package/dist/runtime/services/readHtmlTagAttribute.js +0 -7
  95. package/dist/runtime/services/rewriteHtmlTags.d.ts +0 -1
  96. package/dist/runtime/services/rewriteHtmlTags.js +0 -8
  97. package/dist/runtime/services/securityRouteMatcher.d.ts +0 -3
  98. package/dist/runtime/services/securityRouteMatcher.js +0 -10
  99. package/dist/runtime/services/serializeBasicAuthChallenge.d.ts +0 -1
  100. package/dist/runtime/services/serializeBasicAuthChallenge.js +0 -3
  101. package/dist/runtime/services/serializeContentSecurityPolicy.d.ts +0 -2
  102. package/dist/runtime/services/serializeContentSecurityPolicy.js +0 -6
  103. package/dist/runtime/services/serializePermissionsPolicy.d.ts +0 -2
  104. package/dist/runtime/services/serializePermissionsPolicy.js +0 -3
  105. package/dist/runtime/services/serializeSecurityHeaders.d.ts +0 -2
  106. package/dist/runtime/services/serializeSecurityHeaders.js +0 -18
  107. package/dist/runtime/services/serializeStrictTransportSecurity.d.ts +0 -2
  108. package/dist/runtime/services/serializeStrictTransportSecurity.js +0 -7
  109. package/dist/runtime/services/stripHtmlTagAttribute.d.ts +0 -1
  110. package/dist/runtime/services/stripHtmlTagAttribute.js +0 -4
  111. package/dist/runtime/services/updateContentSecurityPolicy.d.ts +0 -3
  112. package/dist/runtime/services/updateContentSecurityPolicy.js +0 -14
  113. package/dist/schemas/allowedMethodsRestricterOptionsSchema.js +0 -4
  114. package/dist/schemas/basicAuthOptionsSchema.js +0 -11
  115. package/dist/schemas/contentSecurityPolicySchema.js +0 -4
  116. package/dist/schemas/corsHandlerOptionsSchema.js +0 -13
  117. package/dist/schemas/csrfOptionsSchema.js +0 -8
  118. package/dist/schemas/moduleOptionsSchema.js +0 -28
  119. package/dist/schemas/permissionsPolicySchema.js +0 -4
  120. package/dist/schemas/rateLimiterOptionsSchema.js +0 -7
  121. package/dist/schemas/requestSizeLimiterOptionsSchema.js +0 -7
  122. package/dist/schemas/securityHeadersSchema.js +0 -24
  123. package/dist/schemas/ssgOptionsSchema.js +0 -10
  124. package/dist/schemas/strictTransportSecurityOptionsSchema.js +0 -8
  125. package/dist/services/computeSubresourceIntegrityHashes.js +0 -28
  126. package/dist/services/formatZodIssues.js +0 -15
  127. package/dist/services/getDefaultModuleOptions.js +0 -40
  128. package/dist/services/getDefaultSecurityHeaders.js +0 -84
  129. package/dist/services/getPluginTemplate.js +0 -9
  130. package/dist/services/getRemoveLoggersViteConfig.js +0 -3
  131. package/dist/services/getRouteRulesTemplate.js +0 -3
  132. package/dist/services/getRouteSecurityRules.js +0 -16
  133. package/dist/services/getStaticResourceHeaders.js +0 -11
  134. package/dist/services/getTypeTemplate.js +0 -24
  135. package/dist/services/mergeModuleOptions.js +0 -38
  136. package/dist/services/parseModuleOptions.js +0 -9
@@ -1,2 +0,0 @@
1
- import { ContentSecurityPolicy } from "../../models/ContentSecurityPolicy.js";
2
- export declare const serializeContentSecurityPolicy: (policy: ContentSecurityPolicy) => string;
@@ -1,6 +0,0 @@
1
- // src/runtime/services/serializeContentSecurityPolicy.ts
2
- const serializeContentSecurityPolicy = (policy) => Object.entries(policy).filter(([, value]) => value !== false).map(([directive, value]) => {
3
- if (directive === "upgrade-insecure-requests") return "upgrade-insecure-requests;";
4
- return `${directive} ${Array.isArray(value) ? value.map((source) => source.trim()).join(" ") : ""};`;
5
- }).join(" ");
6
- export { serializeContentSecurityPolicy };
@@ -1,2 +0,0 @@
1
- import { PermissionsPolicy } from "../../models/PermissionsPolicy.js";
2
- export declare const serializePermissionsPolicy: (policy: PermissionsPolicy) => string;
@@ -1,3 +0,0 @@
1
- // src/runtime/services/serializePermissionsPolicy.ts
2
- const serializePermissionsPolicy = (policy) => Object.entries(policy).flatMap(([feature, sources]) => sources === false ? [] : [`${feature}=(${(sources ?? []).join(" ")})`]).join(", ");
3
- export { serializePermissionsPolicy };
@@ -1,2 +0,0 @@
1
- import { SecurityHeaders } from "../../models/SecurityHeaders.js";
2
- export declare const serializeSecurityHeaders: (headers: SecurityHeaders) => Record<string, string>;
@@ -1,18 +0,0 @@
1
- import { SECURITY_HEADER_NAMES } from "../constants.js";
2
- import { serializeContentSecurityPolicy } from "./serializeContentSecurityPolicy.js";
3
- import { serializePermissionsPolicy } from "./serializePermissionsPolicy.js";
4
- import { serializeStrictTransportSecurity } from "./serializeStrictTransportSecurity.js";
5
- // src/runtime/services/serializeSecurityHeaders.ts
6
- const checkIsSecurityHeaderKey = (key) => Object.hasOwn(SECURITY_HEADER_NAMES, key);
7
- const serializeSecurityHeaders = (headers) => Object.fromEntries(Object.keys(headers).flatMap((key) => {
8
- if (!checkIsSecurityHeaderKey(key)) return [];
9
- const value = headers[key];
10
- return value === false || value === void 0 ? [] : [[SECURITY_HEADER_NAMES[key], serializeValue(key, value)]];
11
- }));
12
- const serializeValue = (key, value) => {
13
- if (key === "contentSecurityPolicy") return serializeContentSecurityPolicy(value);
14
- if (key === "permissionsPolicy") return serializePermissionsPolicy(value);
15
- if (key === "strictTransportSecurity") return serializeStrictTransportSecurity(value);
16
- return String(value);
17
- };
18
- export { serializeSecurityHeaders };
@@ -1,2 +0,0 @@
1
- import { StrictTransportSecurity } from "../../models/StrictTransportSecurity.js";
2
- export declare const serializeStrictTransportSecurity: (policy: StrictTransportSecurity) => string;
@@ -1,7 +0,0 @@
1
- // src/runtime/services/serializeStrictTransportSecurity.ts
2
- const serializeStrictTransportSecurity = (policy) => [
3
- `max-age=${policy.maxAge}`,
4
- policy.includeSubdomains && "includeSubDomains",
5
- policy.preload && "preload"
6
- ].filter(Boolean).join("; ");
7
- export { serializeStrictTransportSecurity };
@@ -1 +0,0 @@
1
- export declare const stripHtmlTagAttribute: (attributes: string, attributeName: string) => string;
@@ -1,4 +0,0 @@
1
- import { HTML_ATTRIBUTE_REGEX } from "../constants.js";
2
- // src/runtime/services/stripHtmlTagAttribute.ts
3
- const stripHtmlTagAttribute = (attributes, attributeName) => attributes.replace(HTML_ATTRIBUTE_REGEX, (token, name) => name.toLowerCase() === attributeName ? "" : token);
4
- export { stripHtmlTagAttribute };
@@ -1,3 +0,0 @@
1
- import { ContentSecurityPolicy } from "../../models/ContentSecurityPolicy.js";
2
- import { SecurityState } from "./getSecurityState.js";
3
- export declare const updateContentSecurityPolicy: (policy: ContentSecurityPolicy, { hashes, nonce }: SecurityState) => ContentSecurityPolicy;
@@ -1,14 +0,0 @@
1
- import { NONCE_PLACEHOLDER } from "../constants.js";
2
- // src/runtime/services/updateContentSecurityPolicy.ts
3
- const SCRIPT_DIRECTIVES = /* @__PURE__ */ new Set(["script-src", "script-src-elem"]);
4
- const STYLE_DIRECTIVES = /* @__PURE__ */ new Set(["style-src", "style-src-elem"]);
5
- const updateContentSecurityPolicy = (policy, { hashes, nonce }) => Object.fromEntries(Object.keys(policy).map((directive) => {
6
- const value = policy[directive];
7
- if (!Array.isArray(value)) return [directive, value];
8
- const sources = value.filter((source) => !checkIsStaticNonce(source)).map((source) => source === "'nonce-{{nonce}}'" && nonce ? `'nonce-${nonce}'` : source).filter((source) => source !== NONCE_PLACEHOLDER);
9
- if (SCRIPT_DIRECTIVES.has(directive)) sources.push(...hashes.script);
10
- if (STYLE_DIRECTIVES.has(directive)) sources.push(...hashes.style);
11
- return [directive, sources];
12
- }));
13
- const checkIsStaticNonce = (source) => source.startsWith("'nonce-") && source !== "'nonce-{{nonce}}'";
14
- export { updateContentSecurityPolicy };
@@ -1,4 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/allowedMethodsRestricterOptionsSchema.ts
3
- const allowedMethodsRestricterOptionsSchema = z.strictObject({ methods: z.array(z.string().min(1)).min(1) });
4
- export { allowedMethodsRestricterOptionsSchema };
@@ -1,11 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/basicAuthOptionsSchema.ts
3
- const pathSchema = z.string().startsWith("/");
4
- const basicAuthOptionsSchema = z.strictObject({
5
- exclude: z.array(pathSchema).optional(),
6
- include: z.array(pathSchema).optional(),
7
- message: z.string().optional(),
8
- name: z.string().min(1),
9
- pass: z.string().min(1)
10
- });
11
- export { basicAuthOptionsSchema };
@@ -1,4 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/contentSecurityPolicySchema.ts
3
- const contentSecurityPolicySchema = z.record(z.string().min(1), z.union([z.boolean(), z.array(z.string().min(1))]).optional());
4
- export { contentSecurityPolicySchema };
@@ -1,13 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/corsHandlerOptionsSchema.ts
3
- const headerNameSchema = z.string().regex(/^[\w-]+$/u);
4
- const corsHandlerOptionsSchema = z.strictObject({
5
- allowHeaders: z.array(headerNameSchema).optional(),
6
- credentials: z.boolean().optional(),
7
- exposeHeaders: z.array(headerNameSchema).optional(),
8
- maxAge: z.string().regex(/^\d+$/u).optional(),
9
- methods: z.array(z.string().min(1)).min(1),
10
- origin: z.union([z.url(), z.array(z.url())]),
11
- preflight: z.strictObject({ statusCode: z.int().min(200).max(299) }).optional()
12
- });
13
- export { corsHandlerOptionsSchema };
@@ -1,8 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/csrfOptionsSchema.ts
3
- const tokenNameSchema = z.string().regex(/^[\w-]+$/u, "must be letters, digits, underscores or hyphens");
4
- const csrfOptionsSchema = z.strictObject({
5
- cookieName: tokenNameSchema,
6
- headerName: tokenNameSchema
7
- });
8
- export { csrfOptionsSchema };
@@ -1,28 +0,0 @@
1
- import { allowedMethodsRestricterOptionsSchema } from "./allowedMethodsRestricterOptionsSchema.js";
2
- import { basicAuthOptionsSchema } from "./basicAuthOptionsSchema.js";
3
- import { corsHandlerOptionsSchema } from "./corsHandlerOptionsSchema.js";
4
- import { csrfOptionsSchema } from "./csrfOptionsSchema.js";
5
- import { rateLimiterOptionsSchema } from "./rateLimiterOptionsSchema.js";
6
- import { requestSizeLimiterOptionsSchema } from "./requestSizeLimiterOptionsSchema.js";
7
- import { securityHeadersSchema } from "./securityHeadersSchema.js";
8
- import { ssgOptionsSchema } from "./ssgOptionsSchema.js";
9
- import { z } from "zod";
10
- // src/schemas/moduleOptionsSchema.ts
11
- const moduleOptionsSchema = z.strictObject({
12
- allowedMethodsRestricter: z.union([allowedMethodsRestricterOptionsSchema, z.literal(false)]),
13
- basicAuth: z.union([basicAuthOptionsSchema, z.literal(false)]),
14
- contentSecurityPolicyReportOnly: z.boolean(),
15
- corsHandler: z.union([corsHandlerOptionsSchema, z.literal(false)]),
16
- csrf: z.union([csrfOptionsSchema, z.literal(false)]),
17
- enabled: z.boolean(),
18
- headers: z.union([securityHeadersSchema, z.literal(false)]),
19
- hidePoweredBy: z.boolean(),
20
- nonce: z.boolean(),
21
- rateLimiter: z.union([rateLimiterOptionsSchema, z.literal(false)]),
22
- removeLoggers: z.boolean(),
23
- requestSizeLimiter: z.union([requestSizeLimiterOptionsSchema, z.literal(false)]),
24
- sri: z.boolean(),
25
- ssg: z.union([ssgOptionsSchema, z.literal(false)]),
26
- strict: z.boolean()
27
- });
28
- export { moduleOptionsSchema };
@@ -1,4 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/permissionsPolicySchema.ts
3
- const permissionsPolicySchema = z.record(z.string().min(1), z.union([z.literal(false), z.array(z.string().min(1))]).optional());
4
- export { permissionsPolicySchema };
@@ -1,7 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/rateLimiterOptionsSchema.ts
3
- const rateLimiterOptionsSchema = z.strictObject({
4
- intervalInMilliseconds: z.int("must be a whole number of milliseconds").positive("must be more than zero milliseconds"),
5
- tokensPerInterval: z.int("must be a whole number of requests").positive("must allow at least one request")
6
- });
7
- export { rateLimiterOptionsSchema };
@@ -1,7 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/requestSizeLimiterOptionsSchema.ts
3
- const requestSizeLimiterOptionsSchema = z.strictObject({
4
- maxRequestSizeInBytes: z.int("must be a whole number of bytes").positive("must be more than zero bytes"),
5
- maxUploadFileRequestInBytes: z.int("must be a whole number of bytes").positive("must be more than zero bytes")
6
- });
7
- export { requestSizeLimiterOptionsSchema };
@@ -1,24 +0,0 @@
1
- import { CrossOriginEmbedderPolicy } from "../models/CrossOriginEmbedderPolicy.js";
2
- import { XFrameOptions } from "../models/XFrameOptions.js";
3
- import { contentSecurityPolicySchema } from "./contentSecurityPolicySchema.js";
4
- import { permissionsPolicySchema } from "./permissionsPolicySchema.js";
5
- import { strictTransportSecurityOptionsSchema } from "./strictTransportSecurityOptionsSchema.js";
6
- import { z } from "zod";
7
- // src/schemas/securityHeadersSchema.ts
8
- const headerValueSchema = z.string().min(1);
9
- const securityHeadersSchema = z.strictObject({
10
- contentSecurityPolicy: z.union([contentSecurityPolicySchema, z.literal(false)]).optional(),
11
- crossOriginEmbedderPolicy: z.union([z.enum(CrossOriginEmbedderPolicy), z.literal(false)]).optional(),
12
- crossOriginOpenerPolicy: z.union([headerValueSchema, z.literal(false)]).optional(),
13
- crossOriginResourcePolicy: z.union([headerValueSchema, z.literal(false)]).optional(),
14
- originAgentCluster: z.union([headerValueSchema, z.literal(false)]).optional(),
15
- permissionsPolicy: z.union([permissionsPolicySchema, z.literal(false)]).optional(),
16
- referrerPolicy: z.union([headerValueSchema, z.literal(false)]).optional(),
17
- strictTransportSecurity: z.union([strictTransportSecurityOptionsSchema, z.literal(false)]).optional(),
18
- xContentTypeOptions: z.union([headerValueSchema, z.literal(false)]).optional(),
19
- xDNSPrefetchControl: z.union([headerValueSchema, z.literal(false)]).optional(),
20
- xDownloadOptions: z.union([headerValueSchema, z.literal(false)]).optional(),
21
- xFrameOptions: z.union([z.enum(XFrameOptions), z.literal(false)]).optional(),
22
- xPermittedCrossDomainPolicies: z.union([headerValueSchema, z.literal(false)]).optional()
23
- });
24
- export { securityHeadersSchema };
@@ -1,10 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/ssgOptionsSchema.ts
3
- const ssgOptionsSchema = z.strictObject({
4
- exportToPresets: z.boolean(),
5
- hashScripts: z.boolean(),
6
- hashStyles: z.boolean(),
7
- meta: z.boolean(),
8
- nitroHeaders: z.boolean()
9
- });
10
- export { ssgOptionsSchema };
@@ -1,8 +0,0 @@
1
- import { z } from "zod";
2
- // src/schemas/strictTransportSecurityOptionsSchema.ts
3
- const strictTransportSecurityOptionsSchema = z.strictObject({
4
- includeSubdomains: z.boolean(),
5
- maxAge: z.int().nonnegative(),
6
- preload: z.boolean()
7
- });
8
- export { strictTransportSecurityOptionsSchema };
@@ -1,28 +0,0 @@
1
- import { SRI_HASH_ALGORITHM } from "../runtime/constants.js";
2
- import { generateHash } from "../runtime/services/generateHash.js";
3
- import { existsSync } from "node:fs";
4
- import { readFile, readdir } from "node:fs/promises";
5
- import { join, posix, relative, sep } from "node:path";
6
- // src/services/computeSubresourceIntegrityHashes.ts
7
- const computeSubresourceIntegrityHashes = async (nitro) => {
8
- const { baseURL: appBaseUrl, cdnURL: appCdnUrl } = nitro.options.runtimeConfig.app;
9
- const existingPublicAssets = nitro.options.publicAssets.filter(({ dir: directory }) => existsSync(directory));
10
- const filesByPublicAsset = await Promise.all(existingPublicAssets.map(async ({ baseURL = "", dir: directory }) => {
11
- return (await readdir(directory, {
12
- recursive: true,
13
- withFileTypes: true
14
- })).filter((entry) => entry.isFile()).map((entry) => {
15
- const filePath = join(entry.parentPath, entry.name);
16
- return {
17
- filePath,
18
- fullPath: posix.join(baseURL, ...relative(directory, filePath).split(sep))
19
- };
20
- });
21
- }));
22
- const hashEntries = await Promise.all(filesByPublicAsset.flat().map(async ({ filePath, fullPath }) => {
23
- const hash = await generateHash(await readFile(filePath), SRI_HASH_ALGORITHM);
24
- return [appCdnUrl ? new URL(posix.isAbsolute(fullPath) ? fullPath.slice(1) : fullPath, appCdnUrl.endsWith("/") ? appCdnUrl : `${appCdnUrl}/`).href : posix.join("/", appBaseUrl, fullPath), hash];
25
- }));
26
- return Object.fromEntries(hashEntries);
27
- };
28
- export { computeSubresourceIntegrityHashes };
@@ -1,15 +0,0 @@
1
- // src/services/formatZodIssues.ts
2
- const getDeepestPathLength = (leafIssues) => Math.max(-1, ...leafIssues.map(({ path }) => path.length));
3
- const getLeafIssues = (issue, parentPath) => {
4
- const path = [...parentPath, ...issue.path];
5
- if (issue.code !== "invalid_union") return [{
6
- issue,
7
- path
8
- }];
9
- return issue.errors.map((branch) => branch.flatMap((branchIssue) => getLeafIssues(branchIssue, path))).reduce((deepest, branch) => getDeepestPathLength(branch) > getDeepestPathLength(deepest) ? branch : deepest);
10
- };
11
- const formatLeafIssue = ({ issue, path }) => {
12
- return `${path.map(String).join(".") || "(options)"}: ${issue.message}`;
13
- };
14
- const formatZodIssues = (issues) => issues.flatMap((issue) => getLeafIssues(issue, [])).map((leafIssue) => formatLeafIssue(leafIssue)).join("; ");
15
- export { formatZodIssues };
@@ -1,40 +0,0 @@
1
- import { getDefaultSecurityHeaders } from "./getDefaultSecurityHeaders.js";
2
- // src/services/getDefaultModuleOptions.ts
3
- const getDefaultModuleOptions = (isDevelopment, devServerUrl, isStrict) => ({
4
- allowedMethodsRestricter: false,
5
- basicAuth: false,
6
- contentSecurityPolicyReportOnly: false,
7
- corsHandler: {
8
- methods: [
9
- "GET",
10
- "HEAD",
11
- "PUT",
12
- "PATCH",
13
- "POST",
14
- "DELETE"
15
- ],
16
- origin: devServerUrl,
17
- preflight: { statusCode: 204 }
18
- },
19
- csrf: false,
20
- enabled: true,
21
- headers: getDefaultSecurityHeaders(isDevelopment, isStrict),
22
- hidePoweredBy: true,
23
- nonce: true,
24
- rateLimiter: false,
25
- removeLoggers: false,
26
- requestSizeLimiter: {
27
- maxRequestSizeInBytes: 2e6,
28
- maxUploadFileRequestInBytes: 8e6
29
- },
30
- sri: true,
31
- ssg: {
32
- exportToPresets: true,
33
- hashScripts: true,
34
- hashStyles: false,
35
- meta: true,
36
- nitroHeaders: true
37
- },
38
- strict: isStrict
39
- });
40
- export { getDefaultModuleOptions };
@@ -1,84 +0,0 @@
1
- import { NONCE_PLACEHOLDER } from "../runtime/constants.js";
2
- import { CrossOriginEmbedderPolicy } from "../models/CrossOriginEmbedderPolicy.js";
3
- import { XFrameOptions } from "../models/XFrameOptions.js";
4
- // 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
- export { getDefaultSecurityHeaders };
@@ -1,9 +0,0 @@
1
- // 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
- export { getPluginTemplate };
@@ -1,3 +0,0 @@
1
- // src/services/getRemoveLoggersViteConfig.ts
2
- const getRemoveLoggersViteConfig = () => ({ build: { rolldownOptions: { output: { minify: { compress: { dropConsole: true } } } } } });
3
- export { getRemoveLoggersViteConfig };
@@ -1,3 +0,0 @@
1
- // src/services/getRouteRulesTemplate.ts
2
- const getRouteRulesTemplate = (routes) => `export default ${JSON.stringify(routes)}\n`;
3
- export { getRouteRulesTemplate };
@@ -1,16 +0,0 @@
1
- import { moduleOptionsSchema } from "../schemas/moduleOptionsSchema.js";
2
- import { formatZodIssues } from "./formatZodIssues.js";
3
- import { mergeModuleOptions } from "./mergeModuleOptions.js";
4
- // 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
- export { getRouteSecurityRules };
@@ -1,11 +0,0 @@
1
- import { serializeSecurityHeaders } from "../runtime/services/serializeSecurityHeaders.js";
2
- // 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
- export { getStaticResourceHeaders };
@@ -1,24 +0,0 @@
1
- import { MODULE_NAME, ROUTE_RULES_HOOK } from "../runtime/constants.js";
2
- // 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
- export { getTypeTemplate };
@@ -1,38 +0,0 @@
1
- // 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
- export { mergeModuleOptions };
@@ -1,9 +0,0 @@
1
- import { moduleOptionsSchema } from "../schemas/moduleOptionsSchema.js";
2
- import { formatZodIssues } from "./formatZodIssues.js";
3
- // 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
- export { parseModuleOptions };