clone

a browser-first diagram editor with live svg previews, local drafts and encrypted, accountless sharing

main
diagramzip / renderers / edge / src / adapters / dbml.ts
dbml.ts 2.1K
1import { RenderError } from '../runtime/errors'2import { dbmlToDot } from '../../artifacts/dbml/dbml-backend.js'3import type { RendererAdapter } from '../runtime/types'4import { edgeResult } from './types'5import { renderGraphvizSource } from './graphviz'67const VERSION = 'dbml@1.0.31+graphviz@15.1.1'8const MAX_SOURCE_BYTES = 262_1449const MAX_DECLARATIONS = 2_00010const MAX_REFERENCES = 10_00011const MAX_DOT_BYTES = 4_194_3041213function preflight(source: string): void {14 if (new TextEncoder().encode(source).byteLength > MAX_SOURCE_BYTES) {15 throw new RenderError(413, 'request_too_large', 'DBML source is too large for the edge renderer.')16 }17 const declarations = source.match(/^\s*(?:Table|TableGroup|Enum)\b/gm)?.length ?? 018 if (declarations > MAX_DECLARATIONS) {19 throw new RenderError(413, 'request_too_large', 'DBML contains too many declarations for the edge renderer.')20 }21 const references = source.match(/^\s*Ref\b/gm)?.length ?? 022 if (references > MAX_REFERENCES) {23 throw new RenderError(413, 'request_too_large', 'DBML contains too many references for the edge renderer.')24 }25}2627export const dbmlAdapter: RendererAdapter = {28 id: 'dbml',29 runtime: 'edge-wasm',30 version: VERSION,31 async render(request, signal) {32 if (signal.aborted) throw signal.reason33 if (Object.keys(request.options).length > 0) {34 throw new RenderError(400, 'invalid_options', 'DBML does not accept renderer options.')35 }36 try {37 preflight(request.source)38 const dot = dbmlToDot(request.source)39 if (new TextEncoder().encode(dot).byteLength > MAX_DOT_BYTES) {40 throw new RenderError(413, 'output_too_large', 'DBML produced too large a GraphViz model.')41 }42 if (signal.aborted) throw signal.reason43 return edgeResult('dbml', VERSION, await renderGraphvizSource(dot), 'edge-wasm')44 } catch (error) {45 if (error instanceof RenderError) throw error46 const message = error instanceof Error ? error.message : String(error)47 throw new RenderError(422, 'render_failed', message.slice(0, 500) || 'DBML could not render this source.')48 }49 },50}