slackmark 0.1.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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/adapters/blockquote-adapter.d.ts +11 -0
  4. package/dist/adapters/blockquote-adapter.d.ts.map +1 -0
  5. package/dist/adapters/code-fence-adapter.d.ts +12 -0
  6. package/dist/adapters/code-fence-adapter.d.ts.map +1 -0
  7. package/dist/adapters/heading-adapter.d.ts +11 -0
  8. package/dist/adapters/heading-adapter.d.ts.map +1 -0
  9. package/dist/adapters/html-block-adapter.d.ts +11 -0
  10. package/dist/adapters/html-block-adapter.d.ts.map +1 -0
  11. package/dist/adapters/inline.d.ts +41 -0
  12. package/dist/adapters/inline.d.ts.map +1 -0
  13. package/dist/adapters/list-adapter.d.ts +12 -0
  14. package/dist/adapters/list-adapter.d.ts.map +1 -0
  15. package/dist/adapters/math-block-adapter.d.ts +11 -0
  16. package/dist/adapters/math-block-adapter.d.ts.map +1 -0
  17. package/dist/adapters/mermaid-fence-adapter.d.ts +19 -0
  18. package/dist/adapters/mermaid-fence-adapter.d.ts.map +1 -0
  19. package/dist/adapters/node-adapter.d.ts +21 -0
  20. package/dist/adapters/node-adapter.d.ts.map +1 -0
  21. package/dist/adapters/paragraph-adapter.d.ts +11 -0
  22. package/dist/adapters/paragraph-adapter.d.ts.map +1 -0
  23. package/dist/adapters/skip-adapter.d.ts +11 -0
  24. package/dist/adapters/skip-adapter.d.ts.map +1 -0
  25. package/dist/adapters/table-adapter.d.ts +11 -0
  26. package/dist/adapters/table-adapter.d.ts.map +1 -0
  27. package/dist/adapters/task-list-adapter.d.ts +11 -0
  28. package/dist/adapters/task-list-adapter.d.ts.map +1 -0
  29. package/dist/adapters/thematic-break-adapter.d.ts +11 -0
  30. package/dist/adapters/thematic-break-adapter.d.ts.map +1 -0
  31. package/dist/assemble/message-assembler.d.ts +24 -0
  32. package/dist/assemble/message-assembler.d.ts.map +1 -0
  33. package/dist/assemble/text-fallback.d.ts +10 -0
  34. package/dist/assemble/text-fallback.d.ts.map +1 -0
  35. package/dist/assert-never.d.ts +5 -0
  36. package/dist/assert-never.d.ts.map +1 -0
  37. package/dist/blocks/types.d.ts +196 -0
  38. package/dist/blocks/types.d.ts.map +1 -0
  39. package/dist/budget/conversion-context.d.ts +44 -0
  40. package/dist/budget/conversion-context.d.ts.map +1 -0
  41. package/dist/budget/recording-degradation-collector.d.ts +11 -0
  42. package/dist/budget/recording-degradation-collector.d.ts.map +1 -0
  43. package/dist/budget/standard-budget-ledger.d.ts +35 -0
  44. package/dist/budget/standard-budget-ledger.d.ts.map +1 -0
  45. package/dist/capabilities/capabilities.d.ts +42 -0
  46. package/dist/capabilities/capabilities.d.ts.map +1 -0
  47. package/dist/constants.d.ts +59 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/converter/create-converter.d.ts +25 -0
  50. package/dist/converter/create-converter.d.ts.map +1 -0
  51. package/dist/converter/resolve-config.d.ts +7 -0
  52. package/dist/converter/resolve-config.d.ts.map +1 -0
  53. package/dist/converter/slackmark-converter.d.ts +33 -0
  54. package/dist/converter/slackmark-converter.d.ts.map +1 -0
  55. package/dist/errors.d.ts +10 -0
  56. package/dist/errors.d.ts.map +1 -0
  57. package/dist/index.d.ts +27 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +3402 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/mermaid/mermaid-pie-parser.d.ts +10 -0
  62. package/dist/mermaid/mermaid-pie-parser.d.ts.map +1 -0
  63. package/dist/mermaid/mermaid-xychart-parser.d.ts +10 -0
  64. package/dist/mermaid/mermaid-xychart-parser.d.ts.map +1 -0
  65. package/dist/parsers/remark-markdown-parser.d.ts +9 -0
  66. package/dist/parsers/remark-markdown-parser.d.ts.map +1 -0
  67. package/dist/registry/adapter-registry.d.ts +13 -0
  68. package/dist/registry/adapter-registry.d.ts.map +1 -0
  69. package/dist/renderers/codecogs-renderer.d.ts +18 -0
  70. package/dist/renderers/codecogs-renderer.d.ts.map +1 -0
  71. package/dist/renderers/encoding.d.ts +5 -0
  72. package/dist/renderers/encoding.d.ts.map +1 -0
  73. package/dist/renderers/kroki-renderer.d.ts +27 -0
  74. package/dist/renderers/kroki-renderer.d.ts.map +1 -0
  75. package/dist/renderers/mermaid-ink-renderer.d.ts +24 -0
  76. package/dist/renderers/mermaid-ink-renderer.d.ts.map +1 -0
  77. package/dist/renderers/quickchart-renderer.d.ts +25 -0
  78. package/dist/renderers/quickchart-renderer.d.ts.map +1 -0
  79. package/dist/renderers/url-utils.d.ts +3 -0
  80. package/dist/renderers/url-utils.d.ts.map +1 -0
  81. package/dist/renderers.d.ts +12 -0
  82. package/dist/renderers.d.ts.map +1 -0
  83. package/dist/renderers.js +269 -0
  84. package/dist/renderers.js.map +1 -0
  85. package/dist/slack/fetch-slack-uploader.d.ts +52 -0
  86. package/dist/slack/fetch-slack-uploader.d.ts.map +1 -0
  87. package/dist/slack/slack-upload-error.d.ts +25 -0
  88. package/dist/slack/slack-upload-error.d.ts.map +1 -0
  89. package/dist/slack.d.ts +8 -0
  90. package/dist/slack.d.ts.map +1 -0
  91. package/dist/slack.js +255 -0
  92. package/dist/slack.js.map +1 -0
  93. package/dist/types.d.ts +202 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/validate/validate-blocks.d.ts +18 -0
  96. package/dist/validate/validate-blocks.d.ts.map +1 -0
  97. package/package.json +76 -0
