@danielsimonjr/sciengjs 0.0.0-stage → 0.1.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -3
  3. package/THIRD_PARTY_NOTICES.md +57 -0
  4. package/assets/fonts/LiberationSerif-Regular.LICENSE.txt +102 -0
  5. package/assets/fonts/LiberationSerif-Regular.ttf +0 -0
  6. package/assets/index_bg.wasm +0 -0
  7. package/assets/licenses/EPL-2.0.txt +278 -0
  8. package/assets/licenses/MPL-2.0.txt +374 -0
  9. package/dist/assets.d.ts +12 -0
  10. package/dist/assets.js +63 -0
  11. package/dist/assets.js.map +1 -0
  12. package/dist/config.d.ts +32 -0
  13. package/dist/config.js +186 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/core.d.ts +10 -0
  16. package/dist/core.js +85 -0
  17. package/dist/core.js.map +1 -0
  18. package/dist/errors.d.ts +24 -0
  19. package/dist/errors.js +40 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/graph/backend-png.d.ts +5 -0
  22. package/dist/graph/backend-png.js +57 -0
  23. package/dist/graph/backend-png.js.map +1 -0
  24. package/dist/graph/backend-svg.d.ts +3 -0
  25. package/dist/graph/backend-svg.js +12 -0
  26. package/dist/graph/backend-svg.js.map +1 -0
  27. package/dist/graph/dot.d.ts +12 -0
  28. package/dist/graph/dot.js +48 -0
  29. package/dist/graph/dot.js.map +1 -0
  30. package/dist/graph/image.d.ts +23 -0
  31. package/dist/graph/image.js +292 -0
  32. package/dist/graph/image.js.map +1 -0
  33. package/dist/graph/index.d.ts +3 -0
  34. package/dist/graph/index.js +3 -0
  35. package/dist/graph/index.js.map +1 -0
  36. package/dist/index.d.ts +9 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/pairs.d.ts +11 -0
  40. package/dist/pairs.js +43 -0
  41. package/dist/pairs.js.map +1 -0
  42. package/dist/raster/index.d.ts +24 -0
  43. package/dist/raster/index.js +83 -0
  44. package/dist/raster/index.js.map +1 -0
  45. package/dist/raster/warnings.d.ts +12 -0
  46. package/dist/raster/warnings.js +175 -0
  47. package/dist/raster/warnings.js.map +1 -0
  48. package/dist/registry.d.ts +13 -0
  49. package/dist/registry.js +17 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/types.d.ts +48 -0
  52. package/dist/types.js +19 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/version.d.ts +1 -0
  55. package/dist/version.js +3 -0
  56. package/dist/version.js.map +1 -0
  57. package/dist/worker/entry.d.ts +1 -0
  58. package/dist/worker/entry.js +38 -0
  59. package/dist/worker/entry.js.map +1 -0
  60. package/dist/worker/protocol.d.ts +39 -0
  61. package/dist/worker/protocol.js +2 -0
  62. package/dist/worker/protocol.js.map +1 -0
  63. package/dist/worker/run.d.ts +30 -0
  64. package/dist/worker/run.js +90 -0
  65. package/dist/worker/run.js.map +1 -0
  66. package/package.json +71 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { type ConfigDeps, type SciengConfig } from "./config.ts";
