@utilix-tech/sdk 0.53.0 → 0.54.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.
@@ -3220,6 +3220,123 @@ function validateTsconfig(text) {
3220
3220
  const valid = !issues.some((i) => i.severity === "error");
3221
3221
  return { parsed: true, topLevelKeys, compilerOptionKeys, issues, valid };
3222
3222
  }
3223
+ function collectExportsStringLeaves(value, out = []) {
3224
+ if (typeof value === "string") out.push(value);
3225
+ else if (Array.isArray(value)) value.forEach((v) => collectExportsStringLeaves(v, out));
3226
+ else if (value && typeof value === "object") Object.values(value).forEach((v) => collectExportsStringLeaves(v, out));
3227
+ return out;
3228
+ }
3229
+ function checkExportsPatternMatch(key, value, path, issues) {
3230
+ const keyHasStar = key.includes("*");
3231
+ const leaves = collectExportsStringLeaves(value);
3232
+ if (keyHasStar) {
3233
+ const bad = leaves.filter((l) => !l.includes("*"));
3234
+ if (bad.length > 0) {
3235
+ issues.push({ severity: "error", path, message: `pattern key "${key}" contains "*" but target ${bad.map((l) => `"${l}"`).join(", ")} has no "*" to receive the matched text` });
3236
+ }
3237
+ } else {
3238
+ const bad = leaves.filter((l) => l.includes("*"));
3239
+ if (bad.length > 0) {
3240
+ issues.push({ severity: "error", path, message: `target ${bad.map((l) => `"${l}"`).join(", ")} contains "*" but key "${key}" has no "*" pattern to match against` });
3241
+ }
3242
+ }
3243
+ }
3244
+ function validateExportsValue(value, path, issues) {
3245
+ if (value === null) return;
3246
+ if (typeof value === "string") {
3247
+ if (!value.startsWith("./")) {
3248
+ issues.push({ severity: "error", path, message: `target "${value}" must start with "./"` });
3249
+ }
3250
+ return;
3251
+ }
3252
+ if (Array.isArray(value)) {
3253
+ if (value.length === 0) {
3254
+ issues.push({ severity: "warning", path, message: "empty fallback array will never resolve" });
3255
+ }
3256
+ value.forEach((v, i) => validateExportsValue(v, `${path}[${i}]`, issues));
3257
+ return;
3258
+ }
3259
+ if (typeof value === "object") {
3260
+ const obj = value;
3261
+ const keys = Object.keys(obj);
3262
+ if (keys.length === 0) {
3263
+ issues.push({ severity: "warning", path, message: "empty object will never resolve" });
3264
+ return;
3265
+ }
3266
+ const hasDotKeys = keys.some((k) => k.startsWith("."));
3267
+ const hasNonDotKeys = keys.some((k) => !k.startsWith("."));
3268
+ if (hasDotKeys && hasNonDotKeys) {
3269
+ issues.push({ severity: "error", path, message: 'cannot mix subpath keys (starting with ".") with condition keys in the same object' });
3270
+ return;
3271
+ }
3272
+ if (hasDotKeys) {
3273
+ for (const key of keys) {
3274
+ const subpath = `${path}["${key}"]`;
3275
+ if (key !== "." && !key.startsWith("./")) {
3276
+ issues.push({ severity: "error", path: subpath, message: `subpath key "${key}" must be "." or start with "./"` });
3277
+ }
3278
+ checkExportsPatternMatch(key, obj[key], subpath, issues);
3279
+ validateExportsValue(obj[key], subpath, issues);
3280
+ }
3281
+ return;
3282
+ }
3283
+ if (keys.includes("types") && keys[0] !== "types") {
3284
+ issues.push({ severity: "warning", path, message: '"types" condition should be listed first so TypeScript resolves it before any other condition matches' });
3285
+ }
3286
+ if (keys.includes("default") && keys[keys.length - 1] !== "default") {
3287
+ issues.push({ severity: "warning", path, message: '"default" condition should be listed last; conditions are matched in order and anything after "default" is unreachable' });
3288
+ }
3289
+ if ((keys.includes("import") || keys.includes("require")) && !keys.includes("default")) {
3290
+ issues.push({ severity: "warning", path, message: 'no "default" fallback condition; resolution fails for any importer using a condition not listed here' });
3291
+ }
3292
+ const requireVal = obj.require;
3293
+ if (typeof requireVal === "string" && requireVal.endsWith(".mjs")) {
3294
+ issues.push({ severity: "error", path: `${path}.require`, message: `"require" condition points to a .mjs file ("${requireVal}"), but .mjs is always treated as ESM and cannot be required` });
3295
+ }
3296
+ const importVal = obj.import;
3297
+ if (typeof importVal === "string" && importVal.endsWith(".cjs")) {
3298
+ issues.push({ severity: "error", path: `${path}.import`, message: `"import" condition points to a .cjs file ("${importVal}"), but .cjs is always treated as CommonJS and cannot be imported as ESM` });
3299
+ }
3300
+ for (const key of keys) {
3301
+ validateExportsValue(obj[key], `${path}.${key}`, issues);
3302
+ }
3303
+ return;
3304
+ }
3305
+ issues.push({ severity: "error", path, message: `unexpected value type at "${path}"` });
3306
+ }
3307
+ function validatePackageExports(packageJsonText) {
3308
+ if (!packageJsonText || !packageJsonText.trim()) return { error: "Input is empty" };
3309
+ let parsed;
3310
+ try {
3311
+ parsed = JSON.parse(packageJsonText);
3312
+ } catch (e) {
3313
+ return { error: `Invalid JSON: ${e.message}` };
3314
+ }
3315
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
3316
+ return { error: "Root of package.json must be an object" };
3317
+ }
3318
+ const obj = parsed;
3319
+ if (!("exports" in obj)) return { error: 'package.json has no "exports" field' };
3320
+ const exportsValue = obj.exports;
3321
+ const issues = [];
3322
+ let exportsShape;
3323
+ if (exportsValue === null) {
3324
+ exportsShape = "null";
3325
+ } else if (typeof exportsValue === "string") {
3326
+ exportsShape = "string";
3327
+ } else if (Array.isArray(exportsValue)) {
3328
+ exportsShape = "array";
3329
+ } else if (typeof exportsValue === "object") {
3330
+ const keys = Object.keys(exportsValue);
3331
+ exportsShape = keys.some((k) => k.startsWith(".")) ? "subpaths" : "conditions";
3332
+ } else {
3333
+ return { error: '"exports" must be a string, array, object, or null' };
3334
+ }
3335
+ validateExportsValue(exportsValue, "exports", issues);
3336
+ const subpaths = exportsShape === "subpaths" ? Object.keys(exportsValue) : ["."];
3337
+ const valid = !issues.some((i) => i.severity === "error");
3338
+ return { parsed: true, exportsShape, subpaths, issues, valid };
3339
+ }
3223
3340
 
