rea/src/domain/artifactPathSyntax.ts

35 lines
1.6 KiB
TypeScript

/**
* Pure string predicates for artifact path syntax. The local artifact
* resolver, the Electron native specifier check, and (by reference) the
* live-DOM and source-map URL handling share these character-level rules.
*
* Policy divergence (deliberate, not yet unified):
* - Local artifact paths resolve against an inventoried container root and
* report rejected | external | not-found. Confinement is lexical
* (posix.normalize must stay inside the root).
* - Live DOM destinations resolve against the document base URL and report
* approved | outside_policy | unsupported against allowedOrigins
* (see CdpCaptureDocuments.domDestination).
* - Source-map fetches require exact-origin http(s) without credentials
* (see WebSourceMapFetcher.approvedUrl).
* Unifying those outcome vocabularies is a separate, observable change.
*/
/** Whether a reference carries a URI scheme (`https:`, `file:`, …). */
export const hasScheme = (value: string): boolean =>
/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(value);
/** Whether a reference is scheme-qualified or protocol-relative. */
export const looksExternal = (value: string): boolean =>
hasScheme(value) || value.startsWith("//");
/** Drop any query string and fragment from a declared reference. */
export const stripQueryAndFragment = (value: string): string =>
value.split("#", 1)[0]?.split("?", 1)[0] ?? "";
/** Path syntax admitted for a canonical artifact path. */
export const admitsCanonicalPathSyntax = (value: string): boolean =>
!value.includes("\0") &&
!value.includes("\\") &&
!/%(?:2e|2f|5c)/iu.test(value);