2
+ import { type Registry } from "./registry.ts";
3
+ import { type Capability, type RenderRequest, type RenderResult } from "./types.ts";
4
+ /**
5
+ * Renders one request. The registry and the config dependencies are parameters so that tests
6
+ * inject them. The public `render` passes the built-in registry.
7
+ */
8
+ export declare function renderWithRegistry(req: RenderRequest, options: Partial<SciengConfig>, registry: Registry, configDeps?: Partial<ConfigDeps>): Promise<RenderResult>;
9
+ /** Reports every pair of the design with its stage and its readiness on this machine. */
10
+ export declare function capabilitiesWithRegistry(options: Partial<SciengConfig>, registry: Registry, configDeps?: Partial<ConfigDeps>): Promise<Capability[]>;
package/dist/core.js ADDED
@@ -0,0 +1,85 @@
1
+ import { loadConfig } from "./config.js";
2
+ import { RenderError } from "./errors.js";
3
+ import { PAIRS, findPair } from "./pairs.js";
4
+ import { registryKey } from "./registry.js";
5
+ import { runInWorker } from "./worker/run.js";
6
+ import { BINARY_INPUT_TYPES, INPUT_TYPES, OUTPUT_FORMATS } from "./types.js";
7
+ /** The MIME type of each output format. */
8
+ const MIME = {
9
+ svg: "image/svg+xml",
10
+ png: "image/png",
11
+ pdf: "application/pdf",
12
+ html: "text/html; charset=utf-8",
13
+ md: "text/markdown; charset=utf-8",
14
+ glb: "model/gltf-binary",
15
+ stl: "model/stl",
16
+ };
17
+ const encoder = new TextEncoder();
18
+ /**
19
+ * Renders one request. The registry and the config dependencies are parameters so that tests
20
+ * inject them. The public `render` passes the built-in registry.
21
+ */
22
+ export async function renderWithRegistry(req, options, registry, configDeps) {
23
+ const cfg = await loadConfig(options, configDeps);
24
+ if (!INPUT_TYPES.includes(req.type)) {
25
+ throw new RenderError("E_INPUT", `unknown input type: ${String(req.type)}`);
26
+ }
27
+ if (!OUTPUT_FORMATS.includes(req.format)) {
28
+ throw new RenderError("E_INPUT", `unknown output format: ${String(req.format)}`);
29
+ }
30
+ const pair = findPair(req.type, req.format);
31
+ if (pair === undefined) {
32
+ throw new RenderError("E_UNSUPPORTED", `${req.type} to ${req.format} is not a supported pair`);
33
+ }
34
+ const isBinary = BINARY_INPUT_TYPES.includes(req.type);
35
+ if (isBinary && typeof req.source === "string") {
36
+ throw new RenderError("E_INPUT", `${req.type} takes bytes, not text`);
37
+ }
38
+ if (!isBinary && typeof req.source !== "string") {
39
+ throw new RenderError("E_INPUT", `${req.type} takes text, not bytes`);
40
+ }
41
+ const sourceBytes = typeof req.source === "string" ? encoder.encode(req.source).byteLength : req.source.byteLength;
42
+ if (sourceBytes > cfg.maxSourceBytes) {
43
+ throw new RenderError("E_LIMIT", `source is ${sourceBytes} bytes; the limit is ${cfg.maxSourceBytes}`);
44
+ }
45
+ const entry = registry[registryKey(req.type, req.format)];
46
+ if (entry === undefined) {
47
+ throw new RenderError("E_UNSUPPORTED", `no ${req.type} to ${req.format} backend is built in this release`);
48
+ }
49
+ if (pair.stage === "browser" && cfg.browser === undefined) {
50
+ throw new RenderError("E_STAGE_MISSING", "the browser stage needs SCIENG_BROWSER or the browser configuration key");
51
+ }
52
+ const out = await runInWorker({
53
+ moduleUrl: entry.moduleUrl,
54
+ backend: entry.backend,
55
+ request: {
56
+ type: req.type,
57
+ format: req.format,
58
+ source: req.source,
59
+ options: (req.options ?? {}),
60
+ settings: { maxMemoryMb: cfg.maxMemoryMb, rasterFont: cfg.rasterFont, assetsUrl: cfg.assetsUrl },
61
+ },
62
+ }, { timeoutMs: cfg.timeoutMs, maxMemoryMb: cfg.maxMemoryMb });
63
+ return {
64
+ bytes: out.bytes,
65
+ mime: MIME[req.format],
66
+ backend: entry.backend,
67
+ warnings: out.warnings ?? [],
68
+ };
69
+ }
70
+ /** Reports every pair of the design with its stage and its readiness on this machine. */
71
+ export async function capabilitiesWithRegistry(options, registry, configDeps) {
72
+ const cfg = await loadConfig(options, configDeps);
73
+ return PAIRS.map((pair) => {
74
+ const registered = registry[registryKey(pair.type, pair.format)] !== undefined;
75
+ const browserReady = pair.stage !== "browser" || cfg.browser !== undefined;
76
+ const ready = registered && browserReady;
77
+ const cap = { type: pair.type, format: pair.format, stage: pair.stage, ready };
78
+ if (!registered)
79
+ cap.reason = "no backend is built in this release";
80
+ else if (!browserReady)
81
+ cap.reason = "no browser path is configured (SCIENG_BROWSER)";
82
+ return cap;
83
+ });
84
+ }
85
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** The error codes of a render. Each code names one class of failure. */
2
+ export declare const RENDER_ERROR_CODES: readonly ["E_INPUT", "E_UNSUPPORTED", "E_LIMIT", "E_TIMEOUT", "E_STAGE_MISSING", "E_CONFIG", "E_INTEGRITY", "E_INTERNAL"];
3
+ /** One of the eight codes of a render error. */
4
+ export type RenderErrorCode = (typeof RENDER_ERROR_CODES)[number];
5
+ /** The optional position of a render error in its source. */
6
+ export interface RenderErrorPosition {
7
+ /** The one-based source line, when the failure has one. */
8
+ line?: number;
9
+ /** The one-based source column, when the failure has one. */
10
+ column?: number;
11
+ }
12
+ /** The only error type that the engine rejects with. */
13
+ export declare class RenderError extends Error {
14
+ readonly code: RenderErrorCode;
15
+ readonly line: number | undefined;
16
+ readonly column: number | undefined;
17
+ constructor(code: RenderErrorCode, message: string, position?: RenderErrorPosition);
18
+ }
19
+ /**
20
+ * Whether the value is a render error, decided structurally instead of by class identity.
21
+ * A bundle can hold more than one copy of the errors module, so an error from another copy
22
+ * fails `instanceof RenderError`. The check matches the name and the code instead.
23
+ */
24
+ export declare function isRenderError(value: unknown): value is RenderError;
package/dist/errors.js ADDED
@@ -0,0 +1,40 @@
1
+ /** The error codes of a render. Each code names one class of failure. */
2
+ export const RENDER_ERROR_CODES = [
3
+ "E_INPUT",
4
+ "E_UNSUPPORTED",
5
+ "E_LIMIT",
6
+ "E_TIMEOUT",
7
+ "E_STAGE_MISSING",
8
+ "E_CONFIG",
9
+ "E_INTEGRITY",
10
+ "E_INTERNAL",
11
+ ];
12
+ /** The only error type that the engine rejects with. */
13
+ export class RenderError extends Error {
14
+ code;
15
+ line;
16
+ column;
17
+ constructor(code, message, position = {}) {
18
+ super(message);
19
+ this.name = "RenderError";
20
+ this.code = code;
21
+ this.line = position.line;
22
+ this.column = position.column;
23
+ }
24
+ }
25
+ /**
26
+ * Whether the value is a render error, decided structurally instead of by class identity.
27
+ * A bundle can hold more than one copy of the errors module, so an error from another copy
28
+ * fails `instanceof RenderError`. The check matches the name and the code instead.
29
+ */
30
+ export function isRenderError(value) {
31
+ if (!(value instanceof Error) || value.name !== "RenderError") {
32
+ return false;
33
+ }
34
+ const code = value.code;
35
+ if (typeof code !== "string") {
36
+ return false;
37
+ }
38
+ return RENDER_ERROR_CODES.includes(code);
39
+ }
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,eAAe;IACf,SAAS;IACT,WAAW;IACX,iBAAiB;IACjB,UAAU;IACV,aAAa;IACb,YAAY;CACJ,CAAC;AAaX,wDAAwD;AACxD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,IAAI,CAAqB;IACzB,MAAM,CAAqB;IAEpC,YAAY,IAAqB,EAAE,OAAe,EAAE,QAAQ,GAAwB,EAAE;QACpF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BackendOutput, WorkerJob } from "../worker/protocol.ts";
2
+ /** Renders dot to png: the SVG of the graph, then the PNG of that SVG at the option scale. The bundled font comes from the assets folder named in the settings. */
3
+ export declare function render(request: WorkerJob["request"]): Promise<BackendOutput>;
4
+ /** Renders dot to png with the bundled font at the given path. The path is a parameter so that a test can name a missing or invalid bundled font. */
5
+ export declare function renderPng(request: WorkerJob["request"], bundledFontPath: string): Promise<BackendOutput>;
@@ -0,0 +1,57 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { RenderError } from "../errors.js";
3
+ import { bundledFontPathIn } from "../assets.js";
4
+ import { dotSourceText, dotToSvg } from "./dot.js";
5
+ import { isFontFile, svgToPng } from "../raster/index.js";
6
+ import { rasterWarnings } from "../raster/warnings.js";
7
+ function readFont(path, bundled) {
8
+ let bytes;
9
+ try {
10
+ bytes = readFileSync(path);
11
+ }
12
+ catch {
13
+ throw bundled
14
+ ? new RenderError("E_STAGE_MISSING", "the bundled raster font is missing: " + path)
15
+ : new RenderError("E_CONFIG", "rasterFont cannot be read: " + path);
16
+ }
17
+ if (!isFontFile(bytes)) {
18
+ throw bundled
19
+ ? new RenderError("E_STAGE_MISSING", "the bundled raster font is not a font: " + path)
20
+ : new RenderError("E_CONFIG", "rasterFont is not a TrueType or OpenType font: " + path);
21
+ }
22
+ return bytes;
23
+ }
24
+ /** Renders dot to png: the SVG of the graph, then the PNG of that SVG at the option scale. The bundled font comes from the assets folder named in the settings. */
25
+ export async function render(request) {
26
+ return renderPng(request, bundledFontPathIn(request.settings.assetsUrl));
27
+ }
28
+ /** Renders dot to png with the bundled font at the given path. The path is a parameter so that a test can name a missing or invalid bundled font. */
29
+ export async function renderPng(request, bundledFontPath) {
30
+ const options = request.options;
31
+ for (const key of Object.keys(options)) {
32
+ if (key !== "scale") {
33
+ throw new RenderError("E_INPUT", "dot to png takes no option " + key);
34
+ }
35
+ }
36
+ let scale = 1;
37
+ if ("scale" in options) {
38
+ const value = options.scale;
39
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
40
+ scale = value;
41
+ }
42
+ else {
43
+ throw new RenderError("E_INPUT", "option scale must be a finite number greater than 0");
44
+ }
45
+ }
46
+ const rasterFont = request.settings.rasterFont;
47
+ const font = readFont(rasterFont ?? bundledFontPath, rasterFont === undefined);
48
+ const dot = await dotToSvg(dotSourceText(request.source));
49
+ const bytes = await svgToPng(dot.svg, {
50
+ scale,
51
+ maxMemoryMb: request.settings.maxMemoryMb,
52
+ font,
53
+ assetsUrl: request.settings.assetsUrl,
54
+ });
55
+ return { bytes, warnings: [...dot.warnings, ...rasterWarnings(dot.svg, font)] };
56
+ }
57
+ //# sourceMappingURL=backend-png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-png.js","sourceRoot":"","sources":["../../src/graph/backend-png.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BackendOutput, WorkerJob } from "../worker/protocol.ts";
2
+ /** Renders dot to svg. The backend takes no options, so any option is an input error. */
3
+ export declare function render(request: WorkerJob["request"]): Promise<BackendOutput>;
@@ -0,0 +1,12 @@
1
+ import { RenderError } from "../errors.js";
2
+ import { dotSourceText, dotToSvg } from "./dot.js";
3
+ /** Renders dot to svg. The backend takes no options, so any option is an input error. */
4
+ export async function render(request) {
5
+ const names = Object.keys(request.options);
6
+ if (names.length > 0) {
7
+ throw new RenderError("E_INPUT", `dot to svg takes no options; got ${names.join(", ")}`);
8
+ }
9
+ const result = await dotToSvg(dotSourceText(request.source));
10
+ return { bytes: new TextEncoder().encode(result.svg), warnings: result.warnings };
11
+ }
12
+ //# sourceMappingURL=backend-svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-svg.js","sourceRoot":"","sources":["../../src/graph/backend-svg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEnD,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA6B;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,oCAAoC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AACpF,CAAC"}
@@ -0,0 +1,12 @@
1
+ type VizModule = typeof import("@viz-js/viz");
2
+ type Viz = Awaited<ReturnType<VizModule["instance"]>>;
3
+ /** The SVG of a DOT graph, and the warnings of the render. */
4
+ export interface DotSvgResult {
5
+ svg: string;
6
+ warnings: string[];
7
+ }
8
+ /** Renders a DOT source to SVG with the viz library. Image and stylesheet attributes are removed first. A syntax error rejects with E_INPUT. The viz instance is a parameter so that a test can fail it. */
9
+ export declare function dotToSvg(source: string, getViz?: () => Promise<Viz>): Promise<DotSvgResult>;
10
+ /** The text of a DOT request. The function reads a byte source as UTF-8. */
11
+ export declare function dotSourceText(source: string | Uint8Array): string;
12
+ export {};
@@ -0,0 +1,48 @@
1
+ import { RenderError } from "../errors.js";
2
+ import { stripImageAttributes, dropImageElements, dropStylesheetInstructions } from "./image.js";
3
+ let vizInstancePromise;
4
+ async function createVizInstance() {
5
+ const viz = await import("@viz-js/viz");
6
+ return viz.instance();
7
+ }
8
+ function vizInstance() {
9
+ if (vizInstancePromise === undefined) {
10
+ vizInstancePromise = createVizInstance();
11
+ }
12
+ return vizInstancePromise;
13
+ }
14
+ /** Renders a DOT source to SVG with the viz library. Image and stylesheet attributes are removed first. A syntax error rejects with E_INPUT. The viz instance is a parameter so that a test can fail it. */
15
+ export async function dotToSvg(source, getViz = vizInstance) {
16
+ const stripped = stripImageAttributes(source);
17
+ const warnings = [];
18
+ for (const removed of stripped.removed) {
19
+ warnings.push(removed.key === "image"
20
+ ? `line ${removed.line}: image attribute "${removed.file}" removed; the graph stage reads no image file`
21
+ : `line ${removed.line}: ${removed.key} attribute "${removed.file}" removed; the graph stage links no external style sheet`);
22
+ }
23
+ const viz = await getViz();
24
+ const result = viz.render(stripped.source, { format: "svg" });
25
+ if (result.status === "failure") {
26
+ const error = result.errors.find((entry) => entry.level === "error") ?? result.errors[0];
27
+ const message = error?.message ?? "graphviz failed and gave no error message";
28
+ const lineMatch = /line (\d+)/.exec(message);
29
+ throw new RenderError("E_INPUT", message, lineMatch === null ? undefined : { line: Number(lineMatch[1]) });
30
+ }
31
+ for (const entry of result.errors) {
32
+ warnings.push(entry.level === "warning" ? "graphviz warning: " + entry.message : "graphviz message: " + entry.message);
33
+ }
34
+ const dropped = dropImageElements(result.output);
35
+ if (dropped.dropped > 0) {
36
+ warnings.push("an image element that referenced a file was removed");
37
+ }
38
+ const sheets = dropStylesheetInstructions(dropped.svg);
39
+ if (sheets.dropped > 0) {
40
+ warnings.push("a style sheet instruction that referenced a file was removed");
41
+ }
42
+ return { svg: sheets.svg, warnings };
43
+ }
44
+ /** The text of a DOT request. The function reads a byte source as UTF-8. */
45
+ export function dotSourceText(source) {
46
+ return typeof source === "string" ? source : new TextDecoder().decode(source);
47
+ }
48
+ //# sourceMappingURL=dot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/graph/dot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** One attribute that the scanner removed: its key, the line of the key and the text of its value. */
2
+ export interface ImageRemoval {
3
+ key: string;
4
+ line: number;
5
+ file: string;
6
+ }
7
+ /** The source without its external-resource attributes, and one entry for each attribute that was removed. */
8
+ export interface StripResult {
9
+ source: string;
10
+ removed: ImageRemoval[];
11
+ }
12
+ /** Removes each image and stylesheet attribute of a DOT source and reports its key, line and value. Comments, quoted strings and HTML strings keep their text. */
13
+ export declare function stripImageAttributes(source: string): StripResult;
14
+ /** Removes each SVG image element, with its attributes and its closing tag, and counts the removed elements. */
15
+ export declare function dropImageElements(svg: string): {
16
+ svg: string;
17
+ dropped: number;
18
+ };
19
+ /** Removes each xml-stylesheet processing instruction of an SVG and counts the removed instructions. */
20
+ export declare function dropStylesheetInstructions(svg: string): {
21
+ svg: string;
22
+ dropped: number;
23
+ };