3224
3341
  exports.ALL_FLAGS = ALL_FLAGS;
3225
3342
  exports.CHEATSHEET = CHEATSHEET;
@@ -3274,4 +3391,5 @@ exports.testPattern = testPattern;
3274
3391
  exports.testRegex = testRegex;
3275
3392
  exports.validateEditorConfig = validateEditorConfig;
3276
3393
  exports.validateEnvKey = validateEnvKey;
3394
+ exports.validatePackageExports = validatePackageExports;
3277
3395
  exports.validateTsconfig = validateTsconfig;
@@ -1 +1 @@
1
- export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EditorConfigIssue, m as EditorConfigProperty, n as EditorConfigSection, o as EditorConfigValidationResult, p as EnvEntry, q as EnvParseResult, G as GitCommandConfig, r as GitCommandResult, s as GitOperation, t as GithubUrlInfo, u as GithubUrlType, v as GitignoreTestResult, w as GqlFormatResult, H as HtmlFormatResult, x as HtmlMinifyOptions, y as HtmlMinifyResult, J as JsMinifyOptions, z as JsMinifyResult, M as MIME_TABLE, B as MatchResult, F as MimeEntry, I as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, K as RedosResult, L as RedosSeverity, N as RegexError, Q as RegexFlag, S as RegexMatch, T as RegexResult, U as RegexSuccess, V as SQL_DEFAULT_OPTIONS, W as Segment, X as SpecVersion, Y as SqlDialect, Z as SqlFormatOptions, _ as TestPatternResult, $ as TsconfigIssue, a0 as TsconfigValidationResult, a1 as buildDockerPull, a2 as buildDockerRun, a3 as buildGitCommand, a4 as collapseHtmlWhitespace, a5 as collapseJsWhitespace, a6 as countProperties, a7 as countRules, a8 as detectDialect, a9 as detectOperationType, aa as detectRedos, ab as envToExport, ac as envToJson, ad as formatCss, ae as formatGql, af as formatHtml, ag as formatSql, ah as getEndpointsByTag, ai as getHtmlStats, aj as getJsStats, ak as getMethodColor, al as isValidTag, am as lintConventionalCommit, an as lookupMime, ao as minifyCss, ap as minifyGql, aq as minifyHtml, ar as minifyJs, as as minifySql, at as normalizeRef, au as parseDockerImage, av as parseEnv, aw as parseGitCommand, ax as parseGithubUrl, ay as parseSpec, az as removeConsoleCalls, aA as removeEmptyAttributes, aB as removeHtmlComments, aC as removeJsComments, aD as removeRedundantAttributes, aE as searchCheatsheet, aF as searchEndpoints, aG as splitStatements, aH as testGitignorePatterns, aI as testPattern, aJ as testRegex, aK as validateEditorConfig, aL as validateEnvKey, aM as validateTsconfig } from '../code-B_gDkRAx.cjs';
1
+ export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EditorConfigIssue, m as EditorConfigProperty, n as EditorConfigSection, o as EditorConfigValidationResult, p as EnvEntry, q as EnvParseResult, r as ExportsIssue, s as ExportsShape, t as ExportsValidationResult, G as GitCommandConfig, u as GitCommandResult, v as GitOperation, w as GithubUrlInfo, x as GithubUrlType, y as GitignoreTestResult, z as GqlFormatResult, H as HtmlFormatResult, B as HtmlMinifyOptions, F as HtmlMinifyResult, J as JsMinifyOptions, I as JsMinifyResult, M as MIME_TABLE, K as MatchResult, L as MimeEntry, N as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, Q as RedosResult, S as RedosSeverity, T as RegexError, U as RegexFlag, V as RegexMatch, W as RegexResult, X as RegexSuccess, Y as SQL_DEFAULT_OPTIONS, Z as Segment, _ as SpecVersion, $ as SqlDialect, a0 as SqlFormatOptions, a1 as TestPatternResult, a2 as TsconfigIssue, a3 as TsconfigValidationResult, a4 as buildDockerPull, a5 as buildDockerRun, a6 as buildGitCommand, a7 as collapseHtmlWhitespace, a8 as collapseJsWhitespace, a9 as countProperties, aa as countRules, ab as detectDialect, ac as detectOperationType, ad as detectRedos, ae as envToExport, af as envToJson, ag as formatCss, ah as formatGql, ai as formatHtml, aj as formatSql, ak as getEndpointsByTag, al as getHtmlStats, am as getJsStats, an as getMethodColor, ao as isValidTag, ap as lintConventionalCommit, aq as lookupMime, ar as minifyCss, as as minifyGql, at as minifyHtml, au as minifyJs, av as minifySql, aw as normalizeRef, ax as parseDockerImage, ay as parseEnv, az as parseGitCommand, aA as parseGithubUrl, aB as parseSpec, aC as removeConsoleCalls, aD as removeEmptyAttributes, aE as removeHtmlComments, aF as removeJsComments, aG as removeRedundantAttributes, aH as searchCheatsheet, aI as searchEndpoints, aJ as splitStatements, aK as testGitignorePatterns, aL as testPattern, aM as testRegex, aN as validateEditorConfig, aO as validateEnvKey, aP as validatePackageExports, aQ as validateTsconfig } from '../code-rxidGgvB.cjs';
@@ -1 +1 @@
1
- export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EditorConfigIssue, m as EditorConfigProperty, n as EditorConfigSection, o as EditorConfigValidationResult, p as EnvEntry, q as EnvParseResult, G as GitCommandConfig, r as GitCommandResult, s as GitOperation, t as GithubUrlInfo, u as GithubUrlType, v as GitignoreTestResult, w as GqlFormatResult, H as HtmlFormatResult, x as HtmlMinifyOptions, y as HtmlMinifyResult, J as JsMinifyOptions, z as JsMinifyResult, M as MIME_TABLE, B as MatchResult, F as MimeEntry, I as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, K as RedosResult, L as RedosSeverity, N as RegexError, Q as RegexFlag, S as RegexMatch, T as RegexResult, U as RegexSuccess, V as SQL_DEFAULT_OPTIONS, W as Segment, X as SpecVersion, Y as SqlDialect, Z as SqlFormatOptions, _ as TestPatternResult, $ as TsconfigIssue, a0 as TsconfigValidationResult, a1 as buildDockerPull, a2 as buildDockerRun, a3 as buildGitCommand, a4 as collapseHtmlWhitespace, a5 as collapseJsWhitespace, a6 as countProperties, a7 as countRules, a8 as detectDialect, a9 as detectOperationType, aa as detectRedos, ab as envToExport, ac as envToJson, ad as formatCss, ae as formatGql, af as formatHtml, ag as formatSql, ah as getEndpointsByTag, ai as getHtmlStats, aj as getJsStats, ak as getMethodColor, al as isValidTag, am as lintConventionalCommit, an as lookupMime, ao as minifyCss, ap as minifyGql, aq as minifyHtml, ar as minifyJs, as as minifySql, at as normalizeRef, au as parseDockerImage, av as parseEnv, aw as parseGitCommand, ax as parseGithubUrl, ay as parseSpec, az as removeConsoleCalls, aA as removeEmptyAttributes, aB as removeHtmlComments, aC as removeJsComments, aD as removeRedundantAttributes, aE as searchCheatsheet, aF as searchEndpoints, aG as splitStatements, aH as testGitignorePatterns, aI as testPattern, aJ as testRegex, aK as validateEditorConfig, aL as validateEnvKey, aM as validateTsconfig } from '../code-B_gDkRAx.js';
1
+ export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EditorConfigIssue, m as EditorConfigProperty, n as EditorConfigSection, o as EditorConfigValidationResult, p as EnvEntry, q as EnvParseResult, r as ExportsIssue, s as ExportsShape, t as ExportsValidationResult, G as GitCommandConfig, u as GitCommandResult, v as GitOperation, w as GithubUrlInfo, x as GithubUrlType, y as GitignoreTestResult, z as GqlFormatResult, H as HtmlFormatResult, B as HtmlMinifyOptions, F as HtmlMinifyResult, J as JsMinifyOptions, I as JsMinifyResult, M as MIME_TABLE, K as MatchResult, L as MimeEntry, N as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, Q as RedosResult, S as RedosSeverity, T as RegexError, U as RegexFlag, V as RegexMatch, W as RegexResult, X as RegexSuccess, Y as SQL_DEFAULT_OPTIONS, Z as Segment, _ as SpecVersion, $ as SqlDialect, a0 as SqlFormatOptions, a1 as TestPatternResult, a2 as TsconfigIssue, a3 as TsconfigValidationResult, a4 as buildDockerPull, a5 as buildDockerRun, a6 as buildGitCommand, a7 as collapseHtmlWhitespace, a8 as collapseJsWhitespace, a9 as countProperties, aa as countRules, ab as detectDialect, ac as detectOperationType, ad as detectRedos, ae as envToExport, af as envToJson, ag as formatCss, ah as formatGql, ai as formatHtml, aj as formatSql, ak as getEndpointsByTag, al as getHtmlStats, am as getJsStats, an as getMethodColor, ao as isValidTag, ap as lintConventionalCommit, aq as lookupMime, ar as minifyCss, as as minifyGql, at as minifyHtml, au as minifyJs, av as minifySql, aw as normalizeRef, ax as parseDockerImage, ay as parseEnv, az as parseGitCommand, aA as parseGithubUrl, aB as parseSpec, aC as removeConsoleCalls, aD as removeEmptyAttributes, aE as removeHtmlComments, aF as removeJsComments, aG as removeRedundantAttributes, aH as searchCheatsheet, aI as searchEndpoints, aJ as splitStatements, aK as testGitignorePatterns, aL as testPattern, aM as testRegex, aN as validateEditorConfig, aO as validateEnvKey, aP as validatePackageExports, aQ as validateTsconfig } from '../code-rxidGgvB.js';
@@ -1,2 +1,2 @@
1
- export { ALL_FLAGS, CHEATSHEET, DEFAULT_COMMIT_TYPES, MIME_TABLE, OPERATIONS, SQL_DEFAULT_OPTIONS, buildDockerPull, buildDockerRun, buildGitCommand, collapseHtmlWhitespace, collapseJsWhitespace, countProperties, countRules, detectDialect, detectOperationType, detectRedos, envToExport, envToJson, formatCss, formatGql, formatHtml, formatSql, getEndpointsByTag, getHtmlStats, getJsStats, getMethodColor, isValidTag, lintConventionalCommit, lookupMime, minifyCss, minifyGql, minifyHtml, minifyJs, minifySql, normalizeRef, parseDockerImage, parseEnv, parseGitCommand, parseGithubUrl, parseSpec, removeConsoleCalls, removeEmptyAttributes, removeHtmlComments, removeJsComments, removeRedundantAttributes, searchCheatsheet, searchEndpoints, splitStatements, testGitignorePatterns, testPattern, testRegex, validateEditorConfig, validateEnvKey, validateTsconfig } from '../chunk-K4ZERKBD.js';
1
+ export { ALL_FLAGS, CHEATSHEET, DEFAULT_COMMIT_TYPES, MIME_TABLE, OPERATIONS, SQL_DEFAULT_OPTIONS, buildDockerPull, buildDockerRun, buildGitCommand, collapseHtmlWhitespace, collapseJsWhitespace, countProperties, countRules, detectDialect, detectOperationType, detectRedos, envToExport, envToJson, formatCss, formatGql, formatHtml, formatSql, getEndpointsByTag, getHtmlStats, getJsStats, getMethodColor, isValidTag, lintConventionalCommit, lookupMime, minifyCss, minifyGql, minifyHtml, minifyJs, minifySql, normalizeRef, parseDockerImage, parseEnv, parseGitCommand, parseGithubUrl, parseSpec, removeConsoleCalls, removeEmptyAttributes, removeHtmlComments, removeJsComments, removeRedundantAttributes, searchCheatsheet, searchEndpoints, splitStatements, testGitignorePatterns, testPattern, testRegex, validateEditorConfig, validateEnvKey, validatePackageExports, validateTsconfig } from '../chunk-JW4NG2GN.js';
2
2
  import '../chunk-MLKGABMK.js';
