{"version":3,"sources":["../src/index.ts","../src/constants/directives.ts","../src/constants/values.ts"],"sourcesContent":["import { ALLOWED_DIRECTIVES } from \"./constants/directives\";\nimport { NONE } from \"./constants/values\";\nimport {\n\tCSPHeaderParams,\n\tCSPDirectives,\n\tCSPDirectiveName,\n\tCSPDirectiveValue,\n\tCSPPreset,\n\tCSPPresetsArray,\n\tCSPListDirectiveValue,\n} from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./constants/directives\";\nexport * from \"./constants/values\";\n\n/**\n * Build CSP header value from params\n */\nexport function getCSP(params: CSPHeaderParams = {}): string {\n\tconst { directives = {}, presets = {}, reportUri } = params;\n\tconst presetsList = normalizePresetsList(presets);\n\tconst mergedPolicies = applyPresets(directives, presetsList);\n\n\treturn policyToString(mergedPolicies, reportUri);\n}\n\n/**\n * Build CSP nonce string\n */\nexport function nonce(nonceKey: string): string {\n\treturn `'nonce-${nonceKey}'`;\n}\n\n/**\n * Build CSP header value from resolved policy\n */\n\nfunction policyToString(\n\tdirectives: Partial<CSPDirectives>,\n\treportUri?: string\n): string {\n\tconst cspStringParts: string[] = [];\n\n\tfor (const directiveName in directives) {\n\t\tif (!directives.hasOwnProperty(directiveName)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst directiveValue = directives[directiveName as keyof CSPDirectives];\n\n\t\tif (!directiveValue) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst directiveRulesString = getDirectiveString(\n\t\t\tdirectiveName as CSPDirectiveName,\n\t\t\tdirectiveValue\n\t\t);\n\n\t\tif (directiveRulesString) {\n\t\t\tcspStringParts.push(directiveRulesString);\n\t\t}\n\t}\n\n\tif (reportUri) {\n\t\tcspStringParts.push(getReportUriDirective(reportUri));\n\t}\n\n\treturn cspStringParts.join(\" \");\n}\n\n/**\n * Build directive rules part of CSP header value\n */\nfunction getDirectiveString(\n\tdirectiveName: CSPDirectiveName,\n\tdirectiveValue: CSPDirectiveValue\n): string {\n\tif (typeof directiveValue === \"boolean\") {\n\t\treturn `${directiveName};`;\n\t}\n\n\tif (typeof directiveValue === \"string\") {\n\t\treturn `${directiveName} ${directiveValue};`;\n\t}\n\n\tif (Array.isArray(directiveValue)) {\n\t\tconst valueString = (directiveValue as CSPListDirectiveValue)\n\t\t\t.filter(Boolean)\n\t\t\t.join(\" \");\n\t\treturn `${directiveName} ${valueString};`;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Build report-uri directive\n */\nfunction getReportUriDirective(reportUri: string): string {\n\treturn `report-uri ${reportUri};`;\n}\n\n/**\n * Normalize different presets list formats to array format\n */\nfunction normalizePresetsList(presets: CSPPreset): CSPPresetsArray {\n\treturn Array.isArray(presets) ? presets : Object.values(presets);\n}\n\n/**\n * Merges presets to policy\n */\nfunction applyPresets(\n\tdirectives: Partial<CSPDirectives>,\n\tpresets: CSPPresetsArray\n): Partial<CSPDirectives> {\n\tconst mergedPolicies: Partial<CSPDirectives> = {};\n\n\tfor (const preset of [directives, ...presets]) {\n\t\tfor (const directiveName in preset) {\n\t\t\tif (!(directiveName in ALLOWED_DIRECTIVES)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst currentRules =\n\t\t\t\tmergedPolicies[directiveName as keyof CSPDirectives];\n\t\t\tconst presetRules = preset[directiveName as keyof CSPDirectives];\n\n\t\t\tif (presetRules === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t(mergedPolicies[\n\t\t\t\tdirectiveName as keyof CSPDirectives\n\t\t\t] as CSPDirectiveValue) = mergeDirectiveRules(\n\t\t\t\tcurrentRules,\n\t\t\t\tpresetRules\n\t\t\t);\n\t\t}\n\t}\n\n\treturn mergedPolicies;\n}\n\nfunction mergeDirectiveRules(\n\tdirectiveValue1: CSPDirectiveValue = \"\",\n\tdirectiveValue2: CSPDirectiveValue = \"\"\n): CSPDirectiveValue {\n\tif (directiveValue1 === undefined) {\n\t\treturn directiveValue2;\n\t}\n\n\tif (directiveValue2 === undefined) {\n\t\treturn directiveValue1;\n\t}\n\n\tif (Array.isArray(directiveValue1) && Array.isArray(directiveValue2)) {\n\t\tconst uniqRules = getUniqRules([\n\t\t\t...directiveValue1,\n\t\t\t...directiveValue2,\n\t\t]);\n\n\t\tconst noneIndex = uniqRules.indexOf(NONE);\n\t\t// Remove \"'none'\" if there are other rules\n\t\tif (noneIndex >= 0 && uniqRules.length > 1) {\n\t\t\tuniqRules.splice(noneIndex, 1);\n\t\t}\n\n\t\treturn uniqRules;\n\t}\n\n\treturn directiveValue2;\n}\n\nfunction getUniqRules(rules: CSPListDirectiveValue): CSPListDirectiveValue {\n\treturn Array.from(new Set(rules));\n}\n","export const ALLOWED_DIRECTIVES = {\n\t'base-uri': 'base-uri',\n\t'block-all-mixed-content': 'block-all-mixed-content',\n\t'child-src': 'child-src',\n\t'connect-src': 'connect-src',\n\t'default-src': 'default-src',\n\t'font-src': 'font-src',\n\t'form-action': 'form-action',\n\t'frame-ancestors': 'frame-ancestors',\n\t'frame-src': 'frame-src',\n\t'img-src': 'img-src',\n\t'manifest-src': 'manifest-src',\n\t'media-src': 'media-src',\n\t'navigate-to': 'navigate-to',\n\t'object-src': 'object-src',\n\t'plugin-types': 'plugin-types',\n\t'prefetch-src': 'prefetch-src',\n\t'referrer': 'referrer',\n\t'report-to': 'report-to',\n\t'report-uri': 'report-uri',\n\t'require-sri-for': 'require-sri-for',\n\t'require-trusted-types-for': 'require-trusted-types-for',\n\t'sandbox': 'sandbox',\n\t'script-src': 'script-src',\n\t'script-src-attr': 'script-src-attr',\n\t'script-src-elem': 'script-src-elem',\n\t'style-src': 'style-src',\n\t'style-src-attr': 'style-src-attr',\n\t'style-src-elem': 'style-src-elem',\n\t'trusted-types': 'trusted-types',\n\t'upgrade-insecure-requests': 'upgrade-insecure-requests',\n\t'webrtc': 'webrtc',\n\t'worker-src': 'worker-src',\n};\n","export const ALLOW = \"'allow'\";\nexport const ALLOW_DOWNLOADS = \"allow-downloads\";\nexport const ALLOW_DOWNLOADS_WITHOUT_USER_ACTIVATION = \"allow-downloads-without-user-activation\";\nexport const ALLOW_DUPLICATES = \"'allow-duplicates'\";\nexport const ALLOW_FORMS = \"allow-forms\";\nexport const ALLOW_MODALS = \"allow-modals\";\nexport const ALLOW_ORIENTATION_LOCK = \"allow-orientation-lock\";\nexport const ALLOW_POINTER_LOCK = \"allow-pointer-lock\";\nexport const ALLOW_POPUPS = \"allow-popups\";\nexport const ALLOW_POPUPS_TO_ESCAPE_SANDBOX = \"allow-popups-to-escape-sandbox\";\n/**\n * @deprecated\n */\nexport const ALLOW_POPUPS_TO_ESACPE_SANDBOX = ALLOW_POPUPS_TO_ESCAPE_SANDBOX;\nexport const ALLOW_PRESENTATION = \"allow-presentation\";\nexport const ALLOW_SAME_ORIGIN = \"allow-same-origin\";\nexport const ALLOW_STORAGE_ACCESS_BY_USER_ACTIVATION = \"allow-storage-access-by-user-activation\";\nexport const ALLOW_SCRIPTS = \"allow-scripts\";\nexport const ALLOW_TOP_NAVIGATION = \"allow-top-navigation\";\nexport const ALLOW_TOP_NAVIGATION_BY_USER_ACTIVATION = \"allow-top-navigation-by-user-activation\";\nexport const BLOB = 'blob:';\nexport const BLOCK = \"'block'\";\nexport const DATA = 'data:';\nexport const HTTP = 'http:';\nexport const HTTPS = 'https:';\nexport const NO_REFERRER = \"'no-referrer'\";\nexport const NONE = \"'none'\";\nexport const NONE_WHEN_DOWNGRADE = \"'none-when-downgrade'\";\nexport const ORIGIN = \"'origin'\";\nexport const ORIGIN_WHEN_CROSS_ORIGIN = \"'origin-when-cross-origin'\";\nexport const REPORT_SAMPLE = \"'report-sample'\";\nexport const SCRIPT = \"'script'\";\nexport const SELF = \"'self'\";\nexport const STRICT_DYNAMIC = \"'strict-dynamic'\";\nexport const UNSAFE_ALLOW_REDIRECTS = \"'unsafe-allow-redirects'\";\nexport const UNSAFE_EVAL = \"'unsafe-eval'\";\nexport const UNSAFE_HASHES = \"'unsafe-hashes'\";\nexport const UNSAFE_INLINE = \"'unsafe-inline'\";\nexport const UNSAFE_URL = \"'unsafe-url'\";\nexport const WASM_UNSAFE_EVAL = \"'wasm-unsafe-eval'\";\nexport const WS = 'ws:';\nexport const WSS = 'wss:';\n\n// @deprecated Use UNSAFE_EVAL\nexport const EVAL = \"'unsafe-eval'\";\n// @deprecated Use UNSAFE_HASHES\nexport const HASHES = \"'unsafe-hashes'\";\n// @deprecated Use UNSAFE_INLINE\nexport const INLINE = \"'unsafe-inline'\";\n// @deprecated Use NO_REFERRER\nexport const NO_REFERER = NO_REFERRER;\n"],"mappings":"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","names":[]}