@springbrand/file-renderers 0.1.0-alpha.0 → 0.1.0-alpha.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.
Files changed (132) hide show
  1. package/README.md +7 -1
  2. package/dist/file-renderers/src/attachment-format.d.ts +1 -1
  3. package/dist/file-renderers/src/attachment-format.js +21 -21
  4. package/dist/file-renderers/src/attachment.d.ts +3 -3
  5. package/dist/file-renderers/src/attachment.js +4 -4
  6. package/dist/file-renderers/src/code/index.d.ts +3 -3
  7. package/dist/file-renderers/src/code/index.js +2 -2
  8. package/dist/file-renderers/src/code/mime.d.ts +1 -1
  9. package/dist/file-renderers/src/code/mime.js +1 -1
  10. package/dist/file-renderers/src/config/index.d.ts +8 -8
  11. package/dist/file-renderers/src/config/index.js +11 -11
  12. package/dist/file-renderers/src/config/limits.js +1 -1
  13. package/dist/file-renderers/src/config/mime.d.ts +1 -1
  14. package/dist/file-renderers/src/config/mime.js +1 -1
  15. package/dist/file-renderers/src/config/toml.d.ts +1 -1
  16. package/dist/file-renderers/src/config/toml.js +1 -1
  17. package/dist/file-renderers/src/config/xml.d.ts +1 -1
  18. package/dist/file-renderers/src/config/xml.js +1 -1
  19. package/dist/file-renderers/src/config/yaml.d.ts +2 -2
  20. package/dist/file-renderers/src/config/yaml.js +1 -1
  21. package/dist/file-renderers/src/contracts.d.ts +2 -0
  22. package/dist/file-renderers/src/csv/index.d.ts +2 -2
  23. package/dist/file-renderers/src/csv/index.js +2 -2
  24. package/dist/file-renderers/src/csv/mime.d.ts +1 -1
  25. package/dist/file-renderers/src/csv/mime.js +1 -1
  26. package/dist/file-renderers/src/docx/index.d.ts +2 -2
  27. package/dist/file-renderers/src/docx/index.js +4 -4
  28. package/dist/file-renderers/src/docx/mime.d.ts +1 -1
  29. package/dist/file-renderers/src/docx/mime.js +1 -1
  30. package/dist/file-renderers/src/drawio/index.d.ts +5 -5
  31. package/dist/file-renderers/src/drawio/index.js +4 -4
  32. package/dist/file-renderers/src/drawio/mime.d.ts +1 -1
  33. package/dist/file-renderers/src/drawio/mime.js +1 -1
  34. package/dist/file-renderers/src/drawio/parse.d.ts +1 -1
  35. package/dist/file-renderers/src/excalidraw/index.d.ts +2 -2
  36. package/dist/file-renderers/src/excalidraw/index.js +3 -3
  37. package/dist/file-renderers/src/excalidraw/mime.d.ts +1 -1
  38. package/dist/file-renderers/src/excalidraw/mime.js +1 -1
  39. package/dist/file-renderers/src/file-format.js +21 -21
  40. package/dist/file-renderers/src/glb/index.d.ts +3 -3
  41. package/dist/file-renderers/src/glb/index.js +4 -4
  42. package/dist/file-renderers/src/glb/mime.d.ts +1 -1
  43. package/dist/file-renderers/src/glb/mime.js +1 -1
  44. package/dist/file-renderers/src/glb/parse.js +1 -1
  45. package/dist/file-renderers/src/html/index.d.ts +2 -2
  46. package/dist/file-renderers/src/html/index.js +2 -2
  47. package/dist/file-renderers/src/html/mime.d.ts +1 -1
  48. package/dist/file-renderers/src/html/mime.js +1 -1
  49. package/dist/file-renderers/src/html/preview-project.d.ts +2 -3
  50. package/dist/file-renderers/src/html/preview-project.js +13 -53
  51. package/dist/file-renderers/src/html/preview.d.ts +3 -3
  52. package/dist/file-renderers/src/html/preview.js +2 -2
  53. package/dist/file-renderers/src/image/index.d.ts +2 -2
  54. package/dist/file-renderers/src/image/index.js +2 -2
  55. package/dist/file-renderers/src/image/mime.d.ts +1 -1
  56. package/dist/file-renderers/src/image/mime.js +1 -1
  57. package/dist/file-renderers/src/index.d.ts +28 -27
  58. package/dist/file-renderers/src/index.js +28 -27
  59. package/dist/file-renderers/src/json/index.d.ts +4 -4
  60. package/dist/file-renderers/src/json/index.js +5 -5
  61. package/dist/file-renderers/src/json/json.typecheck.js +2 -2
  62. package/dist/file-renderers/src/json/jsonl.d.ts +4 -4
  63. package/dist/file-renderers/src/json/jsonl.js +5 -5
  64. package/dist/file-renderers/src/json/mime.d.ts +1 -1
  65. package/dist/file-renderers/src/json/mime.js +2 -2
  66. package/dist/file-renderers/src/json/parse.d.ts +1 -1
  67. package/dist/file-renderers/src/json/parse.js +1 -1
  68. package/dist/file-renderers/src/markdown/index.d.ts +2 -2
  69. package/dist/file-renderers/src/markdown/index.js +2 -2
  70. package/dist/file-renderers/src/markdown/mime.d.ts +1 -1
  71. package/dist/file-renderers/src/markdown/mime.js +1 -1
  72. package/dist/file-renderers/src/media/index.d.ts +5 -5
  73. package/dist/file-renderers/src/media/index.js +3 -3
  74. package/dist/file-renderers/src/media/mime.d.ts +1 -1
  75. package/dist/file-renderers/src/media/mime.js +1 -1
  76. package/dist/file-renderers/src/mermaid/frame.d.ts +1 -1
  77. package/dist/file-renderers/src/mermaid/frame.js +1 -1
  78. package/dist/file-renderers/src/mermaid/index.d.ts +3 -3
  79. package/dist/file-renderers/src/mermaid/index.js +4 -4
  80. package/dist/file-renderers/src/mermaid/mime.d.ts +1 -1
  81. package/dist/file-renderers/src/mermaid/mime.js +1 -1
  82. package/dist/file-renderers/src/notebook/index.d.ts +4 -4
  83. package/dist/file-renderers/src/notebook/index.js +8 -8
  84. package/dist/file-renderers/src/notebook/mime.d.ts +1 -1
  85. package/dist/file-renderers/src/notebook/mime.js +1 -1
  86. package/dist/file-renderers/src/notebook/parse.d.ts +2 -2
  87. package/dist/file-renderers/src/notebook/parse.js +4 -4
  88. package/dist/file-renderers/src/pdf/index.d.ts +2 -2
  89. package/dist/file-renderers/src/pdf/index.js +2 -2
  90. package/dist/file-renderers/src/pdf/mime.d.ts +1 -1
  91. package/dist/file-renderers/src/pdf/mime.js +1 -1
  92. package/dist/file-renderers/src/ppt/index.d.ts +2 -2
  93. package/dist/file-renderers/src/ppt/index.js +3 -3
  94. package/dist/file-renderers/src/ppt/mime.d.ts +1 -1
  95. package/dist/file-renderers/src/ppt/mime.js +1 -1
  96. package/dist/file-renderers/src/preview-content.d.ts +1 -1
  97. package/dist/file-renderers/src/preview-content.js +11 -11
  98. package/dist/file-renderers/src/preview-host.d.ts +23 -23
  99. package/dist/file-renderers/src/preview-host.js +24 -24
  100. package/dist/file-renderers/src/preview-surface.d.ts +2 -2
  101. package/dist/file-renderers/src/preview-surface.js +3 -3
  102. package/dist/file-renderers/src/registry.d.ts +1 -1
  103. package/dist/file-renderers/src/resource-path.d.ts +7 -0
  104. package/dist/file-renderers/src/resource-path.js +37 -0
  105. package/dist/file-renderers/src/svg/index.d.ts +3 -3
  106. package/dist/file-renderers/src/svg/index.js +5 -5
  107. package/dist/file-renderers/src/svg/mime.d.ts +1 -1
  108. package/dist/file-renderers/src/svg/mime.js +1 -1
  109. package/dist/file-renderers/src/svg/parse.d.ts +1 -1
  110. package/dist/file-renderers/src/svg/parse.js +1 -1
  111. package/dist/file-renderers/src/svg/svg.typecheck.js +1 -1
  112. package/dist/file-renderers/src/wasm/index.d.ts +4 -4
  113. package/dist/file-renderers/src/wasm/index.js +4 -4
  114. package/dist/file-renderers/src/wasm/mime.d.ts +1 -1
  115. package/dist/file-renderers/src/wasm/mime.js +1 -1
  116. package/dist/file-renderers/src/wasm/parse.js +1 -1
  117. package/dist/file-renderers/src/wasm/wasm.typecheck.js +1 -1
  118. package/dist/file-renderers/src/xlsx/index.d.ts +2 -2
  119. package/dist/file-renderers/src/xlsx/index.js +4 -4
  120. package/dist/file-renderers/src/xlsx/mime.d.ts +1 -1
  121. package/dist/file-renderers/src/xlsx/mime.js +1 -1
  122. package/dist/file-renderers/src/zip/index.d.ts +4 -4
  123. package/dist/file-renderers/src/zip/index.js +5 -5
  124. package/dist/file-renderers/src/zip/mime.d.ts +1 -1
  125. package/dist/file-renderers/src/zip/mime.js +1 -1
  126. package/dist/file-renderers/src/zip/parse.js +1 -1
  127. package/dist/utils/src/index.d.ts +12 -12
  128. package/dist/utils/src/index.js +12 -12
  129. package/dist/utils/src/ooxml.d.ts +1 -1
  130. package/dist/utils/src/ooxml.js +1 -1
  131. package/dist/utils/src/uuid.js +1 -1
  132. package/package.json +9 -5