@@ -2717,6 +2717,59 @@ function parseContentDisposition(header) {
2717
2717
  }
2718
2718
  return { type, filename, filenameIsExtended, params };
2719
2719
  }
2720
+ var X_CONTENT_TYPE_OPTIONS_HEADER = "X-Content-Type-Options: nosniff";
2721
+ function buildXContentTypeOptionsHeader() {
2722
+ return {
2723
+ header: X_CONTENT_TYPE_OPTIONS_HEADER,
2724
+ value: "nosniff",
2725
+ explanation: `Tells the browser to strictly honor the declared Content-Type header instead of "sniffing" a response's bytes to guess its real type. Without it, a browser that decides an oddly-typed response looks like HTML or JavaScript may render or execute it, letting a file that was only ever meant to be downloaded or displayed as plain text be used to run a cross-site scripting attack.`
2726
+ };
2727
+ }
2728
+ function parseXContentTypeOptionsHeader(rawHeader) {
2729
+ if (typeof rawHeader !== "string" || rawHeader.trim() === "") return { error: "Provide a header line or value to check" };
2730
+ const withoutLabel = rawHeader.trim().replace(/^x-content-type-options\s*:\s*/i, "");
2731
+ const value = withoutLabel.trim();
2732
+ if (value.toLowerCase() === "nosniff") {
2733
+ return { raw: value, valid: true, message: "Valid. The browser will not MIME-sniff this response." };
2734
+ }
2735
+ if (value === "") {
2736
+ return { error: 'No value found after "X-Content-Type-Options:"' };
2737
+ }
2738
+ return { raw: value, valid: false, message: `"${value}" is not a recognized value. The only value browsers act on is "nosniff" (case-insensitive); anything else is silently ignored, same as omitting the header.` };
2739
+ }
2740
+ var X_CONTENT_TYPE_EXACT_RISK_TABLE = {
2741
+ "text/plain": { risk: "high", reason: "Browsers historically sniff text/plain responses and may render them as HTML if the body looks like markup, letting user-controlled text (comments, error pages, logs) execute as script." },
2742
+ "application/octet-stream": { risk: "high", reason: "A generic fallback type with no format hint, so browsers are the most likely to sniff its real content and may render it as HTML." },
2743
+ "": { risk: "high", reason: "A missing Content-Type header gives the browser nothing to trust, so it falls back to sniffing the response body entirely." }
2744
+ };
2745
+ var X_CONTENT_TYPE_PREFIX_RISK_TABLE = [
2746
+ { prefix: "text/html", risk: "medium", reason: "Already interpreted as HTML, so sniffing mostly matters if the type is wrong on purpose; nosniff still protects against a mismatched charset or embedded polyglot content." },
2747
+ { prefix: "image/", risk: "low", reason: 'Browsers rarely upgrade an image response to HTML, but a crafted "GIFAR"-style polyglot file can still be sniffed as HTML in older engines.' },
2748
+ { prefix: "audio/", risk: "low", reason: "Media types are rarely reinterpreted as HTML by modern sniffing algorithms." },
2749
+ { prefix: "video/", risk: "low", reason: "Media types are rarely reinterpreted as HTML by modern sniffing algorithms." },
2750
+ { prefix: "font/", risk: "low", reason: "Font types are rarely reinterpreted as HTML by modern sniffing algorithms." },
2751
+ { prefix: "application/pdf", risk: "low", reason: "PDF has a strong magic-number signature, so sniffing rarely reclassifies it, though nosniff is still worth setting for user-uploaded PDFs." },
2752
+ { prefix: "application/json", risk: "medium", reason: "Structurally distinct from HTML, but user-controlled JSONP-style responses served with a wrong or missing type have been used in real sniffing attacks." },
2753
+ { prefix: "application/javascript", risk: "medium", reason: "Already executable; nosniff mainly protects against it being served where a script tag was not expected, such as inside an <img> or <object> tag." },
2754
+ { prefix: "application/xml", risk: "medium", reason: "XML can be reinterpreted in ways that overlap with HTML/XHTML parsing in some legacy sniffing paths." }
2755
+ ];
2756
+ function assessContentTypeRisk(contentType) {
2757
+ if (typeof contentType !== "string") return { error: "contentType must be a string" };
2758
+ const normalized = contentType.trim().toLowerCase().split(";")[0].trim();
2759
+ if (normalized in X_CONTENT_TYPE_EXACT_RISK_TABLE) {
2760
+ const entry = X_CONTENT_TYPE_EXACT_RISK_TABLE[normalized];
2761
+ return { contentType: contentType.trim() || "(empty)", risk: entry.risk, reason: entry.reason };
2762
+ }
2763
+ const prefixMatch = X_CONTENT_TYPE_PREFIX_RISK_TABLE.find((e) => normalized.startsWith(e.prefix));
2764
+ if (prefixMatch) {
2765
+ return { contentType: contentType.trim(), risk: prefixMatch.risk, reason: prefixMatch.reason };
2766
+ }
2767
+ return {
2768
+ contentType: contentType.trim(),
2769
+ risk: "medium",
2770
+ reason: "Not a well-known type in this tool's lookup table. Treat any response type as sniffable unless you've confirmed the serving browser trusts it, and set nosniff regardless of type as a baseline defense."
2771
+ };
2772
+ }
2720
2773
 
