@joycostudio/iris 0.0.0-stage → 0.0.1
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.
- package/LICENSE +15 -0
- package/README.md +137 -2
- package/dist/browser.cjs +466 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +69 -0
- package/dist/browser.d.ts +69 -0
- package/dist/browser.js +439 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.cjs +681 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +658 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.cjs +355 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +8 -0
- package/dist/core.d.ts +8 -0
- package/dist/core.js +328 -0
- package/dist/core.js.map +1 -0
- package/dist/next.cjs +380 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +16 -0
- package/dist/next.d.ts +16 -0
- package/dist/next.js +352 -0
- package/dist/next.js.map +1 -0
- package/dist/node.cjs +580 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +47 -0
- package/dist/node.d.ts +47 -0
- package/dist/node.js +542 -0
- package/dist/node.js.map +1 -0
- package/dist/policy-types-LoD2Ldcl.d.cts +147 -0
- package/dist/policy-types-LoD2Ldcl.d.ts +147 -0
- package/dist/react.cjs +628 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +42 -0
- package/dist/react.d.ts +42 -0
- package/dist/react.js +611 -0
- package/dist/react.js.map +1 -0
- package/dist/types-Dv3DS4OX.d.cts +17 -0
- package/dist/types-Dv3DS4OX.d.ts +17 -0
- package/package.json +102 -4
- package/skills/iris-audit/SKILL.md +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/browser/index.ts"],"sourcesContent":["import type { IrisAsset, IrisDiagnostic } from \"../core\"\n\nexport type IrisBrowserManifest = Record<string, IrisAsset>\n\nexport type IrisBrowserReport = {\n id: string\n source: IrisAsset | null\n renderedWidth: number\n renderedHeight: number\n visualWidth: number\n visualHeight: number\n naturalWidth: number\n dpr: number\n idealWidth: number\n selectedWidth: number | null\n selectedUrl: string\n availableWidths: number[]\n declaredSizes: string\n declaredSlotWidth: number | null\n loading: string\n objectFit: string\n transferBytes: number | null\n duration: number | null\n timing: IrisImageTiming | null\n isLcp: boolean\n diagnostics: IrisDiagnostic[]\n}\n\nexport type IrisImageTiming = {\n blurMs: number | null\n previewMs: number | null\n finalMs: number | null\n startedAt: number | null\n previewAt: number | null\n finalAt: number | null\n}\n\nexport type IrisDebugger = ReturnType<typeof createIrisDebugger>\n\nexport function inspectImageElement(\n image: HTMLImageElement,\n manifest: IrisBrowserManifest = {},\n lcpElements: ReadonlySet<Element> = new Set(),\n timing: IrisImageTiming | null = null\n): IrisBrowserReport {\n const rect = image.getBoundingClientRect()\n // `sizes` describes the image's CSS layout slot. DOMRect includes transforms\n // from the image and every ancestor, which makes reveal animations look like\n // a smaller slot and produces false positives while they are running.\n const renderedWidth = image.clientWidth || rect.width\n const renderedHeight = image.clientHeight || rect.height\n const id = image.dataset.iris || image.currentSrc || image.src\n const source =\n manifest[image.dataset.irisSrc || id] ??\n manifest[id] ??\n manifest[image.currentSrc] ??\n manifest[image.src] ??\n null\n const candidates = parseSrcSet(image.srcset, renderedWidth)\n const selectedUrl = image.currentSrc || image.src\n const selectedWidth = selectedCandidateWidth(selectedUrl, candidates)\n const dpr = window.devicePixelRatio || 1\n const idealWidth = Math.ceil(renderedWidth * dpr)\n const declaredSlotWidth = resolveSizes(image.sizes)\n const resource = resourceTiming(selectedUrl)\n const diagnostics = diagnoseRuntime({\n source,\n renderedWidth,\n renderedHeight,\n visualWidth: rect.width,\n visualHeight: rect.height,\n idealWidth,\n selectedWidth,\n availableWidths: candidates.map((candidate) => candidate.width),\n declaredSlotWidth,\n objectFit: getComputedStyle(image).objectFit,\n })\n\n return {\n id,\n source,\n renderedWidth,\n renderedHeight,\n visualWidth: rect.width,\n visualHeight: rect.height,\n naturalWidth: image.naturalWidth,\n dpr,\n idealWidth,\n selectedWidth,\n selectedUrl,\n availableWidths: candidates.map((candidate) => candidate.width),\n declaredSizes: image.sizes,\n declaredSlotWidth,\n loading: image.loading,\n objectFit: getComputedStyle(image).objectFit,\n transferBytes: resource?.transferSize ?? null,\n duration: resource?.duration ?? null,\n timing,\n isLcp: lcpElements.has(image),\n diagnostics,\n }\n}\n\nexport function createIrisDebugger(\n options: {\n manifest?: IrisBrowserManifest\n scope?: \"marked\" | \"document\"\n console?: \"silent\" | \"warnings\" | \"all\"\n } = {}\n) {\n const reports = new Map<HTMLImageElement, IrisBrowserReport>()\n const lcpElements = new Set<Element>()\n let mutationObserver: MutationObserver | null = null\n let resizeObserver: ResizeObserver | null = null\n let performanceObserver: PerformanceObserver | null = null\n let frame = 0\n let tableTimer: ReturnType<typeof setTimeout> | null = null\n let lastTableSignature = \"\"\n const pending = new Set<HTMLImageElement>()\n const timelines = new WeakMap<HTMLImageElement, IrisImageTiming>()\n\n const selector = options.scope === \"document\" ? \"img\" : \"img[data-iris]\"\n const measure = (image: HTMLImageElement) => {\n const report = inspectImageElement(\n image,\n options.manifest,\n lcpElements,\n timelines.get(image) ?? null\n )\n reports.set(image, report)\n scheduleTable()\n }\n const table = () => logReportTable(report(), options.console ?? \"warnings\")\n const scheduleTable = () => {\n if (options.console === \"silent\") return\n if (tableTimer) clearTimeout(tableTimer)\n tableTimer = setTimeout(() => {\n tableTimer = null\n const signature = reportSignature(report())\n if (signature === lastTableSignature) return\n lastTableSignature = signature\n table()\n }, 250)\n }\n const schedule = (image: HTMLImageElement) => {\n pending.add(image)\n if (frame) return\n frame = requestAnimationFrame(() => {\n frame = 0\n for (const pendingImage of pending) measure(pendingImage)\n pending.clear()\n })\n }\n const observe = (root: ParentNode = document) => {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target instanceof HTMLImageElement) schedule(entry.target)\n }\n })\n const register = (image: HTMLImageElement) => {\n resizeObserver?.observe(image)\n image.addEventListener(\"load\", () => schedule(image), { once: true })\n if (image.complete) schedule(image)\n }\n root.querySelectorAll<HTMLImageElement>(selector).forEach(register)\n mutationObserver = new MutationObserver((records) => {\n for (const record of records) {\n for (const node of record.addedNodes) {\n if (!(node instanceof Element)) continue\n if (node.matches(selector)) register(node as HTMLImageElement)\n node.querySelectorAll<HTMLImageElement>(selector).forEach(register)\n }\n }\n })\n mutationObserver.observe(root, { childList: true, subtree: true })\n if (typeof PerformanceObserver !== \"undefined\") {\n performanceObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const element = (entry as PerformanceEntry & { element?: Element })\n .element\n if (element) {\n lcpElements.add(element)\n if (element instanceof HTMLImageElement) schedule(element)\n }\n }\n })\n try {\n performanceObserver.observe({\n type: \"largest-contentful-paint\",\n buffered: true,\n })\n } catch {\n performanceObserver = null\n }\n }\n return api\n }\n const disconnect = () => {\n mutationObserver?.disconnect()\n resizeObserver?.disconnect()\n performanceObserver?.disconnect()\n cancelAnimationFrame(frame)\n if (tableTimer) clearTimeout(tableTimer)\n tableTimer = null\n frame = 0\n pending.clear()\n }\n const report = () => [...reports.values()]\n const startTimeline = (image: HTMLImageElement) => {\n timelines.set(image, {\n blurMs: null,\n previewMs: null,\n finalMs: null,\n startedAt: null,\n previewAt: null,\n finalAt: null,\n })\n }\n const markPreview = (\n image: HTMLImageElement,\n preview: HTMLImageElement,\n at = performance.now()\n ) => {\n const timing = timelines.get(image)\n if (!timing) return\n timing.startedAt =\n resourceTiming(preview.currentSrc || preview.src)?.startTime ?? at\n timing.previewAt = at\n timing.blurMs = roundDuration(at - timing.startedAt)\n schedule(image)\n }\n const markFinal = (image: HTMLImageElement, at = performance.now()) => {\n const timing = timelines.get(image)\n if (!timing) return\n const finalStartedAt =\n resourceTiming(image.currentSrc || image.src)?.startTime ?? at\n timing.finalAt = at\n timing.finalMs = roundDuration(at - finalStartedAt)\n if (timing.previewAt === null) {\n timing.startedAt = finalStartedAt\n timing.blurMs = timing.finalMs\n } else timing.previewMs = roundDuration(at - timing.previewAt)\n schedule(image)\n }\n const summary = () => ({\n inspected: reports.size,\n healthy: report().filter((item) => item.diagnostics.length === 0).length,\n warnings: report()\n .flatMap((item) => item.diagnostics)\n .filter((item) => item.severity === \"warning\").length,\n errors: report()\n .flatMap((item) => item.diagnostics)\n .filter((item) => item.severity === \"error\").length,\n })\n const api = {\n observe,\n disconnect,\n report,\n table,\n summary,\n startTimeline,\n markPreview,\n markFinal,\n }\n return api\n}\n\nfunction roundDuration(value: number) {\n return Math.round(value * 10) / 10\n}\n\nfunction resourceTiming(url: string) {\n const normalized = normalizeUrl(url)\n const entries = performance.getEntriesByType(\n \"resource\"\n ) as PerformanceResourceTiming[]\n for (let index = entries.length - 1; index >= 0; index--) {\n if (normalizeUrl(entries[index].name) === normalized) return entries[index]\n }\n return undefined\n}\n\nfunction parseSrcSet(srcset: string, renderedWidth: number) {\n return srcset\n .split(\",\")\n .map((value) => value.trim().split(/\\s+/))\n .map(([url, descriptor]) => ({\n url,\n width: descriptor?.endsWith(\"w\")\n ? Number.parseInt(descriptor, 10)\n : descriptor?.endsWith(\"x\")\n ? Math.round(Number.parseFloat(descriptor) * renderedWidth)\n : 0,\n }))\n .filter((candidate) => candidate.url && candidate.width > 0)\n}\n\nfunction selectedCandidateWidth(\n selectedUrl: string,\n candidates: { url: string; width: number }[]\n) {\n const selected = normalizeUrl(selectedUrl)\n const candidate = candidates.find(\n (item) => normalizeUrl(item.url) === selected\n )\n if (candidate) return candidate.width\n const queryWidth = new URL(\n selectedUrl,\n window.location.href\n ).searchParams.get(\"w\")\n return queryWidth ? Number(queryWidth) : null\n}\n\nfunction normalizeUrl(url: string) {\n try {\n return new URL(url, window.location.href).href\n } catch {\n return url\n }\n}\n\nexport function diagnoseRuntime(input: {\n source: IrisAsset | null\n renderedWidth: number\n renderedHeight: number\n visualWidth?: number\n visualHeight?: number\n idealWidth: number\n selectedWidth: number | null\n availableWidths: number[]\n declaredSlotWidth: number | null\n objectFit: string\n}) {\n const diagnostics: IrisDiagnostic[] = []\n if (\n input.visualWidth !== undefined &&\n input.renderedWidth > 0 &&\n Math.abs(input.visualWidth - input.renderedWidth) / input.renderedWidth >\n 0.02\n ) {\n diagnostics.push(\n runtimeDiagnostic(\n \"css-transform-affects-visual-size\",\n \"info\",\n \"high\",\n \"A CSS transform changes the visual width; responsive selection still uses the untransformed layout slot.\",\n {\n renderedWidth: input.renderedWidth,\n visualWidth: input.visualWidth,\n }\n )\n )\n }\n if (input.declaredSlotWidth && input.renderedWidth > 0) {\n const pixelDifference = input.declaredSlotWidth - input.renderedWidth\n const difference = pixelDifference / input.renderedWidth\n // Relative differences on icons look dramatic while changing no candidate:\n // 49px vs 38px is 28%, but both resolve to the same smallest srcset width.\n // Require a meaningful absolute mismatch as well as a relative one.\n const isMaterialMismatch = Math.abs(pixelDifference) >= 32\n if (difference < -0.1 && isMaterialMismatch) {\n diagnostics.push(\n runtimeDiagnostic(\n \"sizes-understates-layout\",\n \"warning\",\n \"high\",\n \"The active sizes slot is smaller than the rendered CSS width.\",\n {\n declaredSlotWidth: input.declaredSlotWidth,\n renderedWidth: input.renderedWidth,\n pixelDifference,\n difference,\n }\n )\n )\n } else if (difference > 0.25 && isMaterialMismatch) {\n diagnostics.push(\n runtimeDiagnostic(\n \"sizes-overstates-layout\",\n \"warning\",\n \"high\",\n \"The active sizes slot is substantially larger than the rendered CSS width.\",\n {\n declaredSlotWidth: input.declaredSlotWidth,\n renderedWidth: input.renderedWidth,\n pixelDifference,\n difference,\n }\n )\n )\n }\n }\n if (input.source && input.source.width < input.idealWidth) {\n diagnostics.push(\n runtimeDiagnostic(\n \"source-too-small\",\n \"error\",\n \"high\",\n \"The source is smaller than the rendered width × DPR target.\",\n {\n sourceWidth: input.source.width,\n idealWidth: input.idealWidth,\n }\n )\n )\n }\n if (input.selectedWidth && input.selectedWidth < input.idealWidth) {\n const hasLarger = input.availableWidths.some(\n (width) => width >= input.idealWidth\n )\n diagnostics.push(\n runtimeDiagnostic(\n hasLarger ? \"browser-downselected\" : \"missing-useful-candidate\",\n hasLarger ? \"info\" : \"warning\",\n \"high\",\n hasLarger\n ? \"The browser selected below the theoretical target although a larger candidate exists.\"\n : \"No available candidate reaches the theoretical target.\",\n { selectedWidth: input.selectedWidth, idealWidth: input.idealWidth }\n )\n )\n }\n if (input.source && input.objectFit === \"cover\") {\n const sourceRatio = input.source.width / input.source.height\n const renderedRatio = input.renderedWidth / input.renderedHeight\n if (Math.abs(sourceRatio - renderedRatio) / sourceRatio > 0.02) {\n diagnostics.push(\n runtimeDiagnostic(\n \"cropped-image\",\n \"info\",\n \"high\",\n \"object-fit: cover crops part of the downloaded source.\",\n {\n sourceAspectRatio: sourceRatio,\n renderedAspectRatio: renderedRatio,\n }\n )\n )\n }\n }\n return diagnostics\n}\n\nfunction resolveSizes(sizes: string): number | null {\n if (!sizes || sizes.trim() === \"auto\") return null\n for (const rule of splitTopLevel(sizes)) {\n const value = rule.trim()\n let length = value\n if (value.startsWith(\"(\")) {\n const end = matchingParenthesis(value)\n if (end < 0) continue\n if (!matchMedia(value.slice(0, end + 1)).matches) continue\n length = value.slice(end + 1).trim()\n }\n if (!length || length === \"auto\") continue\n const probe = document.createElement(\"div\")\n probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;width:${length};height:0`\n document.body.append(probe)\n const width = probe.getBoundingClientRect().width\n probe.remove()\n return Number.isFinite(width) && width > 0 ? width : null\n }\n return null\n}\n\nfunction splitTopLevel(value: string) {\n const output: string[] = []\n let depth = 0\n let start = 0\n for (let index = 0; index < value.length; index++) {\n if (value[index] === \"(\") depth++\n if (value[index] === \")\") depth--\n if (value[index] === \",\" && depth === 0) {\n output.push(value.slice(start, index))\n start = index + 1\n }\n }\n output.push(value.slice(start))\n return output\n}\n\nfunction matchingParenthesis(value: string) {\n let depth = 0\n for (let index = 0; index < value.length; index++) {\n if (value[index] === \"(\") depth++\n if (value[index] === \")\" && --depth === 0) return index\n }\n return -1\n}\n\nfunction runtimeDiagnostic(\n code: string,\n severity: IrisDiagnostic[\"severity\"],\n confidence: IrisDiagnostic[\"confidence\"],\n message: string,\n evidence: IrisDiagnostic[\"evidence\"]\n): IrisDiagnostic {\n return { code, severity, confidence, message, evidence }\n}\n\nfunction logReportTable(\n reports: IrisBrowserReport[],\n mode: \"silent\" | \"warnings\" | \"all\"\n) {\n if (mode === \"silent\") return\n const visible = reports.filter(\n (report) =>\n mode === \"all\" ||\n report.diagnostics.some((diagnostic) => diagnostic.severity !== \"info\")\n )\n if (visible.length === 0) return\n console.table(\n visible.map((report) => ({\n asset: report.id,\n stage: imageStage(report),\n rendered: `${Math.round(report.renderedWidth)}×${Math.round(report.renderedHeight)}`,\n selected: report.selectedWidth,\n ideal: report.idealWidth,\n bytes: report.transferBytes,\n blurMs: report.timing?.blurMs ?? null,\n previewMs: report.timing?.previewMs ?? null,\n finalMs: report.timing?.finalMs ?? null,\n lazy: report.loading === \"lazy\",\n lcp: report.isLcp,\n status: diagnosticStatus(report),\n diagnostics: report.diagnostics\n .map((diagnostic) => diagnostic.code)\n .join(\", \"),\n }))\n )\n}\n\nfunction imageStage(report: IrisBrowserReport) {\n if (report.timing?.finalAt !== null && report.timing?.finalAt !== undefined)\n return \"final\"\n if (report.timing?.previewAt) return \"preview\"\n if (report.timing) return \"blur\"\n return report.naturalWidth > 0 ? \"final\" : \"loading\"\n}\n\nfunction diagnosticStatus(report: IrisBrowserReport) {\n if (report.diagnostics.some((item) => item.severity === \"error\"))\n return \"error\"\n if (report.diagnostics.some((item) => item.severity === \"warning\"))\n return \"warning\"\n if (report.diagnostics.some((item) => item.severity === \"info\")) return \"info\"\n return \"healthy\"\n}\n\nfunction reportSignature(reports: IrisBrowserReport[]) {\n return reports\n .map((report) =>\n [\n report.id,\n imageStage(report),\n report.selectedWidth,\n report.transferBytes,\n report.timing?.blurMs,\n report.timing?.previewMs,\n report.timing?.finalMs,\n diagnosticStatus(report),\n ].join(\":\")\n )\n .join(\"|\")\n}\n"],"mappings":"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","names":["report"]}
|