@@ -0,0 +1,13 @@
1
+ import type { RootContent } from "mdast";
2
+ import type { NodeAdapter } from "../adapters/node-adapter.js";
3
+ import type { Block } from "../blocks/types.js";
4
+ import type { ConversionContext } from "../budget/conversion-context.js";
5
+ /**
6
+ * First-matching adapter wins; candidates tried in order with capability/budget gates.
7
+ */
8
+ export declare class AdapterRegistry {
9
+ private readonly adapters;
10
+ constructor(adapters: ReadonlyArray<NodeAdapter>);
11
+ emit(node: RootContent, ctx: ConversionContext): Promise<ReadonlyArray<Block>>;
12
+ }
13
+ //# sourceMappingURL=adapter-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-registry.d.ts","sourceRoot":"","sources":["../../src/registry/adapter-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGzE;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,YAAY,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EAE/C;IAEK,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAmDnF;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { ImageRenderer, RenderRequest, UrlImage } from "../types.js";
2
+ export interface CodeCogsRendererOptions {
3
+ readonly baseUrl?: string;
4
+ readonly dpi?: number;
5
+ }
6
+ /**
7
+ * Produces deterministic CodeCogs `png.image` URLs for display math.
8
+ */
9
+ export declare class CodeCogsRenderer implements ImageRenderer {
10
+ private readonly baseUrl;
11
+ private readonly dpi;
12
+ constructor(options?: CodeCogsRendererOptions);
13
+ canRender(req: RenderRequest): boolean;
14
+ render(req: RenderRequest): Promise<(UrlImage & {
15
+ readonly altText: string;
16
+ }) | null>;
17
+ }
18
+ //# sourceMappingURL=codecogs-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecogs-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/codecogs-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ1E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAAY,OAAO,GAAE,uBAA4B,EAOhD;IAED,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAErC;IAEK,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAiB1F;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Kroki and mermaid.ink both accept zlib-deflated, unpadded base64url payloads.
3
+ */
4
+ export declare function deflateBase64Url(value: string): Promise<string>;
5
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/renderers/encoding.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrE"}
@@ -0,0 +1,27 @@
1
+ import type { ImageRenderer, RenderRequest, UrlImage } from "../types.js";
2
+ /**
3
+ * Fence-language aliases for Kroki's supported diagram types.
4
+ *
5
+ * @see https://docs.kroki.io/kroki/setup/usage/
6
+ */
7
+ export declare const KROKI_DIAGRAM_TYPES: Readonly<Record<string, string>>;
8
+ export interface KrokiRendererOptions {
9
+ readonly baseUrl?: string;
10
+ /**
11
+ * Additional or replacement fence-language aliases, merged over the defaults.
12
+ */
13
+ readonly diagramTypes?: Readonly<Record<string, string>>;
14
+ }
15
+ /**
16
+ * Produces durable Kroki GET URLs without performing network I/O.
17
+ */
18
+ export declare class KrokiRenderer implements ImageRenderer {
19
+ private readonly baseUrl;
20
+ private readonly diagramTypes;
21
+ constructor(options?: KrokiRendererOptions);
22
+ canRender(req: RenderRequest): boolean;
23
+ render(req: RenderRequest): Promise<(UrlImage & {
24
+ readonly altText: string;
25
+ }) | null>;
26
+ }
27
+ //# sourceMappingURL=kroki-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kroki-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/kroki-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO1E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4B/D,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAEhE,YAAY,OAAO,GAAE,oBAAyB,EAM7C;IAED,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAErC;IAEK,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAkB1F;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { ImageRenderer, RenderRequest, UrlImage } from "../types.js";
2
+ export type MermaidInkTheme = "default" | "neutral" | "dark" | "forest";
3
+ export interface MermaidInkRendererOptions {
4
+ readonly baseUrl?: string;
5
+ readonly theme?: MermaidInkTheme;
6
+ /**
7
+ * mermaid.ink color value, such as `!white` or `FF0000`.
8
+ */
9
+ readonly bgColor?: string;
10
+ }
11
+ /**
12
+ * Produces mermaid.ink pako-state PNG URLs without performing network I/O.
13
+ */
14
+ export declare class MermaidInkRenderer implements ImageRenderer {
15
+ private readonly baseUrl;
16
+ private readonly theme;
17
+ private readonly bgColor;
18
+ constructor(options?: MermaidInkRendererOptions);
19
+ canRender(req: RenderRequest): boolean;
20
+ render(req: RenderRequest): Promise<(UrlImage & {
21
+ readonly altText: string;
22
+ }) | null>;
23
+ }
24
+ //# sourceMappingURL=mermaid-ink-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-ink-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/mermaid-ink-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ1E,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AASD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YAAY,OAAO,GAAE,yBAA8B,EAIlD;IAED,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAErC;IAEK,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAuB1F;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { ImageRenderer, RenderRequest, UrlImage } from "../types.js";
2
+ export interface QuickChartRendererOptions {
3
+ readonly baseUrl?: string;
4
+ readonly width?: number;
5
+ readonly height?: number;
6
+ readonly backgroundColor?: string;
7
+ readonly devicePixelRatio?: number;
8
+ }
9
+ /**
10
+ * Produces full, durable QuickChart GET URLs. It never uses the expiring
11
+ * `/chart/create` short-URL API.
12
+ */
13
+ export declare class QuickChartRenderer implements ImageRenderer {
14
+ private readonly baseUrl;
15
+ private readonly width;
16
+ private readonly height;
17
+ private readonly backgroundColor;
18
+ private readonly devicePixelRatio;
19
+ constructor(options?: QuickChartRendererOptions);
20
+ canRender(req: RenderRequest): boolean;
21
+ render(req: RenderRequest): Promise<(UrlImage & {
22
+ readonly altText: string;
23
+ }) | null>;
24
+ }
25
+ //# sourceMappingURL=quickchart-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickchart-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/quickchart-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgB1E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,YAAY,OAAO,GAAE,yBAA8B,EAgBlD;IAED,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAErC;IAEK,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAwB1F;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare function normalizeBaseUrl(baseUrl: string): string;
2
+ export declare function normalizeFenceLanguage(lang: string): string;
3
+ //# sourceMappingURL=url-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/renderers/url-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * First-party hosted image renderers. None are enabled by default.
3
+ */
4
+ export { KrokiRenderer, KROKI_DIAGRAM_TYPES } from "./renderers/kroki-renderer.js";
5
+ export type { KrokiRendererOptions } from "./renderers/kroki-renderer.js";
6
+ export { MermaidInkRenderer } from "./renderers/mermaid-ink-renderer.js";
7
+ export type { MermaidInkRendererOptions, MermaidInkTheme, } from "./renderers/mermaid-ink-renderer.js";
8
+ export { CodeCogsRenderer } from "./renderers/codecogs-renderer.js";
9
+ export type { CodeCogsRendererOptions } from "./renderers/codecogs-renderer.js";
10
+ export { QuickChartRenderer } from "./renderers/quickchart-renderer.js";
11
+ export type { QuickChartRendererOptions } from "./renderers/quickchart-renderer.js";
12
+ //# sourceMappingURL=renderers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../src/renderers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACnF,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EACV,yBAAyB,EACzB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,269 @@
1
+ // src/constants.ts
2
+ var IMAGE_URL_MAX_CHARS = 3e3;
3
+
4
+ // src/renderers/encoding.ts
5
+ var BASE64URL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
6
+ async function deflateBase64Url(value) {
7
+ const stream = new CompressionStream("deflate");
8
+ const compressed = readAll(stream.readable);
9
+ const writer = stream.writable.getWriter();
10
+ await writer.write(new TextEncoder().encode(value));
11
+ await writer.close();
12
+ writer.releaseLock();
13
+ return encodeBase64Url(await compressed);
14
+ }
15
+ async function readAll(stream) {
16
+ const reader = stream.getReader();
17
+ const chunks = [];
18
+ let length = 0;
19
+ while (true) {
20
+ const result = await reader.read();
21
+ if (result.done) {
22
+ break;
23
+ }
24
+ if (result.value !== void 0) {
25
+ chunks.push(result.value);
26
+ length += result.value.byteLength;
27
+ }
28
+ }
29
+ reader.releaseLock();
30
+ const output = new Uint8Array(length);
31
+ let offset = 0;
32
+ for (const chunk of chunks) {
33
+ output.set(chunk, offset);
34
+ offset += chunk.byteLength;
35
+ }
36
+ return output;
37
+ }
38
+ function encodeBase64Url(bytes) {
39
+ const output = [];
40
+ for (let index = 0; index < bytes.length; index += 3) {
41
+ const first = bytes[index] ?? 0;
42
+ const second = bytes[index + 1];
43
+ const third = bytes[index + 2];
44
+ output.push(
45
+ BASE64URL_ALPHABET[first >> 2] ?? "",
46
+ BASE64URL_ALPHABET[(first & 3) << 4 | (second ?? 0) >> 4] ?? ""
47
+ );
48
+ if (second !== void 0) {
49
+ output.push(BASE64URL_ALPHABET[(second & 15) << 2 | (third ?? 0) >> 6] ?? "");
50
+ }
51
+ if (third !== void 0) {
52
+ output.push(BASE64URL_ALPHABET[third & 63] ?? "");
53
+ }
54
+ }
55
+ return output.join("");
56
+ }
57
+
58
+ // src/renderers/url-utils.ts
59
+ function normalizeBaseUrl(baseUrl) {
60
+ const normalized = baseUrl.replace(/\/+$/u, "");
61
+ if (normalized.length === 0) {
62
+ throw new TypeError("baseUrl must not be empty");
63
+ }
64
+ return normalized;
65
+ }
66
+ function normalizeFenceLanguage(lang) {
67
+ return lang.trim().toLowerCase();
68
+ }
69
+
70
+ // src/renderers/kroki-renderer.ts
71
+ var DEFAULT_KROKI_BASE_URL = "https://kroki.io";
72
+ var KROKI_DIAGRAM_TYPES = Object.freeze({
73
+ blockdiag: "blockdiag",
74
+ bpmn: "bpmn",
75
+ bytefield: "bytefield",
76
+ c4: "c4plantuml",
77
+ c4plantuml: "c4plantuml",
78
+ d2: "d2",
79
+ dbml: "dbml",
80
+ ditaa: "ditaa",
81
+ dot: "graphviz",
82
+ erd: "erd",
83
+ excalidraw: "excalidraw",
84
+ graphviz: "graphviz",
85
+ mermaid: "mermaid",
86
+ nomnoml: "nomnoml",
87
+ pikchr: "pikchr",
88
+ plantuml: "plantuml",
89
+ puml: "plantuml",
90
+ structurizr: "structurizr",
91
+ svgbob: "svgbob",
92
+ symbolator: "symbolator",
93
+ tikz: "tikz",
94
+ umlet: "umlet",
95
+ vega: "vega",
96
+ "vega-lite": "vegalite",
97
+ vegalite: "vegalite",
98
+ wavedrom: "wavedrom",
99
+ wireviz: "wireviz"
100
+ });
101
+ var KrokiRenderer = class {
102
+ baseUrl;
103
+ diagramTypes;
104
+ constructor(options = {}) {
105
+ this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_KROKI_BASE_URL);
106
+ this.diagramTypes = Object.freeze({
107
+ ...KROKI_DIAGRAM_TYPES,
108
+ ...options.diagramTypes
109
+ });
110
+ }
111
+ canRender(req) {
112
+ return this.diagramTypes[normalizeFenceLanguage(req.lang)] !== void 0;
113
+ }
114
+ async render(req) {
115
+ const diagramType = this.diagramTypes[normalizeFenceLanguage(req.lang)];
116
+ if (diagramType === void 0) {
117
+ return null;
118
+ }
119
+ const encoded = await deflateBase64Url(req.source);
120
+ const imageUrl = `${this.baseUrl}/${encodeURIComponent(diagramType)}/png/${encoded}`;
121
+ if (imageUrl.length > IMAGE_URL_MAX_CHARS) {
122
+ return null;
123
+ }
124
+ return {
125
+ kind: "url",
126
+ imageUrl,
127
+ altText: req.altText
128
+ };
129
+ }
130
+ };
131
+
132
+ // src/renderers/mermaid-ink-renderer.ts
133
+ var DEFAULT_MERMAID_INK_BASE_URL = "https://mermaid.ink";
134
+ var DEFAULT_MERMAID_INK_BACKGROUND = "!white";
135
+ var MermaidInkRenderer = class {
136
+ baseUrl;
137
+ theme;
138
+ bgColor;
139
+ constructor(options = {}) {
140
+ this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_MERMAID_INK_BASE_URL);
141
+ this.theme = options.theme ?? "default";
142
+ this.bgColor = options.bgColor ?? DEFAULT_MERMAID_INK_BACKGROUND;
143
+ }
144
+ canRender(req) {
145
+ return normalizeFenceLanguage(req.lang) === "mermaid";
146
+ }
147
+ async render(req) {
148
+ if (!this.canRender(req)) {
149
+ return null;
150
+ }
151
+ const state = {
152
+ code: req.source,
153
+ mermaid: { theme: this.theme }
154
+ };
155
+ const encoded = await deflateBase64Url(JSON.stringify(state));
156
+ const imageUrl = `${this.baseUrl}/img/pako:${encoded}?type=png&bgColor=${encodeURIComponent(this.bgColor)}`;
157
+ if (imageUrl.length > IMAGE_URL_MAX_CHARS) {
158
+ return null;
159
+ }
160
+ return {
161
+ kind: "url",
162
+ imageUrl,
163
+ altText: req.altText
164
+ };
165
+ }
166
+ };
167
+
168
+ // src/renderers/codecogs-renderer.ts
169
+ var DEFAULT_CODECOGS_BASE_URL = "https://latex.codecogs.com";
170
+ var DEFAULT_CODECOGS_DPI = 200;
171
+ var MATH_FENCE_LANGUAGES = /* @__PURE__ */ new Set(["katex", "latex", "math", "tex"]);
172
+ var CodeCogsRenderer = class {
173
+ baseUrl;
174
+ dpi;
175
+ constructor(options = {}) {
176
+ this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_CODECOGS_BASE_URL);
177
+ this.dpi = options.dpi ?? DEFAULT_CODECOGS_DPI;
178
+ if (!Number.isInteger(this.dpi) || this.dpi <= 0) {
179
+ throw new RangeError("dpi must be a positive integer");
180
+ }
181
+ }
182
+ canRender(req) {
183
+ return MATH_FENCE_LANGUAGES.has(normalizeFenceLanguage(req.lang));
184
+ }
185
+ async render(req) {
186
+ if (!this.canRender(req)) {
187
+ return null;
188
+ }
189
+ const formula = `\\dpi{${String(this.dpi)}} ${req.source}`;
190
+ const imageUrl = `${this.baseUrl}/png.image?${encodeURIComponent(formula)}`;
191
+ if (imageUrl.length > IMAGE_URL_MAX_CHARS) {
192
+ return null;
193
+ }
194
+ return {
195
+ kind: "url",
196
+ imageUrl,
197
+ altText: req.altText
198
+ };
199
+ }
200
+ };
201
+
202
+ // src/renderers/quickchart-renderer.ts
203
+ var DEFAULT_QUICKCHART_BASE_URL = "https://quickchart.io";
204
+ var DEFAULT_QUICKCHART_WIDTH = 500;
205
+ var DEFAULT_QUICKCHART_HEIGHT = 300;
206
+ var DEFAULT_QUICKCHART_BACKGROUND = "white";
207
+ var DEFAULT_QUICKCHART_DEVICE_PIXEL_RATIO = 2;
208
+ var CHART_FENCE_LANGUAGES = /* @__PURE__ */ new Set([
209
+ "chart",
210
+ "chart.js",
211
+ "chartjs",
212
+ "quickchart"
213
+ ]);
214
+ var QuickChartRenderer = class {
215
+ baseUrl;
216
+ width;
217
+ height;
218
+ backgroundColor;
219
+ devicePixelRatio;
220
+ constructor(options = {}) {
221
+ this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_QUICKCHART_BASE_URL);
222
+ this.width = options.width ?? DEFAULT_QUICKCHART_WIDTH;
223
+ this.height = options.height ?? DEFAULT_QUICKCHART_HEIGHT;
224
+ this.backgroundColor = options.backgroundColor ?? DEFAULT_QUICKCHART_BACKGROUND;
225
+ this.devicePixelRatio = options.devicePixelRatio ?? DEFAULT_QUICKCHART_DEVICE_PIXEL_RATIO;
226
+ if (!Number.isInteger(this.width) || this.width <= 0) {
227
+ throw new RangeError("width must be a positive integer");
228
+ }
229
+ if (!Number.isInteger(this.height) || this.height <= 0) {
230
+ throw new RangeError("height must be a positive integer");
231
+ }
232
+ if (!Number.isFinite(this.devicePixelRatio) || this.devicePixelRatio <= 0) {
233
+ throw new RangeError("devicePixelRatio must be positive");
234
+ }
235
+ }
236
+ canRender(req) {
237
+ return CHART_FENCE_LANGUAGES.has(normalizeFenceLanguage(req.lang));
238
+ }
239
+ async render(req) {
240
+ if (!this.canRender(req)) {
241
+ return null;
242
+ }
243
+ const query = [
244
+ `c=${encodeURIComponent(req.source)}`,
245
+ `width=${String(this.width)}`,
246
+ `height=${String(this.height)}`,
247
+ `backgroundColor=${encodeURIComponent(this.backgroundColor)}`,
248
+ `devicePixelRatio=${String(this.devicePixelRatio)}`,
249
+ "format=png"
250
+ ].join("&");
251
+ const imageUrl = `${this.baseUrl}/chart?${query}`;
252
+ if (imageUrl.length > IMAGE_URL_MAX_CHARS) {
253
+ return null;
254
+ }
255
+ return {
256
+ kind: "url",
257
+ imageUrl,
258
+ altText: req.altText
259
+ };
260
+ }
261
+ };
262
+ export {
263
+ CodeCogsRenderer,
264
+ KROKI_DIAGRAM_TYPES,
265
+ KrokiRenderer,
266
+ MermaidInkRenderer,
267
+ QuickChartRenderer
268
+ };
269
+ //# sourceMappingURL=renderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/renderers/encoding.ts","../src/renderers/url-utils.ts","../src/renderers/kroki-renderer.ts","../src/renderers/mermaid-ink-renderer.ts","../src/renderers/codecogs-renderer.ts","../src/renderers/quickchart-renderer.ts"],"sourcesContent":["/**\n * Named Slack Block Kit limits.\n * Sources: https://docs.slack.dev/block-kit and block reference pages (July 2026 research).\n */\n\n/** https://docs.slack.dev/block-kit */\nexport const MAX_BLOCKS_PER_MESSAGE = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/section-block */\nexport const SECTION_TEXT_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_TEXT_MAX_CHARS = 150;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/header-block */\nexport const HEADER_LEVEL_MAX = 4;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_URL_MAX_CHARS = 3000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/image-block */\nexport const IMAGE_ALT_MAX_CHARS = 2000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/context-block */\nexport const CONTEXT_ELEMENTS_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/markdown-block */\nexport const MARKDOWN_CUMULATIVE_MAX_CHARS = 12_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_ROWS = 100;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_MAX_COLS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/table-block */\nexport const TABLE_CELL_CHARS_MAX = 10_000;\n\n/** Spec decision: prefer `table` up to this many rows (incl. header). */\nexport const TABLE_PREFERRED_MAX_ROWS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_MAX_DATA_ROWS = 200;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-table-block */\nexport const DATA_TABLE_CELL_CHARS_MAX = 20_000;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_TITLE_MAX_CHARS = 50;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_LABEL_MAX_CHARS = 20;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SEGMENTS_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_SERIES_MAX = 12;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block */\nexport const CHART_POINTS_MAX = 20;\n\n/**\n * Community-reported cap (ENG-4936); not in official docs.\n * Enforced defensively with degradation.\n */\nexport const DATA_VISUALIZATION_MAX_PER_MESSAGE = 2;\n\n/** https://docs.slack.dev/reference/methods/chat.postMessage#truncating */\nexport const MESSAGE_TEXT_SAFETY_MAX_CHARS = 40_000;\n\n/** Undocumented; defensive clamp for rich_text_list.indent. */\nexport const RICH_TEXT_LIST_INDENT_MAX = 6;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_CHILDREN_MAX = 10;\n\n/** https://docs.slack.dev/reference/block-kit/blocks/container-block */\nexport const CONTAINER_TITLE_MAX_CHARS = 150;\n\n/** Cell wrap heuristic for table column_settings.is_wrapped. */\nexport const TABLE_CELL_WRAP_THRESHOLD = 40;\n\nexport const ELLIPSIS = \"…\";\n","const BASE64URL_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n/**\n * Kroki and mermaid.ink both accept zlib-deflated, unpadded base64url payloads.\n */\nexport async function deflateBase64Url(value: string): Promise<string> {\n const stream = new CompressionStream(\"deflate\");\n const compressed = readAll(stream.readable);\n const writer = stream.writable.getWriter();\n\n await writer.write(new TextEncoder().encode(value));\n await writer.close();\n writer.releaseLock();\n\n return encodeBase64Url(await compressed);\n}\n\nasync function readAll(stream: GfmReadableStream<Uint8Array>): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n\n while (true) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n if (result.value !== undefined) {\n chunks.push(result.value);\n length += result.value.byteLength;\n }\n }\n reader.releaseLock();\n\n const output = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return output;\n}\n\nfunction encodeBase64Url(bytes: Uint8Array): string {\n const output: string[] = [];\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1];\n const third = bytes[index + 2];\n\n output.push(\n BASE64URL_ALPHABET[first >> 2] ?? \"\",\n BASE64URL_ALPHABET[((first & 0b11) << 4) | ((second ?? 0) >> 4)] ?? \"\",\n );\n if (second !== undefined) {\n output.push(BASE64URL_ALPHABET[((second & 0b1111) << 2) | ((third ?? 0) >> 6)] ?? \"\");\n }\n if (third !== undefined) {\n output.push(BASE64URL_ALPHABET[third & 0b11_1111] ?? \"\");\n }\n }\n return output.join(\"\");\n}\n","export function normalizeBaseUrl(baseUrl: string): string {\n const normalized = baseUrl.replace(/\\/+$/u, \"\");\n if (normalized.length === 0) {\n throw new TypeError(\"baseUrl must not be empty\");\n }\n return normalized;\n}\n\nexport function normalizeFenceLanguage(lang: string): string {\n return lang.trim().toLowerCase();\n}\n","import { IMAGE_URL_MAX_CHARS } from \"../constants.js\";\nimport type { ImageRenderer, RenderRequest, UrlImage } from \"../types.js\";\n\nimport { deflateBase64Url } from \"./encoding.js\";\nimport { normalizeBaseUrl, normalizeFenceLanguage } from \"./url-utils.js\";\n\nconst DEFAULT_KROKI_BASE_URL = \"https://kroki.io\";\n\n/**\n * Fence-language aliases for Kroki's supported diagram types.\n *\n * @see https://docs.kroki.io/kroki/setup/usage/\n */\nexport const KROKI_DIAGRAM_TYPES: Readonly<Record<string, string>> = Object.freeze({\n blockdiag: \"blockdiag\",\n bpmn: \"bpmn\",\n bytefield: \"bytefield\",\n c4: \"c4plantuml\",\n c4plantuml: \"c4plantuml\",\n d2: \"d2\",\n dbml: \"dbml\",\n ditaa: \"ditaa\",\n dot: \"graphviz\",\n erd: \"erd\",\n excalidraw: \"excalidraw\",\n graphviz: \"graphviz\",\n mermaid: \"mermaid\",\n nomnoml: \"nomnoml\",\n pikchr: \"pikchr\",\n plantuml: \"plantuml\",\n puml: \"plantuml\",\n structurizr: \"structurizr\",\n svgbob: \"svgbob\",\n symbolator: \"symbolator\",\n tikz: \"tikz\",\n umlet: \"umlet\",\n vega: \"vega\",\n \"vega-lite\": \"vegalite\",\n vegalite: \"vegalite\",\n wavedrom: \"wavedrom\",\n wireviz: \"wireviz\",\n});\n\nexport interface KrokiRendererOptions {\n readonly baseUrl?: string;\n /**\n * Additional or replacement fence-language aliases, merged over the defaults.\n */\n readonly diagramTypes?: Readonly<Record<string, string>>;\n}\n\n/**\n * Produces durable Kroki GET URLs without performing network I/O.\n */\nexport class KrokiRenderer implements ImageRenderer {\n private readonly baseUrl: string;\n private readonly diagramTypes: Readonly<Record<string, string>>;\n\n constructor(options: KrokiRendererOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_KROKI_BASE_URL);\n this.diagramTypes = Object.freeze({\n ...KROKI_DIAGRAM_TYPES,\n ...options.diagramTypes,\n });\n }\n\n canRender(req: RenderRequest): boolean {\n return this.diagramTypes[normalizeFenceLanguage(req.lang)] !== undefined;\n }\n\n async render(req: RenderRequest): Promise<(UrlImage & { readonly altText: string }) | null> {\n const diagramType = this.diagramTypes[normalizeFenceLanguage(req.lang)];\n if (diagramType === undefined) {\n return null;\n }\n\n const encoded = await deflateBase64Url(req.source);\n const imageUrl = `${this.baseUrl}/${encodeURIComponent(diagramType)}/png/${encoded}`;\n\n // https://docs.slack.dev/reference/block-kit/blocks/image-block\n if (imageUrl.length > IMAGE_URL_MAX_CHARS) {\n return null;\n }\n return {\n kind: \"url\",\n imageUrl,\n altText: req.altText,\n };\n }\n}\n","import { IMAGE_URL_MAX_CHARS } from \"../constants.js\";\nimport type { ImageRenderer, RenderRequest, UrlImage } from \"../types.js\";\n\nimport { deflateBase64Url } from \"./encoding.js\";\nimport { normalizeBaseUrl, normalizeFenceLanguage } from \"./url-utils.js\";\n\nconst DEFAULT_MERMAID_INK_BASE_URL = \"https://mermaid.ink\";\nconst DEFAULT_MERMAID_INK_BACKGROUND = \"!white\";\n\nexport type MermaidInkTheme = \"default\" | \"neutral\" | \"dark\" | \"forest\";\n\nexport interface MermaidInkRendererOptions {\n readonly baseUrl?: string;\n readonly theme?: MermaidInkTheme;\n /**\n * mermaid.ink color value, such as `!white` or `FF0000`.\n */\n readonly bgColor?: string;\n}\n\ninterface MermaidInkState {\n readonly code: string;\n readonly mermaid: {\n readonly theme: MermaidInkTheme;\n };\n}\n\n/**\n * Produces mermaid.ink pako-state PNG URLs without performing network I/O.\n */\nexport class MermaidInkRenderer implements ImageRenderer {\n private readonly baseUrl: string;\n private readonly theme: MermaidInkTheme;\n private readonly bgColor: string;\n\n constructor(options: MermaidInkRendererOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_MERMAID_INK_BASE_URL);\n this.theme = options.theme ?? \"default\";\n this.bgColor = options.bgColor ?? DEFAULT_MERMAID_INK_BACKGROUND;\n }\n\n canRender(req: RenderRequest): boolean {\n return normalizeFenceLanguage(req.lang) === \"mermaid\";\n }\n\n async render(req: RenderRequest): Promise<(UrlImage & { readonly altText: string }) | null> {\n if (!this.canRender(req)) {\n return null;\n }\n\n const state: MermaidInkState = {\n code: req.source,\n mermaid: { theme: this.theme },\n };\n const encoded = await deflateBase64Url(JSON.stringify(state));\n const imageUrl =\n `${this.baseUrl}/img/pako:${encoded}` +\n `?type=png&bgColor=${encodeURIComponent(this.bgColor)}`;\n\n // https://docs.slack.dev/reference/block-kit/blocks/image-block\n if (imageUrl.length > IMAGE_URL_MAX_CHARS) {\n return null;\n }\n return {\n kind: \"url\",\n imageUrl,\n altText: req.altText,\n };\n }\n}\n","import { IMAGE_URL_MAX_CHARS } from \"../constants.js\";\nimport type { ImageRenderer, RenderRequest, UrlImage } from \"../types.js\";\n\nimport { normalizeBaseUrl, normalizeFenceLanguage } from \"./url-utils.js\";\n\nconst DEFAULT_CODECOGS_BASE_URL = \"https://latex.codecogs.com\";\nconst DEFAULT_CODECOGS_DPI = 200;\nconst MATH_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\"katex\", \"latex\", \"math\", \"tex\"]);\n\nexport interface CodeCogsRendererOptions {\n readonly baseUrl?: string;\n readonly dpi?: number;\n}\n\n/**\n * Produces deterministic CodeCogs `png.image` URLs for display math.\n */\nexport class CodeCogsRenderer implements ImageRenderer {\n private readonly baseUrl: string;\n private readonly dpi: number;\n\n constructor(options: CodeCogsRendererOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_CODECOGS_BASE_URL);\n this.dpi = options.dpi ?? DEFAULT_CODECOGS_DPI;\n\n if (!Number.isInteger(this.dpi) || this.dpi <= 0) {\n throw new RangeError(\"dpi must be a positive integer\");\n }\n }\n\n canRender(req: RenderRequest): boolean {\n return MATH_FENCE_LANGUAGES.has(normalizeFenceLanguage(req.lang));\n }\n\n async render(req: RenderRequest): Promise<(UrlImage & { readonly altText: string }) | null> {\n if (!this.canRender(req)) {\n return null;\n }\n\n const formula = `\\\\dpi{${String(this.dpi)}} ${req.source}`;\n const imageUrl = `${this.baseUrl}/png.image?${encodeURIComponent(formula)}`;\n\n // https://docs.slack.dev/reference/block-kit/blocks/image-block\n if (imageUrl.length > IMAGE_URL_MAX_CHARS) {\n return null;\n }\n return {\n kind: \"url\",\n imageUrl,\n altText: req.altText,\n };\n }\n}\n","import { IMAGE_URL_MAX_CHARS } from \"../constants.js\";\nimport type { ImageRenderer, RenderRequest, UrlImage } from \"../types.js\";\n\nimport { normalizeBaseUrl, normalizeFenceLanguage } from \"./url-utils.js\";\n\nconst DEFAULT_QUICKCHART_BASE_URL = \"https://quickchart.io\";\nconst DEFAULT_QUICKCHART_WIDTH = 500;\nconst DEFAULT_QUICKCHART_HEIGHT = 300;\nconst DEFAULT_QUICKCHART_BACKGROUND = \"white\";\nconst DEFAULT_QUICKCHART_DEVICE_PIXEL_RATIO = 2;\nconst CHART_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\n \"chart\",\n \"chart.js\",\n \"chartjs\",\n \"quickchart\",\n]);\n\nexport interface QuickChartRendererOptions {\n readonly baseUrl?: string;\n readonly width?: number;\n readonly height?: number;\n readonly backgroundColor?: string;\n readonly devicePixelRatio?: number;\n}\n\n/**\n * Produces full, durable QuickChart GET URLs. It never uses the expiring\n * `/chart/create` short-URL API.\n */\nexport class QuickChartRenderer implements ImageRenderer {\n private readonly baseUrl: string;\n private readonly width: number;\n private readonly height: number;\n private readonly backgroundColor: string;\n private readonly devicePixelRatio: number;\n\n constructor(options: QuickChartRendererOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_QUICKCHART_BASE_URL);\n this.width = options.width ?? DEFAULT_QUICKCHART_WIDTH;\n this.height = options.height ?? DEFAULT_QUICKCHART_HEIGHT;\n this.backgroundColor = options.backgroundColor ?? DEFAULT_QUICKCHART_BACKGROUND;\n this.devicePixelRatio = options.devicePixelRatio ?? DEFAULT_QUICKCHART_DEVICE_PIXEL_RATIO;\n\n if (!Number.isInteger(this.width) || this.width <= 0) {\n throw new RangeError(\"width must be a positive integer\");\n }\n if (!Number.isInteger(this.height) || this.height <= 0) {\n throw new RangeError(\"height must be a positive integer\");\n }\n if (!Number.isFinite(this.devicePixelRatio) || this.devicePixelRatio <= 0) {\n throw new RangeError(\"devicePixelRatio must be positive\");\n }\n }\n\n canRender(req: RenderRequest): boolean {\n return CHART_FENCE_LANGUAGES.has(normalizeFenceLanguage(req.lang));\n }\n\n async render(req: RenderRequest): Promise<(UrlImage & { readonly altText: string }) | null> {\n if (!this.canRender(req)) {\n return null;\n }\n\n const query = [\n `c=${encodeURIComponent(req.source)}`,\n `width=${String(this.width)}`,\n `height=${String(this.height)}`,\n `backgroundColor=${encodeURIComponent(this.backgroundColor)}`,\n `devicePixelRatio=${String(this.devicePixelRatio)}`,\n \"format=png\",\n ].join(\"&\");\n const imageUrl = `${this.baseUrl}/chart?${query}`;\n\n // https://docs.slack.dev/reference/block-kit/blocks/image-block\n if (imageUrl.length > IMAGE_URL_MAX_CHARS) {\n return null;\n }\n return {\n kind: \"url\",\n imageUrl,\n altText: req.altText,\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,52 @@
1
+ import type { BytesImage, SlackUploader } from "../types.js";
2
+ export interface SlackFetchRequestInit {
3
+ readonly method: "POST";
4
+ readonly headers: Readonly<Record<string, string>>;
5
+ readonly body: string | Uint8Array;
6
+ }
7
+ export interface SlackFetchResponse {
8
+ readonly ok: boolean;
9
+ readonly status: number;
10
+ json(): Promise<unknown>;
11
+ }
12
+ export type SlackFetch = (input: string, init: SlackFetchRequestInit) => Promise<SlackFetchResponse>;
13
+ export type SlackUploadSleep = (milliseconds: number) => Promise<void>;
14
+ export type SlackUploadClock = () => number;
15
+ export interface SlackUploadPollOptions {
16
+ readonly intervalMs?: number;
17
+ readonly maxAttempts?: number;
18
+ readonly timeoutMs?: number;
19
+ readonly sleep?: SlackUploadSleep;
20
+ readonly clock?: SlackUploadClock;
21
+ }
22
+ export interface FetchSlackUploaderOptions {
23
+ readonly token: string;
24
+ readonly fetch?: SlackFetch;
25
+ readonly channelId?: string;
26
+ readonly poll?: SlackUploadPollOptions;
27
+ }
28
+ /**
29
+ * Web-standard implementation of Slack's external file-upload flow.
30
+ *
31
+ * @see https://docs.slack.dev/messaging/working-with-files
32
+ */
33
+ export declare class FetchSlackUploader implements SlackUploader {
34
+ private readonly token;
35
+ private readonly fetcher;
36
+ private readonly channelId;
37
+ private readonly pollIntervalMs;
38
+ private readonly pollMaxAttempts;
39
+ private readonly pollTimeoutMs;
40
+ private readonly sleep;
41
+ private readonly clock;
42
+ constructor(options: FetchSlackUploaderOptions);
43
+ upload(img: BytesImage): Promise<{
44
+ readonly fileId: string;
45
+ }>;
46
+ private getUploadTarget;
47
+ private uploadBytes;
48
+ private completeUpload;
49
+ private waitUntilProcessed;
50
+ private callSlackApi;
51
+ }
52
+ //# sourceMappingURL=fetch-slack-uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-slack-uploader.d.ts","sourceRoot":"","sources":["../../src/slack/fetch-slack-uploader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAa7D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACvE,MAAM,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAOD;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,YAAY,OAAO,EAAE,yBAAyB,EAgB7C;IAEK,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAMlE;YAEa,eAAe;YAoBf,WAAW;YAwBX,cAAc;YAsBd,kBAAkB;YAiClB,YAAY;CA6C3B"}
@@ -0,0 +1,25 @@
1
+ export declare const SlackUploadStage: {
2
+ readonly GetUploadUrl: "get-upload-url";
3
+ readonly UploadBytes: "upload-bytes";
4
+ readonly CompleteUpload: "complete-upload";
5
+ readonly FileInfo: "file-info";
6
+ readonly ProcessingTimeout: "processing-timeout";
7
+ };
8
+ export type SlackUploadStage = (typeof SlackUploadStage)[keyof typeof SlackUploadStage];
9
+ export interface SlackUploadErrorDetails {
10
+ readonly stage: SlackUploadStage;
11
+ readonly status?: number;
12
+ readonly code?: string;
13
+ readonly cause?: unknown;
14
+ }
15
+ /**
16
+ * Integration error from one explicit stage of Slack's external-upload flow.
17
+ */
18
+ export declare class SlackUploadError extends Error {
19
+ readonly name: string;
20
+ readonly stage: SlackUploadStage;
21
+ readonly status: number | undefined;
22
+ readonly code: string | undefined;
23
+ constructor(message: string, details: SlackUploadErrorDetails);
24
+ }
25
+ //# sourceMappingURL=slack-upload-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-upload-error.d.ts","sourceRoot":"","sources":["../../src/slack/slack-upload-error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;aAC3B,YAAY,EAAE,gBAAgB;aAC9B,WAAW,EAAE,cAAc;aAC3B,cAAc,EAAE,iBAAiB;aACjC,QAAQ,EAAE,WAAW;aACrB,iBAAiB,EAAE,oBAAoB;CAC/B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAkB,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAM5D;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Slack Web API integrations. No request occurs until `upload()` is called.
3
+ */
4
+ export { FetchSlackUploader } from "./slack/fetch-slack-uploader.js";
5
+ export type { FetchSlackUploaderOptions, SlackFetch, SlackFetchRequestInit, SlackFetchResponse, SlackUploadClock, SlackUploadPollOptions, SlackUploadSleep, } from "./slack/fetch-slack-uploader.js";
6
+ export { SlackUploadError, SlackUploadStage } from "./slack/slack-upload-error.js";
7
+ export type { SlackUploadErrorDetails } from "./slack/slack-upload-error.js";
8
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,YAAY,EACV,yBAAyB,EACzB,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACnF,YAAY,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC"}