2721
2774
  exports.CLIENT_HINTS = CLIENT_HINTS;
2722
2775
  exports.DNS_RECORD_TYPES = DNS_RECORD_TYPES;
@@ -2725,7 +2778,9 @@ exports.LINK_REL_VALUES = LINK_REL_VALUES;
2725
2778
  exports.PERMISSIONS_POLICY_FEATURES = PERMISSIONS_POLICY_FEATURES;
2726
2779
  exports.REFERRER_POLICY_VALUES = REFERRER_POLICY_VALUES;
2727
2780
  exports.STATUS_CODES = STATUS_CODES;
2781
+ exports.X_CONTENT_TYPE_OPTIONS_HEADER = X_CONTENT_TYPE_OPTIONS_HEADER;
2728
2782
  exports.analyzeEmailHeaders = analyzeEmailHeaders;
2783
+ exports.assessContentTypeRisk = assessContentTypeRisk;
2729
2784
  exports.buildCacheControl = buildCacheControl;
2730
2785
  exports.buildClientHints = buildClientHints;
2731
2786
  exports.buildContentDisposition = buildContentDisposition;
@@ -2737,6 +2792,7 @@ exports.buildPermissionsPolicy = buildPermissionsPolicy;
2737
2792
  exports.buildRangeHeader = buildRangeHeader;