@@ -1,7 +1,7 @@
1
- import type { FileRenderer, FrameDocumentModel, RendererHostContext, RendererInput } from "../contracts";
2
- import { type NotebookPreview } from "./parse";
3
- export { isSupportedNotebookInput, NOTEBOOK_MIME_TYPE, NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime";
4
- export { InvalidNotebookError, parseNotebook, type NotebookCell, type NotebookOutput, type NotebookPreview } from "./parse";
1
+ import type { FileRenderer, FrameDocumentModel, RendererHostContext, RendererInput } from "../contracts.js";
2
+ import { type NotebookPreview } from "./parse.js";
3
+ export { isSupportedNotebookInput, NOTEBOOK_MIME_TYPE, NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime.js";
4
+ export { InvalidNotebookError, parseNotebook, type NotebookCell, type NotebookOutput, type NotebookPreview } from "./parse.js";
5
5
  export type NotebookFrame = NotebookPreview & {
6
6
  readonly status: "valid";
7
7
  readonly name: string;
@@ -1,14 +1,14 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
- import { CodeDocument } from "../code";
4
- import { ImageDocument } from "../image";
5
- import { InvalidJsonError, JsonPreviewLimitError } from "../json/parse";
6
- import { MarkdownDocument } from "../markdown";
7
- import { parseNotebook, InvalidNotebookError } from "./parse";
8
- import { isSupportedNotebookInput } from "./mime";
3
+ import { CodeDocument } from "../code/index.js";
4
+ import { ImageDocument } from "../image/index.js";
5
+ import { InvalidJsonError, JsonPreviewLimitError } from "../json/parse.js";
6
+ import { MarkdownDocument } from "../markdown/index.js";
7
+ import { parseNotebook, InvalidNotebookError } from "./parse.js";
8
+ import { isSupportedNotebookInput } from "./mime.js";
9
9
  import styles from "./notebook.module.css";
10
- export { isSupportedNotebookInput, NOTEBOOK_MIME_TYPE, NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime";
11
- export { InvalidNotebookError, parseNotebook } from "./parse";
10
+ export { isSupportedNotebookInput, NOTEBOOK_MIME_TYPE, NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime.js";
11
+ export { InvalidNotebookError, parseNotebook } from "./parse.js";
12
12
  const CELL_PAGE_SIZE = 25;
13
13
  export class UnsupportedNotebookTypeError extends Error {
14
14
  constructor(input) {
@@ -1,4 +1,4 @@
1
- import type { RendererInput } from "../contracts";
1
+ import type { RendererInput } from "../contracts.js";
2
2
  export declare const NOTEBOOK_MIME_TYPE = "application/x-ipynb+json";
3
3
  export declare const NOTEBOOK_PREVIEW_MAX_BYTES: number;
4
4
  export declare function isSupportedNotebookInput(input: Pick<RendererInput<"notebook">, "name" | "mimeType">): boolean;
@@ -1,4 +1,4 @@
1
- import { filenameSuffix } from "../file-name";
1
+ import { filenameSuffix } from "../file-name.js";
2
2
  export const NOTEBOOK_MIME_TYPE = "application/x-ipynb+json";
3
3
  export const NOTEBOOK_PREVIEW_MAX_BYTES = 2 * 1024 * 1024;
4
4
  export function isSupportedNotebookInput(input) {
@@ -1,5 +1,5 @@
1
- import type { RendererDiagnostic, RendererHostContext } from "../contracts";
2
- import { type ImageFrame } from "../image";
1
+ import type { RendererDiagnostic, RendererHostContext } from "../contracts.js";
2
+ import { type ImageFrame } from "../image/index.js";
3
3
  export type NotebookOutput = {
4
4
  readonly kind: "text";
5
5
  readonly text: string;
@@ -1,8 +1,8 @@
1
1
  import { decodeBase64 } from "../../../utils/src/index.js";
2
- import { imageRenderer } from "../image";
3
- import { isSupportedImageMimeType } from "../image/mime";
4
- import { parseJsonText } from "../json/parse";
5
- import { NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime";
2
+ import { imageRenderer } from "../image/index.js";
3
+ import { isSupportedImageMimeType } from "../image/mime.js";
4
+ import { parseJsonText } from "../json/parse.js";
5
+ import { NOTEBOOK_PREVIEW_MAX_BYTES } from "./mime.js";
6
6
  const MAX_CELLS = 200;
7
7
  const MAX_OUTPUTS_PER_CELL = 20;
8
8
  const MAX_CELL_CHARACTERS = 128 * 1024;
@@ -1,5 +1,5 @@
1
- import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts";
2
- export { isSupportedPdfInput, normalizedPdfMimeType, pdfMimeTypeFor } from "./mime";
1
+ import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts.js";
2
+ export { isSupportedPdfInput, normalizedPdfMimeType, pdfMimeTypeFor } from "./mime.js";
3
3
  export type PdfFrame = {
4
4
  readonly name: string;
5
5
  readonly mimeType: string;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
- import { isSupportedPdfInput, normalizedPdfMimeType, pdfMimeTypeFor, } from "./mime";
3
+ import { pdfMimeTypeFor } from "./mime.js";
4
4
  import styles from "./pdf.module.css";
5
- export { isSupportedPdfInput, normalizedPdfMimeType, pdfMimeTypeFor } from "./mime";
5
+ export { isSupportedPdfInput, normalizedPdfMimeType, pdfMimeTypeFor } from "./mime.js";
6
6
  export class UnsupportedPdfTypeError extends Error {
7
7
  fileName;
8
8
  mimeType;
@@ -1,4 +1,4 @@
1
- import type { RendererInput } from "../contracts";
1
+ import type { RendererInput } from "../contracts.js";
2
2
  export declare function normalizedPdfMimeType(mimeType: string): string;
3
3
  export declare function pdfMimeTypeFor(input: Pick<RendererInput<"pdf">, "name" | "mimeType">): string | null;
4
4
  export declare function isSupportedPdfInput(input: Pick<RendererInput<"pdf">, "name" | "mimeType">): boolean;
@@ -1,4 +1,4 @@
1
- import { filenameSuffix } from "../file-name";
1
+ import { filenameSuffix } from "../file-name.js";
2
2
  const PDF_MIME_TYPE = "application/pdf";
3
3
  export function normalizedPdfMimeType(mimeType) {
4
4
  return mimeType.split(";", 1)[0]?.trim().toLowerCase() ?? "";
@@ -1,5 +1,5 @@
1
- import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts";
2
- export { isSupportedPptInput, normalizedPptMimeType, pptMimeTypeFor } from "./mime";
1
+ import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts.js";
2
+ export { isSupportedPptInput, normalizedPptMimeType, pptMimeTypeFor } from "./mime.js";
3
3
  export type PptFrame = {
4
4
  readonly name: string;
5
5
  readonly mimeType: string;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { inspectSafeOoxml } from "../../../utils/src/index.js";
3
- import { OfficePreview, OOXML_VIEWER_RESOURCE_LIMITS, } from "../office/preview";
4
- import { pptMimeTypeFor } from "./mime";
5
- export { isSupportedPptInput, normalizedPptMimeType, pptMimeTypeFor } from "./mime";
3
+ import { OfficePreview, OOXML_VIEWER_RESOURCE_LIMITS, } from "../office/preview.js";
4
+ import { pptMimeTypeFor } from "./mime.js";
5
+ export { isSupportedPptInput, normalizedPptMimeType, pptMimeTypeFor } from "./mime.js";
6
6
  export class UnsupportedPptTypeError extends Error {
7
7
  constructor(input) {
8
8
  super(`No PPTX renderer is registered for ${input.name || input.mimeType || "this file"}`);
@@ -1,4 +1,4 @@
1
- import type { RendererInput } from "../contracts";
1
+ import type { RendererInput } from "../contracts.js";
2
2
  export declare function normalizedPptMimeType(mimeType: string): string;
3
3
  export declare function pptMimeTypeFor(input: Pick<RendererInput<"ppt">, "name" | "mimeType">): string | null;
4
4
  export declare function isSupportedPptInput(input: Pick<RendererInput<"ppt">, "name" | "mimeType">): boolean;
@@ -1,4 +1,4 @@
1
- import { filenameSuffix } from "../file-name";
1
+ import { filenameSuffix } from "../file-name.js";
2
2
  const PPTX_MIME_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
3
3
  export function normalizedPptMimeType(mimeType) {
4
4
  return mimeType.split(";", 1)[0]?.trim().toLowerCase() ?? "";
@@ -1,4 +1,4 @@
1
- import type { DetectedFileFormat } from './file-format';
1
+ import type { DetectedFileFormat } from './file-format.js';
2
2
  export declare const FILE_TEXT_PREVIEW_MAX_BYTES: number;
3
3
  export declare const FILE_IMAGE_PREVIEW_MAX_BYTES: number;
4
4
  export declare const FILE_MEDIA_PREVIEW_MAX_BYTES: number;
@@ -1,14 +1,14 @@
1
- import { GLB_PREVIEW_MAX_BYTES } from './glb/mime';
2
- import { CONFIG_PREVIEW_MAX_BYTES } from './config/mime';
3
- import { DRAWIO_PREVIEW_MAX_BYTES } from './drawio/mime';
4
- import { EXCALIDRAW_PREVIEW_MAX_BYTES } from './excalidraw/mime';
5
- import { JSON_PREVIEW_MAX_BYTES } from './json/mime';
6
- import { JSONL_PREVIEW_MAX_BYTES } from './json/mime';
7
- import { MERMAID_PREVIEW_MAX_BYTES } from './mermaid/mime';
8
- import { NOTEBOOK_PREVIEW_MAX_BYTES } from './notebook/mime';
9
- import { SVG_PREVIEW_MAX_BYTES } from './svg/mime';
10
- import { WASM_PREVIEW_MAX_BYTES } from './wasm/mime';
11
- import { ZIP_PREVIEW_MAX_BYTES } from './zip/mime';
1
+ import { GLB_PREVIEW_MAX_BYTES } from './glb/mime.js';
2
+ import { CONFIG_PREVIEW_MAX_BYTES } from './config/mime.js';
3
+ import { DRAWIO_PREVIEW_MAX_BYTES } from './drawio/mime.js';
4
+ import { EXCALIDRAW_PREVIEW_MAX_BYTES } from './excalidraw/mime.js';
5
+ import { JSON_PREVIEW_MAX_BYTES } from './json/mime.js';
6
+ import { JSONL_PREVIEW_MAX_BYTES } from './json/mime.js';
7
+ import { MERMAID_PREVIEW_MAX_BYTES } from './mermaid/mime.js';
8
+ import { NOTEBOOK_PREVIEW_MAX_BYTES } from './notebook/mime.js';
9
+ import { SVG_PREVIEW_MAX_BYTES } from './svg/mime.js';
10
+ import { WASM_PREVIEW_MAX_BYTES } from './wasm/mime.js';
11
+ import { ZIP_PREVIEW_MAX_BYTES } from './zip/mime.js';
12
12
  export const FILE_TEXT_PREVIEW_MAX_BYTES = 512 * 1024;
13
13
  export const FILE_IMAGE_PREVIEW_MAX_BYTES = 10 * 1024 * 1024;
14
14
  export const FILE_MEDIA_PREVIEW_MAX_BYTES = 50 * 1024 * 1024;
@@ -1,26 +1,26 @@
1
- import type { CodeModel } from './code';
2
- import type { TomlModel, XmlModel, YamlModel } from './config';
3
- import type { CsvModel } from './csv';
4
- import type { DocxModel } from './docx';
5
- import type { DrawioModel } from './drawio';
6
- import type { ExcalidrawModel } from './excalidraw';
7
- import type { GlbModel } from './glb';
8
- import type { HtmlModel } from './html';
9
- import type { ImageModel } from './image';
10
- import type { JsonModel } from './json';
11
- import type { JsonlModel } from './json/jsonl';
12
- import type { MediaModel } from './media';
13
- import type { MermaidModel } from './mermaid';
14
- import type { NotebookModel } from './notebook';
15
- import type { PdfModel } from './pdf';
16
- import type { PptModel } from './ppt';
17
- import type { SvgModel } from './svg';
18
- import type { WasmModel } from './wasm';
19
- import type { XlsxModel } from './xlsx';
20
- import type { ZipModel } from './zip';
21
- import type { FileRenderer, FileRendererFormat, ParsedDocument, RendererModel, RendererResourceResolver } from './contracts';
22
- import type { MarkdownModel } from './markdown';
23
- import type { DefaultFileRendererModelMap } from './registry';
1
+ import type { CodeModel } from './code/index.js';
2
+ import type { TomlModel, XmlModel, YamlModel } from './config/index.js';
3
+ import type { CsvModel } from './csv/index.js';
4
+ import type { DocxModel } from './docx/index.js';
5
+ import type { DrawioModel } from './drawio/index.js';
6
+ import type { ExcalidrawModel } from './excalidraw/index.js';
7
+ import type { GlbModel } from './glb/index.js';
8
+ import type { HtmlModel } from './html/index.js';
9
+ import type { ImageModel } from './image/index.js';
10
+ import type { JsonModel } from './json/index.js';
11
+ import type { JsonlModel } from './json/jsonl.js';
12
+ import type { MediaModel } from './media/index.js';
13
+ import type { MermaidModel } from './mermaid/index.js';
14
+ import type { NotebookModel } from './notebook/index.js';
15
+ import type { PdfModel } from './pdf/index.js';
16
+ import type { PptModel } from './ppt/index.js';
17
+ import type { SvgModel } from './svg/index.js';
18
+ import type { WasmModel } from './wasm/index.js';
19
+ import type { XlsxModel } from './xlsx/index.js';
20
+ import type { ZipModel } from './zip/index.js';
21
+ import type { FileRenderer, FileRendererFormat, ParsedDocument, RendererModel, RendererResourceResolver } from './contracts.js';
22
+ import type { MarkdownModel } from './markdown/index.js';
23
+ import type { DefaultFileRendererModelMap } from './registry.js';
24
24
  export declare const blockedFileResources: RendererResourceResolver;
25
25
  type CompleteRendererModels<Models extends DefaultFileRendererModelMap> = Models;
26
26
  type FileRendererModels = CompleteRendererModels<{
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useState } from 'react';
3
- import { fileFormatFor, isBinaryFileFormat } from './file-format';
3
+ import { fileFormatFor, isBinaryFileFormat } from './file-format.js';
4
4
  export const blockedFileResources = {
5
5
  async resolve(_request, { signal }) {
6
6
  signal.throwIfAborted();
@@ -17,7 +17,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
17
17
  if (payload.encoding === 'bytes') {
18
18
  if (format === 'image') {
19
19
  signal.throwIfAborted();
20
- const { imageRenderer: renderer } = await import('./image');
20
+ const { imageRenderer: renderer } = await import('./image/index.js');
21
21
  signal.throwIfAborted();
22
22
  const document = await renderer.parse({
23
23
  format: 'image',
@@ -30,7 +30,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
30
30
  }
31
31
  if (format === 'media') {
32
32
  signal.throwIfAborted();
33
- const { mediaRenderer: renderer } = await import('./media');
33
+ const { mediaRenderer: renderer } = await import('./media/index.js');
34
34
  signal.throwIfAborted();
35
35
  const document = await renderer.parse({
36
36
  format: 'media',
@@ -43,7 +43,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
43
43
  }
44
44
  if (format === 'pdf') {
45
45
  signal.throwIfAborted();
46
- const { pdfRenderer: renderer } = await import('./pdf');
46
+ const { pdfRenderer: renderer } = await import('./pdf/index.js');
47
47
  signal.throwIfAborted();
48
48
  const document = await renderer.parse({
49
49
  format: 'pdf',
@@ -56,7 +56,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
56
56
  }
57
57
  if (format === 'glb') {
58
58
  signal.throwIfAborted();
59
- const { glbRenderer: renderer } = await import('./glb');
59
+ const { glbRenderer: renderer } = await import('./glb/index.js');
60
60
  signal.throwIfAborted();
61
61
  const document = await renderer.parse({
62
62
  format: 'glb',
@@ -69,7 +69,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
69
69
  }
70
70
  if (format === 'wasm') {
71
71
  signal.throwIfAborted();
72
- const { wasmRenderer: renderer } = await import('./wasm');
72
+ const { wasmRenderer: renderer } = await import('./wasm/index.js');
73
73
  signal.throwIfAborted();
74
74
  const document = await renderer.parse({ format: 'wasm', name, mimeType, payload }, context);
75
75
  signal.throwIfAborted();
@@ -77,7 +77,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
77
77
  }
78
78
  if (format === 'zip') {
79
79
  signal.throwIfAborted();
80
- const { zipRenderer: renderer } = await import('./zip');
80
+ const { zipRenderer: renderer } = await import('./zip/index.js');
81
81
  signal.throwIfAborted();
82
82
  const document = await renderer.parse({ format: 'zip', name, mimeType, payload }, context);
83
83
  signal.throwIfAborted();
@@ -85,7 +85,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
85
85
  }
86
86
  if (format === 'docx') {
87
87
  signal.throwIfAborted();
88
- const { docxRenderer: renderer } = await import('./docx');
88
+ const { docxRenderer: renderer } = await import('./docx/index.js');
89
89
  signal.throwIfAborted();
90
90
  const document = await renderer.parse({
91
91
  format: 'docx',
@@ -98,7 +98,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
98
98
  }
99
99
  if (format === 'xlsx') {
100
100
  signal.throwIfAborted();
101
- const { xlsxRenderer: renderer } = await import('./xlsx');
101
+ const { xlsxRenderer: renderer } = await import('./xlsx/index.js');
102
102
  signal.throwIfAborted();
103
103
  const document = await renderer.parse({
104
104
  format: 'xlsx',
@@ -111,7 +111,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
111
111
  }
112
112
  if (format === 'ppt') {
113
113
  signal.throwIfAborted();
114
- const { pptRenderer: renderer } = await import('./ppt');
114
+ const { pptRenderer: renderer } = await import('./ppt/index.js');
115
115
  signal.throwIfAborted();
116
116
  const document = await renderer.parse({
117
117
  format: 'ppt',
@@ -127,7 +127,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
127
127
  return unhandledRendererFormat(format);
128
128
  }
129
129
  if (format === 'html') {
130
- const { htmlRenderer: renderer } = await import('./html');
130
+ const { htmlRenderer: renderer } = await import('./html/index.js');
131
131
  signal.throwIfAborted();
132
132
  const document = await renderer.parse({
133
133
  format: 'html',
@@ -139,77 +139,77 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
139
139
  return { format: 'html', basePath, document, renderer };
140
140
  }
141
141
  if (format === 'json') {
142
- const { jsonRenderer: renderer } = await import('./json');
142
+ const { jsonRenderer: renderer } = await import('./json/index.js');
143
143
  signal.throwIfAborted();
144
144
  const document = await renderer.parse({ format: 'json', name, mimeType, payload }, context);
145
145
  signal.throwIfAborted();
146
146
  return { format: 'json', basePath, document, renderer };
147
147
  }
148
148
  if (format === 'jsonl') {
149
- const { jsonlRenderer: renderer } = await import('./json/jsonl');
149
+ const { jsonlRenderer: renderer } = await import('./json/jsonl.js');
150
150
  signal.throwIfAborted();
151
151
  const document = await renderer.parse({ format: 'jsonl', name, mimeType, payload }, context);
152
152
  signal.throwIfAborted();
153
153
  return { format: 'jsonl', basePath, document, renderer };
154
154
  }
155
155
  if (format === 'yaml') {
156
- const { yamlRenderer: renderer } = await import('./config');
156
+ const { yamlRenderer: renderer } = await import('./config/index.js');
157
157
  signal.throwIfAborted();
158
158
  const document = await renderer.parse({ format: 'yaml', name, mimeType, payload }, context);
159
159
  signal.throwIfAborted();
160
160
  return { format: 'yaml', basePath, document, renderer };
161
161
  }
162
162
  if (format === 'toml') {
163
- const { tomlRenderer: renderer } = await import('./config');
163
+ const { tomlRenderer: renderer } = await import('./config/index.js');
164
164
  signal.throwIfAborted();
165
165
  const document = await renderer.parse({ format: 'toml', name, mimeType, payload }, context);
166
166
  signal.throwIfAborted();
167
167
  return { format: 'toml', basePath, document, renderer };
168
168
  }
169
169
  if (format === 'xml') {
170
- const { xmlRenderer: renderer } = await import('./config');
170
+ const { xmlRenderer: renderer } = await import('./config/index.js');
171
171
  signal.throwIfAborted();
172
172
  const document = await renderer.parse({ format: 'xml', name, mimeType, payload }, context);
173
173
  signal.throwIfAborted();
174
174
  return { format: 'xml', basePath, document, renderer };
175
175
  }
176
176
  if (format === 'notebook') {
177
- const { notebookRenderer: renderer } = await import('./notebook');
177
+ const { notebookRenderer: renderer } = await import('./notebook/index.js');
178
178
  signal.throwIfAborted();
179
179
  const document = await renderer.parse({ format: 'notebook', name, mimeType, payload }, context);
180
180
  signal.throwIfAborted();
181
181
  return { format: 'notebook', basePath, document, renderer };
182
182
  }
183
183
  if (format === 'svg') {
184
- const { svgRenderer: renderer } = await import('./svg');
184
+ const { svgRenderer: renderer } = await import('./svg/index.js');
185
185
  signal.throwIfAborted();
186
186
  const document = await renderer.parse({ format: 'svg', name, mimeType, payload }, context);
187
187
  signal.throwIfAborted();
188
188
  return { format: 'svg', basePath, document, renderer };
189
189
  }
190
190
  if (format === 'drawio') {
191
- const { drawioRenderer: renderer } = await import('./drawio');
191
+ const { drawioRenderer: renderer } = await import('./drawio/index.js');
192
192
  signal.throwIfAborted();
193
193
  const document = await renderer.parse({ format: 'drawio', name, mimeType, payload }, context);
194
194
  signal.throwIfAborted();
195
195
  return { format: 'drawio', basePath, document, renderer };
196
196
  }
197
197
  if (format === 'excalidraw') {
198
- const { excalidrawRenderer: renderer } = await import('./excalidraw');
198
+ const { excalidrawRenderer: renderer } = await import('./excalidraw/index.js');
199
199
  signal.throwIfAborted();
200
200
  const document = await renderer.parse({ format: 'excalidraw', name, mimeType, payload }, context);
201
201
  signal.throwIfAborted();
202
202
  return { format: 'excalidraw', basePath, document, renderer };
203
203
  }
204
204
  if (format === 'mermaid') {
205
- const { mermaidRenderer: renderer } = await import('./mermaid');
205
+ const { mermaidRenderer: renderer } = await import('./mermaid/index.js');
206
206
  signal.throwIfAborted();
207
207
  const document = await renderer.parse({ format: 'mermaid', name, mimeType, payload }, context);
208
208
  signal.throwIfAborted();
209
209
  return { format: 'mermaid', basePath, document, renderer };
210
210
  }
211
211
  if (format === 'markdown') {
212
- const { markdownRenderer: renderer } = await import('./markdown');
212
+ const { markdownRenderer: renderer } = await import('./markdown/index.js');
213
213
  signal.throwIfAborted();
214
214
  const document = await renderer.parse({
215
215
  format: 'markdown',
@@ -221,7 +221,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
221
221
  return { format: 'markdown', basePath, document, renderer };
222
222
  }
223
223
  if (format === 'csv') {
224
- const { csvRenderer: renderer } = await import('./csv');
224
+ const { csvRenderer: renderer } = await import('./csv/index.js');
225
225
  signal.throwIfAborted();
226
226
  const document = await renderer.parse({
227
227
  format: 'csv',
@@ -237,7 +237,7 @@ export async function parseFile({ path, name, mimeType, payload, resources = blo
237
237
  return null;
238
238
  return unhandledRendererFormat(format);
239
239
  }
240
- const { codeRenderer: renderer } = await import('./code');
240
+ const { codeRenderer: renderer } = await import('./code/index.js');
241
241
  signal.throwIfAborted();
242
242
  const document = await renderer.parse({
243
243
  format: 'code',
@@ -1,6 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
- import { type FileRendererProjection } from './preview-host';
3
- import type { RendererResourceResolver } from './contracts';
2
+ import { type FileRendererProjection } from './preview-host.js';
3
+ import type { RendererResourceResolver } from './contracts.js';
4
4
  export type FileViewMode = 'preview' | 'source';
5
5
  export declare function FileViewSwitch({ mode, onModeChange, }: {
6
6
  mode: FileViewMode;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { lazy, Suspense, useState } from 'react';
3
- import { blockedFileResources, FileDiagramPreview, FileRendererSurface, FileGlbPreview, FileWasmPreview, } from './preview-host';
4
- import { mediaKindFor } from './media/mime';
5
- const HtmlPreviewDocument = lazy(() => import('./html/preview').then(({ HtmlPreviewDocument }) => ({
3
+ import { blockedFileResources, FileDiagramPreview, FileRendererSurface, FileGlbPreview, FileWasmPreview, } from './preview-host.js';
4
+ import { mediaKindFor } from './media/mime.js';
5
+ const HtmlPreviewDocument = lazy(() => import('./html/preview.js').then(({ HtmlPreviewDocument }) => ({
6
6
  default: HtmlPreviewDocument,
7
7
  })));
8
8
  export function FileViewSwitch({ mode, onModeChange, }) {
@@ -1,4 +1,4 @@
1
- import type { FileRenderer, FileRendererFormat, RendererModel } from "./contracts";
1
+ import type { FileRenderer, FileRendererFormat, RendererModel } from "./contracts.js";
2
2
  export type FileRendererModelMap = {
3
3
  readonly [Format in FileRendererFormat]?: RendererModel<Format>;
4
4
  };
@@ -0,0 +1,7 @@
1
+ import type { RendererResourceRequest } from "./contracts.js";
2
+ /** The host supplies an exact, decoded directory, not a URL pathname. */
3
+ export declare function resourceDirectoryUrl(basePath: string): URL | null;
4
+ /** Resolve a raw local URL reference without giving it the host page's origin. */
5
+ export declare function localResourceUrl(reference: string, base: URL): URL | null;
6
+ /** Decode a renderer URL reference exactly once to the host's inventory path. */
7
+ export declare function rendererResourcePath({ basePath, reference }: Pick<RendererResourceRequest, "basePath" | "reference">): string | null;
@@ -0,0 +1,37 @@
1
+ const RESOURCE_ORIGIN = "https://workspace.invalid";
2
+ /** The host supplies an exact, decoded directory, not a URL pathname. */
3
+ export function resourceDirectoryUrl(basePath) {
4
+ if (!basePath.startsWith("/") || basePath.startsWith("//") || /[\\\0-\x1f\x7f]/u.test(basePath) ||
5
+ basePath.split("/").some((segment) => segment === "." || segment === ".."))
6
+ return null;
7
+ const path = basePath.split("/").map(encodeURIComponent).join("/");
8
+ return new URL(path.endsWith("/") ? path : `${path}/`, RESOURCE_ORIGIN);
9
+ }
10
+ /** Resolve a raw local URL reference without giving it the host page's origin. */
11
+ export function localResourceUrl(reference, base) {
12
+ const value = reference.trim();
13
+ if (!value || value.startsWith("#") || value.startsWith("//") ||
14
+ /^[a-z][a-z\d+.-]*:/iu.test(value) || /[\\\0-\x1f\x7f]/u.test(reference))
15
+ return null;
16
+ try {
17
+ const url = new URL(value, base);
18
+ return url.origin === RESOURCE_ORIGIN && !/%2f|%5c/iu.test(url.pathname) ? url : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ /** Decode a renderer URL reference exactly once to the host's inventory path. */
25
+ export function rendererResourcePath({ basePath, reference }) {
26
+ const base = resourceDirectoryUrl(basePath);
27
+ const url = base && localResourceUrl(reference, base);
28
+ if (!url)
29
+ return null;
30
+ try {
31
+ const path = decodeURIComponent(url.pathname);
32
+ return /[\\\0-\x1f\x7f]/u.test(path) || path.split("/").some((segment) => segment === "." || segment === "..") ? null : path;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
@@ -1,6 +1,6 @@
1
- import type { FileRenderer, FrameDocumentModel, RendererInput, RendererDiagnostic } from "../contracts";
2
- export { SVG_MIME_TYPE, SVG_PREVIEW_MAX_BYTES, isSupportedSvgInput, normalizedSvgMimeType, svgMimeTypeFor, } from "./mime";
3
- export { InvalidSvgError, sanitizeSvg, type SvgPreview } from "./parse";
1
+ import type { FileRenderer, FrameDocumentModel, RendererInput, RendererDiagnostic } from "../contracts.js";
2
+ export { SVG_MIME_TYPE, SVG_PREVIEW_MAX_BYTES, isSupportedSvgInput, normalizedSvgMimeType, svgMimeTypeFor, } from "./mime.js";
3
+ export { InvalidSvgError, sanitizeSvg, type SvgPreview } from "./parse.js";
4
4
  export type SvgFrame = {
5
5
  readonly name: string;
6
6
  readonly mimeType: string;
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ImageDocument } from "../image";
3
- import { svgMimeTypeFor } from "./mime";
4
- import { sanitizeSvg } from "./parse";
5
- export { SVG_MIME_TYPE, SVG_PREVIEW_MAX_BYTES, isSupportedSvgInput, normalizedSvgMimeType, svgMimeTypeFor, } from "./mime";
6
- export { InvalidSvgError, sanitizeSvg } from "./parse";
2
+ import { ImageDocument } from "../image/index.js";
3
+ import { svgMimeTypeFor } from "./mime.js";
4
+ import { sanitizeSvg } from "./parse.js";
5
+ export { SVG_MIME_TYPE, SVG_PREVIEW_MAX_BYTES, isSupportedSvgInput, normalizedSvgMimeType, svgMimeTypeFor, } from "./mime.js";
6
+ export { InvalidSvgError, sanitizeSvg } from "./parse.js";
7
7
  export class UnsupportedSvgTypeError extends Error {
8
8
  constructor(input) {
9
9
  super(`No SVG renderer is registered for ${input.name || input.mimeType || "this file"}`);
@@ -1,4 +1,4 @@
1
- import type { RendererInput } from "../contracts";
1
+ import type { RendererInput } from "../contracts.js";
2
2
  export declare const SVG_MIME_TYPE = "image/svg+xml";
3
3
  export declare const SVG_PREVIEW_MAX_BYTES: number;
4
4
  export declare function normalizedSvgMimeType(mimeType: string): string;
@@ -1,4 +1,4 @@
1
- import { filenameSuffix } from "../file-name";
1
+ import { filenameSuffix } from "../file-name.js";
2
2
  export const SVG_MIME_TYPE = "image/svg+xml";
3
3
  export const SVG_PREVIEW_MAX_BYTES = 512 * 1024;
4
4
  export function normalizedSvgMimeType(mimeType) {
@@ -1,4 +1,4 @@
1
- import type { RendererDiagnostic } from "../contracts";
1
+ import type { RendererDiagnostic } from "../contracts.js";
2
2
  export type SvgPreview = {
3
3
  readonly svg: string;
4
4
  readonly diagnostics: readonly RendererDiagnostic[];
@@ -1,5 +1,5 @@
1
1
  import { SaxesParser } from "saxes";
2
- import { SVG_PREVIEW_MAX_BYTES } from "./mime";
2
+ import { SVG_PREVIEW_MAX_BYTES } from "./mime.js";
3
3
  const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
4
4
  const XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
5
5
  const XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/";
@@ -1,4 +1,4 @@
1
- import { svgRenderer } from "./index";
1
+ import { svgRenderer } from "./index.js";
2
2
  void svgRenderer.parse(svgInput, context);
3
3
  void svgRenderer.render(svgDocument, context);
4
4
  // @ts-expect-error SVG source is text, never binary payload.
@@ -1,7 +1,7 @@
1
- import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts";
2
- import { type WasmMetadata } from "./parse";
3
- export { WASM_MIME_TYPE, WASM_PREVIEW_MAX_BYTES, isSupportedWasmInput, normalizedWasmMimeType, wasmMimeTypeFor, } from "./mime";
4
- export { InvalidWasmError, parseWasmMetadata, type WasmMetadata, type WasmSection } from "./parse";
1
+ import type { FileRenderer, FrameDocumentModel, RendererInput } from "../contracts.js";
2
+ import { type WasmMetadata } from "./parse.js";
3
+ export { WASM_MIME_TYPE, WASM_PREVIEW_MAX_BYTES, isSupportedWasmInput, normalizedWasmMimeType, wasmMimeTypeFor, } from "./mime.js";
4
+ export { InvalidWasmError, parseWasmMetadata, type WasmMetadata, type WasmSection } from "./parse.js";
5
5
  export type WasmFrame = {
6
6
  readonly name: string;
7
7
  readonly metadata: WasmMetadata;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { wasmMimeTypeFor } from "./mime";
3
- import { parseWasmMetadata } from "./parse";
4
- export { WASM_MIME_TYPE, WASM_PREVIEW_MAX_BYTES, isSupportedWasmInput, normalizedWasmMimeType, wasmMimeTypeFor, } from "./mime";
5
- export { InvalidWasmError, parseWasmMetadata } from "./parse";
2
+ import { wasmMimeTypeFor } from "./mime.js";
3
+ import { parseWasmMetadata } from "./parse.js";
4
+ export { WASM_MIME_TYPE, WASM_PREVIEW_MAX_BYTES, isSupportedWasmInput, normalizedWasmMimeType, wasmMimeTypeFor, } from "./mime.js";
5
+ export { InvalidWasmError, parseWasmMetadata } from "./parse.js";
6
6
  export class UnsupportedWasmTypeError extends Error {
7
7
  constructor(input) {
8
8
  super(`No WASM renderer is registered for ${input.name || input.mimeType || "this file"}`);
@@ -1,4 +1,4 @@
1
- import type { RendererInput } from "../contracts";
1
+ import type { RendererInput } from "../contracts.js";
2
2
  export declare const WASM_MIME_TYPE = "application/wasm";
3
3
  export declare const WASM_PREVIEW_MAX_BYTES: number;
4
4
  export declare function normalizedWasmMimeType(mimeType: string): string;
@@ -1,4 +1,4 @@
1
- import { filenameSuffix } from "../file-name";
1
+ import { filenameSuffix } from "../file-name.js";
2
2
  export const WASM_MIME_TYPE = "application/wasm";
3
3
  export const WASM_PREVIEW_MAX_BYTES = 10 * 1024 * 1024;
4
4
  export function normalizedWasmMimeType(mimeType) {