UNPKG

next-armored

Version:
1 lines 11 kB
{"version":3,"sources":["../../../middlewares/cross-origin-resource-sharing/index.ts","../../../middlewares/cross-origin-resource-sharing/middleware.ts","../../../middlewares/cross-origin-resource-sharing/config.ts","../../../middlewares/cross-origin-resource-sharing/constants.ts","../../../middlewares/cross-origin-resource-sharing/utils.ts"],"sourcesContent":["import createCorsMiddleware from './middleware';\nimport type { CorsConfig } from './types';\nimport { DEFAULT_CORS_CONFIG } from './config';\n\nexport default createCorsMiddleware;\n\nexport { DEFAULT_CORS_CONFIG, type CorsConfig, createCorsMiddleware };\n","import { NextResponse, NextRequest } from 'next/server';\nimport type { CorsConfig, PathOptions } from './types';\nimport { DEFAULT_CORS_CONFIG } from './config';\nimport {\n configureAllowCredentials,\n configureAllowHeaders,\n configureAllowMethods,\n configureAllowOrigin,\n configureExposedHeaders,\n configureMaxAge,\n getIsOriginAllowed,\n isPathIncluded,\n} from './utils';\nimport type { Header, NextCorsMiddleware } from './types';\n\n/**\n * CORS middleware builder\n * @param config - The CORS configuration (origins, methods, headers, etc.)\n * @param pathOptions - Path options selector (includes, excludes) to enable or disable CORS for specific paths\n * @returns The corsMiddleware function\n * @usage\n * ```ts\n * export const corsMiddleware = createCorsMiddleware(config, pathOptions);\n * ```\n */\nconst createCorsMiddleware = (\n config: CorsConfig,\n pathOptions: PathOptions = {},\n): NextCorsMiddleware => {\n const configWithDefaults = { ...DEFAULT_CORS_CONFIG, ...config };\n const {\n origins,\n methods,\n headers,\n allowCredentials,\n exposedHeaders,\n maxAge,\n optionsSuccessStatus,\n preflightContinue,\n } = configWithDefaults;\n\n /**\n * @description Middleware handling CORS\n * @param request - The request object with information about the origin and the method\n * @param response (optional) - If provided, the headers will be attached to the response. Unless in case of preflight request without preflightContinue set to true.\n * @returns A NextResponse object with the headers attached\n * @usage\n * ```ts\n * export const middleware = createCorsMiddleware(config);\n * ```\n */\n const corsMiddleware = (request: NextRequest, response?: NextResponse) => {\n const nextResponse = response ?? NextResponse.next();\n const pathname = request.nextUrl.pathname;\n if (\n pathOptions.excludes !== undefined &&\n isPathIncluded(pathname, pathOptions.excludes)\n ) {\n return nextResponse;\n }\n\n if (\n pathOptions.includes !== undefined &&\n !isPathIncluded(pathname, pathOptions.includes)\n ) {\n return nextResponse;\n }\n\n const origin = request.headers.get('origin') ?? '';\n const isOriginAllowed = getIsOriginAllowed(origin, origins);\n const optionsHeaders: Header[] = [];\n optionsHeaders.push(configureMaxAge(maxAge));\n optionsHeaders.push(configureExposedHeaders(exposedHeaders));\n optionsHeaders.push(configureAllowCredentials(allowCredentials));\n optionsHeaders.push(configureAllowMethods(methods));\n optionsHeaders.push(configureAllowHeaders(headers));\n\n if (isOriginAllowed.result) {\n optionsHeaders.push(configureAllowOrigin(isOriginAllowed.origin));\n }\n\n const isPreflight = request.method === 'OPTIONS';\n\n if (isPreflight && !preflightContinue) {\n return NextResponse.json(\n {},\n {\n headers: optionsHeaders.map(header => [header.key, header.value]),\n status: optionsSuccessStatus,\n },\n );\n }\n\n optionsHeaders.forEach(({ key, value }) => {\n nextResponse.headers.set(key, value);\n });\n\n return nextResponse;\n };\n\n return corsMiddleware;\n};\n\nexport default createCorsMiddleware;\n","import type { Method } from './types';\n\ntype CorsConfigDefaults = {\n origins: undefined;\n methods: Method[];\n headers: string[];\n allowCredentials: boolean;\n exposedHeaders: string[];\n preflightContinue: boolean;\n maxAge: number;\n optionsSuccessStatus: number;\n};\n\n/**\n * @default origins is undefined, you must specify it manually to prevent unwanted * which can be a security risk\n * @default methods is ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']\n * @default headers is ['Content-Type', 'Authorization']\n * @default allowCredentials is true\n * @default preflightContinue is false\n * @default optionsSuccessStatus is 204\n * @default exposedHeaders is []\n * @default maxAge is 1 day\n */\nexport const DEFAULT_CORS_CONFIG: CorsConfigDefaults = {\n origins: undefined, // Required -> DO NOT USE * by default\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: ['Content-Type', 'Authorization'],\n allowCredentials: true,\n preflightContinue: false,\n optionsSuccessStatus: 204,\n exposedHeaders: [],\n maxAge: 60 * 60 * 24, // 1 day\n};\n","export const ACCESS_CONTROL_ALLOW_ORIGIN = 'Access-Control-Allow-Origin';\nexport const ACCESS_CONTROL_ALLOW_CREDENTIALS =\n 'Access-Control-Allow-Credentials';\nexport const ACCESS_CONTROL_ALLOW_METHODS = 'Access-Control-Allow-Methods';\nexport const ACCESS_CONTROL_ALLOW_HEADERS = 'Access-Control-Allow-Headers';\nexport const ACCESS_CONTROL_EXPOSE_HEADERS = 'Access-Control-Expose-Headers';\nexport const ACCESS_CONTROL_MAX_AGE = 'Access-Control-Max-Age';\n","import {\n ACCESS_CONTROL_MAX_AGE,\n ACCESS_CONTROL_EXPOSE_HEADERS,\n ACCESS_CONTROL_ALLOW_CREDENTIALS,\n ACCESS_CONTROL_ALLOW_METHODS,\n ACCESS_CONTROL_ALLOW_HEADERS,\n ACCESS_CONTROL_ALLOW_ORIGIN,\n} from './constants';\nimport type {\n Header,\n IsOriginAllowedResult,\n Method,\n Origin,\n PathMatcher,\n} from './types';\n\nexport function isPathMatching(\n url: string,\n pathMatcher: PathMatcher,\n includeOption: 'every' | 'some' = 'every',\n) {\n const { startWith, additionalIncludes } = pathMatcher;\n const isMatching = url.startsWith(startWith);\n if (isMatching && additionalIncludes !== undefined) {\n if (includeOption === 'every') {\n return additionalIncludes.every(path => url.includes(path));\n }\n return additionalIncludes.some(path => url.includes(path));\n }\n return isMatching;\n}\n\nexport function isPathIncluded(path: string, pathToMatch: PathMatcher[]) {\n return pathToMatch.some(pathMatcher => isPathMatching(path, pathMatcher));\n}\n\nexport function configureMaxAge(maxAge: number): Header {\n return {\n key: ACCESS_CONTROL_MAX_AGE,\n value: maxAge.toString(),\n };\n}\n\nexport function configureExposedHeaders(exposedHeaders: string[]): Header {\n return {\n key: ACCESS_CONTROL_EXPOSE_HEADERS,\n value: exposedHeaders.join(', '),\n };\n}\n\nexport function configureAllowCredentials(allowCredentials: boolean): Header {\n return {\n key: ACCESS_CONTROL_ALLOW_CREDENTIALS,\n value: allowCredentials ? 'true' : 'false',\n };\n}\n\nexport function configureAllowMethods(methods: Method[]): Header {\n return {\n key: ACCESS_CONTROL_ALLOW_METHODS,\n value: methods.join(', '),\n };\n}\n\nexport function configureAllowHeaders(headers: string[]): Header {\n return {\n key: ACCESS_CONTROL_ALLOW_HEADERS,\n value: headers.join(', '),\n };\n}\n\nexport function configureAllowOrigin(origin: string): Header {\n return {\n key: ACCESS_CONTROL_ALLOW_ORIGIN,\n value: origin,\n };\n}\n\nexport function getIsOriginAllowed(\n origin: string,\n allowedOrigins: Origin[],\n): IsOriginAllowedResult {\n if (allowedOrigins.length === 0) {\n return { result: false };\n }\n // if contains '*', allow all origins\n if (allowedOrigins.includes('*')) {\n return { result: true, origin };\n }\n for (const allowedOrigin of allowedOrigins) {\n if (typeof allowedOrigin === 'string' && allowedOrigin === origin) {\n return { result: true, origin };\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return { result: true, origin };\n }\n }\n\n return { result: false };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAA0C;;;ACuBnC,IAAM,sBAA0C;AAAA,EACrD,SAAS;AAAA;AAAA,EACT,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS;AAAA,EAC5D,SAAS,CAAC,gBAAgB,eAAe;AAAA,EACzC,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,gBAAgB,CAAC;AAAA,EACjB,QAAQ,KAAK,KAAK;AAAA;AACpB;;;AChCO,IAAM,8BAA8B;AACpC,IAAM,mCACX;AACK,IAAM,+BAA+B;AACrC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,yBAAyB;;;ACU/B,SAAS,eACd,KACA,aACA,gBAAkC,SAClC;AACA,QAAM,EAAE,WAAW,mBAAmB,IAAI;AAC1C,QAAM,aAAa,IAAI,WAAW,SAAS;AAC3C,MAAI,cAAc,uBAAuB,QAAW;AAClD,QAAI,kBAAkB,SAAS;AAC7B,aAAO,mBAAmB,MAAM,UAAQ,IAAI,SAAS,IAAI,CAAC;AAAA,IAC5D;AACA,WAAO,mBAAmB,KAAK,UAAQ,IAAI,SAAS,IAAI,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEO,SAAS,eAAe,MAAc,aAA4B;AACvE,SAAO,YAAY,KAAK,iBAAe,eAAe,MAAM,WAAW,CAAC;AAC1E;AAEO,SAAS,gBAAgB,QAAwB;AACtD,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAEO,SAAS,wBAAwB,gBAAkC;AACxE,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,eAAe,KAAK,IAAI;AAAA,EACjC;AACF;AAEO,SAAS,0BAA0B,kBAAmC;AAC3E,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,mBAAmB,SAAS;AAAA,EACrC;AACF;AAEO,SAAS,sBAAsB,SAA2B;AAC/D,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;AAEO,SAAS,sBAAsB,SAA2B;AAC/D,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;AAEO,SAAS,qBAAqB,QAAwB;AAC3D,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAEO,SAAS,mBACd,QACA,gBACuB;AACvB,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AAEA,MAAI,eAAe,SAAS,GAAG,GAAG;AAChC,WAAO,EAAE,QAAQ,MAAM,OAAO;AAAA,EAChC;AACA,aAAW,iBAAiB,gBAAgB;AAC1C,QAAI,OAAO,kBAAkB,YAAY,kBAAkB,QAAQ;AACjE,aAAO,EAAE,QAAQ,MAAM,OAAO;AAAA,IAChC;AACA,QAAI,yBAAyB,UAAU,cAAc,KAAK,MAAM,GAAG;AACjE,aAAO,EAAE,QAAQ,MAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;;;AH1EA,IAAM,uBAAuB,CAC3B,QACA,cAA2B,CAAC,MACL;AACvB,QAAM,qBAAqB,EAAE,GAAG,qBAAqB,GAAG,OAAO;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAYJ,QAAM,iBAAiB,CAAC,SAAsB,aAA4B;AACxE,UAAM,eAAe,YAAY,2BAAa,KAAK;AACnD,UAAM,WAAW,QAAQ,QAAQ;AACjC,QACE,YAAY,aAAa,UACzB,eAAe,UAAU,YAAY,QAAQ,GAC7C;AACA,aAAO;AAAA,IACT;AAEA,QACE,YAAY,aAAa,UACzB,CAAC,eAAe,UAAU,YAAY,QAAQ,GAC9C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ,KAAK;AAChD,UAAM,kBAAkB,mBAAmB,QAAQ,OAAO;AAC1D,UAAM,iBAA2B,CAAC;AAClC,mBAAe,KAAK,gBAAgB,MAAM,CAAC;AAC3C,mBAAe,KAAK,wBAAwB,cAAc,CAAC;AAC3D,mBAAe,KAAK,0BAA0B,gBAAgB,CAAC;AAC/D,mBAAe,KAAK,sBAAsB,OAAO,CAAC;AAClD,mBAAe,KAAK,sBAAsB,OAAO,CAAC;AAElD,QAAI,gBAAgB,QAAQ;AAC1B,qBAAe,KAAK,qBAAqB,gBAAgB,MAAM,CAAC;AAAA,IAClE;AAEA,UAAM,cAAc,QAAQ,WAAW;AAEvC,QAAI,eAAe,CAAC,mBAAmB;AACrC,aAAO,2BAAa;AAAA,QAClB,CAAC;AAAA,QACD;AAAA,UACE,SAAS,eAAe,IAAI,YAAU,CAAC,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,UAChE,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,QAAQ,CAAC,EAAE,KAAK,MAAM,MAAM;AACzC,mBAAa,QAAQ,IAAI,KAAK,KAAK;AAAA,IACrC,CAAC;AAED,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ADnGf,IAAO,wCAAQ;","names":[]}