2738
2793
  exports.buildReferrerPolicy = buildReferrerPolicy;
2739
2794
  exports.buildVaryHeader = buildVaryHeader;
2795
+ exports.buildXContentTypeOptionsHeader = buildXContentTypeOptionsHeader;
2740
2796
  exports.checkSetCookieHeader = checkSetCookieHeader;
2741
2797
  exports.countryCodeToFlag = countryCodeToFlag;
2742
2798
  exports.formatCoordinates = formatCoordinates;
@@ -2762,6 +2818,7 @@ exports.parseIpv6Address = parseIpv6Address;
2762
2818
  exports.parsePermissionsPolicy = parsePermissionsPolicy;
2763
2819
  exports.parseUserAgent = parseUserAgent;
2764
2820
  exports.parseVaryHeader = parseVaryHeader;
2821
+ exports.parseXContentTypeOptionsHeader = parseXContentTypeOptionsHeader;
2765
2822
  exports.searchHeaders = searchHeaders;
2766
2823
  exports.searchStatusCodes = searchStatusCodes;
2767
2824
  exports.splitSitemap = splitSitemap;
@@ -1 +1 @@
1
- export { A as AuthResultEntry, B as BuildRangeHeaderOptions, C as CLIENT_HINTS, a as CacheControlDirective, b as CacheControlOptions, c as CacheControlResult, d as ClientHintDef, e as ClientHintValueType, f as ClientHintsBuildResult, g as ClientHintsParseResult, h as ContentDispositionBuildOptions, i as ContentDispositionBuildResult, j as ContentDispositionParseResult, k as ContentRangeResult, l as CookieAttributes, m as CookieCheckResult, D as DNS_RECORD_TYPES, o as DnsRecord, p as DnsRecordType, q as DnsResponse, E as EmailHeaderAnalysis, r as EmailHeaderField, G as GeoResult, H as HTTP_HEADERS, s as HarEntry, t as HarParseResult, u as HarSummary, v as HeaderCategory, w as HttpHeader, I as Ipv6AddressType, x as Ipv6ParseResult, L as LINK_REL_VALUES, y as LinkHeaderEntry, z as LinkHeaderEntryInput, F as LinkHeaderResult, J as LinkRel, M as ManifestIconInfo, K as ManifestIssue, N as ManifestValidationResult, P as PERMISSIONS_POLICY_FEATURES, O as ParsedClientHint, Q as ParsedDnsResult, R as ParsedGeoResult, S as PermissionsPolicyDirective, T as PermissionsPolicyFeatureInput, U as PermissionsPolicyResult, V as REFERRER_POLICY_VALUES, W as RangeEntry, X as RangeEntryInput, Y as RangeHeaderResult, Z as ReceivedHop, _ as ReferrerPolicyEntry, $ as ReferrerPolicyResult, a0 as ReferrerPolicyValue, a1 as RobotsGroup, a2 as RobotsIssue, a3 as RobotsRule, a4 as RobotsValidationResult, a5 as STATUS_CODES, a6 as SameSiteValue, a7 as SitemapIndexEntry, a8 as SitemapIssue, a9 as SitemapSplitFile, aa as SitemapUrlEntry, ab as SitemapValidationResult, ac as SplitSitemapOptions, ad as SplitSitemapResult, ae as StatusCode, af as UaDeviceType, ag as UserAgentInfo, ah as VaryHeaderEntry, ai as VaryHeaderResult, aj as analyzeEmailHeaders, ak as buildCacheControl, al as buildClientHints, am as buildContentDisposition, an as buildDnsQueryUrl, ao as buildGeoUrl, ap as buildLinkHeader, aq as buildMapUrl, ar as buildPermissionsPolicy, as as buildRangeHeader, at as buildReferrerPolicy, au as buildVaryHeader, av as checkSetCookieHeader, aw as countryCodeToFlag, ax as formatCoordinates, ay as formatTtl, az as getByCategory, aA as getHeader, aB as getHeadersByCategory, aC as getStatusByCategory, aD as getStatusCode, aE as isClientError, aF as isServerError, aG as isSuccess, aH as isValidIp, aI as isValidIpv4, aJ as isValidIpv6, aK as parseClientHintHeaders, aL as parseContentDisposition, aM as parseContentRangeHeader, aN as parseDnsResponse, aO as parseGeoResponse, aP as parseHar, aQ as parseIpv6Address, aR as parsePermissionsPolicy, aS as parseUserAgent, aT as parseVaryHeader, aU as searchHeaders, aV as searchStatusCodes, aW as splitSitemap, aX as statusCodeToText, aY as typeNumberToLabel, aZ as validateDomain, a_ as validateHeaderName, a$ as validateHeaderValue, b0 as validateManifest, b1 as validateRobotsTxt, b2 as validateSitemap } from '../network-DelcJeJa.cjs';
1
+ export { A as AuthResultEntry, B as BuildRangeHeaderOptions, C as CLIENT_HINTS, a as CacheControlDirective, b as CacheControlOptions, c as CacheControlResult, d as ClientHintDef, e as ClientHintValueType, f as ClientHintsBuildResult, g as ClientHintsParseResult, h as ContentDispositionBuildOptions, i as ContentDispositionBuildResult, j as ContentDispositionParseResult, k as ContentRangeResult, l as ContentTypeRiskResult, m as ContentTypeSniffRisk, o as CookieAttributes, p as CookieCheckResult, D as DNS_RECORD_TYPES, q as DnsRecord, r as DnsRecordType, s as DnsResponse, E as EmailHeaderAnalysis, t as EmailHeaderField, G as GeoResult, H as HTTP_HEADERS, u as HarEntry, v as HarParseResult, w as HarSummary, x as HeaderCategory, y as HttpHeader, I as Ipv6AddressType, z as Ipv6ParseResult, L as LINK_REL_VALUES, F as LinkHeaderEntry, J as LinkHeaderEntryInput, K as LinkHeaderResult, M as LinkRel, N as ManifestIconInfo, O as ManifestIssue, P as ManifestValidationResult, Q as PERMISSIONS_POLICY_FEATURES, R as ParsedClientHint, S as ParsedDnsResult, T as ParsedGeoResult, U as PermissionsPolicyDirective, V as PermissionsPolicyFeatureInput, W as PermissionsPolicyResult, X as REFERRER_POLICY_VALUES, Y as RangeEntry, Z as RangeEntryInput, _ as RangeHeaderResult, $ as ReceivedHop, a0 as ReferrerPolicyEntry, a1 as ReferrerPolicyResult, a2 as ReferrerPolicyValue, a3 as RobotsGroup, a4 as RobotsIssue, a5 as RobotsRule, a6 as RobotsValidationResult, a7 as STATUS_CODES, a8 as SameSiteValue, a9 as SitemapIndexEntry, aa as SitemapIssue, ab as SitemapSplitFile, ac as SitemapUrlEntry, ad as SitemapValidationResult, ae as SplitSitemapOptions, af as SplitSitemapResult, ag as StatusCode, ah as UaDeviceType, ai as UserAgentInfo, aj as VaryHeaderEntry, ak as VaryHeaderResult, al as XContentTypeOptionsHeader, am as XContentTypeOptionsParseResult, an as X_CONTENT_TYPE_OPTIONS_HEADER, ao as analyzeEmailHeaders, ap as assessContentTypeRisk, aq as buildCacheControl, ar as buildClientHints, as as buildContentDisposition, at as buildDnsQueryUrl, au as buildGeoUrl, av as buildLinkHeader, aw as buildMapUrl, ax as buildPermissionsPolicy, ay as buildRangeHeader, az as buildReferrerPolicy, aA as buildVaryHeader, aB as buildXContentTypeOptionsHeader, aC as checkSetCookieHeader, aD as countryCodeToFlag, aE as formatCoordinates, aF as formatTtl, aG as getByCategory, aH as getHeader, aI as getHeadersByCategory, aJ as getStatusByCategory, aK as getStatusCode, aL as isClientError, aM as isServerError, aN as isSuccess, aO as isValidIp, aP as isValidIpv4, aQ as isValidIpv6, aR as parseClientHintHeaders, aS as parseContentDisposition, aT as parseContentRangeHeader, aU as parseDnsResponse, aV as parseGeoResponse, aW as parseHar, aX as parseIpv6Address, aY as parsePermissionsPolicy, aZ as parseUserAgent, a_ as parseVaryHeader, a$ as parseXContentTypeOptionsHeader, b0 as searchHeaders, b1 as searchStatusCodes, b2 as splitSitemap, b3 as statusCodeToText, b4 as typeNumberToLabel, b5 as validateDomain, b6 as validateHeaderName, b7 as validateHeaderValue, b8 as validateManifest, b9 as validateRobotsTxt, ba as validateSitemap } from '../network-C6IcHeMB.cjs';
@@ -1 +1 @@
1
- export { A as AuthResultEntry, B as BuildRangeHeaderOptions, C as CLIENT_HINTS, a as CacheControlDirective, b as CacheControlOptions, c as CacheControlResult, d as ClientHintDef, e as ClientHintValueType, f as ClientHintsBuildResult, g as ClientHintsParseResult, h as ContentDispositionBuildOptions, i as ContentDispositionBuildResult, j as ContentDispositionParseResult, k as ContentRangeResult, l as CookieAttributes, m as CookieCheckResult, D as DNS_RECORD_TYPES, o as DnsRecord, p as DnsRecordType, q as DnsResponse, E as EmailHeaderAnalysis, r as EmailHeaderField, G as GeoResult, H as HTTP_HEADERS, s as HarEntry, t as HarParseResult, u as HarSummary, v as HeaderCategory, w as HttpHeader, I as Ipv6AddressType, x as Ipv6ParseResult, L as LINK_REL_VALUES, y as LinkHeaderEntry, z as LinkHeaderEntryInput, F as LinkHeaderResult, J as LinkRel, M as ManifestIconInfo, K as ManifestIssue, N as ManifestValidationResult, P as PERMISSIONS_POLICY_FEATURES, O as ParsedClientHint, Q as ParsedDnsResult, R as ParsedGeoResult, S as PermissionsPolicyDirective, T as PermissionsPolicyFeatureInput, U as PermissionsPolicyResult, V as REFERRER_POLICY_VALUES, W as RangeEntry, X as RangeEntryInput, Y as RangeHeaderResult, Z as ReceivedHop, _ as ReferrerPolicyEntry, $ as ReferrerPolicyResult, a0 as ReferrerPolicyValue, a1 as RobotsGroup, a2 as RobotsIssue, a3 as RobotsRule, a4 as RobotsValidationResult, a5 as STATUS_CODES, a6 as SameSiteValue, a7 as SitemapIndexEntry, a8 as SitemapIssue, a9 as SitemapSplitFile, aa as SitemapUrlEntry, ab as SitemapValidationResult, ac as SplitSitemapOptions, ad as SplitSitemapResult, ae as StatusCode, af as UaDeviceType, ag as UserAgentInfo, ah as VaryHeaderEntry, ai as VaryHeaderResult, aj as analyzeEmailHeaders, ak as buildCacheControl, al as buildClientHints, am as buildContentDisposition, an as buildDnsQueryUrl, ao as buildGeoUrl, ap as buildLinkHeader, aq as buildMapUrl, ar as buildPermissionsPolicy, as as buildRangeHeader, at as buildReferrerPolicy, au as buildVaryHeader, av as checkSetCookieHeader, aw as countryCodeToFlag, ax as formatCoordinates, ay as formatTtl, az as getByCategory, aA as getHeader, aB as getHeadersByCategory, aC as getStatusByCategory, aD as getStatusCode, aE as isClientError, aF as isServerError, aG as isSuccess, aH as isValidIp, aI as isValidIpv4, aJ as isValidIpv6, aK as parseClientHintHeaders, aL as parseContentDisposition, aM as parseContentRangeHeader, aN as parseDnsResponse, aO as parseGeoResponse, aP as parseHar, aQ as parseIpv6Address, aR as parsePermissionsPolicy, aS as parseUserAgent, aT as parseVaryHeader, aU as searchHeaders, aV as searchStatusCodes, aW as splitSitemap, aX as statusCodeToText, aY as typeNumberToLabel, aZ as validateDomain, a_ as validateHeaderName, a$ as validateHeaderValue, b0 as validateManifest, b1 as validateRobotsTxt, b2 as validateSitemap } from '../network-DelcJeJa.js';
1
+ export { A as AuthResultEntry, B as BuildRangeHeaderOptions, C as CLIENT_HINTS, a as CacheControlDirective, b as CacheControlOptions, c as CacheControlResult, d as ClientHintDef, e as ClientHintValueType, f as ClientHintsBuildResult, g as ClientHintsParseResult, h as ContentDispositionBuildOptions, i as ContentDispositionBuildResult, j as ContentDispositionParseResult, k as ContentRangeResult, l as ContentTypeRiskResult, m as ContentTypeSniffRisk, o as CookieAttributes, p as CookieCheckResult, D as DNS_RECORD_TYPES, q as DnsRecord, r as DnsRecordType, s as DnsResponse, E as EmailHeaderAnalysis, t as EmailHeaderField, G as GeoResult, H as HTTP_HEADERS, u as HarEntry, v as HarParseResult, w as HarSummary, x as HeaderCategory, y as HttpHeader, I as Ipv6AddressType, z as Ipv6ParseResult, L as LINK_REL_VALUES, F as LinkHeaderEntry, J as LinkHeaderEntryInput, K as LinkHeaderResult, M as LinkRel, N as ManifestIconInfo, O as ManifestIssue, P as ManifestValidationResult, Q as PERMISSIONS_POLICY_FEATURES, R as ParsedClientHint, S as ParsedDnsResult, T as ParsedGeoResult, U as PermissionsPolicyDirective, V as PermissionsPolicyFeatureInput, W as PermissionsPolicyResult, X as REFERRER_POLICY_VALUES, Y as RangeEntry, Z as RangeEntryInput, _ as RangeHeaderResult, $ as ReceivedHop, a0 as ReferrerPolicyEntry, a1 as ReferrerPolicyResult, a2 as ReferrerPolicyValue, a3 as RobotsGroup, a4 as RobotsIssue, a5 as RobotsRule, a6 as RobotsValidationResult, a7 as STATUS_CODES, a8 as SameSiteValue, a9 as SitemapIndexEntry, aa as SitemapIssue, ab as SitemapSplitFile, ac as SitemapUrlEntry, ad as SitemapValidationResult, ae as SplitSitemapOptions, af as SplitSitemapResult, ag as StatusCode, ah as UaDeviceType, ai as UserAgentInfo, aj as VaryHeaderEntry, ak as VaryHeaderResult, al as XContentTypeOptionsHeader, am as XContentTypeOptionsParseResult, an as X_CONTENT_TYPE_OPTIONS_HEADER, ao as analyzeEmailHeaders, ap as assessContentTypeRisk, aq as buildCacheControl, ar as buildClientHints, as as buildContentDisposition, at as buildDnsQueryUrl, au as buildGeoUrl, av as buildLinkHeader, aw as buildMapUrl, ax as buildPermissionsPolicy, ay as buildRangeHeader, az as buildReferrerPolicy, aA as buildVaryHeader, aB as buildXContentTypeOptionsHeader, aC as checkSetCookieHeader, aD as countryCodeToFlag, aE as formatCoordinates, aF as formatTtl, aG as getByCategory, aH as getHeader, aI as getHeadersByCategory, aJ as getStatusByCategory, aK as getStatusCode, aL as isClientError, aM as isServerError, aN as isSuccess, aO as isValidIp, aP as isValidIpv4, aQ as isValidIpv6, aR as parseClientHintHeaders, aS as parseContentDisposition, aT as parseContentRangeHeader, aU as parseDnsResponse, aV as parseGeoResponse, aW as parseHar, aX as parseIpv6Address, aY as parsePermissionsPolicy, aZ as parseUserAgent, a_ as parseVaryHeader, a$ as parseXContentTypeOptionsHeader, b0 as searchHeaders, b1 as searchStatusCodes, b2 as splitSitemap, b3 as statusCodeToText, b4 as typeNumberToLabel, b5 as validateDomain, b6 as validateHeaderName, b7 as validateHeaderValue, b8 as validateManifest, b9 as validateRobotsTxt, ba as validateSitemap } from '../network-C6IcHeMB.js';
@@ -1,2 +1,2 @@
1
- export { CLIENT_HINTS, DNS_RECORD_TYPES, HTTP_HEADERS, LINK_REL_VALUES, PERMISSIONS_POLICY_FEATURES, REFERRER_POLICY_VALUES, STATUS_CODES, analyzeEmailHeaders, buildCacheControl, buildClientHints, buildContentDisposition, buildDnsQueryUrl, buildGeoUrl, buildLinkHeader, buildMapUrl, buildPermissionsPolicy, buildRangeHeader, buildReferrerPolicy, buildVaryHeader, checkSetCookieHeader, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, parseClientHintHeaders, parseContentDisposition, parseContentRangeHeader, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parsePermissionsPolicy, parseUserAgent, parseVaryHeader, searchHeaders, searchStatusCodes, splitSitemap, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateManifest, validateRobotsTxt, validateSitemap } from '../chunk-Y7YY733Z.js';
1
+ export { CLIENT_HINTS, DNS_RECORD_TYPES, HTTP_HEADERS, LINK_REL_VALUES, PERMISSIONS_POLICY_FEATURES, REFERRER_POLICY_VALUES, STATUS_CODES, X_CONTENT_TYPE_OPTIONS_HEADER, analyzeEmailHeaders, assessContentTypeRisk, buildCacheControl, buildClientHints, buildContentDisposition, buildDnsQueryUrl, buildGeoUrl, buildLinkHeader, buildMapUrl, buildPermissionsPolicy, buildRangeHeader, buildReferrerPolicy, buildVaryHeader, buildXContentTypeOptionsHeader, checkSetCookieHeader, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, parseClientHintHeaders, parseContentDisposition, parseContentRangeHeader, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parsePermissionsPolicy, parseUserAgent, parseVaryHeader, parseXContentTypeOptionsHeader, searchHeaders, searchStatusCodes, splitSitemap, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateManifest, validateRobotsTxt, validateSitemap } from '../chunk-DEBIH7QS.js';
2
2
  import '../chunk-MLKGABMK.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utilix-tech/sdk",
3
- "version": "0.53.0",
3
+ "version": "0.54.0",
4
4
  "description": "154+ developer utility tools for Node.js: JSON, encoding, hashing, color, CSS, network and more. Runs locally, no API key required.",
5
5
  "author": "Utilix <hello@utilix.tech>",
6
6
  "license": "MIT",