diff --git a/.github/workflows/correctness.yml b/.github/workflows/correctness.yml index c461234..5ad68d8 100644 --- a/.github/workflows/correctness.yml +++ b/.github/workflows/correctness.yml @@ -60,7 +60,10 @@ jobs: - name: Check runtime remains local-only shell: bash run: | - if grep -REn "https?://" index.html styles.css src dist tests; then + # The W3C SVG namespace is an XML identifier passed to createElementNS, + # not a network URL: allow exactly that string and fail on any other. + if grep -REn "https?://" index.html styles.css src dist tests \ + | grep -v "http://www.w3.org/2000/svg"; then echo "Runtime files contain an external URL." exit 1 fi diff --git a/CHANGELOG.md b/CHANGELOG.md index d3ae881..5a8bdc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,22 @@ All notable released ProcFlow changes are recorded here. Detailed verification evidence belongs in the canonical release note under `docs/releases/`. +## v2.1.0 — Entity relationship diagrams + +- Added the ERD page (`erd.html`): DDL parsing for declared tables, views, + columns, primary/unique/foreign keys, and composite-key grouping across + T-SQL, PostgreSQL, DB2, and SQLite, with raw type fidelity and source spans. +- Added deterministic Mermaid `erDiagram` export with declared cardinality, + optionality, and provenance comments. Declared constraints only; unresolved + references stay explicit. +- Added estate navigation: canvas panning, draggable tables, FK selection + inspector, find/jump, compact boxes for large estates, and smooth wheel zoom + with whole-estate Fit. +- Added a draggable editor/diagram divider on both pages and a clear + Flowchart/ERD page switcher. +- Fixed view cards being hidden by a global class collision and Fit zooming + out indefinitely on large estates. + ## v2.0.0 — Trustworthy SQL Analysis Contract - Added the cross-dialect adversarial semantic qualification matrix and its diff --git a/README.md b/README.md index 1d5b31a..2b76b49 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@

ProcFlow turns SQL into diagrams for control flow, query structure, object -dependencies, column lineage, and report dependencies. It runs locally in the -browser: no backend, database connection, sign-in, or installation is required. +dependencies, column lineage, report dependencies, and entity relationship +diagrams from schema DDL. It runs locally in the browser: no backend, database +connection, sign-in, or installation is required. > **Accuracy warning:** ProcFlow is a deterministic heuristic analyser, not a > database compiler. Treat diagrams as investigation aids and verify important @@ -33,6 +34,9 @@ browser: no backend, database connection, sign-in, or installation is required. their queries, and trace report → dataset → object → column dependencies. - **Application teams:** inspect multi-object scripts, temporary-table flow, catalogue-backed object resolution, and conservative column lineage. +- **Schema reviewers:** open `erd.html`, paste or import `CREATE TABLE` / + `ALTER TABLE` DDL, and see declared tables, views, keys, and foreign keys as + an entity relationship diagram. - **Reviewers:** export deterministic Mermaid, SVG, or editable draw.io diagrams with source provenance. @@ -45,6 +49,24 @@ browser: no backend, database connection, sign-in, or installation is required. 4. Choose an object and scope, then inspect the source spans and diagnostics before relying on a relationship. +For schema DDL, open `erd.html`, paste or import `CREATE TABLE` / `ALTER TABLE` +statements (T-SQL, PostgreSQL, DB2, or SQLite), and review the declared +entities and foreign keys. Drag the canvas to pan, drag a table card to move it +out of the way and declutter relationship lines (double-click a card, or use +**Reset layout**, to restore the grid), select a table to highlight its +declared foreign keys and list each one with its column mapping and +cardinality, and press **Clear** (or Escape) to deselect. Zoom controls under +the canvas (or **Fit**) frame the whole estate; with a table selected, **Fit** +frames that table and its declared neighbours and the selection ring stays +visible at estate zoom. On both the flowchart +and ERD pages the divider between the editor and the diagram is draggable +(double-click it to reset). Estates with hundreds of tables stay responsive: +auto-draw pauses above the shared large-input threshold until **Refresh**, +boxes switch to a compact summary automatically, and **Find** highlights +matches and jumps between them with Enter. The ERD page asserts declared +constraints only; it never infers a relationship from query text, and +unresolved references stay explicit. + For development, see [Development](docs/DEVELOPMENT.md). For a simple served run, use `python -m http.server 8000` from the runtime directory and open `http://127.0.0.1:8000/`. @@ -66,6 +88,9 @@ in the browser. - temporary-table producer → consumer data flow; - conservative column lineage with explicit ambiguity; - report and dataset dependency chains; +- declared entity relationships from DDL: tables, views, columns, primary, + unique, and foreign keys (composite keys grouped), exported as Mermaid + `erDiagram`; - dynamic SQL as an explicit opaque step rather than an invented dependency. ## Supported dialects diff --git a/dist/src/erd.js b/dist/src/erd.js new file mode 100644 index 0000000..37f6b72 --- /dev/null +++ b/dist/src/erd.js @@ -0,0 +1,282 @@ +"use strict"; +/* ===== v2.1.0 ERD export (declared constraints only) ===== + Renders the schema IR as a Mermaid `erDiagram`. Relationships are derived + only from declared FOREIGN KEY constraints; the exporter never infers an + edge. Sanitized identifiers keep Mermaid syntax valid while `%%` provenance + comments preserve the original entity, column, and type names. */ +function erdToken(value) { + var s = String(value == null ? '' : value).replace(/[^A-Za-z0-9_]/g, '_') + .replace(/_+/g, '_').replace(/^_+|_+$/g, ''); + return s || 'unknown'; +} +function erdTypeToken(value) { + var s = erdToken(value); + return s === 'unknown' ? 'unknown' : s; +} +/* Deterministic, collision-free Mermaid entity identifiers. */ +function erdEntityIds(result) { + var used = {}, map = {}; + result.entities.forEach(function (entity) { + var base = erdToken(entity.id).toUpperCase(); + if (/^[0-9]/.test(base)) + base = 'E_' + base; + var count = used[base] || 0; + var candidate = base; + if (count > 0) { + do { + count++; + candidate = base + '_' + count; + } while (used[candidate]); + used[base] = count; + } + used[candidate] = 1; + map[entity.id] = candidate; + }); + return map; +} +function erdHasColumn(key, column) { + var norm = schemaNormColumn(column); + return key.columns.some(function (name) { return schemaNormColumn(name) === norm; }); +} +function erdColumnKeys(entity, column) { + var keys = []; + var pk = column.primaryKey || entity.keys.some(function (k) { + return k.kind === 'pk' && erdHasColumn(k, column.name); + }); + if (pk) + keys.push('PK'); + var fk = entity.keys.some(function (k) { + return k.kind === 'fk' && erdHasColumn(k, column.name); + }); + if (fk) + keys.push('FK'); + var uk = column.unique || entity.keys.some(function (k) { + return k.kind === 'unique' && erdHasColumn(k, column.name); + }); + if (uk) + keys.push('UK'); + return keys; +} +/* Cardinality notation, read as "how many per " on the left + and "how many per " on the right: + mandatory one-to-many: PARENT ||--o{ CHILD + optional one-to-many: PARENT o|--o{ + mandatory one-to-one: PARENT ||--|| + optional one-to-one: PARENT o|--|| */ +function erdRelationshipCardinality(rel) { + return { left: rel.optional ? 'o|' : '||', right: rel.unique ? '||' : 'o{' }; +} +function erdRelationshipLabel(rel, child) { + if (rel.name) + return erdToken(rel.name); + var columns = rel.toColumns.length ? rel.toColumns : ['fk']; + return erdToken('fk_' + child.name.replace(/\./g, '_') + '_' + columns.join('_')); +} +/* Mermaid `erDiagram` text. Entity blocks come first, then relationship lines, + then the provenance map as comments. Deterministic for a given schema. */ +function toMermaidER(result) { + var ids = erdEntityIds(result); + var lines = ['erDiagram']; + lines.push(' %% procflow:erd v1 — declared constraints only; no inferred relationships'); + lines.push(' %% schema tables=' + result.stats.tables + ' views=' + result.stats.views + + ' columns=' + result.stats.columns + ' relationships=' + result.stats.relationships + + ' unresolved=' + result.stats.unresolved); + result.entities.forEach(function (entity) { + var id = ids[entity.id]; + if (entity.columns.length) { + lines.push(' ' + id + ' {'); + entity.columns.forEach(function (column) { + var keys = erdColumnKeys(entity, column); + var line = ' ' + erdTypeToken(column.type) + ' ' + erdToken(column.name) + + (keys.length ? ' ' + keys.join(', ') : ''); + var rawType = (column.type || '').trim(); + if (rawType && rawType !== erdTypeToken(rawType)) { + line += ' "' + rawType.replace(/"/g, "'") + '"'; + } + lines.push(line); + }); + lines.push(' }'); + } + else { + lines.push(' %% ' + id + ' has no declared columns' + (entity.unresolved ? ' (unresolved reference)' : '')); + } + }); + result.relationships.forEach(function (rel) { + var from = ids[rel.fromId], to = ids[rel.toId]; + if (!from || !to) + return; + var child = result.entities.filter(function (entity) { return entity.id === rel.toId; })[0]; + var card = erdRelationshipCardinality(rel); + lines.push(' ' + from + ' ' + card.left + '--' + card.right + ' ' + to + ' : ' + + erdRelationshipLabel(rel, child || { name: 'entity' })); + }); + result.entities.forEach(function (entity) { + lines.push(' %% entity ' + ids[entity.id] + ' = "' + entity.name + '" (' + entity.kind + + (entity.unresolved ? ', unresolved' : '') + ')'); + }); + result.entities.forEach(function (entity) { + entity.columns.forEach(function (column) { + lines.push(' %% column ' + ids[entity.id] + '.' + column.name + ' : ' + + (column.type || '(no declared type)')); + }); + }); + result.relationships.forEach(function (rel) { + lines.push(' %% relationship ' + ids[rel.fromId] + ' -> ' + ids[rel.toId] + ' ' + + rel.cardinality + (rel.optional ? ' optional' : ' mandatory') + + ' [' + (rel.fromColumns.join(',') || '?') + ' -> ' + rel.toColumns.join(',') + ']' + + (rel.name ? ' constraint ' + rel.name : '') + ' resolution=' + rel.resolution); + }); + return lines.join('\n'); +} +/* Bundled ERD samples (local-only, deterministic, and also used by the + v2.1.0 fixtures so the demo path is covered by tests). */ +var PROCFLOW_ERD_SAMPLE_TSQL = [ + '/* Sample retail schema — declared constraints only. */', + 'CREATE TABLE dbo.Customer (', + ' CustomerId INT IDENTITY(1,1) PRIMARY KEY,', + ' Email NVARCHAR(200) NOT NULL UNIQUE,', + ' DisplayName NVARCHAR(120) NOT NULL,', + ' ReferredBy INT NULL,', + ' CONSTRAINT FK_Customer_Referrer FOREIGN KEY (ReferredBy)', + ' REFERENCES dbo.Customer (CustomerId)', + ');', + 'GO', + 'CREATE TABLE dbo.Product (', + ' ProductId INT IDENTITY(1,1) PRIMARY KEY,', + ' Sku VARCHAR(40) NOT NULL,', + ' UnitPrice DECIMAL(12,2) NOT NULL,', + ' CONSTRAINT UQ_Product_Sku UNIQUE (Sku)', + ');', + 'GO', + 'CREATE TABLE dbo.OrderHeader (', + ' OrderId INT IDENTITY(1,1) PRIMARY KEY,', + ' CustomerId INT NOT NULL,', + ' PlacedAt DATETIME2 NOT NULL DEFAULT (SYSUTCDATETIME()),', + ' Status VARCHAR(20) NOT NULL,', + ' CONSTRAINT FK_Order_Customer FOREIGN KEY (CustomerId)', + ' REFERENCES dbo.Customer (CustomerId),', + ' CONSTRAINT UQ_Order_Customer UNIQUE (CustomerId)', + ');', + 'GO', + 'CREATE TABLE dbo.OrderLine (', + ' OrderId INT NOT NULL,', + ' LineNo INT NOT NULL,', + ' ProductId INT NOT NULL,', + ' Quantity INT NOT NULL,', + ' CONSTRAINT PK_OrderLine PRIMARY KEY (OrderId, LineNo),', + ' CONSTRAINT FK_OrderLine_Order FOREIGN KEY (OrderId)', + ' REFERENCES dbo.OrderHeader (OrderId),', + ' CONSTRAINT FK_OrderLine_Product FOREIGN KEY (ProductId)', + ' REFERENCES dbo.Product (ProductId) ON DELETE CASCADE', + ');', + 'GO', + 'CREATE VIEW dbo.vOrderValue (OrderId, LineCount, TotalValue) AS', + ' SELECT OrderId, COUNT(*), SUM(1) FROM dbo.OrderLine GROUP BY OrderId;' +].join('\n'); +/* 8 tables, 4 views. EMPLOYEE (table 2) and ORDERS (table 4) are related + through the employee who took the order. AUDIT_LOG and APP_SETTINGS are + standalone: nothing references them and they reference nothing. */ +var PROCFLOW_ERD_SAMPLE_DB2 = [ + '/* DB2 schema sample — declared constraints only. */', + 'CREATE SCHEMA sales;', + '', + 'CREATE TABLE sales.department (', + ' dept_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10),', + ' dept_name VARCHAR(80) NOT NULL,', + ' location VARCHAR(80),', + ' CONSTRAINT pk_department PRIMARY KEY (dept_id),', + ' CONSTRAINT uq_department_name UNIQUE (dept_name)', + ');', + '', + 'CREATE TABLE sales.employee (', + ' emp_id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY,', + ' dept_id INTEGER NOT NULL,', + ' manager_id INTEGER,', + ' full_name CHARACTER VARYING(120) NOT NULL,', + ' hired_on DATE NOT NULL DEFAULT CURRENT DATE,', + ' salary DECIMAL(11,2) NOT NULL,', + ' CONSTRAINT pk_employee PRIMARY KEY (emp_id),', + ' CONSTRAINT fk_employee_dept FOREIGN KEY (dept_id)', + ' REFERENCES sales.department (dept_id) ON DELETE RESTRICT,', + ' CONSTRAINT fk_employee_manager FOREIGN KEY (manager_id)', + ' REFERENCES sales.employee (emp_id) ON DELETE SET NULL', + ');', + '', + 'CREATE TABLE sales.customer (', + ' customer_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' customer_name VARCHAR(120) NOT NULL,', + ' email VARCHAR(200) NOT NULL,', + ' country CHAR(2),', + ' CONSTRAINT pk_customer PRIMARY KEY (customer_id)', + ');', + '', + 'CREATE TABLE sales.orders (', + ' order_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' customer_id INTEGER NOT NULL,', + ' emp_id INTEGER NOT NULL,', + ' order_date TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,', + ' status VARCHAR(20) NOT NULL,', + ' CONSTRAINT pk_orders PRIMARY KEY (order_id),', + ' CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id)', + ' REFERENCES sales.customer (customer_id) ON DELETE CASCADE,', + ' CONSTRAINT fk_orders_employee FOREIGN KEY (emp_id)', + ' REFERENCES sales.employee (emp_id) ON DELETE RESTRICT,', + ' CONSTRAINT ck_orders_status CHECK (status IN (\'OPEN\',\'SHIPPED\',\'CANCELLED\'))', + ');', + '', + 'CREATE TABLE sales.product (', + ' product_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' sku VARCHAR(40) NOT NULL,', + ' product_name VARCHAR(160) NOT NULL,', + ' unit_price DECIMAL(9,2) NOT NULL,', + ' CONSTRAINT pk_product PRIMARY KEY (product_id)', + ');', + 'CREATE UNIQUE INDEX sales.uq_product_sku ON sales.product (sku);', + '', + 'CREATE TABLE sales.order_line (', + ' order_id INTEGER NOT NULL,', + ' line_no SMALLINT NOT NULL,', + ' product_id INTEGER NOT NULL,', + ' quantity INTEGER NOT NULL,', + ' unit_price DECIMAL(9,2) NOT NULL,', + ' CONSTRAINT pk_order_line PRIMARY KEY (order_id, line_no),', + ' CONSTRAINT fk_order_line_order FOREIGN KEY (order_id)', + ' REFERENCES sales.orders (order_id) ON DELETE CASCADE,', + ' CONSTRAINT fk_order_line_product FOREIGN KEY (product_id)', + ' REFERENCES sales.product (product_id) ON DELETE RESTRICT', + ');', + '', + '/* Standalone table 7: audit trail, no foreign keys in or out. */', + 'CREATE TABLE sales.audit_log (', + ' log_id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' message VARCHAR(500) NOT NULL,', + ' created_at TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,', + ' CONSTRAINT pk_audit_log PRIMARY KEY (log_id)', + ');', + '', + '/* Standalone table 8: application settings, no foreign keys in or out. */', + 'CREATE TABLE sales.app_settings (', + ' setting_key VARCHAR(100) NOT NULL,', + ' setting_value VARCHAR(500),', + ' CONSTRAINT pk_app_settings PRIMARY KEY (setting_key)', + ');', + '', + 'CREATE VIEW sales.v_order_summary (order_id, customer_name, total_value) AS', + ' SELECT o.order_id, c.customer_name, SUM(l.quantity * l.unit_price)', + ' FROM sales.orders o', + ' JOIN sales.customer c ON c.customer_id = o.customer_id', + ' JOIN sales.order_line l ON l.order_id = o.order_id', + ' GROUP BY o.order_id, c.customer_name;', + '', + 'CREATE VIEW sales.v_employee_directory (emp_id, full_name, dept_name) AS', + ' SELECT e.emp_id, e.full_name, d.dept_name', + ' FROM sales.employee e', + ' JOIN sales.department d ON d.dept_id = e.dept_id;', + '', + 'CREATE VIEW sales.v_product_catalog (product_id, sku, product_name, unit_price) AS', + ' SELECT product_id, sku, product_name, unit_price FROM sales.product;', + '', + 'CREATE VIEW sales.v_audit_recent (log_id, message, created_at) AS', + ' SELECT log_id, message, created_at FROM sales.audit_log;' +].join('\n'); +//# sourceMappingURL=erd.js.map \ No newline at end of file diff --git a/dist/src/erd.js.map b/dist/src/erd.js.map new file mode 100644 index 0000000..2ff44cc --- /dev/null +++ b/dist/src/erd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"erd.js","sourceRoot":"","sources":["../../src/erd.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/schema.js b/dist/src/schema.js new file mode 100644 index 0000000..ee705ce --- /dev/null +++ b/dist/src/schema.js @@ -0,0 +1,922 @@ +"use strict"; +/* ===== v2.1.0 ERD / schema foundation (DDL → declared constraint model) ===== + Parses CREATE TABLE / CREATE VIEW / CREATE [UNIQUE] INDEX / ALTER TABLE + across T-SQL, PostgreSQL, DB2, and SQLite into a conservative schema IR for + the ERD page. + + Honesty rules (matches the v2 accuracy contract): + - Only declared constraints become relationship edges. Nothing is inferred + from query text. + - Raw column type text is preserved verbatim (dialect types are not + normalized); the ERD treats type as a display attribute. + - Composite keys are grouped and never exploded into per-column edges. + - Unresolved foreign-key targets become explicit external entities with a + region-scoped diagnostic, never a silent drop. + - Entity, column, and key spans point back into the source DDL. + + Views and CTAS tables without a declared column list have unknown columns; + that is reported, not invented. */ +var SCHEMA_IGNORED_CREATE = S([ + 'PROCEDURE', 'PROC', 'FUNCTION', 'TRIGGER', 'SEQUENCE', 'SCHEMA', 'DATABASE', + 'TYPE', 'DOMAIN', 'EXTENSION', 'ROLE', 'USER', 'LOGIN', 'SYNONYM', 'TABLESPACE', + 'SERVER', 'PUBLICATION', 'SUBSCRIPTION', 'POLICY', 'RULE', 'AGGREGATE', + 'OPERATOR', 'CAST', 'LANGUAGE', 'COLLATION', 'STATISTICS', 'ASSEMBLY', 'XML', + 'CREDENTIAL', 'ENDPOINT', 'EVENT', 'FULLTEXT', 'MASTER', 'MESSAGE', 'PARTITION', + 'QUEUE', 'REMOTE', 'RESOURCE', 'SECURITY', 'SERVICE', 'SYMMETRIC', 'CERTIFICATE', + 'BROKER', 'CONTRACT', 'DIALOG', 'APPLICATION' +]); +/* Clause keywords that terminate a column's raw type text. `WITH`/`WITHOUT` + stay out so multi-word types like `timestamp with time zone` and + `character varying` are preserved. */ +var SCHEMA_STOP = S([ + 'NOT', 'NULL', 'DEFAULT', 'PRIMARY', 'UNIQUE', 'REFERENCES', 'CHECK', 'CONSTRAINT', + 'GENERATED', 'IDENTITY', 'AUTO_INCREMENT', 'AUTOINCREMENT', 'COLLATE', 'COMMENT', + 'AS', 'ENCODE', 'INLINE', 'PERIOD', 'ON', 'MASKED', 'ROWGUIDCOL', 'SPARSE', + 'FILESTREAM', 'PERSISTED', 'STORED', 'VIRTUAL' +]); +function schemaUnquote(part) { + var s = part || ''; + if (s.length >= 2) { + var a = s.charAt(0), b = s.charAt(s.length - 1); + if (a === '[' && b === ']') + s = s.slice(1, -1).replace(/\]\]/g, ']'); + else if (a === '"' && b === '"') + s = s.slice(1, -1).replace(/""/g, '"'); + else if (a === '`' && b === '`') + s = s.slice(1, -1).replace(/``/g, '`'); + } + return s; +} +function schemaNormName(parts) { + return parts.map(schemaUnquote).join('.').replace(/\s+/g, ' ').trim().toUpperCase(); +} +function schemaNormColumn(name) { + return String(name || '').toUpperCase(); +} +function schemaIssue(ctx, severity, code, message, span) { + ctx.diagnostics.push({ severity: severity, code: code, message: message, + span: span, scope: 'region' }); +} +function schemaSpan(start, end) { + return { start: start, end: Math.max(start + 1, end) }; +} +/* A dotted identifier written with any of the supported quoting styles. + Returns unquoted parts so `[dbo].[Order]` and "dbo"."Order" compare equal. */ +function schemaIdent(toks, i) { + if (i >= toks.length || toks[i].type !== 'word') + return null; + var parts = [schemaUnquote(toks[i].v)]; + var start = toks[i].pos, end = toks[i].end, j = i + 1; + while (j + 1 < toks.length && toks[j].v === '.' && toks[j + 1].type === 'word') { + parts.push(schemaUnquote(toks[j + 1].v)); + end = toks[j + 1].end; + j += 2; + } + return { parts: parts, start: start, end: end, next: j }; +} +/* Index after the parenthesis matching the one at `open`. */ +function schemaSkipParens(toks, open) { + var depth = 0, i = open; + while (i < toks.length) { + if (toks[i].v === '(') + depth++; + else if (toks[i].v === ')') { + depth--; + if (depth <= 0) + return i + 1; + } + i++; + } + return i; +} +function schemaSkipDefault(toks, i) { + var depth = 0; + while (i < toks.length) { + var t = toks[i]; + if (t.v === '(') { + depth++; + i++; + continue; + } + if (t.v === ')') { + if (depth === 0) + break; + depth--; + i++; + continue; + } + if (depth === 0) { + if (t.v === ',') + break; + if (t.type === 'word' && SCHEMA_STOP[t.u]) + break; + } + i++; + } + return i; +} +function schemaParseAction(toks, i) { + var words = []; + while (i < toks.length && toks[i].type === 'word' && words.length < 2) { + var u = toks[i].u; + if (words.length === 1 && /^(CASCADE|NULL|DEFAULT|ACTION)$/.test(u)) + words.push(u); + else if (words.length === 0 && /^(CASCADE|RESTRICT|SET|NO)$/.test(u)) + words.push(u); + else + break; + i++; + } + return { text: words.join(' '), end: i }; +} +/* FOREIGN KEY / inline REFERENCES target with optional columns and actions. */ +function schemaParseReference(toks, i) { + if (!toks[i] || toks[i].type !== 'word' || toks[i].u !== 'REFERENCES') + return null; + var id = schemaIdent(toks, i + 1); + if (!id) + return null; + var target = { name: id.parts.join('.'), + columns: [], + resolution: 'opaque', + norm: schemaNormName(id.parts) }; + var j = id.next; + if (toks[j] && toks[j].v === '(') { + var parsed = schemaParseColumns(toks, j); + if (parsed) { + target.columns = parsed.names; + j = parsed.end; + } + } + var onDelete, onUpdate, deferrable; + while (j < toks.length) { + var t = toks[j]; + if (t.type === 'word' && t.u === 'ON' && toks[j + 1] && toks[j + 1].type === 'word' && + (toks[j + 1].u === 'DELETE' || toks[j + 1].u === 'UPDATE')) { + var action = schemaParseAction(toks, j + 2); + if (toks[j + 1].u === 'DELETE') + onDelete = action.text; + else + onUpdate = action.text; + j = action.end; + continue; + } + if (t.type === 'word' && t.u === 'MATCH') { + j += 2; + continue; + } + if (t.type === 'word' && t.u === 'DEFERRABLE') { + deferrable = true; + j++; + continue; + } + if (t.type === 'word' && t.u === 'NOT' && toks[j + 1] && toks[j + 1].u === 'DEFERRABLE') { + deferrable = false; + j += 2; + continue; + } + if (t.type === 'word' && t.u === 'INITIALLY') { + j += 2; + continue; + } + break; + } + return { target: target, onDelete: onDelete, onUpdate: onUpdate, + deferrable: deferrable, end: j }; +} +/* Comma-separated column list inside parentheses; returns names and the index + after the closing parenthesis. */ +function schemaParseColumns(toks, i) { + if (!toks[i] || toks[i].v !== '(') + return null; + var names = [], j = i + 1; + while (j < toks.length) { + var t = toks[j]; + if (t.v === ')') + return { names: names, end: j + 1 }; + if (t.v === ',') { + j++; + continue; + } + if (t.type === 'word') { + var id = schemaIdent(toks, j); + if (!id) + return null; + names.push(id.parts[id.parts.length - 1]); + j = id.next; + while (j < toks.length && toks[j].type === 'word' && (toks[j].u === 'ASC' || toks[j].u === 'DESC')) + j++; + continue; + } + return null; + } + return null; +} +function schemaAddEntity(ctx, entity) { + if (ctx.byKey[entity.id]) { + schemaIssue(ctx, 'warning', 'schema_duplicate_entity', 'Table or view "' + entity.name + '" is defined more than once; the first definition is kept.', entity.span); + return false; + } + ctx.byKey[entity.id] = entity; + ctx.entities.push(entity); + return true; +} +function schemaAddColumn(ctx, entity, col) { + if (entity.columns.some(function (c) { return schemaNormColumn(c.name) === schemaNormColumn(col.name); })) { + schemaIssue(ctx, 'warning', 'schema_duplicate_column', 'Column "' + col.name + '" appears more than once in "' + entity.name + '"; the first definition is kept.', col.span); + return; + } + entity.columns.push(col); +} +function schemaAddKey(entity, key) { + var signature = key.kind + '|' + key.columns.map(schemaNormColumn).join('|') + '|' + + (key.referenced ? key.referenced.norm : ''); + var duplicate = entity.keys.some(function (existing) { + return existing.kind + '|' + existing.columns.map(schemaNormColumn).join('|') + '|' + + (existing.referenced ? existing.referenced.norm : '') === signature; + }); + if (!duplicate) + entity.keys.push(key); +} +/* Split a statement on commas at the top level of the parentheses opened at + `open`. The opening parenthesis is not part of any item. */ +function schemaSplitItems(toks, open) { + var items = [], cur = [], depth = 1, i = open + 1; + while (i < toks.length) { + var t = toks[i]; + if (t.v === '(') + depth++; + else if (t.v === ')') { + depth--; + if (depth === 0) { + if (cur.length) + items.push(cur); + return { items: items, end: i + 1 }; + } + } + if (depth === 1 && t.v === ',') { + if (cur.length) + items.push(cur); + cur = []; + i++; + continue; + } + cur.push(t); + i++; + } + if (cur.length) + items.push(cur); + return { items: items, end: i }; +} +/* Split a whole DDL document into statements. Semicolons and T-SQL `GO` + batches are authoritative; a new top-level CREATE/ALTER recovers when + semicolons are omitted, matching the parser's newline-independent goal. */ +function schemaStatements(toks) { + var out = [], cur = [], depth = 0; + function flush() { + if (cur.length) + out.push(cur); + cur = []; + } + for (var i = 0; i < toks.length; i++) { + var t = toks[i]; + if (t.v === '(') + depth++; + else if (t.v === ')') + depth = Math.max(0, depth - 1); + if (depth === 0) { + if (t.v === ';') { + flush(); + continue; + } + if (t.type === 'word' && t.u === 'GO') { + flush(); + continue; + } + /* Missing-semicolon recovery: a new top-level CREATE/ALTER starts a + statement. Semicolons and GO remain authoritative. */ + if (cur.length && t.type === 'word' && (t.u === 'CREATE' || t.u === 'ALTER')) + flush(); + } + cur.push(t); + } + flush(); + return out; +} +function schemaMarkPrimaryKey(entity, columns) { + columns.forEach(function (name) { + entity.columns.forEach(function (col) { + if (schemaNormColumn(col.name) === schemaNormColumn(name)) { + col.primaryKey = true; + col.nullable = false; + } + }); + }); +} +function schemaMarkUnique(entity, columns) { + if (columns.length !== 1) + return; + entity.columns.forEach(function (col) { + if (schemaNormColumn(col.name) === schemaNormColumn(columns[0])) + col.unique = true; + }); +} +/* Column definition: name, raw type, inline constraints, inline FK. */ +function schemaParseColumnItem(ctx, entity, item, constraintName) { + if (!item.length || item[0].type !== 'word') + return; + var nameTok = item[0]; + var col = { + name: schemaUnquote(nameTok.v), + type: '', + nullable: true, + primaryKey: false, + unique: false, + identity: false, + generated: false, + computed: false, + ordinal: entity.columns.length + 1, + span: schemaSpan(nameTok.pos, nameTok.end) + }; + var i = 1, typeStart = -1, typeEnd = -1; + while (i < item.length) { + var t = item[i]; + if (t.type === 'word' && SCHEMA_STOP[t.u]) + break; + if (t.v === '(') { + var afterParen = schemaSkipParens(item, i); + if (typeStart >= 0 && afterParen > i) + typeEnd = item[afterParen - 1].end; + i = afterParen; + continue; + } + if (t.v === ',') + break; + if (typeStart < 0) + typeStart = t.pos; + typeEnd = t.end; + i++; + } + if (typeStart >= 0 && typeEnd > typeStart) { + col.type = ctx.text.slice(typeStart, typeEnd).replace(/\s+/g, ' ').trim(); + if (/^(BIGSERIAL|SERIAL|SMALLSERIAL)$/i.test(col.type)) + col.identity = true; + } + while (i < item.length) { + var c = item[i]; + if (c.type === 'word' && c.u === 'CONSTRAINT') { + i += 2; + continue; + } + if (c.type === 'word' && c.u === 'NOT' && item[i + 1] && item[i + 1].u === 'NULL') { + col.nullable = false; + i += 2; + continue; + } + if (c.type === 'word' && c.u === 'NULL') { + col.nullable = true; + i++; + continue; + } + if (c.type === 'word' && c.u === 'DEFAULT') { + i = schemaSkipDefault(item, i + 1); + continue; + } + if (c.type === 'word' && c.u === 'PRIMARY' && item[i + 1] && item[i + 1].u === 'KEY') { + col.primaryKey = true; + col.nullable = false; + schemaAddKey(entity, { kind: 'pk', columns: [col.name], name: constraintName, + span: schemaSpan(c.pos, item[i + 1].end) }); + i += 2; + continue; + } + if (c.type === 'word' && c.u === 'UNIQUE') { + col.unique = true; + schemaAddKey(entity, { kind: 'unique', columns: [col.name], name: constraintName, + span: schemaSpan(c.pos, c.end) }); + i++; + continue; + } + if (c.type === 'word' && c.u === 'REFERENCES') { + var refStart = c; + var ref = schemaParseReference(item, i); + if (ref) { + schemaAddKey(entity, { kind: 'fk', columns: [col.name], name: constraintName, + referenced: ref.target, onDelete: ref.onDelete, + onUpdate: ref.onUpdate, deferrable: ref.deferrable, + span: schemaSpan(refStart.pos, item[ref.end - 1].end) }); + i = ref.end; + } + else + i++; + continue; + } + if (c.type === 'word' && c.u === 'CHECK') { + i = schemaSkipParens(item, i + 1); + continue; + } + if (c.type === 'word' && c.u === 'GENERATED') { + var g = i + 1; + if (item[g] && item[g].type === 'word' && (item[g].u === 'ALWAYS' || item[g].u === 'BY')) { + if (item[g].u === 'BY') { + g++; + if (item[g] && item[g].u === 'DEFAULT') + g++; + if (item[g] && item[g].u === 'ON' && item[g + 1] && item[g + 1].u === 'NULL') + g += 2; + } + else + g++; + } + if (item[g] && item[g].u === 'AS') { + g++; + if (item[g] && item[g].u === 'IDENTITY') { + col.identity = true; + g = (item[g + 1] && item[g + 1].v === '(') ? schemaSkipParens(item, g + 1) : g + 1; + } + else if (item[g] && item[g].v === '(') { + col.generated = true; + g = schemaSkipParens(item, g); + } + } + else if (item[g] && item[g].u === 'IDENTITY') { + col.identity = true; + g = (item[g + 1] && item[g + 1].v === '(') ? schemaSkipParens(item, g + 1) : g + 1; + } + i = g; + continue; + } + if (c.type === 'word' && c.u === 'IDENTITY') { + col.identity = true; + i = (item[i + 1] && item[i + 1].v === '(') ? schemaSkipParens(item, i + 1) : i + 1; + continue; + } + if (c.type === 'word' && c.u === 'AUTO_INCREMENT') { + col.identity = true; + i++; + continue; + } + if (c.type === 'word' && c.u === 'AUTOINCREMENT') { + col.identity = true; + i++; + continue; + } + if (c.type === 'word' && c.u === 'COLLATE') { + i += 2; + continue; + } + if (c.type === 'word' && c.u === 'COMMENT') { + i += 2; + continue; + } + if (c.type === 'word' && c.u === 'AS' && item[i + 1] && item[i + 1].v === '(') { + col.computed = true; + i = schemaSkipParens(item, i + 1); + continue; + } + if (c.v === '(') { + i = schemaSkipParens(item, i); + continue; + } + i++; + } + col.span = schemaSpan(nameTok.pos, item[item.length - 1].end); + schemaAddColumn(ctx, entity, col); +} +/* PRIMARY KEY / UNIQUE / FOREIGN KEY / CHECK item inside a table body. */ +function schemaParseTableItem(ctx, entity, item, constraintName) { + if (!item.length) + return; + var i = 0, spanStart = item[0].pos; + if (item[0].type === 'word' && item[0].u === 'CONSTRAINT') { + if (item[1]) + constraintName = schemaUnquote(item[1].v); + i = 2; + } + var head = item[i]; + if (!head || head.type !== 'word') { + schemaParseColumnItem(ctx, entity, item, constraintName); + return; + } + var u = head.u; + if (u === 'PRIMARY' || u === 'UNIQUE') { + var kind = u === 'UNIQUE' ? 'unique' : 'pk'; + var j = i + 1; + if (item[j] && item[j].u === 'KEY') + j++; + if (u === 'UNIQUE' && item[j] && (item[j].u === 'INDEX')) + j++; + if (item[j] && (item[j].u === 'CLUSTERED' || item[j].u === 'NONCLUSTERED')) + j++; + var cols = schemaParseColumns(item, j); + if (!cols) { + schemaIssue(ctx, 'warning', 'schema_unparsed_statement', 'Could not read the column list of a ' + u + ' constraint on "' + entity.name + '".', schemaSpan(spanStart, item[item.length - 1].end)); + return; + } + var key = { kind: kind, columns: cols.names, name: constraintName, + span: schemaSpan(spanStart, item[item.length - 1].end) }; + schemaAddKey(entity, key); + if (kind === 'pk') + schemaMarkPrimaryKey(entity, cols.names); + else + schemaMarkUnique(entity, cols.names); + return; + } + if (u === 'FOREIGN') { + var k = i + 1; + if (item[k] && item[k].u === 'KEY') + k++; + var fkCols = schemaParseColumns(item, k); + if (!fkCols || !item[fkCols.end] || item[fkCols.end].u !== 'REFERENCES') { + schemaIssue(ctx, 'warning', 'schema_unparsed_statement', 'Could not read a FOREIGN KEY constraint on "' + entity.name + '".', schemaSpan(spanStart, item[item.length - 1].end)); + return; + } + var ref = schemaParseReference(item, fkCols.end); + if (!ref) { + schemaIssue(ctx, 'warning', 'schema_unparsed_statement', 'Could not read the REFERENCES target of a FOREIGN KEY on "' + entity.name + '".', schemaSpan(spanStart, item[item.length - 1].end)); + return; + } + schemaAddKey(entity, { kind: 'fk', columns: fkCols.names, name: constraintName, + referenced: ref.target, onDelete: ref.onDelete, + onUpdate: ref.onUpdate, deferrable: ref.deferrable, + span: schemaSpan(spanStart, item[item.length - 1].end) }); + return; + } + if (u === 'CHECK' || u === 'PERIOD' || u === 'LIKE' || u === 'INHERITS' || u === 'PARTITION' || + u === 'DISTRIBUTE' || u === 'ORGANIZE' || u === 'EXCLUDE' || u === 'INDEX' || u === 'KEY' || + u === 'FULLTEXT' || u === 'SPATIAL') { + return; + } + schemaParseColumnItem(ctx, entity, item, constraintName); +} +function schemaParseCreateTable(ctx, toks) { + var i = 1; + while (i < toks.length && toks[i].type === 'word' && + (toks[i].u === 'TEMP' || toks[i].u === 'TEMPORARY' || toks[i].u === 'GLOBAL' || + toks[i].u === 'LOCAL' || toks[i].u === 'UNLOGGED' || toks[i].u === 'VIRTUAL')) + i++; + if (!toks[i] || toks[i].u !== 'TABLE') + return false; + i++; + if (toks[i] && toks[i].u === 'IF' && toks[i + 1] && toks[i + 1].u === 'NOT' && toks[i + 2] && toks[i + 2].u === 'EXISTS') + i += 3; + var id = schemaIdent(toks, i); + if (!id) { + schemaIssue(ctx, 'warning', 'schema_unparsed_statement', 'Could not read the table name in a CREATE TABLE statement.', schemaSpan(toks[0].pos, toks[toks.length - 1].end)); + return true; + } + var entity = { + id: schemaNormName(id.parts), + name: id.parts.join('.'), + schema: id.parts.length > 1 ? id.parts.slice(0, -1).join('.') : null, + kind: 'table', + columns: [], + keys: [], + unresolved: false, + span: schemaSpan(toks[0].pos, id.end) + }; + if (toks[id.next] && toks[id.next].v === '(') { + var split = schemaSplitItems(toks, id.next); + split.items.forEach(function (item) { schemaParseTableItem(ctx, entity, item); }); + if (split.end > 0 && toks[split.end - 1]) + entity.span = schemaSpan(toks[0].pos, toks[split.end - 1].end); + } + else { + schemaIssue(ctx, 'info', 'schema_columns_unknown', 'Columns of "' + entity.name + '" are not declared in this DDL (CTAS or LIKE); the entity is shown without attributes.', schemaSpan(id.start, id.end)); + } + schemaAddEntity(ctx, entity); + return true; +} +function schemaParseCreateView(ctx, toks) { + var i = 1; + while (i < toks.length && toks[i].type === 'word' && + (toks[i].u === 'OR' || toks[i].u === 'REPLACE' || toks[i].u === 'MATERIALIZED' || + toks[i].u === 'TEMP' || toks[i].u === 'TEMPORARY')) + i++; + if (!toks[i] || toks[i].u !== 'VIEW') + return false; + i++; + if (toks[i] && toks[i].u === 'IF' && toks[i + 1] && toks[i + 1].u === 'NOT' && toks[i + 2] && toks[i + 2].u === 'EXISTS') + i += 3; + var id = schemaIdent(toks, i); + if (!id) { + schemaIssue(ctx, 'warning', 'schema_unparsed_statement', 'Could not read the view name in a CREATE VIEW statement.', schemaSpan(toks[0].pos, toks[toks.length - 1].end)); + return true; + } + var entity = { + id: schemaNormName(id.parts), + name: id.parts.join('.'), + schema: id.parts.length > 1 ? id.parts.slice(0, -1).join('.') : null, + kind: 'view', + columns: [], + keys: [], + unresolved: false, + span: schemaSpan(toks[0].pos, id.end) + }; + var j = id.next; + if (toks[j] && toks[j].v === '(') { + var cols = schemaParseColumns(toks, j); + if (cols) { + cols.names.forEach(function (name, ordinal) { + entity.columns.push({ name: name, type: '', nullable: true, primaryKey: false, + unique: false, identity: false, generated: false, computed: false, + ordinal: ordinal + 1, span: schemaSpan(toks[j].pos, toks[j].end) }); + }); + j = cols.end; + } + } + if (toks[j] && toks[j].u === 'AS') { + entity.span = schemaSpan(toks[0].pos, toks[j].end); + if (!entity.columns.length) { + schemaIssue(ctx, 'info', 'schema_columns_unknown', 'Columns of view "' + entity.name + '" are not declared in this DDL; the view is shown without attributes.', schemaSpan(id.start, id.end)); + } + } + schemaAddEntity(ctx, entity); + return true; +} +function schemaParseCreateIndex(ctx, toks) { + var i = 1, unique = false; + while (i < toks.length && toks[i].type === 'word' && + (toks[i].u === 'UNIQUE' || toks[i].u === 'CLUSTERED' || toks[i].u === 'NONCLUSTERED' || + toks[i].u === 'COLUMNSTORE')) { + if (toks[i].u === 'UNIQUE') + unique = true; + i++; + } + if (!toks[i] || toks[i].u !== 'INDEX') + return false; + i++; + if (toks[i] && toks[i].u === 'IF' && toks[i + 1] && toks[i + 1].u === 'NOT' && toks[i + 2] && toks[i + 2].u === 'EXISTS') + i += 3; + var name = schemaIdent(toks, i); + if (name) + i = name.next; + if (!toks[i] || toks[i].u !== 'ON') + return false; + var table = schemaIdent(toks, i + 1); + if (!table) + return false; + var cols = []; + if (toks[table.next] && toks[table.next].v === '(') { + var parsed = schemaParseColumns(toks, table.next); + if (parsed) + cols = parsed.names; + } + if (unique && cols.length) { + ctx.pendingIndexes.push({ + tableNorm: schemaNormName(table.parts), + tableName: table.parts.join('.'), + columns: cols, + name: name ? name.parts.join('.') : undefined, + span: schemaSpan(toks[0].pos, toks[toks.length - 1].end) + }); + } + return true; +} +function schemaParseAlterTable(ctx, toks) { + if (!toks[1] || toks[1].u !== 'TABLE') + return false; + var id = schemaIdent(toks, 2); + if (!id) + return false; + var entity = ctx.byKey[schemaNormName(id.parts)]; + var i = id.next; + while (i < toks.length) { + if (toks[i].u !== 'ADD') { + /* ALTER/DROP/etc. actions do not change the declared entity model. */ + while (i < toks.length && !(toks[i].v === ',' && true)) + i++; + if (toks[i] && toks[i].v === ',') { + i++; + continue; + } + break; + } + i++; + if (toks[i] && toks[i].u === 'COLUMN') + i++; + /* Collect one ADD item up to the next depth-0 comma. */ + var item = [], depth = 0; + while (i < toks.length) { + var t = toks[i]; + if (t.v === '(') + depth++; + else if (t.v === ')') + depth = Math.max(0, depth - 1); + if (depth === 0 && t.v === ',') + break; + item.push(t); + i++; + } + if (!item.length) + continue; + if (!entity) { + schemaIssue(ctx, 'warning', 'schema_alter_unknown_table', 'ALTER TABLE targets "' + id.parts.join('.') + '", which is not defined in this DDL; the change is not applied.', schemaSpan(item[0].pos, item[item.length - 1].end)); + if (toks[i] && toks[i].v === ',') + i++; + continue; + } + var head = item[0]; + if (head.type === 'word' && (head.u === 'CONSTRAINT' || head.u === 'PRIMARY' || + head.u === 'UNIQUE' || head.u === 'FOREIGN' || head.u === 'CHECK')) { + schemaParseTableItem(ctx, entity, item); + } + else { + schemaParseColumnItem(ctx, entity, item); + } + if (toks[i] && toks[i].v === ',') + i++; + } + return true; +} +function schemaParseStatement(ctx, toks) { + var head = toks[0]; + if (!head || head.type !== 'word') { + schemaIssue(ctx, 'info', 'schema_ignored_statement', 'Statement is not a schema definition and was ignored.', schemaSpan(head ? head.pos : 0, toks[toks.length - 1].end)); + return; + } + if (head.u === 'CREATE') { + var i = 1; + if (toks[i] && toks[i].u === 'OR') + i++; + if (toks[i] && toks[i].u === 'REPLACE') + i++; + if (toks[i] && (toks[i].u === 'INDEX' || toks[i].u === 'UNIQUE')) { + if (schemaParseCreateIndex(ctx, toks)) + return; + } + var kind = toks[i] ? toks[i].u : ''; + if (kind === 'TABLE') { + schemaParseCreateTable(ctx, toks); + return; + } + if (kind === 'VIEW') { + schemaParseCreateView(ctx, toks); + return; + } + if (SCHEMA_IGNORED_CREATE[kind]) + return; + if (kind) + schemaIssue(ctx, 'info', 'schema_ignored_statement', 'CREATE ' + kind + ' is not part of the ERD schema model and was ignored.', schemaSpan(head.pos, toks[toks.length - 1].end)); + return; + } + if (head.u === 'ALTER') { + if (schemaParseAlterTable(ctx, toks)) + return; + return; + } + /* SET / USE / GO / INSERT / … are outside the schema model. */ +} +/* Apply pending UNIQUE INDEX declarations once every entity is known. */ +function schemaApplyIndexes(ctx) { + ctx.pendingIndexes.forEach(function (index) { + var entity = ctx.byKey[index.tableNorm]; + if (!entity) + return; /* defined nowhere; not an ERD claim */ + if (entity.unresolved) + return; + entity.keys.push({ kind: 'unique', columns: index.columns, name: index.name, + span: index.span }); + schemaMarkUnique(entity, index.columns); + }); +} +/* True when the referencing column set is covered by any declared primary or + unique key (a unique key whose columns are a subset makes the FK rows + unique, so the relationship is one-to-one). */ +function schemaForeignKeyIsUnique(entity, fkColumns) { + var fk = fkColumns.map(schemaNormColumn); + if (!fk.length) + return false; + return entity.keys.some(function (key) { + if (key.kind === 'fk' || !key.columns.length) + return false; + var keyCols = key.columns.map(schemaNormColumn); + return keyCols.every(function (c) { return fk.indexOf(c) >= 0; }); + }); +} +function schemaEnsureExternal(ctx, ref, span) { + var id = 'external:' + ref.norm; + if (ctx.byKey[id]) + return ctx.byKey[id]; + var entity = { + id: id, + name: ref.name, + schema: null, + kind: 'table', + columns: [], + keys: [], + unresolved: true, + span: span + }; + ctx.byKey[id] = entity; + ctx.entities.push(entity); + return entity; +} +/* Resolve every FOREIGN KEY against the defined entities and derive + relationships. Exact full-name matches win; a unique last-part match is a + labelled heuristic; anything else stays an explicit external entity. */ +function schemaResolve(ctx) { + var relationships = [], relIndex = 0; + ctx.entities.slice().forEach(function (entity) { + if (entity.unresolved) + return; + entity.keys.forEach(function (key) { + if (key.kind !== 'fk' || !key.referenced) + return; + var ref = key.referenced; + var target = ctx.byKey[ref.norm]; + var resolution = 'opaque'; + if (target) { + resolution = 'exact'; + } + else { + var last = schemaNormColumn(ref.norm.split('.').pop() || ''); + var candidates = ctx.entities.filter(function (candidate) { + if (candidate.unresolved) + return false; + var parts = candidate.id.split('.'); + return parts[parts.length - 1] === last; + }); + if (candidates.length === 1) { + target = candidates[0]; + resolution = 'heuristic'; + schemaIssue(ctx, 'warning', 'schema_unresolved_reference', 'Foreign key on "' + entity.name + '" references "' + ref.name + '"; resolved by name only to "' + + target.name + '" — verify schema qualification.', key.span); + } + else if (candidates.length > 1) { + schemaIssue(ctx, 'warning', 'schema_ambiguous_reference', 'Foreign key on "' + entity.name + '" references "' + ref.name + '", which matches ' + candidates.length + + ' tables; the relationship is not drawn.', key.span); + return; + } + } + if (!target) { + target = schemaEnsureExternal(ctx, ref, key.span); + schemaIssue(ctx, 'warning', 'schema_unresolved_reference', 'Foreign key on "' + entity.name + '" references "' + ref.name + '", which is not defined in this DDL; shown as an unresolved entity.', key.span); + } + ref.entityId = target.id; + ref.resolution = resolution; + var unique = schemaForeignKeyIsUnique(entity, key.columns); + var optional = key.columns.some(function (name) { + var col = entity.columns.filter(function (c) { return schemaNormColumn(c.name) === schemaNormColumn(name); })[0]; + return !col || col.nullable; + }); + var fromColumns = ref.columns.length ? ref.columns : target.keys + .filter(function (k) { return k.kind === 'pk'; }) + .map(function (k) { return k.columns; })[0] || []; + relationships.push({ + id: 'rel:' + (relIndex++), + fromId: target.id, + toId: entity.id, + fromColumns: fromColumns, + toColumns: key.columns, + cardinality: unique ? 'one-to-one' : 'one-to-many', + optional: optional, + unique: unique, + name: key.name, + resolution: resolution, + span: key.span + }); + }); + }); + return relationships; +} +function schemaStats(result) { + var tables = 0, views = 0, columns = 0, unresolved = 0; + result.entities.forEach(function (entity) { + if (entity.unresolved) + unresolved++; + else if (entity.kind === 'view') + views++; + else + tables++; + columns += entity.columns.length; + }); + return { tables: tables, views: views, columns: columns, + relationships: result.relationships.length, unresolved: unresolved }; +} +/* Parse DDL text into the schema model. Declared constraints only. */ +function parseSchema(text) { + var source = String(text == null ? '' : text); + var toks = tokenize(source); + var ctx = { text: source, entities: [], byKey: {}, + diagnostics: (toks.diagnostics || []).slice(), + pendingIndexes: [] }; + if (source.trim()) { + schemaStatements(toks).forEach(function (statement) { + schemaParseStatement(ctx, statement); + }); + schemaApplyIndexes(ctx); + } + else { + ctx.diagnostics.push({ severity: 'info', code: 'schema_empty', + message: 'Paste or import DDL to draw an entity relationship diagram.', + span: null, scope: 'document' }); + } + var relationships = schemaResolve(ctx); + var result = { text: source, entities: ctx.entities, + relationships: relationships, + diagnostics: ctx.diagnostics, stats: null }; + result.stats = schemaStats(result); + return result; +} +//# sourceMappingURL=schema.js.map \ No newline at end of file diff --git a/dist/src/schema.js.map b/dist/src/schema.js.map new file mode 100644 index 0000000..b4f2999 --- /dev/null +++ b/dist/src/schema.js.map @@ -0,0 +1 @@ +{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/ui/erd-page.js b/dist/src/ui/erd-page.js new file mode 100644 index 0000000..1be376a --- /dev/null +++ b/dist/src/ui/erd-page.js @@ -0,0 +1,880 @@ +"use strict"; +/* proc>flow v2.1.0 — ERD page controller. + Parses schema DDL into the shared schema IR and draws an entity map of + declared tables, views, and foreign keys. Declared constraints only: this + page never infers a relationship from query text. */ +(function () { + if (typeof document === 'undefined') + return; + var $ = function (id) { return document.getElementById(id); }; + var sql = $('erd-sql'), gutter = $('erd-gutter'), msg = $('erd-msg'), cardsHost = $('erd-cards'), overlay = $('erd-overlay'), canvas = $('erd-canvas'), space = $('erd-space'), empty = $('erd-empty'), mermaidOut = $('erd-mermaid-out'), inspector = $('erd-inspector'), largeNotice = $('erd-large-notice'), findInput = $('erd-find'), findCount = $('erd-find-count'), compactInput = $('erd-compact'); + var result = null; + var cardEls = {}; + var adjacency = {}; + var relCounts = {}; + var selectedId = null; + var renderSeq = 0; + var compactMode = false, compactTouched = false; + var findMatches = [], findIndex = 0; + var panning = false, panStartX = 0, panStartY = 0, panStartScrollLeft = 0, panStartScrollTop = 0, didPan = false; + var dragMode = null, dragCardId = null, dragBaseX = 0, dragBaseY = 0, dragLastDx = 0, dragLastDy = 0; + var cardOffsets = {}; + var overlayRaf = 0; + function drawGutter() { + if (!gutter || !sql) + return; + var lines = sql.value.split('\n').length, out = ''; + for (var i = 1; i <= lines; i++) + out += (i > 1 ? '\n' : '') + i; + gutter.textContent = out; + gutter.scrollTop = sql.scrollTop; + } + function setStat(id, value) { + var el = $(id); + if (el) + el.textContent = String(value); + } + function showDiagnostics() { + if (!msg || !result) + return; + msg.textContent = ''; + msg.classList.remove('show', 'warn'); + var list = result.diagnostics || []; + if (!list.length) + return; + var errors = list.filter(function (d) { return d.severity === 'error'; }).length; + msg.classList.add('show'); + if (!errors) + msg.classList.add('warn'); + list.forEach(function (d) { + var line = document.createElement('span'); + line.className = 'diag' + (d.severity === 'info' ? ' info' : ''); + line.textContent = d.message + (d.span ? ' (' + d.span.start + '–' + d.span.end + ')' : ''); + msg.appendChild(line); + }); + } + function compactSummary(entity) { + var fkColumns = {}, pkCount = 0; + entity.keys.forEach(function (key) { + if (key.kind === 'pk') + pkCount++; + if (key.kind === 'fk') + key.columns.forEach(function (name) { + fkColumns[name.toUpperCase()] = 1; + }); + }); + return entity.columns.length + ' cols \u00b7 ' + pkCount + ' PK \u00b7 ' + + Object.keys(fkColumns).length + ' FK'; + } + function buildCard(entity) { + var card = document.createElement('article'); + card.className = 'erd-card' + (entity.unresolved ? ' unresolved' : '') + + (entity.kind === 'view' ? ' erd-view' : '') + (compactMode ? ' compact' : ''); + card.setAttribute('data-entity-id', entity.id); + var head = document.createElement('header'); + var kind = document.createElement('span'); + kind.className = 'erd-kind'; + kind.textContent = entity.unresolved ? 'external' : entity.kind; + var title = document.createElement('h3'); + title.textContent = entity.name; + head.appendChild(kind); + head.appendChild(title); + var count = relCounts[entity.id] || 0; + if (count) { + var badge = document.createElement('span'); + badge.className = 'erd-relcount'; + badge.title = count + ' declared relationship' + (count === 1 ? '' : 's'); + badge.textContent = String(count); + head.appendChild(badge); + } + card.appendChild(head); + if (compactMode) { + var summary = document.createElement('p'); + summary.className = 'erd-summary'; + summary.textContent = compactSummary(entity); + card.appendChild(summary); + } + else { + var list = document.createElement('ul'); + list.className = 'erd-cols'; + if (entity.columns.length) { + var frag = document.createDocumentFragment(); + entity.columns.forEach(function (column) { + var row = document.createElement('li'); + var name = document.createElement('span'); + name.className = 'erd-col-name'; + name.textContent = column.name; + var type = document.createElement('span'); + type.className = 'erd-col-type'; + type.textContent = column.type || '—'; + type.title = column.type || 'no declared type'; + var flags = document.createElement('span'); + flags.className = 'erd-badges'; + erdColumnKeys(entity, column).forEach(function (key) { + var tag = document.createElement('b'); + tag.className = 'erd-badge erd-badge-' + key.toLowerCase(); + tag.textContent = key; + flags.appendChild(tag); + }); + if (column.identity) { + var idTag = document.createElement('b'); + idTag.className = 'erd-badge erd-badge-id'; + idTag.textContent = 'ID'; + idTag.title = 'identity / auto-increment'; + flags.appendChild(idTag); + } + if (column.generated || column.computed) { + var genTag = document.createElement('b'); + genTag.className = 'erd-badge erd-badge-gen'; + genTag.textContent = column.computed ? 'COMP' : 'GEN'; + genTag.title = column.computed ? 'computed column' : 'generated column'; + flags.appendChild(genTag); + } + if (!column.nullable) { + var nnTag = document.createElement('b'); + nnTag.className = 'erd-badge erd-badge-nn'; + nnTag.textContent = 'NN'; + nnTag.title = 'not null'; + flags.appendChild(nnTag); + } + row.appendChild(name); + row.appendChild(type); + row.appendChild(flags); + frag.appendChild(row); + }); + list.appendChild(frag); + } + else { + var none = document.createElement('li'); + none.className = 'erd-no-cols'; + none.textContent = entity.unresolved ? 'referenced but not declared' : 'no declared columns'; + list.appendChild(none); + } + card.appendChild(list); + } + card.tabIndex = 0; + card.addEventListener('click', function () { + selectEntity(selectedId === entity.id ? null : entity.id); + }); + card.addEventListener('keydown', function (event) { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + selectEntity(selectedId === entity.id ? null : entity.id); + } + }); + card.addEventListener('dblclick', function (event) { + event.preventDefault(); + if (cardOffsets[entity.id]) { + delete cardOffsets[entity.id]; + card.style.transform = ''; + card.classList.remove('moved'); + scheduleOverlay(); + } + }); + return card; + } + function selectEntity(id) { + selectedId = id; + var related = {}; + if (selectedId) { + (adjacency[selectedId] || []).forEach(function (other) { related[other] = 1; }); + } + Object.keys(cardEls).forEach(function (entityId) { + var card = cardEls[entityId]; + card.classList.toggle('focus', entityId === selectedId); + card.classList.toggle('related', !!selectedId && entityId !== selectedId && related[entityId] === 1); + card.classList.toggle('dim', !!selectedId && entityId !== selectedId && related[entityId] !== 1); + }); + renderInspector(); + drawOverlay(); + } + /* Find highlights matches and jumps between them (Enter / Shift+Enter). */ + function applyFind(jump) { + Object.keys(cardEls).forEach(function (id) { cardEls[id].classList.remove('match'); }); + findMatches = []; + var query = (findInput ? String(findInput.value || '') : '').trim().toUpperCase(); + if (!query || !result) { + if (findCount) + findCount.textContent = ''; + return; + } + result.entities.forEach(function (entity) { + if (entity.name.toUpperCase().indexOf(query) >= 0 || entity.id.indexOf(query) >= 0) { + findMatches.push(entity.id); + } + }); + findMatches.forEach(function (id) { + if (cardEls[id]) + cardEls[id].classList.add('match'); + }); + if (findCount) { + findCount.textContent = findMatches.length + ? findMatches.length + ' match' + (findMatches.length === 1 ? '' : 'es') + : '0 matches'; + } + if (jump && findMatches.length) { + var id = findMatches[findIndex % findMatches.length]; + var card = cardEls[id]; + if (card && card.scrollIntoView) { + card.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' }); + } + } + } + /* Selection inspector: every declared FK touching the selected entity, with + direction, column mapping, cardinality, and constraint name. Never inferred. */ + function renderInspector() { + if (!inspector || !result) + return; + inspector.textContent = ''; + var selected = selectedId ? result.entities.filter(function (entity) { + return entity.id === selectedId; + })[0] : null; + if (!selected) { + inspector.hidden = true; + return; + } + inspector.hidden = false; + var head = document.createElement('header'); + var title = document.createElement('h4'); + title.textContent = selected.name; + var clear = document.createElement('button'); + clear.type = 'button'; + clear.className = 'erd-inspector-close'; + clear.textContent = 'Clear'; + clear.addEventListener('click', function () { selectEntity(null); }); + head.appendChild(title); + head.appendChild(clear); + inspector.appendChild(head); + function group(label, rows, outgoing) { + if (!rows.length) + return; + var heading = document.createElement('p'); + heading.className = 'erd-inspector-group'; + heading.textContent = label; + inspector.appendChild(heading); + rows.forEach(function (rel) { + var otherId = outgoing ? rel.fromId : rel.toId; + var other = result.entities.filter(function (entity) { + return entity.id === otherId; + })[0]; + var row = document.createElement('button'); + row.type = 'button'; + row.className = 'erd-rel-row'; + var arrow = document.createElement('span'); + arrow.className = 'erd-rel-arrow'; + arrow.textContent = outgoing ? '\u2192' : '\u2190'; + var name = document.createElement('span'); + name.className = 'erd-rel-name'; + name.textContent = other ? other.name : otherId; + var detail = document.createElement('span'); + detail.className = 'erd-rel-detail'; + detail.textContent = rel.toColumns.join(',') + ' \u2192 ' + + (rel.fromColumns.join(',') || 'PK'); + var meta = document.createElement('span'); + meta.className = 'erd-rel-meta'; + meta.textContent = (rel.cardinality === 'one-to-one' ? '1:1' : '1:N') + + (rel.optional ? ' optional' : '') + (rel.name ? ' \u00b7 ' + rel.name : ''); + row.appendChild(arrow); + row.appendChild(name); + row.appendChild(detail); + row.appendChild(meta); + row.title = 'Select ' + name.textContent; + row.addEventListener('click', function () { + selectEntity(otherId); + var card = cardEls[otherId]; + if (card && card.scrollIntoView) { + card.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' }); + } + }); + inspector.appendChild(row); + }); + } + group('References (FK out)', result.relationships.filter(function (rel) { + return rel.toId === selected.id; + }), true); + group('Referenced by (FK in)', result.relationships.filter(function (rel) { + return rel.fromId === selected.id && rel.toId !== selected.id; + }), false); + if (!result.relationships.some(function (rel) { + return rel.fromId === selected.id || rel.toId === selected.id; + })) { + var none = document.createElement('p'); + none.className = 'erd-inspector-empty'; + none.textContent = 'No declared foreign keys.'; + inspector.appendChild(none); + } + } + /* Adjacency and degree are precomputed so selecting a hub table in an + 800-table estate stays O(degree) instead of O(tables × relationships). */ + function renderCards() { + if (!cardsHost || !result) + return; + adjacency = {}; + relCounts = {}; + result.relationships.forEach(function (rel) { + (adjacency[rel.fromId] = adjacency[rel.fromId] || []).push(rel.toId); + (adjacency[rel.toId] = adjacency[rel.toId] || []).push(rel.fromId); + relCounts[rel.fromId] = (relCounts[rel.fromId] || 0) + 1; + relCounts[rel.toId] = (relCounts[rel.toId] || 0) + 1; + }); + if (!compactTouched && result.entities.length > 150) { + compactMode = true; + if (compactInput) + compactInput.checked = true; + } + cardsHost.classList.toggle('compact', compactMode); + if (Object.keys(cardOffsets).length) { + var keptOffsets = {}; + result.entities.forEach(function (entity) { + if (cardOffsets[entity.id]) + keptOffsets[entity.id] = cardOffsets[entity.id]; + }); + cardOffsets = keptOffsets; + } + cardEls = {}; + cardsHost.textContent = ''; + var frag = document.createDocumentFragment(); + result.entities.forEach(function (entity) { + var card = buildCard(entity); + var offset = cardOffsets[entity.id]; + if (offset && (offset.x || offset.y)) { + card.style.transform = 'translate(' + offset.x + 'px,' + offset.y + 'px)'; + card.classList.add('moved'); + } + cardEls[entity.id] = card; + frag.appendChild(card); + }); + cardsHost.appendChild(frag); + if (empty) + empty.hidden = result.entities.length > 0; + applyZoomLayout(); + } + var cachedCanvasRect = null; + function entityBox(entityId) { + var el = cardEls[entityId], c = canvas; + if (!el || !c) + return null; + var r = el.getBoundingClientRect(); + if (!r.width && !r.height) + return null; + var cr = cachedCanvasRect || c.getBoundingClientRect(); + var left = r.left - cr.left + c.scrollLeft, top = r.top - cr.top + c.scrollTop; + return { left: left, top: top, right: left + r.width, bottom: top + r.height, + cx: left + r.width / 2, cy: top + r.height / 2 }; + } + /* Intersection of the line from a box centre toward (tx, ty) with the box + edge, so relationship lines stop at the entity border. */ + function edgePoint(box, tx, ty) { + var dx = tx - box.cx, dy = ty - box.cy; + if (!dx && !dy) + return { x: box.cx, y: box.cy }; + var sx = dx ? Math.abs((box.right - box.left) / 2 / dx) : Infinity; + var sy = dy ? Math.abs((box.bottom - box.top) / 2 / dy) : Infinity; + var s = Math.min(sx, sy); + return { x: box.cx + dx * s, y: box.cy + dy * s }; + } + function svgEl(name, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', name); + if (attrs) + Object.keys(attrs).forEach(function (k) { el.setAttribute(k, String(attrs[k])); }); + return el; + } + function scheduleOverlay() { + if (overlayRaf) + return; + overlayRaf = requestAnimationFrame(function () { + overlayRaf = 0; + drawOverlay(); + }); + } + /* Manual placement: offsets survive re-renders (keyed by entity id) and are + cleared per card by double-click or all at once by Reset layout. */ + function resetLayout() { + cardOffsets = {}; + Object.keys(cardEls).forEach(function (id) { + cardEls[id].style.transform = ''; + cardEls[id].classList.remove('moved'); + }); + scheduleOverlay(); + } + var ERD_MIN_ZOOM = 0.02, ERD_MAX_ZOOM = 2; + function currentZoom() { + if (!canvas) + return 1; + var value = parseFloat(canvas.style.getPropertyValue('--erd-zoom')); + return isNaN(value) ? 1 : value; + } + /* The card stage is laid out once at 100% and scaled with a transform, so + the grid never reflows while zooming (reflowing made repeated Fit clicks + shrink forever). A spacer carries the scaled scroll area. */ + function applyZoomLayout() { + if (!canvas || !cardsHost || !space) + return; + var zoom = currentZoom(); + cardsHost.style.width = canvas.clientWidth + 'px'; + var width = Math.ceil(cardsHost.offsetWidth * zoom) + 40; + var height = Math.ceil(cardsHost.offsetHeight * zoom) + 40; + space.style.width = Math.max(width, canvas.clientWidth) + 'px'; + space.style.height = Math.max(height, canvas.clientHeight) + 'px'; + } + function setZoom(value) { + if (!canvas) + return; + var zoom = Math.max(ERD_MIN_ZOOM, Math.min(ERD_MAX_ZOOM, value)); + canvas.style.setProperty('--erd-zoom', String(zoom)); + canvas.classList.toggle('zoomed-out', zoom < 0.5); + var label = $('erd-zoom-val'); + if (label) + label.textContent = Math.round(zoom * 100) + '%'; + applyZoomLayout(); + drawOverlay(); + } + /* Zoom keeping the point under the cursor fixed. */ + function zoomAt(clientX, clientY, factor) { + if (!canvas) + return; + var from = currentZoom(); + var to = Math.max(ERD_MIN_ZOOM, Math.min(ERD_MAX_ZOOM, from * factor)); + if (to === from) + return; + var rect = canvas.getBoundingClientRect(); + var offsetX = clientX - rect.left, offsetY = clientY - rect.top; + var logicalX = (canvas.scrollLeft + offsetX) / from; + var logicalY = (canvas.scrollTop + offsetY) / from; + setZoom(to); + canvas.scrollLeft = logicalX * to - offsetX; + canvas.scrollTop = logicalY * to - offsetY; + } + function zoomBy(factor) { + if (!canvas) + return; + var rect = canvas.getBoundingClientRect(); + zoomAt(rect.left + canvas.clientWidth / 2, rect.top + canvas.clientHeight / 2, factor); + } + /* Fit the whole estate, or — with a table selected — that table and its + declared neighbours, so the highlighted entity is immediately readable. */ + function fitView() { + if (!result || !canvas) + return; + var ids = selectedId + ? [selectedId].concat(adjacency[selectedId] || []) + : result.entities.map(function (entity) { return entity.id; }); + var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + ids.forEach(function (id) { + var box = entityBox(id); + if (!box) + return; + minX = Math.min(minX, box.left); + minY = Math.min(minY, box.top); + maxX = Math.max(maxX, box.right); + maxY = Math.max(maxY, box.bottom); + }); + if (minX === Infinity) + return; + var pad = 40; + var width = maxX - minX + pad * 2, height = maxY - minY + pad * 2; + var from = currentZoom(); + var to = Math.max(ERD_MIN_ZOOM, Math.min(ERD_MAX_ZOOM, from * Math.min(canvas.clientWidth / width, canvas.clientHeight / height))); + var ratio = to / from; + setZoom(to); + canvas.scrollLeft = (minX + maxX) / 2 * ratio - canvas.clientWidth / 2; + canvas.scrollTop = (minY + maxY) / 2 * ratio - canvas.clientHeight / 2; + } + function drawOverlay() { + if (!overlay || !canvas || !result) + return; + while (overlay.firstChild) + overlay.removeChild(overlay.firstChild); + var width = Math.max(space ? space.scrollWidth : cardsHost.scrollWidth + 40, canvas.clientWidth); + var height = Math.max(space ? space.scrollHeight : cardsHost.scrollHeight + 40, canvas.clientHeight); + overlay.setAttribute('width', String(width)); + overlay.setAttribute('height', String(height)); + overlay.setAttribute('viewBox', '0 0 ' + width + ' ' + height); + cachedCanvasRect = canvas.getBoundingClientRect(); + var boxCache = {}; + function boxOf(id) { + if (!(id in boxCache)) + boxCache[id] = entityBox(id); + return boxCache[id]; + } + result.relationships.forEach(function (rel) { + var from = boxOf(rel.fromId), to = boxOf(rel.toId); + if (!from || !to) + return; + var active = !!selectedId; + var connected = !active || rel.fromId === selectedId || rel.toId === selectedId; + var dash = rel.resolution === 'exact' ? '' : (rel.resolution === 'heuristic' ? '7 4' : '2 4'); + var color = rel.resolution === 'opaque' ? '#e4645e' : + (rel.resolution === 'heuristic' ? '#e8a33d' : '#7ea6e0'); + var d, labelAt, midAt; + if (rel.fromId === rel.toId) { + var loopX = from.right + 10, loopY = from.cy; + d = 'M ' + from.right + ' ' + (from.top + 14) + ' C ' + (loopX + 34) + ' ' + (from.top - 14) + ', ' + + (loopX + 34) + ' ' + (from.bottom + 14) + ', ' + from.right + ' ' + (from.bottom - 14); + labelAt = [{ x: loopX + 30, y: from.top + 6 }, { x: loopX + 30, y: from.bottom - 4 }]; + midAt = { x: loopX + 34, y: loopY }; + } + else { + var p1 = edgePoint(from, to.cx, to.cy), p2 = edgePoint(to, from.cx, from.cy); + var midX = (p1.x + p2.x) / 2; + d = 'M ' + p1.x + ' ' + p1.y + ' C ' + midX + ' ' + p1.y + ', ' + midX + ' ' + p2.y + ', ' + p2.x + ' ' + p2.y; + labelAt = [{ x: p1.x + (p2.x - p1.x) * 0.16, y: p1.y + (p2.y - p1.y) * 0.16 }, + { x: p1.x + (p2.x - p1.x) * 0.84, y: p1.y + (p2.y - p1.y) * 0.84 }]; + midAt = { x: midX, y: (p1.y + p2.y) / 2 }; + } + var path = svgEl('path', { d: d, fill: 'none', stroke: color, + 'stroke-width': active && connected ? 2.6 : (connected ? 2 : 1.4), + 'stroke-dasharray': dash, opacity: active ? (connected ? 0.95 : 0.07) : 0.95, + 'stroke-linecap': 'round' }); + path.setAttribute('data-relationship', rel.id); + overlay.appendChild(path); + if (!active || connected) { + var leftLabel = rel.optional ? '0..1' : '1', rightLabel = rel.unique ? '1' : 'N'; + [{ text: leftLabel, at: labelAt[0] }, { text: rightLabel, at: labelAt[1] }].forEach(function (item) { + var text = svgEl('text', { x: item.at.x, y: item.at.y, fill: color, 'font-size': 10, + 'font-family': 'ui-monospace,Consolas,monospace', + opacity: active ? (connected ? 1 : 0.1) : 1, + 'text-anchor': 'middle', 'dominant-baseline': 'middle' }); + text.textContent = item.text; + overlay.appendChild(text); + }); + } + if (active && connected) { + var label = rel.name || (rel.toColumns.join(',') + ' \u2192 ' + + (rel.fromColumns.join(',') || 'PK')); + var mid = svgEl('text', { x: midAt.x, y: midAt.y, fill: color, 'font-size': 10, + 'font-family': 'ui-monospace,Consolas,monospace', + stroke: '#101b23', 'stroke-width': 3, 'paint-order': 'stroke', + 'text-anchor': 'middle', 'dominant-baseline': 'middle' }); + mid.textContent = label; + overlay.appendChild(mid); + } + }); + /* At estate zoom the card ring scales away; the overlay is unzoomed, so + draw the selection highlight here instead. */ + if (selectedId && currentZoom() < 0.5) { + var ring = boxOf(selectedId); + if (ring) { + overlay.appendChild(svgEl('rect', { x: ring.left - 5, y: ring.top - 5, + width: ring.right - ring.left + 10, height: ring.bottom - ring.top + 10, rx: 6, + fill: 'none', stroke: '#e8a33d', 'stroke-width': 2, 'stroke-dasharray': '7 5' })); + } + } + } + function render() { + if (!sql) + return; + var text = sql.value; + result = parseSchema(text); + setStat('erd-tables', result.stats.tables); + setStat('erd-views', result.stats.views); + setStat('erd-columns', result.stats.columns); + setStat('erd-relationships', result.stats.relationships); + setStat('erd-unresolved', result.stats.unresolved); + setStat('erd-diagnostics', result.diagnostics.length); + selectedId = null; + renderCards(); + renderInspector(); + showDiagnostics(); + applyFind(false); + updateLargeInputNotice(); + if (mermaidOut) + mermaidOut.textContent = toMermaidER(result); + var seq = ++renderSeq; + requestAnimationFrame(function () { + if (seq !== renderSeq) + return; + drawOverlay(); + }); + } + /* Large, exported-estate DDL must not reparse and rebuild hundreds of cards + on every keystroke: auto-draw pauses above the shared local threshold and + resumes when the input shrinks or Refresh is pressed. */ + function updateLargeInputNotice() { + if (!sql) + return false; + var policy = largeInputPolicy(sql.value.length); + if (largeNotice) { + largeNotice.hidden = !policy.large; + if (policy.large) { + largeNotice.textContent = 'Large DDL (' + policy.length.toLocaleString('en-US') + + ' characters). Auto-draw is paused — press Refresh (Ctrl+Enter) or edit below ' + + policy.threshold.toLocaleString('en-US') + ' characters to resume live updates.'; + } + } + return policy.large; + } + function schedule() { + if (updateLargeInputNotice()) + return; + if (scheduleTimer !== null) + clearTimeout(scheduleTimer); + scheduleTimer = setTimeout(render, 220); + } + var scheduleTimer = null; + function tab(which) { + var diagram = $('view-erd-diagram'), mermaid = $('view-erd-mermaid'); + var diagramTab = $('tab-erd-diagram'), mermaidTab = $('tab-erd-mermaid'); + if (!diagram || !mermaid || !diagramTab || !mermaidTab) + return; + var showDiagram = which === 'diagram'; + diagram.classList.toggle('active', showDiagram); + mermaid.classList.toggle('active', !showDiagram); + diagramTab.setAttribute('aria-selected', String(showDiagram)); + mermaidTab.setAttribute('aria-selected', String(!showDiagram)); + if (showDiagram) + requestAnimationFrame(drawOverlay); + } + function flash(btn, word) { + if (!btn) + return; + var old = btn.textContent; + btn.textContent = word; + setTimeout(function () { btn.textContent = old; }, 1400); + } + function copyMermaid() { + var text = mermaidOut ? mermaidOut.textContent : ''; + var done = function () { flash($('btn-erd-copy'), 'Copied'); }; + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(text).then(done, function () { fallbackCopy(text, done); }); + } + else + fallbackCopy(text, done); + } + function fallbackCopy(text, done) { + var area = document.createElement('textarea'); + area.value = text; + area.setAttribute('readonly', ''); + area.style.position = 'absolute'; + area.style.left = '-9999px'; + document.body.appendChild(area); + area.select(); + try { + document.execCommand('copy'); + done(); + } + catch (err) { /* clipboard unavailable */ } + document.body.removeChild(area); + } + if (sql) { + sql.value = ''; + sql.addEventListener('input', schedule); + sql.addEventListener('scroll', function () { if (gutter) + gutter.scrollTop = sql.scrollTop; }); + sql.addEventListener('keydown', function (event) { + if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') { + event.preventDefault(); + render(); + } + }); + } + var sample = $('btn-erd-sample'); + if (sample) + sample.addEventListener('click', function () { + if (!sql) + return; + sql.value = PROCFLOW_ERD_SAMPLE_TSQL; + drawGutter(); + render(); + sql.focus(); + }); + var sampleDb2 = $('btn-erd-sample-db2'); + if (sampleDb2) + sampleDb2.addEventListener('click', function () { + if (!sql) + return; + sql.value = PROCFLOW_ERD_SAMPLE_DB2; + drawGutter(); + render(); + sql.focus(); + }); + var clear = $('btn-erd-clear'); + if (clear) + clear.addEventListener('click', function () { + if (!sql) + return; + sql.value = ''; + drawGutter(); + render(); + sql.focus(); + }); + var draw = $('btn-erd-draw'); + if (draw) + draw.addEventListener('click', render); + var copy = $('btn-erd-copy'); + if (copy) + copy.addEventListener('click', copyMermaid); + var tabDiagram = $('tab-erd-diagram'); + if (tabDiagram) + tabDiagram.addEventListener('click', function () { tab('diagram'); }); + var tabMermaid = $('tab-erd-mermaid'); + if (tabMermaid) + tabMermaid.addEventListener('click', function () { tab('mermaid'); }); + if (findInput) { + findInput.addEventListener('input', function () { findIndex = 0; applyFind(true); }); + findInput.addEventListener('keydown', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + if (findMatches.length) { + findIndex = event.shiftKey + ? (findIndex - 1 + findMatches.length) % findMatches.length + : (findIndex + 1) % findMatches.length; + applyFind(true); + } + } + else if (event.key === 'Escape') { + findInput.value = ''; + findIndex = 0; + applyFind(false); + } + }); + } + if (compactInput) + compactInput.addEventListener('change', function () { + compactTouched = true; + compactMode = !!compactInput.checked; + renderCards(); + applyFind(false); + renderInspector(); + requestAnimationFrame(drawOverlay); + }); + var resetLayoutBtn = $('btn-erd-reset-layout'); + if (resetLayoutBtn) + resetLayoutBtn.addEventListener('click', resetLayout); + var zoomOut = $('erd-z-out'); + if (zoomOut) + zoomOut.addEventListener('click', function () { zoomBy(1 / 1.15); }); + var zoomIn = $('erd-z-in'); + if (zoomIn) + zoomIn.addEventListener('click', function () { zoomBy(1.15); }); + var zoomFit = $('erd-z-fit'); + if (zoomFit) + zoomFit.addEventListener('click', fitView); + var fileInput = $('erd-file-input'); + var importBtn = $('btn-erd-import'); + if (importBtn && fileInput) + importBtn.addEventListener('click', function () { fileInput.click(); }); + if (fileInput) + fileInput.addEventListener('change', function () { + var files = Array.prototype.slice.call(fileInput.files || []); + if (!files.length) + return; + Promise.all(files.map(function (file) { + return file.text(); + })).then(function (texts) { + if (!sql) + return; + var joined = sql.value.trim(); + texts.forEach(function (text) { + joined = (joined ? joined + '\nGO\n' : '') + text; + }); + sql.value = joined; + drawGutter(); + render(); + fileInput.value = ''; + }); + }); + window.addEventListener('resize', function () { + applyZoomLayout(); + requestAnimationFrame(drawOverlay); + }); + if (typeof ResizeObserver !== 'undefined' && cardsHost) { + new ResizeObserver(function () { drawOverlay(); }).observe(cardsHost); + } + /* Drag on empty canvas pans; drag on a card moves that card so crowded + relationships can be separated. Click still selects: a drag shorter than + the threshold never suppresses the click, and a real drag always does. */ + if (canvas) { + canvas.addEventListener('pointerdown', function (event) { + if (event.button !== 0) + return; + var target = event.target; + var cardEl = target && target.closest ? target.closest('.erd-card') : null; + dragMode = cardEl ? 'card' : 'pan'; + dragCardId = cardEl ? cardEl.getAttribute('data-entity-id') : null; + panning = true; + didPan = false; + dragLastDx = 0; + dragLastDy = 0; + panStartX = event.clientX; + panStartY = event.clientY; + panStartScrollLeft = canvas.scrollLeft; + panStartScrollTop = canvas.scrollTop; + if (dragMode === 'card' && dragCardId) { + var offset = cardOffsets[dragCardId] || { x: 0, y: 0 }; + dragBaseX = offset.x; + dragBaseY = offset.y; + if (cardEl) + cardEl.classList.add('moving'); + } + else { + canvas.classList.add('dragging'); + } + }); + document.addEventListener('pointermove', function (event) { + if (!panning) + return; + var dx = event.clientX - panStartX, dy = event.clientY - panStartY; + dragLastDx = dx; + dragLastDy = dy; + if (dragMode === 'card') { + if (Math.abs(dx) > 4 || Math.abs(dy) > 4) + didPan = true; + if (didPan && dragCardId && cardEls[dragCardId]) { + var zoom = currentZoom(); + cardEls[dragCardId].style.transform = + 'translate(' + (dragBaseX + dx / zoom) + 'px,' + (dragBaseY + dy / zoom) + 'px)'; + scheduleOverlay(); + } + return; + } + if (Math.abs(dx) > 6 || Math.abs(dy) > 6) + didPan = true; + canvas.scrollLeft = panStartScrollLeft - dx; + canvas.scrollTop = panStartScrollTop - dy; + }); + var endDrag = function () { + if (!panning) + return; + if (dragMode === 'card' && dragCardId && didPan) { + var endZoom = currentZoom(); + cardOffsets[dragCardId] = { x: dragBaseX + dragLastDx / endZoom, + y: dragBaseY + dragLastDy / endZoom }; + if (cardEls[dragCardId]) { + cardEls[dragCardId].classList.add('moved'); + cardEls[dragCardId].classList.remove('moving'); + } + } + else if (dragCardId && cardEls[dragCardId]) { + cardEls[dragCardId].classList.remove('moving'); + } + panning = false; + dragMode = null; + dragCardId = null; + canvas.classList.remove('dragging'); + }; + document.addEventListener('pointerup', endDrag); + document.addEventListener('pointercancel', endDrag); + canvas.addEventListener('click', function (event) { + if (didPan) { + didPan = false; + event.stopPropagation(); + event.preventDefault(); + } + }, true); + /* Smooth wheel zoom: continuous and cursor-anchored, instead of stepped + button jumps. Trackpad pinch (ctrl+wheel) works through the same path. */ + canvas.addEventListener('wheel', function (event) { + event.preventDefault(); + zoomAt(event.clientX, event.clientY, Math.exp(-event.deltaY * 0.0015)); + }, { passive: false }); + } + document.addEventListener('keydown', function (event) { + if (event.key === 'Escape' && selectedId) + selectEntity(null); + }); + drawGutter(); + render(); + document.documentElement.setAttribute('data-procflow-ready', String(typeof parseSchema === 'function' && typeof toMermaidER === 'function')); +})(); +//# sourceMappingURL=erd-page.js.map \ No newline at end of file diff --git a/dist/src/ui/erd-page.js.map b/dist/src/ui/erd-page.js.map new file mode 100644 index 0000000..f850e46 --- /dev/null +++ b/dist/src/ui/erd-page.js.map @@ -0,0 +1 @@ +{"version":3,"file":"erd-page.js","sourceRoot":"","sources":["../../../src/ui/erd-page.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/ui/splitter.js b/dist/src/ui/splitter.js new file mode 100644 index 0000000..bc851d5 --- /dev/null +++ b/dist/src/ui/splitter.js @@ -0,0 +1,70 @@ +"use strict"; +/* proc>flow v2.1.0 — shared resizable pane divider. + Works on any page with a `.wrap` grid and a `#splitter` element between the + two panes. Pointer, double-click reset, and arrow-key resizing; the width is + session-only and never persisted. */ +(function () { + if (typeof document === 'undefined') + return; + var wrap = document.querySelector('.wrap'); + var splitter = document.getElementById('splitter'); + if (!wrap || !splitter) + return; + var MIN_LEFT = 240, MIN_RIGHT = 260, SPLITTER = 7; + var dragging = false, startX = 0, startLeft = 0; + function leftWidth() { + var pane = wrap.querySelector('.pane'); + return pane ? pane.getBoundingClientRect().width : 0; + } + function setLeft(width) { + var rect = wrap.getBoundingClientRect(); + var max = Math.max(MIN_LEFT, rect.width - MIN_RIGHT - SPLITTER); + var value = Math.max(MIN_LEFT, Math.min(width, max)); + wrap.style.setProperty('--pane-left', value + 'px'); + } + function reset() { + wrap.style.removeProperty('--pane-left'); + } + splitter.addEventListener('pointerdown', function (event) { + if (event.button !== 0) + return; + dragging = true; + startX = event.clientX; + startLeft = leftWidth(); + splitter.classList.add('active'); + event.preventDefault(); + }); + document.addEventListener('pointermove', function (event) { + if (!dragging) + return; + setLeft(startLeft + event.clientX - startX); + }); + var stop = function () { + if (!dragging) + return; + dragging = false; + splitter.classList.remove('active'); + }; + document.addEventListener('pointerup', stop); + document.addEventListener('pointercancel', stop); + splitter.addEventListener('dblclick', reset); + splitter.addEventListener('keydown', function (event) { + if (event.key === 'ArrowLeft') { + event.preventDefault(); + setLeft(leftWidth() - 24); + } + else if (event.key === 'ArrowRight') { + event.preventDefault(); + setLeft(leftWidth() + 24); + } + else if (event.key === 'Home') { + event.preventDefault(); + reset(); + } + }); + window.addEventListener('resize', function () { + if (wrap.style.getPropertyValue('--pane-left')) + setLeft(leftWidth()); + }); +})(); +//# sourceMappingURL=splitter.js.map \ No newline at end of file diff --git a/dist/src/ui/splitter.js.map b/dist/src/ui/splitter.js.map new file mode 100644 index 0000000..7cf25d2 --- /dev/null +++ b/dist/src/ui/splitter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../../src/ui/splitter.ts"],"names":[],"mappings":";AAAA;;;uCAGuC;AACvC,CAAC;IACC,IAAG,OAAO,QAAQ,KAAG,WAAW;QAAE,OAAO;IACzC,IAAI,IAAI,GAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAuB,CAAC;IAC/D,IAAI,QAAQ,GAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACjD,IAAG,CAAC,IAAI,IAAE,CAAC,QAAQ;QAAE,OAAO;IAC5B,IAAI,QAAQ,GAAC,GAAG,EAAE,SAAS,GAAC,GAAG,EAAE,QAAQ,GAAC,CAAC,CAAC;IAC5C,IAAI,QAAQ,GAAC,KAAK,EAAE,MAAM,GAAC,CAAC,EAAE,SAAS,GAAC,CAAC,CAAC;IAC1C,SAAS,SAAS;QAChB,IAAI,IAAI,GAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAA,CAAC,CAAA,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC;IACnD,CAAC;IACD,SAAS,OAAO,CAAC,KAAa;QAC5B,IAAI,IAAI,GAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtC,IAAI,GAAG,GAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAC,IAAI,CAAC,KAAK,GAAC,SAAS,GAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAC,KAAK,GAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,SAAS,KAAK;QACZ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAC,UAAS,KAAmB;QAClE,IAAG,KAAK,CAAC,MAAM,KAAG,CAAC;YAAE,OAAO;QAC5B,QAAQ,GAAC,IAAI,CAAC;QACd,MAAM,GAAC,KAAK,CAAC,OAAO,CAAC;QACrB,SAAS,GAAC,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAC,UAAS,KAAmB;QAClE,IAAG,CAAC,QAAQ;YAAE,OAAO;QACrB,OAAO,CAAC,SAAS,GAAC,KAAK,CAAC,OAAO,GAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAC;QACP,IAAG,CAAC,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAC,KAAK,CAAC;QACf,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAC,KAAK,CAAC,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAC,UAAS,KAAoB;QAC/D,IAAG,KAAK,CAAC,GAAG,KAAG,WAAW,EAAC,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,OAAO,CAAC,SAAS,EAAE,GAAC,EAAE,CAAC,CAAC;QAAC,CAAC;aAC1E,IAAG,KAAK,CAAC,GAAG,KAAG,YAAY,EAAC,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,OAAO,CAAC,SAAS,EAAE,GAAC,EAAE,CAAC,CAAC;QAAC,CAAC;aAChF,IAAG,KAAK,CAAC,GAAG,KAAG,MAAM,EAAC,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAC;QAC/B,IAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC;YAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/tests/schema.js b/dist/tests/schema.js new file mode 100644 index 0000000..e9c5ed3 --- /dev/null +++ b/dist/tests/schema.js @@ -0,0 +1,340 @@ +"use strict"; +/* proc>flow v2.1.0 — ERD / schema foundation fixtures. + DDL parsing across T-SQL, PostgreSQL, DB2, and SQLite: declared keys and + foreign keys only, composite-key grouping, raw type preservation, + conservative unresolved references, source spans, deterministic output, + and the Mermaid erDiagram export. + + After this suite runs, PROCFLOW_SCHEMA_PASS and PROCFLOW_SCHEMA_RESULT gate + the golden suite (tests/tests.ts). */ +(function () { + var results = []; + var mermaidPassed = 0, mermaidTotal = 0; + function record(name, pass, detail) { + results.push({ name: name, pass: pass, detail: pass ? '' : detail }); + } + function recordMermaid(name, pass, detail) { + mermaidTotal++; + if (pass) + mermaidPassed++; + record(name, pass, detail); + } + function has(list, value) { + return (list || []).some(function (v) { return v.toUpperCase() === value.toUpperCase(); }); + } + function entity(result, id) { + return result.entities.filter(function (e) { return e.id === id.toUpperCase(); })[0] || null; + } + function column(result, id, name) { + var e = entity(result, id); + return e && e.columns.filter(function (c) { return c.name.toUpperCase() === name.toUpperCase(); })[0] || null; + } + function key(result, id, kind, columns) { + var e = entity(result, id); + if (!e) + return null; + return e.keys.filter(function (k) { + return k.kind === kind && + k.columns.join('|').toUpperCase() === columns.join('|').toUpperCase(); + })[0] || null; + } + function relationship(result, fromId, toId) { + return result.relationships.filter(function (r) { + return r.fromId.toUpperCase() === fromId.toUpperCase() && + r.toId.toUpperCase() === toId.toUpperCase(); + })[0] || null; + } + function spansValid(result) { + function ok(span) { + return !!span && span.start >= 0 && span.end > span.start && span.end <= result.text.length; + } + return result.entities.every(function (e) { + return ok(e.span) && e.columns.every(function (c) { return ok(c.span); }) && + e.keys.every(function (k) { return ok(k.span); }); + }) && result.relationships.every(function (r) { return ok(r.span); }); + } + var TSQL = [ + 'CREATE TABLE dbo.Student (', + ' StudentId INT IDENTITY(1,1) PRIMARY KEY,', + ' Name NVARCHAR(100) NOT NULL,', + ' MentorId INT NULL,', + ' CONSTRAINT FK_Student_Mentor FOREIGN KEY (MentorId)', + ' REFERENCES dbo.Student (StudentId) ON DELETE SET NULL', + ');', + 'GO', + 'CREATE TABLE dbo.Course (', + ' CourseId INT PRIMARY KEY,', + ' Title NVARCHAR(200) NOT NULL', + ');', + 'CREATE TABLE dbo.Enrollment (', + ' StudentId INT NOT NULL,', + ' CourseId INT NOT NULL,', + ' PRIMARY KEY (StudentId, CourseId),', + ' FOREIGN KEY (StudentId) REFERENCES dbo.Student (StudentId),', + ' FOREIGN KEY (CourseId) REFERENCES dbo.Course (CourseId)', + ');', + 'ALTER TABLE dbo.Student ADD CONSTRAINT UQ_Student_Name UNIQUE (Name);' + ].join('\n'); + var PGSQL = [ + 'CREATE TABLE public.customer (', + ' customer_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,', + ' email text NOT NULL,', + ' CONSTRAINT uq_customer_email UNIQUE (email)', + ');', + 'CREATE TABLE public."Order" (', + ' "Order Id" serial PRIMARY KEY,', + ' "Customer Id" integer NOT NULL REFERENCES public.customer(customer_id) ON DELETE CASCADE,', + ' placed_at timestamp with time zone NOT NULL DEFAULT now(),', + ' total numeric(12,2) GENERATED ALWAYS AS (1) STORED,', + ' note text', + ');', + 'CREATE UNIQUE INDEX uq_order_customer ON public."Order" ("Customer Id");' + ].join('\n'); + var SQLITE = [ + 'CREATE TABLE IF NOT EXISTS gadget (', + ' id INTEGER PRIMARY KEY AUTOINCREMENT,', + ' label VARCHAR(50) NOT NULL UNIQUE,', + ' owner_id INTEGER REFERENCES owner(id),', + ' oddity TYPO_TYPE', + ');', + 'CREATE TABLE owner (id INTEGER PRIMARY KEY);' + ].join('\n'); + var DB2 = [ + 'CREATE TABLE sales (', + ' sale_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' amount DECIMAL(31,0) NOT NULL,', + ' region VARCHAR(10),', + ' PRIMARY KEY (sale_id),', + ' FOREIGN KEY (region) REFERENCES region(code) ON DELETE SET NULL', + ');' + ].join('\n'); + /* ---- T-SQL: declared keys, composite grouping, actions, ALTER ---- */ + try { + var t = parseSchema(TSQL); + var enrollment = key(t, 'DBO.ENROLLMENT', 'pk', ['StudentId', 'CourseId']); + var mentorFk = key(t, 'DBO.STUDENT', 'fk', ['MentorId']); + var studentPk = key(t, 'DBO.STUDENT', 'pk', ['StudentId']); + var studentName = key(t, 'DBO.STUDENT', 'unique', ['Name']); + var selfRel = relationship(t, 'DBO.STUDENT', 'DBO.STUDENT'); + var studentToEnrollment = relationship(t, 'DBO.STUDENT', 'DBO.ENROLLMENT'); + var courseToEnrollment = relationship(t, 'DBO.COURSE', 'DBO.ENROLLMENT'); + record('v2.1.0 T-SQL tables, composite PK, and declared FK relationships', t.stats.tables === 3 && t.stats.views === 0 && t.stats.columns === 7 && + t.stats.relationships === 3 && t.stats.unresolved === 0 && + !!enrollment && !!studentPk && !!studentName && !!mentorFk && + !!selfRel && selfRel.optional === true && selfRel.cardinality === 'one-to-many' && + !!studentToEnrollment && studentToEnrollment.optional === false && + studentToEnrollment.toColumns.join(',') === 'StudentId' && + !!courseToEnrollment && courseToEnrollment.resolution === 'exact' && + mentorFk.onDelete === 'SET NULL' && + !t.diagnostics.some(function (d) { return d.severity === 'error'; }), { stats: t.stats, diagnostics: t.diagnostics, keys: entity(t, 'DBO.ENROLLMENT') }); + record('v2.1.0 T-SQL identity, NOT NULL, and composite column flags', !!column(t, 'DBO.STUDENT', 'StudentId') && column(t, 'DBO.STUDENT', 'StudentId').identity === true && + column(t, 'DBO.STUDENT', 'StudentId').primaryKey === true && + column(t, 'DBO.STUDENT', 'StudentId').nullable === false && + column(t, 'DBO.STUDENT', 'MentorId').nullable === true && + column(t, 'DBO.ENROLLMENT', 'StudentId').primaryKey === true && + column(t, 'DBO.ENROLLMENT', 'CourseId').primaryKey === true && + column(t, 'DBO.STUDENT', 'Name').type === 'NVARCHAR(100)', entity(t, 'DBO.STUDENT')); + record('v2.1.0 schema spans stay inside the source DDL', spansValid(t), t); + record('v2.1.0 DDL parsing is deterministic', JSON.stringify(t) === JSON.stringify(parseSchema(TSQL)), t); + } + catch (err) { + record('v2.1.0 T-SQL tables, composite PK, and declared FK relationships', false, String(err && err.stack || err)); + record('v2.1.0 T-SQL identity, NOT NULL, and composite column flags', false, String(err && err.stack || err)); + record('v2.1.0 schema spans stay inside the source DDL', false, String(err && err.stack || err)); + record('v2.1.0 DDL parsing is deterministic', false, String(err && err.stack || err)); + } + /* ---- PostgreSQL: quoting, serial/identity, generated, unique index ---- */ + try { + var p = parseSchema(PGSQL); + var orderRel = relationship(p, 'PUBLIC.CUSTOMER', 'PUBLIC.ORDER'); + record('v2.1.0 PostgreSQL quoted identifiers, serial, and unique-index one-to-one', p.stats.tables === 2 && p.stats.relationships === 1 && + !!column(p, 'PUBLIC.ORDER', 'Order Id') && + column(p, 'PUBLIC.ORDER', 'Order Id').identity === true && + column(p, 'PUBLIC.ORDER', 'Order Id').primaryKey === true && + column(p, 'PUBLIC.ORDER', 'Customer Id').type === 'integer' && + !!orderRel && orderRel.cardinality === 'one-to-one' && orderRel.optional === false && + orderRel.unique === true && + orderRel.fromColumns.join(',') === 'customer_id' && + orderRel.toColumns.join(',') === 'Customer Id' && + !!key(p, 'PUBLIC.ORDER', 'unique', ['Customer Id']), { stats: p.stats, rel: orderRel, entity: entity(p, 'PUBLIC.ORDER') }); + record('v2.1.0 PostgreSQL raw type fidelity and generated columns', column(p, 'PUBLIC.ORDER', 'placed_at').type === 'timestamp with time zone' && + column(p, 'PUBLIC.ORDER', 'total').type === 'numeric(12,2)' && + column(p, 'PUBLIC.ORDER', 'total').generated === true && + column(p, 'PUBLIC.ORDER', 'total').computed === false, entity(p, 'PUBLIC.ORDER')); + } + catch (err) { + record('v2.1.0 PostgreSQL quoted identifiers, serial, and unique-index one-to-one', false, String(err && err.stack || err)); + record('v2.1.0 PostgreSQL raw type fidelity and generated columns', false, String(err && err.stack || err)); + } + /* ---- SQLite: affinities preserved, inline REFERENCES, AUTOINCREMENT ---- */ + try { + var s = parseSchema(SQLITE); + var ownerRel = relationship(s, 'OWNER', 'GADGET'); + record('v2.1.0 SQLite AUTOINCREMENT, inline REFERENCES, and raw affinity text', s.stats.tables === 2 && s.stats.relationships === 1 && + column(s, 'GADGET', 'id').identity === true && + column(s, 'GADGET', 'label').unique === true && + column(s, 'GADGET', 'label').nullable === false && + column(s, 'GADGET', 'oddity').type === 'TYPO_TYPE' && + !!ownerRel && ownerRel.optional === true && + ownerRel.fromColumns.join(',') === 'id' && ownerRel.toColumns.join(',') === 'owner_id', { stats: s.stats, rel: ownerRel, entity: entity(s, 'GADGET') }); + } + catch (err) { + record('v2.1.0 SQLite AUTOINCREMENT, inline REFERENCES, and raw affinity text', false, String(err && err.stack || err)); + } + /* ---- DB2: generated identity, precise types, unresolved target ---- */ + try { + var d = parseSchema(DB2); + var sales = entity(d, 'SALES'); + var regionRel = relationship(d, 'EXTERNAL:REGION', 'SALES'); + record('v2.1.0 DB2 identity, DECIMAL precision, and explicit unresolved target', d.stats.tables === 1 && d.stats.unresolved === 1 && d.stats.relationships === 1 && + column(d, 'SALES', 'sale_id').identity === true && + column(d, 'SALES', 'sale_id').primaryKey === true && + column(d, 'SALES', 'amount').type === 'DECIMAL(31,0)' && + !!regionRel && regionRel.resolution === 'opaque' && + d.diagnostics.some(function (x) { return x.code === 'schema_unresolved_reference'; }) && + entity(d, 'SALES').unresolved === false, { stats: d.stats, rel: regionRel, diagnostics: d.diagnostics }); + } + catch (err) { + record('v2.1.0 DB2 identity, DECIMAL precision, and explicit unresolved target', false, String(err && err.stack || err)); + } + /* ---- Views and unknown-column honesty ---- */ + try { + var v = parseSchema([ + 'CREATE VIEW dbo.vActive (Id, Name) AS SELECT Id, Name FROM dbo.Student;', + 'CREATE VIEW dbo.vUnknown AS SELECT 1;' + ].join('\n')); + var known = entity(v, 'DBO.VACTIVE'), unknown = entity(v, 'DBO.VUNKNOWN'); + record('v2.1.0 views keep declared columns and report unknown ones', v.stats.tables === 0 && v.stats.views === 2 && + !!known && known.kind === 'view' && known.columns.length === 2 && known.keys.length === 0 && + !!unknown && unknown.columns.length === 0 && + v.diagnostics.some(function (x) { return x.code === 'schema_columns_unknown'; }), { stats: v.stats, diagnostics: v.diagnostics }); + } + catch (err) { + record('v2.1.0 views keep declared columns and report unknown ones', false, String(err && err.stack || err)); + } + /* ---- Conservative resolution: duplicate, anonymous ALTER, ambiguity ---- */ + try { + var dup = parseSchema([ + 'CREATE TABLE a (id INT PRIMARY KEY);', + 'CREATE TABLE a (id INT PRIMARY KEY);', + 'ALTER TABLE ghost ADD COLUMN x INT;' + ].join('\n')); + record('v2.1.0 duplicate entities and unknown ALTER targets are reported, not merged', dup.entities.length === 1 && + dup.diagnostics.some(function (x) { return x.code === 'schema_duplicate_entity'; }) && + dup.diagnostics.some(function (x) { return x.code === 'schema_alter_unknown_table'; }), { entities: dup.entities, diagnostics: dup.diagnostics }); + var ambiguous = parseSchema([ + 'CREATE TABLE s1.users (id INT PRIMARY KEY);', + 'CREATE TABLE s2.users (id INT PRIMARY KEY);', + 'CREATE TABLE t (id INT PRIMARY KEY, user_id INT REFERENCES users (id));' + ].join('\n')); + record('v2.1.0 ambiguous FK targets are never guessed into an edge', ambiguous.relationships.length === 0 && + ambiguous.diagnostics.some(function (x) { return x.code === 'schema_ambiguous_reference'; }), { relationships: ambiguous.relationships, diagnostics: ambiguous.diagnostics }); + var heuristic = parseSchema([ + 'CREATE TABLE s1.users (id INT PRIMARY KEY);', + 'CREATE TABLE t (id INT PRIMARY KEY, user_id INT REFERENCES users (id));' + ].join('\n')); + var heuristicRel = heuristic.relationships[0]; + record('v2.1.0 unqualified FK targets resolve by name with a labelled warning', !!heuristicRel && heuristicRel.resolution === 'heuristic' && + heuristic.diagnostics.some(function (x) { return x.code === 'schema_unresolved_reference'; }), { relationships: heuristic.relationships, diagnostics: heuristic.diagnostics }); + var empty = parseSchema(''); + record('v2.1.0 empty DDL is reported, not treated as a schema', empty.entities.length === 0 && empty.stats.relationships === 0 && + empty.diagnostics.some(function (x) { return x.code === 'schema_empty'; }), empty); + } + catch (err) { + record('v2.1.0 duplicate entities and unknown ALTER targets are reported, not merged', false, String(err && err.stack || err)); + record('v2.1.0 ambiguous FK targets are never guessed into an edge', false, String(err && err.stack || err)); + record('v2.1.0 unqualified FK targets resolve by name with a labelled warning', false, String(err && err.stack || err)); + record('v2.1.0 empty DDL is reported, not treated as a schema', false, String(err && err.stack || err)); + } + /* ---- Bundled DB2 ERD sample: 8 tables, 4 views, 6 relationships ---- */ + try { + var db2Sample = parseSchema(PROCFLOW_ERD_SAMPLE_DB2); + function hasNoRelationships(id) { + return !db2Sample.relationships.some(function (rel) { + return rel.fromId === id || rel.toId === id; + }); + } + record('v2.1.0 DB2 ERD sample parses 8 tables, 4 views, and 6 relationships', db2Sample.stats.tables === 8 && db2Sample.stats.views === 4 && + db2Sample.stats.relationships === 6 && db2Sample.stats.unresolved === 0 && + !!entity(db2Sample, 'SALES.AUDIT_LOG') && !!entity(db2Sample, 'SALES.APP_SETTINGS') && + hasNoRelationships('SALES.AUDIT_LOG') && hasNoRelationships('SALES.APP_SETTINGS') && + !!relationship(db2Sample, 'SALES.EMPLOYEE', 'SALES.ORDERS') && + !!key(db2Sample, 'SALES.PRODUCT', 'unique', ['sku']) && + !db2Sample.diagnostics.some(function (x) { return x.severity === 'error'; }), { stats: db2Sample.stats, diagnostics: db2Sample.diagnostics }); + } + catch (err) { + record('v2.1.0 DB2 ERD sample parses 8 tables, 4 views, and 6 relationships', false, String(err && err.stack || err)); + } + /* ---- Bulk estate: a generated 300-table chain parses without drops ---- */ + try { + var bulkLines = []; + for (var bulkIndex = 1; bulkIndex <= 300; bulkIndex++) { + bulkLines.push('CREATE TABLE app.t' + bulkIndex + ' ('); + bulkLines.push(' id INT NOT NULL,'); + bulkLines.push(' ref_id INT,'); + bulkLines.push(' CONSTRAINT pk_t' + bulkIndex + ' PRIMARY KEY (id),'); + bulkLines.push(' CONSTRAINT fk_t' + bulkIndex + ' FOREIGN KEY (ref_id) REFERENCES app.t' + + (bulkIndex === 1 ? 300 : bulkIndex - 1) + ' (id)'); + bulkLines.push(');'); + } + var bulkResult = parseSchema(bulkLines.join('\n')); + record('v2.1.0 bulk DDL estate parses without silent drops', bulkResult.stats.tables === 300 && bulkResult.stats.relationships === 300 && + bulkResult.stats.columns === 600 && bulkResult.stats.unresolved === 0 && + !bulkResult.diagnostics.some(function (x) { return x.severity !== 'info'; }) && + spansValid(bulkResult), bulkResult.stats); + } + catch (err) { + record('v2.1.0 bulk DDL estate parses without silent drops', false, String(err && err.stack || err)); + } + /* ---- Mermaid erDiagram export ---- */ + try { + var tm = toMermaidER(parseSchema(TSQL)); + recordMermaid('mermaid erDiagram declares entities with PK/FK/UK attributes', tm.indexOf('erDiagram') === 0 && + tm.indexOf('DBO_STUDENT {') >= 0 && + tm.indexOf('INT StudentId PK') >= 0 && + tm.indexOf('INT MentorId FK') >= 0 && + /DBO_ENROLLMENT \{\n(\s+.*\n)*?\s+\}/.test(tm) && + tm.indexOf('StudentId PK, FK') >= 0 && + tm.indexOf('Name UK') >= 0, tm); + recordMermaid('mermaid relationships encode declared cardinality and optionality', tm.indexOf('DBO_STUDENT o|--o{ DBO_STUDENT : FK_Student_Mentor') >= 0 && + tm.indexOf('DBO_STUDENT ||--o{ DBO_ENROLLMENT') >= 0 && + tm.indexOf('DBO_COURSE ||--o{ DBO_ENROLLMENT') >= 0, tm); + recordMermaid('mermaid provenance comments preserve original names and raw types', tm.indexOf('%% entity DBO_STUDENT = "dbo.Student" (table)') >= 0 && + tm.indexOf('%% column DBO_STUDENT.Name : NVARCHAR(100)') >= 0 && + tm.indexOf('%% relationship DBO_STUDENT -> DBO_ENROLLMENT') >= 0, tm); + var pg = toMermaidER(parseSchema(PGSQL)); + recordMermaid('mermaid sanitizes identifiers and types, keeping raw text in a comment', pg.indexOf('timestamp_with_time_zone placed_at "timestamp with time zone"') >= 0 && + pg.indexOf('Order_Id') >= 0 && + pg.indexOf('PUBLIC_CUSTOMER ||--|| PUBLIC_ORDER') >= 0 && + pg.indexOf('PUBLIC_ORDER {') >= 0, pg); + var db2 = toMermaidER(parseSchema(DB2)); + recordMermaid('mermaid exports unresolved targets as explicit external entities', db2.indexOf('EXTERNAL_REGION') >= 0 && + /EXTERNAL_REGION o\|--o\{ SALES/.test(db2) && + db2.indexOf('%% entity EXTERNAL_REGION = "region"') >= 0, db2); + var collisions = toMermaidER(parseSchema([ + 'CREATE TABLE a.b (id INT PRIMARY KEY);', + 'CREATE TABLE a_b (id INT PRIMARY KEY);' + ].join('\n'))); + var idLines = collisions.split('\n').filter(function (line) { + return /\{/.test(line); + }); + recordMermaid('mermaid entity identifiers are deterministic and collision-free', idLines.length === 2 && idLines[0].trim() !== idLines[1].trim() && + idLines[0].trim() === 'A_B {' && idLines[1].trim() === 'A_B_2 {', collisions); + recordMermaid('mermaid export is deterministic', tm === toMermaidER(parseSchema(TSQL)), tm); + } + catch (err) { + recordMermaid('mermaid erDiagram declares entities with PK/FK/UK attributes', false, String(err && err.stack || err)); + recordMermaid('mermaid relationships encode declared cardinality and optionality', false, String(err && err.stack || err)); + recordMermaid('mermaid provenance comments preserve original names and raw types', false, String(err && err.stack || err)); + recordMermaid('mermaid sanitizes identifiers and types, keeping raw text in a comment', false, String(err && err.stack || err)); + recordMermaid('mermaid exports unresolved targets as explicit external entities', false, String(err && err.stack || err)); + recordMermaid('mermaid entity identifiers are deterministic and collision-free', false, String(err && err.stack || err)); + recordMermaid('mermaid export is deterministic', false, String(err && err.stack || err)); + } + var passed = results.filter(function (r) { return r.pass; }).length; + window.PROCFLOW_SCHEMA_DETAIL = results; + window.PROCFLOW_SCHEMA_RESULT = { passed: passed, total: results.length, + mermaidPassed: mermaidPassed, mermaidTotal: mermaidTotal }; + window.PROCFLOW_SCHEMA_PASS = passed === results.length; +})(); +//# sourceMappingURL=schema.js.map \ No newline at end of file diff --git a/dist/tests/schema.js.map b/dist/tests/schema.js.map new file mode 100644 index 0000000..44108ec --- /dev/null +++ b/dist/tests/schema.js.map @@ -0,0 +1 @@ +{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../tests/schema.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tests/tests.js b/dist/tests/tests.js index c41c77c..f42b314 100644 --- a/dist/tests/tests.js +++ b/dist/tests/tests.js @@ -894,6 +894,19 @@ catch (err) { record('v2 adversarial semantic qualification matrix', false, String(err && err.stack || err)); } + /* v2.1.0: ERD / schema foundation — DDL parsing across the four dialects, + declared keys and foreign keys only, composite-key grouping, conservative + unresolved references, source spans, and the Mermaid erDiagram export run + ahead in tests/schema.ts; gate the whole golden page on them. */ + try { + record('v2.1.0 ERD schema parse and Mermaid erDiagram fixtures', window.PROCFLOW_SCHEMA_PASS === true && + !!window.PROCFLOW_SCHEMA_RESULT && + window.PROCFLOW_SCHEMA_RESULT.passed === window.PROCFLOW_SCHEMA_RESULT.total && + window.PROCFLOW_SCHEMA_RESULT.mermaidPassed === window.PROCFLOW_SCHEMA_RESULT.mermaidTotal, window.PROCFLOW_SCHEMA_DETAIL || window.PROCFLOW_SCHEMA_RESULT); + } + catch (err) { + record('v2.1.0 ERD schema parse and Mermaid erDiagram fixtures', false, String(err && err.stack || err)); + } var passed = results.filter(function (r) { return r.pass; }).length; document.body.className = passed === results.length ? 'pass' : 'fail'; document.getElementById('summary').textContent = passed + '/' + results.length + ' tests passed'; diff --git a/dist/tests/tests.js.map b/dist/tests/tests.js.map index a19cd9d..4271d07 100644 --- a/dist/tests/tests.js.map +++ b/dist/tests/tests.js.map @@ -1 +1 @@ -{"version":3,"file":"tests.js","sourceRoot":"","sources":["../../tests/tests.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tests.js","sourceRoot":"","sources":["../../tests/tests.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index cc2569c..4a239c0 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -22,6 +22,7 @@ and open these pages: - `tests/index.html` — golden, parity, layout, workspace, catalogue, report, scale, and realistic-corpus checks. +- `erd.html` — the schema DDL / entity relationship diagram page. - `tests/fuzz.html` — 400 deterministic mutation cases. - `tests/ui.html` — browser interaction and large-input responsiveness. - `tests/security.html` — hostile-input and strict-rendering checks. diff --git a/docs/metrics-v2.1.0.json b/docs/metrics-v2.1.0.json new file mode 100644 index 0000000..f846096 --- /dev/null +++ b/docs/metrics-v2.1.0.json @@ -0,0 +1,87 @@ +{ + "generator": "proc>flow fixture-corpus metrics (deterministic, fixture-only)", + "formulaVersion": "1.6.0", + "corpus": { + "golden": 109, + "fuzz": 400, + "ui": 31, + "parity": 10, + "layout": 11, + "workspace": 17, + "catalogue": 13, + "columns": 18, + "columnFlow": 15, + "columnLayout": 2, + "report": 12, + "reportGraph": 9, + "reportGraphLayout": 2, + "scalability": 11, + "realistic": 4, + "adversarial": 15 + }, + "attributionRate": 1, + "unresolvedTokenRate": 0.043447, + "tailUnconsumedRate": 0, + "opaqueDynamicRate": 0.005111, + "fallbackRate": 0, + "semanticEdgeCoverage": 1, + "provenanceRate": 1, + "regionDiagnosticToSpanRatio": 1, + "exportParityPassRate": 1, + "exportTraceabilityRate": 1, + "layoutBudgetPassRate": 1, + "workspacePassRate": 1, + "cataloguePassRate": 1, + "columnPassRate": 1, + "columnFlowPassRate": 1, + "columnLayoutPassRate": 1, + "reportPassRate": 1, + "reportGraphPassRate": 1, + "reportGraphLayoutPassRate": 1, + "scalabilityPassRate": 1, + "realisticCorpusByDialect": { + "tsql": 1, + "db2": 1, + "plpgsql": 1, + "sqlite": 1 + }, + "dialectAdversarialSemanticAssertionRate": 1, + "adversarialSemanticAssertions": { + "cases": 15, + "total": 56, + "required": 41, + "forbidden": 15, + "byDialect": { + "tsql": { + "cases": 7, + "assertions": 27, + "required": 20, + "forbidden": 7 + }, + "plpgsql": { + "cases": 4, + "assertions": 13, + "required": 9, + "forbidden": 4 + }, + "db2": { + "cases": 3, + "assertions": 12, + "required": 9, + "forbidden": 3 + }, + "sqlite": { + "cases": 1, + "assertions": 4, + "required": 3, + "forbidden": 1 + } + } + }, + "aggregate": { + "totalTokens": 2739, + "accountedTokens": 2739, + "statementRegions": 278, + "unresolvedRegions": 0 + } +} diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md new file mode 100644 index 0000000..26a83c4 --- /dev/null +++ b/docs/releases/v2.1.0.md @@ -0,0 +1,63 @@ +# ProcFlow v2.1.0 — Entity relationship diagrams + +Released as the `v2.1.0` ERD milestone. ProcFlow now visualises SQL procedures +and declared schema relationships in one local-only package. + +## Highlights + +- **New ERD page (`erd.html`).** Paste or import `CREATE TABLE` / `ALTER TABLE` + DDL and review declared tables, views, columns, primary/unique/foreign keys, + and composite-key grouping. Supported dialects: T-SQL, PostgreSQL, DB2, and + SQLite. Raw column type text is preserved per dialect; entity, column, and + key spans point back into the source DDL. +- **Declared constraints only.** Relationship edges come exclusively from + declared `FOREIGN KEY` constraints. Unqualified targets resolve by name only + with a labelled warning; ambiguous or missing targets stay explicit + (ambiguous is not drawn, missing becomes an external entity). +- **Mermaid `erDiagram` export.** Deterministic output with cardinality + (`||--o{`, `o|--o{`, `||--||`), optionality from FK nullability, `PK`/`FK`/`UK` + markers, and `%%` provenance comments carrying original names and raw types. +- **Estate navigation.** Drag the canvas to pan, drag tables to declutter + relationships, click a table for the FK inspector (column mapping, + cardinality, optionality, constraint name), use Find to jump between + matches, and use smooth wheel zoom or Fit for the whole estate. Boxes + compact automatically above 150 entities, and auto-draw pauses above the + shared 100,000-character large-input threshold. +- **Shared UI polish.** A draggable editor/diagram divider on both pages and a + clear Flowchart/ERD page switcher with an active state. +- **Fixes.** View cards were hidden by a collision with the global `.view` + convention; Fit zoomed out indefinitely on large estates because CSS zoom + reflowed the grid; ERD card selection was broken under real mouse input by + pointer capture retargeting the click. + +## Accuracy and limits + +- Declared constraints only. No relationship is inferred from query text, and + disabled or unenforced constraints are not distinguished from enforced ones + in the DDL text. +- `ALTER TABLE` before its `CREATE TABLE` is reported and not back-applied; + CTAS tables and views without a declared column list report unknown columns. +- Layout is manually adjustable; table positions are session-only and are not + written to the workspace. + +## Verification + +The final local verification recorded for this release includes: + +- `npm run typecheck`, `npm run build`, `npm run test:file`, and + `npm run metrics` passing; +- golden browser assertions on `tests/index.html` passing (220/220), including + the new v2.1.0 schema suite (22/22, 7/7 Mermaid assertions, plus a 300-table + bulk estate fixture); +- 31/31 UI interaction checks and the hostile-input security suite passing; +- ERD smoke checks: an 800-table / 175 KB estate parses in ~90 ms with zero + diagnostics, 800 relationships, auto-compact, Find, FK selection, and Fit at + 4% with the selection ring visible; +- runtime archive structure and local-file startup smoke passing + (`procflow-v2.1.0.zip`). + +## Upgrade and distribution + +The runtime is self-contained. Use `npm run package:runtime` to produce the +versioned ZIP and verify `.release/SHA256SUMS.txt` before distributing it. +Workspaces saved by v2.0.0 remain compatible. diff --git a/erd.html b/erd.html new file mode 100644 index 0000000..44fa7e3 --- /dev/null +++ b/erd.html @@ -0,0 +1,125 @@ + + + + + +proc>flow — ERD + + + + +
+
+

proc>flow

+

Entity relationship diagram

+
+ +
+ + + Local only + +
+ Your DDL stays in this browser. + Procflow does not connect to a database, upload schema definitions, or + send anything to an API. Imported files remain in this tab and are + discarded when it closes. +
+
+
+ + + + +
+
+ +
+
+
Schema DDL +
+ + +
+
+
+
1
+ +
+ +
+
+
+
Tables0
+
Views0
+
Columns0
+
Relations0
+
Unresolved0
+
Diagnostics0
+
+
+
+
+
+ + + +
+
+
+ + +
+
+ + + + +
+
+
+
+
+

Paste DDL on the left. The entity map updates as you type.

+
+
+
+ +
+
+ + + + 100% +
+ +
+
+
erDiagram
+
+
+
+ +
Declared constraints only — relationships come from PRIMARY KEY / UNIQUE / FOREIGN KEY declarations in the DDL, never inferred from queries. Unresolved references stay explicit.
+ + + + + + + + + diff --git a/examples/db2-erd-sample.sql b/examples/db2-erd-sample.sql new file mode 100644 index 0000000..d106f7c --- /dev/null +++ b/examples/db2-erd-sample.sql @@ -0,0 +1,106 @@ +-- proc>flow v2.1.0 — DB2 ERD sample (8 tables, 4 views). +-- Tables EMPLOYEE (2) and ORDERS (4) are related through the employee who +-- took the order. AUDIT_LOG and APP_SETTINGS are standalone: nothing +-- references them and they reference nothing. +-- Every relationship below is a declared FOREIGN KEY. + +CREATE SCHEMA sales; + +CREATE TABLE sales.department ( + dept_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), + dept_name VARCHAR(80) NOT NULL, + location VARCHAR(80), + CONSTRAINT pk_department PRIMARY KEY (dept_id), + CONSTRAINT uq_department_name UNIQUE (dept_name) +); + +CREATE TABLE sales.employee ( + emp_id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY, + dept_id INTEGER NOT NULL, + manager_id INTEGER, + full_name CHARACTER VARYING(120) NOT NULL, + hired_on DATE NOT NULL DEFAULT CURRENT DATE, + salary DECIMAL(11,2) NOT NULL, + CONSTRAINT pk_employee PRIMARY KEY (emp_id), + CONSTRAINT fk_employee_dept FOREIGN KEY (dept_id) + REFERENCES sales.department (dept_id) ON DELETE RESTRICT, + CONSTRAINT fk_employee_manager FOREIGN KEY (manager_id) + REFERENCES sales.employee (emp_id) ON DELETE SET NULL +); + +CREATE TABLE sales.customer ( + customer_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, + customer_name VARCHAR(120) NOT NULL, + email VARCHAR(200) NOT NULL, + country CHAR(2), + CONSTRAINT pk_customer PRIMARY KEY (customer_id) +); + +CREATE TABLE sales.orders ( + order_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, + customer_id INTEGER NOT NULL, + emp_id INTEGER NOT NULL, + order_date TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP, + status VARCHAR(20) NOT NULL, + CONSTRAINT pk_orders PRIMARY KEY (order_id), + CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) + REFERENCES sales.customer (customer_id) ON DELETE CASCADE, + CONSTRAINT fk_orders_employee FOREIGN KEY (emp_id) + REFERENCES sales.employee (emp_id) ON DELETE RESTRICT, + CONSTRAINT ck_orders_status CHECK (status IN ('OPEN','SHIPPED','CANCELLED')) +); + +CREATE TABLE sales.product ( + product_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, + sku VARCHAR(40) NOT NULL, + product_name VARCHAR(160) NOT NULL, + unit_price DECIMAL(9,2) NOT NULL, + CONSTRAINT pk_product PRIMARY KEY (product_id) +); +CREATE UNIQUE INDEX sales.uq_product_sku ON sales.product (sku); + +CREATE TABLE sales.order_line ( + order_id INTEGER NOT NULL, + line_no SMALLINT NOT NULL, + product_id INTEGER NOT NULL, + quantity INTEGER NOT NULL, + unit_price DECIMAL(9,2) NOT NULL, + CONSTRAINT pk_order_line PRIMARY KEY (order_id, line_no), + CONSTRAINT fk_order_line_order FOREIGN KEY (order_id) + REFERENCES sales.orders (order_id) ON DELETE CASCADE, + CONSTRAINT fk_order_line_product FOREIGN KEY (product_id) + REFERENCES sales.product (product_id) ON DELETE RESTRICT +); + +-- Standalone table 7: audit trail, no foreign keys in or out. +CREATE TABLE sales.audit_log ( + log_id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, + message VARCHAR(500) NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP, + CONSTRAINT pk_audit_log PRIMARY KEY (log_id) +); + +-- Standalone table 8: application settings, no foreign keys in or out. +CREATE TABLE sales.app_settings ( + setting_key VARCHAR(100) NOT NULL, + setting_value VARCHAR(500), + CONSTRAINT pk_app_settings PRIMARY KEY (setting_key) +); + +CREATE VIEW sales.v_order_summary (order_id, customer_name, total_value) AS + SELECT o.order_id, c.customer_name, SUM(l.quantity * l.unit_price) + FROM sales.orders o + JOIN sales.customer c ON c.customer_id = o.customer_id + JOIN sales.order_line l ON l.order_id = o.order_id + GROUP BY o.order_id, c.customer_name; + +CREATE VIEW sales.v_employee_directory (emp_id, full_name, dept_name) AS + SELECT e.emp_id, e.full_name, d.dept_name + FROM sales.employee e + JOIN sales.department d ON d.dept_id = e.dept_id; + +CREATE VIEW sales.v_product_catalog (product_id, sku, product_name, unit_price) AS + SELECT product_id, sku, product_name, unit_price FROM sales.product; + +CREATE VIEW sales.v_audit_recent (log_id, message, created_at) AS + SELECT log_id, message, created_at FROM sales.audit_log; diff --git a/index.html b/index.html index ae42210..6ca18eb 100644 --- a/index.html +++ b/index.html @@ -13,6 +13,10 @@

proc>flow

Four dialects of SQL, one flowchart

+
@@ -88,6 +92,9 @@

proc>flow

+ +
@@ -263,6 +270,7 @@

proc>flow

+ diff --git a/package.json b/package.json index f25b0db..c565204 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "procflow", - "version": "2.0.0", + "version": "2.1.0", "private": true, "description": "Local-first SQL control-flow and dependency visualiser", "scripts": { diff --git a/scripts/package-runtime.mjs b/scripts/package-runtime.mjs index fec0a77..62a7537 100644 --- a/scripts/package-runtime.mjs +++ b/scripts/package-runtime.mjs @@ -16,19 +16,21 @@ const runtimeReadme = [ `ProcFlow v${version}`, "", "Open index.html in a current Chrome, Edge, Firefox, or Chromium browser.", - "Keep index.html, styles.css, dist/, and vendor/ together after extracting.", + "Open erd.html for the entity relationship diagram page built from schema DDL.", + "Keep index.html, erd.html, styles.css, dist/, and vendor/ together after extracting.", "The application runs locally in the browser; it does not upload or execute SQL.", "Analysis is heuristic. Verify important findings against the source SQL and database.", "" ].join("\n"); const paths = [ - "index.html", "styles.css", "LICENSE", "vendor/mermaid/mermaid.min.js", + "index.html", "erd.html", "styles.css", "LICENSE", "vendor/mermaid/mermaid.min.js", "vendor/mermaid/LICENSE" ]; const distFiles = [ "app.js", "catalogue.js", "columnflow.js", "columns.js", "dialects.js", - "exporters.js", "ir.js", "lineage.js", "report.js", "tokenizer.js", - "workspace.js", "analysis/confidence.js", "ui/large-input.js" + "exporters.js", "ir.js", "lineage.js", "report.js", "schema.js", + "tokenizer.js", "workspace.js", "erd.js", "analysis/confidence.js", + "ui/large-input.js", "ui/splitter.js", "ui/erd-page.js" ]; for (const file of distFiles) paths.push(`dist/src/${file}`); const missing = paths.filter((path) => !existsSync(join(root, path))); diff --git a/scripts/package-smoke.mjs b/scripts/package-smoke.mjs index 9a6f8c2..267e22f 100644 --- a/scripts/package-smoke.mjs +++ b/scripts/package-smoke.mjs @@ -36,8 +36,10 @@ try { names.push(name); offset = dataStart + size; } - const required = ["index.html", "styles.css", "README.txt", "dist/src/app.js", + const required = ["index.html", "erd.html", "styles.css", "README.txt", + "dist/src/app.js", "dist/src/schema.js", "dist/src/erd.js", "dist/src/analysis/confidence.js", "dist/src/ui/large-input.js", + "dist/src/ui/splitter.js", "dist/src/ui/erd-page.js", "vendor/mermaid/mermaid.min.js"]; const missing = required.filter((name) => !names.includes(name)); if (missing.length) throw new Error(`package missing: ${missing.join(", ")}`); diff --git a/src/erd.ts b/src/erd.ts new file mode 100644 index 0000000..d6e715c --- /dev/null +++ b/src/erd.ts @@ -0,0 +1,280 @@ +/* ===== v2.1.0 ERD export (declared constraints only) ===== + Renders the schema IR as a Mermaid `erDiagram`. Relationships are derived + only from declared FOREIGN KEY constraints; the exporter never infers an + edge. Sanitized identifiers keep Mermaid syntax valid while `%%` provenance + comments preserve the original entity, column, and type names. */ + +function erdToken(value: string): string { + var s=String(value==null?'':value).replace(/[^A-Za-z0-9_]/g,'_') + .replace(/_+/g,'_').replace(/^_+|_+$/g,''); + return s||'unknown'; +} + +function erdTypeToken(value: string): string { + var s=erdToken(value); + return s==='unknown'?'unknown':s; +} + +/* Deterministic, collision-free Mermaid entity identifiers. */ +function erdEntityIds(result: SchemaResult): Record { + var used: Record={}, map: Record={}; + result.entities.forEach(function(entity){ + var base=erdToken(entity.id).toUpperCase(); + if(/^[0-9]/.test(base)) base='E_'+base; + var count=used[base]||0; + var candidate=base; + if(count>0){ + do { count++; candidate=base+'_'+count; } while(used[candidate]); + used[base]=count; + } + used[candidate]=1; + map[entity.id]=candidate; + }); + return map; +} + +function erdHasColumn(key: SchemaKey, column: string): boolean { + var norm=schemaNormColumn(column); + return key.columns.some(function(name){ return schemaNormColumn(name)===norm; }); +} + +function erdColumnKeys(entity: SchemaEntity, column: SchemaColumn): string[] { + var keys: string[]=[]; + var pk=column.primaryKey||entity.keys.some(function(k){ + return k.kind==='pk'&&erdHasColumn(k,column.name); + }); + if(pk) keys.push('PK'); + var fk=entity.keys.some(function(k){ + return k.kind==='fk'&&erdHasColumn(k,column.name); + }); + if(fk) keys.push('FK'); + var uk=column.unique||entity.keys.some(function(k){ + return k.kind==='unique'&&erdHasColumn(k,column.name); + }); + if(uk) keys.push('UK'); + return keys; +} + +/* Cardinality notation, read as "how many per " on the left + and "how many per " on the right: + mandatory one-to-many: PARENT ||--o{ CHILD + optional one-to-many: PARENT o|--o{ + mandatory one-to-one: PARENT ||--|| + optional one-to-one: PARENT o|--|| */ +function erdRelationshipCardinality(rel: SchemaRelationship): {left: string; right: string} { + return {left:rel.optional?'o|':'||',right:rel.unique?'||':'o{'}; +} + +function erdRelationshipLabel(rel: SchemaRelationship, child: SchemaEntity): string { + if(rel.name) return erdToken(rel.name); + var columns=rel.toColumns.length?rel.toColumns:['fk']; + return erdToken('fk_'+child.name.replace(/\./g,'_')+'_'+columns.join('_')); +} + +/* Mermaid `erDiagram` text. Entity blocks come first, then relationship lines, + then the provenance map as comments. Deterministic for a given schema. */ +function toMermaidER(result: SchemaResult): string { + var ids=erdEntityIds(result); + var lines: string[]=['erDiagram']; + lines.push(' %% procflow:erd v1 — declared constraints only; no inferred relationships'); + lines.push(' %% schema tables='+result.stats.tables+' views='+result.stats.views+ + ' columns='+result.stats.columns+' relationships='+result.stats.relationships+ + ' unresolved='+result.stats.unresolved); + result.entities.forEach(function(entity){ + var id=ids[entity.id]; + if(entity.columns.length){ + lines.push(' '+id+' {'); + entity.columns.forEach(function(column){ + var keys=erdColumnKeys(entity,column); + var line=' '+erdTypeToken(column.type)+' '+erdToken(column.name)+ + (keys.length?' '+keys.join(', '):''); + var rawType=(column.type||'').trim(); + if(rawType&&rawType!==erdTypeToken(rawType)){ + line+=' "'+rawType.replace(/"/g,"'")+'"'; + } + lines.push(line); + }); + lines.push(' }'); + } else { + lines.push(' %% '+id+' has no declared columns'+(entity.unresolved?' (unresolved reference)':'')); + } + }); + result.relationships.forEach(function(rel){ + var from=ids[rel.fromId], to=ids[rel.toId]; + if(!from||!to) return; + var child=result.entities.filter(function(entity){ return entity.id===rel.toId; })[0]; + var card=erdRelationshipCardinality(rel); + lines.push(' '+from+' '+card.left+'--'+card.right+' '+to+' : '+ + erdRelationshipLabel(rel,child||({name:'entity'} as SchemaEntity))); + }); + result.entities.forEach(function(entity){ + lines.push(' %% entity '+ids[entity.id]+' = "'+entity.name+'" ('+entity.kind+ + (entity.unresolved?', unresolved':'')+')'); + }); + result.entities.forEach(function(entity){ + entity.columns.forEach(function(column){ + lines.push(' %% column '+ids[entity.id]+'.'+column.name+' : '+ + (column.type||'(no declared type)')); + }); + }); + result.relationships.forEach(function(rel){ + lines.push(' %% relationship '+ids[rel.fromId]+' -> '+ids[rel.toId]+' '+ + rel.cardinality+(rel.optional?' optional':' mandatory')+ + ' ['+(rel.fromColumns.join(',')||'?')+' -> '+rel.toColumns.join(',')+']'+ + (rel.name?' constraint '+rel.name:'')+' resolution='+rel.resolution); + }); + return lines.join('\n'); +} + +/* Bundled ERD samples (local-only, deterministic, and also used by the + v2.1.0 fixtures so the demo path is covered by tests). */ +var PROCFLOW_ERD_SAMPLE_TSQL=[ + '/* Sample retail schema — declared constraints only. */', + 'CREATE TABLE dbo.Customer (', + ' CustomerId INT IDENTITY(1,1) PRIMARY KEY,', + ' Email NVARCHAR(200) NOT NULL UNIQUE,', + ' DisplayName NVARCHAR(120) NOT NULL,', + ' ReferredBy INT NULL,', + ' CONSTRAINT FK_Customer_Referrer FOREIGN KEY (ReferredBy)', + ' REFERENCES dbo.Customer (CustomerId)', + ');', + 'GO', + 'CREATE TABLE dbo.Product (', + ' ProductId INT IDENTITY(1,1) PRIMARY KEY,', + ' Sku VARCHAR(40) NOT NULL,', + ' UnitPrice DECIMAL(12,2) NOT NULL,', + ' CONSTRAINT UQ_Product_Sku UNIQUE (Sku)', + ');', + 'GO', + 'CREATE TABLE dbo.OrderHeader (', + ' OrderId INT IDENTITY(1,1) PRIMARY KEY,', + ' CustomerId INT NOT NULL,', + ' PlacedAt DATETIME2 NOT NULL DEFAULT (SYSUTCDATETIME()),', + ' Status VARCHAR(20) NOT NULL,', + ' CONSTRAINT FK_Order_Customer FOREIGN KEY (CustomerId)', + ' REFERENCES dbo.Customer (CustomerId),', + ' CONSTRAINT UQ_Order_Customer UNIQUE (CustomerId)', + ');', + 'GO', + 'CREATE TABLE dbo.OrderLine (', + ' OrderId INT NOT NULL,', + ' LineNo INT NOT NULL,', + ' ProductId INT NOT NULL,', + ' Quantity INT NOT NULL,', + ' CONSTRAINT PK_OrderLine PRIMARY KEY (OrderId, LineNo),', + ' CONSTRAINT FK_OrderLine_Order FOREIGN KEY (OrderId)', + ' REFERENCES dbo.OrderHeader (OrderId),', + ' CONSTRAINT FK_OrderLine_Product FOREIGN KEY (ProductId)', + ' REFERENCES dbo.Product (ProductId) ON DELETE CASCADE', + ');', + 'GO', + 'CREATE VIEW dbo.vOrderValue (OrderId, LineCount, TotalValue) AS', + ' SELECT OrderId, COUNT(*), SUM(1) FROM dbo.OrderLine GROUP BY OrderId;' +].join('\n'); + +/* 8 tables, 4 views. EMPLOYEE (table 2) and ORDERS (table 4) are related + through the employee who took the order. AUDIT_LOG and APP_SETTINGS are + standalone: nothing references them and they reference nothing. */ +var PROCFLOW_ERD_SAMPLE_DB2=[ + '/* DB2 schema sample — declared constraints only. */', + 'CREATE SCHEMA sales;', + '', + 'CREATE TABLE sales.department (', + ' dept_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10),', + ' dept_name VARCHAR(80) NOT NULL,', + ' location VARCHAR(80),', + ' CONSTRAINT pk_department PRIMARY KEY (dept_id),', + ' CONSTRAINT uq_department_name UNIQUE (dept_name)', + ');', + '', + 'CREATE TABLE sales.employee (', + ' emp_id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY,', + ' dept_id INTEGER NOT NULL,', + ' manager_id INTEGER,', + ' full_name CHARACTER VARYING(120) NOT NULL,', + ' hired_on DATE NOT NULL DEFAULT CURRENT DATE,', + ' salary DECIMAL(11,2) NOT NULL,', + ' CONSTRAINT pk_employee PRIMARY KEY (emp_id),', + ' CONSTRAINT fk_employee_dept FOREIGN KEY (dept_id)', + ' REFERENCES sales.department (dept_id) ON DELETE RESTRICT,', + ' CONSTRAINT fk_employee_manager FOREIGN KEY (manager_id)', + ' REFERENCES sales.employee (emp_id) ON DELETE SET NULL', + ');', + '', + 'CREATE TABLE sales.customer (', + ' customer_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' customer_name VARCHAR(120) NOT NULL,', + ' email VARCHAR(200) NOT NULL,', + ' country CHAR(2),', + ' CONSTRAINT pk_customer PRIMARY KEY (customer_id)', + ');', + '', + 'CREATE TABLE sales.orders (', + ' order_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' customer_id INTEGER NOT NULL,', + ' emp_id INTEGER NOT NULL,', + ' order_date TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,', + ' status VARCHAR(20) NOT NULL,', + ' CONSTRAINT pk_orders PRIMARY KEY (order_id),', + ' CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id)', + ' REFERENCES sales.customer (customer_id) ON DELETE CASCADE,', + ' CONSTRAINT fk_orders_employee FOREIGN KEY (emp_id)', + ' REFERENCES sales.employee (emp_id) ON DELETE RESTRICT,', + ' CONSTRAINT ck_orders_status CHECK (status IN (\'OPEN\',\'SHIPPED\',\'CANCELLED\'))', + ');', + '', + 'CREATE TABLE sales.product (', + ' product_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' sku VARCHAR(40) NOT NULL,', + ' product_name VARCHAR(160) NOT NULL,', + ' unit_price DECIMAL(9,2) NOT NULL,', + ' CONSTRAINT pk_product PRIMARY KEY (product_id)', + ');', + 'CREATE UNIQUE INDEX sales.uq_product_sku ON sales.product (sku);', + '', + 'CREATE TABLE sales.order_line (', + ' order_id INTEGER NOT NULL,', + ' line_no SMALLINT NOT NULL,', + ' product_id INTEGER NOT NULL,', + ' quantity INTEGER NOT NULL,', + ' unit_price DECIMAL(9,2) NOT NULL,', + ' CONSTRAINT pk_order_line PRIMARY KEY (order_id, line_no),', + ' CONSTRAINT fk_order_line_order FOREIGN KEY (order_id)', + ' REFERENCES sales.orders (order_id) ON DELETE CASCADE,', + ' CONSTRAINT fk_order_line_product FOREIGN KEY (product_id)', + ' REFERENCES sales.product (product_id) ON DELETE RESTRICT', + ');', + '', + '/* Standalone table 7: audit trail, no foreign keys in or out. */', + 'CREATE TABLE sales.audit_log (', + ' log_id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' message VARCHAR(500) NOT NULL,', + ' created_at TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,', + ' CONSTRAINT pk_audit_log PRIMARY KEY (log_id)', + ');', + '', + '/* Standalone table 8: application settings, no foreign keys in or out. */', + 'CREATE TABLE sales.app_settings (', + ' setting_key VARCHAR(100) NOT NULL,', + ' setting_value VARCHAR(500),', + ' CONSTRAINT pk_app_settings PRIMARY KEY (setting_key)', + ');', + '', + 'CREATE VIEW sales.v_order_summary (order_id, customer_name, total_value) AS', + ' SELECT o.order_id, c.customer_name, SUM(l.quantity * l.unit_price)', + ' FROM sales.orders o', + ' JOIN sales.customer c ON c.customer_id = o.customer_id', + ' JOIN sales.order_line l ON l.order_id = o.order_id', + ' GROUP BY o.order_id, c.customer_name;', + '', + 'CREATE VIEW sales.v_employee_directory (emp_id, full_name, dept_name) AS', + ' SELECT e.emp_id, e.full_name, d.dept_name', + ' FROM sales.employee e', + ' JOIN sales.department d ON d.dept_id = e.dept_id;', + '', + 'CREATE VIEW sales.v_product_catalog (product_id, sku, product_name, unit_price) AS', + ' SELECT product_id, sku, product_name, unit_price FROM sales.product;', + '', + 'CREATE VIEW sales.v_audit_recent (log_id, message, created_at) AS', + ' SELECT log_id, message, created_at FROM sales.audit_log;' +].join('\n'); diff --git a/src/schema.ts b/src/schema.ts new file mode 100644 index 0000000..528ce60 --- /dev/null +++ b/src/schema.ts @@ -0,0 +1,844 @@ +/* ===== v2.1.0 ERD / schema foundation (DDL → declared constraint model) ===== + Parses CREATE TABLE / CREATE VIEW / CREATE [UNIQUE] INDEX / ALTER TABLE + across T-SQL, PostgreSQL, DB2, and SQLite into a conservative schema IR for + the ERD page. + + Honesty rules (matches the v2 accuracy contract): + - Only declared constraints become relationship edges. Nothing is inferred + from query text. + - Raw column type text is preserved verbatim (dialect types are not + normalized); the ERD treats type as a display attribute. + - Composite keys are grouped and never exploded into per-column edges. + - Unresolved foreign-key targets become explicit external entities with a + region-scoped diagnostic, never a silent drop. + - Entity, column, and key spans point back into the source DDL. + + Views and CTAS tables without a declared column list have unknown columns; + that is reported, not invented. */ + +interface SchemaCtx { + text: string; + entities: SchemaEntity[]; + byKey: Record; + diagnostics: Diagnostic[]; + pendingIndexes: SchemaPendingIndex[]; +} + +interface SchemaPendingIndex { + tableNorm: string; + tableName: string; + columns: string[]; + name?: string; + span: SourceSpan; +} + +interface SchemaIdentParts { + parts: string[]; + start: number; + end: number; + next: number; +} + +interface SchemaReferenceParse { + target: SchemaReference; + onDelete?: string; + onUpdate?: string; + deferrable?: boolean; + end: number; +} + +interface SchemaParsedColumns { + names: string[]; + end: number; +} + +var SCHEMA_IGNORED_CREATE: StringSet = S([ + 'PROCEDURE','PROC','FUNCTION','TRIGGER','SEQUENCE','SCHEMA','DATABASE', + 'TYPE','DOMAIN','EXTENSION','ROLE','USER','LOGIN','SYNONYM','TABLESPACE', + 'SERVER','PUBLICATION','SUBSCRIPTION','POLICY','RULE','AGGREGATE', + 'OPERATOR','CAST','LANGUAGE','COLLATION','STATISTICS','ASSEMBLY','XML', + 'CREDENTIAL','ENDPOINT','EVENT','FULLTEXT','MASTER','MESSAGE','PARTITION', + 'QUEUE','REMOTE','RESOURCE','SECURITY','SERVICE','SYMMETRIC','CERTIFICATE', + 'BROKER','CONTRACT','DIALOG','APPLICATION' +]); + +/* Clause keywords that terminate a column's raw type text. `WITH`/`WITHOUT` + stay out so multi-word types like `timestamp with time zone` and + `character varying` are preserved. */ +var SCHEMA_STOP: StringSet = S([ + 'NOT','NULL','DEFAULT','PRIMARY','UNIQUE','REFERENCES','CHECK','CONSTRAINT', + 'GENERATED','IDENTITY','AUTO_INCREMENT','AUTOINCREMENT','COLLATE','COMMENT', + 'AS','ENCODE','INLINE','PERIOD','ON','MASKED','ROWGUIDCOL','SPARSE', + 'FILESTREAM','PERSISTED','STORED','VIRTUAL' +]); + +function schemaUnquote(part: string): string { + var s=part||''; + if(s.length>=2){ + var a=s.charAt(0), b=s.charAt(s.length-1); + if(a==='['&&b===']') s=s.slice(1,-1).replace(/\]\]/g,']'); + else if(a==='"'&&b==='"') s=s.slice(1,-1).replace(/""/g,'"'); + else if(a==='`'&&b==='`') s=s.slice(1,-1).replace(/``/g,'`'); + } + return s; +} + +function schemaNormName(parts: string[]): string { + return parts.map(schemaUnquote).join('.').replace(/\s+/g,' ').trim().toUpperCase(); +} + +function schemaNormColumn(name: string): string { + return String(name||'').toUpperCase(); +} + +function schemaIssue(ctx: SchemaCtx, severity: DiagnosticSeverity, code: string, + message: string, span: SourceSpan): void { + ctx.diagnostics.push({severity:severity,code:code,message:message, + span:span,scope:'region'}); +} + +function schemaSpan(start: number, end: number): SourceSpan { + return {start:start,end:Math.max(start+1,end)}; +} + +/* A dotted identifier written with any of the supported quoting styles. + Returns unquoted parts so `[dbo].[Order]` and "dbo"."Order" compare equal. */ +function schemaIdent(toks: Token[], i: number): SchemaIdentParts | null { + if(i>=toks.length||toks[i].type!=='word') return null; + var parts=[schemaUnquote(toks[i].v)]; + var start=toks[i].pos, end=toks[i].end, j=i+1; + while(j+1=0&&afterParen>i) typeEnd=item[afterParen-1].end; + i=afterParen; + continue; + } + if(t.v===',') break; + if(typeStart<0) typeStart=t.pos; + typeEnd=t.end; + i++; + } + if(typeStart>=0&&typeEnd>typeStart){ + col.type=ctx.text.slice(typeStart,typeEnd).replace(/\s+/g,' ').trim(); + if(/^(BIGSERIAL|SERIAL|SMALLSERIAL)$/i.test(col.type)) col.identity=true; + } + while(i1?id.parts.slice(0,-1).join('.'):null, + kind:'table', + columns:[], + keys:[], + unresolved:false, + span:schemaSpan(toks[0].pos,id.end) + }; + if(toks[id.next]&&toks[id.next].v==='('){ + var split=schemaSplitItems(toks,id.next); + split.items.forEach(function(item){ schemaParseTableItem(ctx,entity,item); }); + if(split.end>0&&toks[split.end-1]) entity.span=schemaSpan(toks[0].pos,toks[split.end-1].end); + } else { + schemaIssue(ctx,'info','schema_columns_unknown', + 'Columns of "'+entity.name+'" are not declared in this DDL (CTAS or LIKE); the entity is shown without attributes.', + schemaSpan(id.start,id.end)); + } + schemaAddEntity(ctx,entity); + return true; +} + +function schemaParseCreateView(ctx: SchemaCtx, toks: Token[]): boolean { + var i=1; + while(i1?id.parts.slice(0,-1).join('.'):null, + kind:'view', + columns:[], + keys:[], + unresolved:false, + span:schemaSpan(toks[0].pos,id.end) + }; + var j=id.next; + if(toks[j]&&toks[j].v==='('){ + var cols=schemaParseColumns(toks,j); + if(cols){ + cols.names.forEach(function(name,ordinal){ + entity.columns.push({name:name,type:'',nullable:true,primaryKey:false, + unique:false,identity:false,generated:false,computed:false, + ordinal:ordinal+1,span:schemaSpan(toks[j].pos,toks[j].end)}); + }); + j=cols.end; + } + } + if(toks[j]&&toks[j].u==='AS'){ + entity.span=schemaSpan(toks[0].pos,toks[j].end); + if(!entity.columns.length){ + schemaIssue(ctx,'info','schema_columns_unknown', + 'Columns of view "'+entity.name+'" are not declared in this DDL; the view is shown without attributes.', + schemaSpan(id.start,id.end)); + } + } + schemaAddEntity(ctx,entity); + return true; +} + +function schemaParseCreateIndex(ctx: SchemaCtx, toks: Token[]): boolean { + var i=1, unique=false; + while(i=0; }); + }); +} + +function schemaEnsureExternal(ctx: SchemaCtx, ref: SchemaReference, span: SourceSpan): SchemaEntity { + var id='external:'+ref.norm; + if(ctx.byKey[id]) return ctx.byKey[id]; + var entity: SchemaEntity={ + id:id, + name:ref.name, + schema:null, + kind:'table', + columns:[], + keys:[], + unresolved:true, + span:span + }; + ctx.byKey[id]=entity; + ctx.entities.push(entity); + return entity; +} + +/* Resolve every FOREIGN KEY against the defined entities and derive + relationships. Exact full-name matches win; a unique last-part match is a + labelled heuristic; anything else stays an explicit external entity. */ +function schemaResolve(ctx: SchemaCtx): SchemaRelationship[] { + var relationships: SchemaRelationship[]=[], relIndex=0; + ctx.entities.slice().forEach(function(entity){ + if(entity.unresolved) return; + entity.keys.forEach(function(key){ + if(key.kind!=='fk'||!key.referenced) return; + var ref=key.referenced; + var target=ctx.byKey[ref.norm]; + var resolution: SchemaLinkResolution='opaque'; + if(target){ + resolution='exact'; + } else { + var last=schemaNormColumn(ref.norm.split('.').pop()||''); + var candidates=ctx.entities.filter(function(candidate){ + if(candidate.unresolved) return false; + var parts=candidate.id.split('.'); + return parts[parts.length-1]===last; + }); + if(candidates.length===1){ + target=candidates[0]; + resolution='heuristic'; + schemaIssue(ctx,'warning','schema_unresolved_reference', + 'Foreign key on "'+entity.name+'" references "'+ref.name+'"; resolved by name only to "'+ + target.name+'" — verify schema qualification.', + key.span); + } else if(candidates.length>1){ + schemaIssue(ctx,'warning','schema_ambiguous_reference', + 'Foreign key on "'+entity.name+'" references "'+ref.name+'", which matches '+candidates.length+ + ' tables; the relationship is not drawn.', + key.span); + return; + } + } + if(!target){ + target=schemaEnsureExternal(ctx,ref,key.span); + schemaIssue(ctx,'warning','schema_unresolved_reference', + 'Foreign key on "'+entity.name+'" references "'+ref.name+'", which is not defined in this DDL; shown as an unresolved entity.', + key.span); + } + ref.entityId=target.id; + ref.resolution=resolution; + var unique=schemaForeignKeyIsUnique(entity,key.columns); + var optional=key.columns.some(function(name){ + var col=entity.columns.filter(function(c){ return schemaNormColumn(c.name)===schemaNormColumn(name); })[0]; + return !col||col.nullable; + }); + var fromColumns=ref.columns.length?ref.columns:target.keys + .filter(function(k){ return k.kind==='pk'; }) + .map(function(k){ return k.columns; })[0]||[]; + relationships.push({ + id:'rel:'+(relIndex++), + fromId:target.id, + toId:entity.id, + fromColumns:fromColumns, + toColumns:key.columns, + cardinality:unique?'one-to-one':'one-to-many', + optional:optional, + unique:unique, + name:key.name, + resolution:resolution, + span:key.span + }); + }); + }); + return relationships; +} + +function schemaStats(result: SchemaResult): SchemaStats { + var tables=0, views=0, columns=0, unresolved=0; + result.entities.forEach(function(entity){ + if(entity.unresolved) unresolved++; + else if(entity.kind==='view') views++; + else tables++; + columns+=entity.columns.length; + }); + return {tables:tables,views:views,columns:columns, + relationships:result.relationships.length,unresolved:unresolved}; +} + +/* Parse DDL text into the schema model. Declared constraints only. */ +function parseSchema(text: string): SchemaResult { + var source=String(text==null?'':text); + var toks=tokenize(source); + var ctx: SchemaCtx={text:source,entities:[],byKey:{}, + diagnostics:(toks.diagnostics||[]).slice(), + pendingIndexes:[]}; + if(source.trim()){ + schemaStatements(toks).forEach(function(statement){ + schemaParseStatement(ctx,statement); + }); + schemaApplyIndexes(ctx); + } else { + ctx.diagnostics.push({severity:'info',code:'schema_empty', + message:'Paste or import DDL to draw an entity relationship diagram.', + span:null,scope:'document'}); + } + var relationships=schemaResolve(ctx); + var result: SchemaResult={text:source,entities:ctx.entities, + relationships:relationships, + diagnostics:ctx.diagnostics,stats:null}; + result.stats=schemaStats(result); + return result; +} diff --git a/src/types.d.ts b/src/types.d.ts index 8782e04..e68ed7f 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -901,6 +901,88 @@ interface RangeFixture { interface Db2GraphFixture extends GraphFixture {} +/* v2.1.0 — ERD / schema foundation. DDL is parsed into a conservative schema + model: declared constraints only, raw type text preserved per dialect, and + every entity, column, and key carrying a source span. Relationship edges + assert declared foreign keys; nothing is inferred from query text. */ +type SchemaObjectKind = 'table' | 'view'; +type SchemaKeyKind = 'pk' | 'unique' | 'fk'; +type SchemaLinkResolution = 'exact' | 'heuristic' | 'opaque'; +type SchemaCardinality = 'one-to-one' | 'one-to-many'; + +interface SchemaColumn { + name: string; + type: string; + nullable: boolean; + primaryKey: boolean; + unique: boolean; + identity: boolean; + generated: boolean; + computed: boolean; + ordinal: number; + span: SourceSpan; +} + +interface SchemaReference { + name: string; + norm: string; + columns: string[]; + entityId?: string; + resolution: SchemaLinkResolution; +} + +interface SchemaKey { + kind: SchemaKeyKind; + columns: string[]; + name?: string; + referenced?: SchemaReference; + onDelete?: string; + onUpdate?: string; + deferrable?: boolean; + span: SourceSpan; +} + +interface SchemaEntity { + id: string; + name: string; + schema: string | null; + kind: SchemaObjectKind; + columns: SchemaColumn[]; + keys: SchemaKey[]; + unresolved: boolean; + span: SourceSpan; +} + +interface SchemaRelationship { + id: string; + fromId: string; + toId: string; + fromColumns: string[]; + toColumns: string[]; + cardinality: SchemaCardinality; + optional: boolean; + unique: boolean; + name?: string; + resolution: SchemaLinkResolution; + span: SourceSpan; +} + +interface SchemaStats { + tables: number; + views: number; + columns: number; + relationships: number; + unresolved: number; +} + +interface SchemaResult { + text: string; + entities: SchemaEntity[]; + relationships: SchemaRelationship[]; + diagnostics: Diagnostic[]; + stats: SchemaStats; +} + interface Window { mermaid: { initialize(options: Record): void; @@ -1004,6 +1086,17 @@ interface Window { expected: string; actual: unknown; }>; + /* v2.1.0 schema/ERD suite results (DDL parse, declared constraints, + relationship derivation, Mermaid erDiagram export), published for the + golden tests. */ + PROCFLOW_SCHEMA_PASS?: boolean; + PROCFLOW_SCHEMA_RESULT?: { + passed: number; + total: number; + mermaidPassed: number; + mermaidTotal: number; + }; + PROCFLOW_SCHEMA_DETAIL?: Array<{name: string; pass: boolean; detail?: unknown}>; /* v1.14.0 hostile-input security suite. */ PROCFLOW_SECURITY_PASS?: boolean; PROCFLOW_SECURITY_RESULT?: {passed: number; total: number}; diff --git a/src/ui/erd-page.ts b/src/ui/erd-page.ts new file mode 100644 index 0000000..df1fee1 --- /dev/null +++ b/src/ui/erd-page.ts @@ -0,0 +1,814 @@ +/* proc>flow v2.1.0 — ERD page controller. + Parses schema DDL into the shared schema IR and draws an entity map of + declared tables, views, and foreign keys. Declared constraints only: this + page never infers a relationship from query text. */ +(function(){ + if(typeof document==='undefined') return; + var $=function(id: string): any { return document.getElementById(id); }; + var sql=$('erd-sql'), gutter=$('erd-gutter'), msg=$('erd-msg'), + cardsHost=$('erd-cards'), overlay=$('erd-overlay'), canvas=$('erd-canvas'), + space=$('erd-space'), + empty=$('erd-empty'), mermaidOut=$('erd-mermaid-out'), + inspector=$('erd-inspector'), largeNotice=$('erd-large-notice'), + findInput=$('erd-find'), findCount=$('erd-find-count'), + compactInput=$('erd-compact'); + var result: SchemaResult | null=null; + var cardEls: Record={}; + var adjacency: Record={}; + var relCounts: Record={}; + var selectedId: string | null=null; + var renderSeq=0; + var compactMode=false, compactTouched=false; + var findMatches: string[]=[], findIndex=0; + var panning=false, panStartX=0, panStartY=0, + panStartScrollLeft=0, panStartScrollTop=0, didPan=false; + var dragMode: 'pan' | 'card' | null=null, dragCardId: string | null=null, + dragBaseX=0, dragBaseY=0, dragLastDx=0, dragLastDy=0; + var cardOffsets: Record={}; + var overlayRaf=0; + + function drawGutter(): void { + if(!gutter||!sql) return; + var lines=sql.value.split('\n').length, out=''; + for(var i=1;i<=lines;i++) out+=(i>1?'\n':'')+i; + gutter.textContent=out; gutter.scrollTop=sql.scrollTop; + } + + function setStat(id: string, value: number): void { + var el=$(id); if(el) el.textContent=String(value); + } + + function showDiagnostics(): void { + if(!msg||!result) return; + msg.textContent=''; msg.classList.remove('show','warn'); + var list=result.diagnostics||[]; + if(!list.length) return; + var errors=list.filter(function(d){ return d.severity==='error'; }).length; + msg.classList.add('show'); + if(!errors) msg.classList.add('warn'); + list.forEach(function(d){ + var line=document.createElement('span'); + line.className='diag'+(d.severity==='info'?' info':''); + line.textContent=d.message+(d.span?' ('+d.span.start+'–'+d.span.end+')':''); + msg.appendChild(line); + }); + } + + function compactSummary(entity: SchemaEntity): string { + var fkColumns: Record={}, pkCount=0; + entity.keys.forEach(function(key){ + if(key.kind==='pk') pkCount++; + if(key.kind==='fk') key.columns.forEach(function(name){ + fkColumns[name.toUpperCase()]=1; + }); + }); + return entity.columns.length+' cols \u00b7 '+pkCount+' PK \u00b7 '+ + Object.keys(fkColumns).length+' FK'; + } + + function buildCard(entity: SchemaEntity): HTMLElement { + var card=document.createElement('article'); + card.className='erd-card'+(entity.unresolved?' unresolved':'')+ + (entity.kind==='view'?' erd-view':'')+(compactMode?' compact':''); + card.setAttribute('data-entity-id',entity.id); + var head=document.createElement('header'); + var kind=document.createElement('span'); + kind.className='erd-kind'; + kind.textContent=entity.unresolved?'external':entity.kind; + var title=document.createElement('h3'); + title.textContent=entity.name; + head.appendChild(kind); + head.appendChild(title); + var count=relCounts[entity.id]||0; + if(count){ + var badge=document.createElement('span'); + badge.className='erd-relcount'; + badge.title=count+' declared relationship'+(count===1?'':'s'); + badge.textContent=String(count); + head.appendChild(badge); + } + card.appendChild(head); + if(compactMode){ + var summary=document.createElement('p'); + summary.className='erd-summary'; + summary.textContent=compactSummary(entity); + card.appendChild(summary); + } else { + var list=document.createElement('ul'); + list.className='erd-cols'; + if(entity.columns.length){ + var frag=document.createDocumentFragment(); + entity.columns.forEach(function(column){ + var row=document.createElement('li'); + var name=document.createElement('span'); + name.className='erd-col-name'; + name.textContent=column.name; + var type=document.createElement('span'); + type.className='erd-col-type'; + type.textContent=column.type||'—'; + type.title=column.type||'no declared type'; + var flags=document.createElement('span'); + flags.className='erd-badges'; + erdColumnKeys(entity,column).forEach(function(key){ + var tag=document.createElement('b'); + tag.className='erd-badge erd-badge-'+key.toLowerCase(); + tag.textContent=key; + flags.appendChild(tag); + }); + if(column.identity){ + var idTag=document.createElement('b'); + idTag.className='erd-badge erd-badge-id'; + idTag.textContent='ID'; + idTag.title='identity / auto-increment'; + flags.appendChild(idTag); + } + if(column.generated||column.computed){ + var genTag=document.createElement('b'); + genTag.className='erd-badge erd-badge-gen'; + genTag.textContent=column.computed?'COMP':'GEN'; + genTag.title=column.computed?'computed column':'generated column'; + flags.appendChild(genTag); + } + if(!column.nullable){ + var nnTag=document.createElement('b'); + nnTag.className='erd-badge erd-badge-nn'; + nnTag.textContent='NN'; + nnTag.title='not null'; + flags.appendChild(nnTag); + } + row.appendChild(name); + row.appendChild(type); + row.appendChild(flags); + frag.appendChild(row); + }); + list.appendChild(frag); + } else { + var none=document.createElement('li'); + none.className='erd-no-cols'; + none.textContent=entity.unresolved?'referenced but not declared':'no declared columns'; + list.appendChild(none); + } + card.appendChild(list); + } + card.tabIndex=0; + card.addEventListener('click',function(){ + selectEntity(selectedId===entity.id?null:entity.id); + }); + card.addEventListener('keydown',function(event: KeyboardEvent){ + if(event.key==='Enter'||event.key===' '){ + event.preventDefault(); + selectEntity(selectedId===entity.id?null:entity.id); + } + }); + card.addEventListener('dblclick',function(event: MouseEvent){ + event.preventDefault(); + if(cardOffsets[entity.id]){ + delete cardOffsets[entity.id]; + card.style.transform=''; + card.classList.remove('moved'); + scheduleOverlay(); + } + }); + return card; + } + + + function selectEntity(id: string | null): void { + selectedId=id; + var related: Record={}; + if(selectedId){ + (adjacency[selectedId]||[]).forEach(function(other){ related[other]=1; }); + } + Object.keys(cardEls).forEach(function(entityId){ + var card=cardEls[entityId]; + card.classList.toggle('focus',entityId===selectedId); + card.classList.toggle('related', + !!selectedId&&entityId!==selectedId&&related[entityId]===1); + card.classList.toggle('dim', + !!selectedId&&entityId!==selectedId&&related[entityId]!==1); + }); + renderInspector(); + drawOverlay(); + } + + /* Find highlights matches and jumps between them (Enter / Shift+Enter). */ + function applyFind(jump: boolean): void { + Object.keys(cardEls).forEach(function(id){ cardEls[id].classList.remove('match'); }); + findMatches=[]; + var query=(findInput?String(findInput.value||''):'').trim().toUpperCase(); + if(!query||!result){ + if(findCount) findCount.textContent=''; + return; + } + result.entities.forEach(function(entity){ + if(entity.name.toUpperCase().indexOf(query)>=0||entity.id.indexOf(query)>=0){ + findMatches.push(entity.id); + } + }); + findMatches.forEach(function(id){ + if(cardEls[id]) cardEls[id].classList.add('match'); + }); + if(findCount){ + findCount.textContent=findMatches.length + ? findMatches.length+' match'+(findMatches.length===1?'':'es') + : '0 matches'; + } + if(jump&&findMatches.length){ + var id=findMatches[findIndex%findMatches.length]; + var card=cardEls[id]; + if(card&&card.scrollIntoView){ + card.scrollIntoView({block:'center',inline:'nearest',behavior:'smooth'}); + } + } + } + + /* Selection inspector: every declared FK touching the selected entity, with + direction, column mapping, cardinality, and constraint name. Never inferred. */ + function renderInspector(): void { + if(!inspector||!result) return; + inspector.textContent=''; + var selected=selectedId?result.entities.filter(function(entity){ + return entity.id===selectedId; + })[0]:null; + if(!selected){ + inspector.hidden=true; + return; + } + inspector.hidden=false; + var head=document.createElement('header'); + var title=document.createElement('h4'); + title.textContent=selected.name; + var clear=document.createElement('button'); + clear.type='button'; + clear.className='erd-inspector-close'; + clear.textContent='Clear'; + clear.addEventListener('click',function(){ selectEntity(null); }); + head.appendChild(title); + head.appendChild(clear); + inspector.appendChild(head); + function group(label: string, rows: SchemaRelationship[], outgoing: boolean): void { + if(!rows.length) return; + var heading=document.createElement('p'); + heading.className='erd-inspector-group'; + heading.textContent=label; + inspector.appendChild(heading); + rows.forEach(function(rel){ + var otherId=outgoing?rel.fromId:rel.toId; + var other=result.entities.filter(function(entity){ + return entity.id===otherId; + })[0]; + var row=document.createElement('button'); + row.type='button'; + row.className='erd-rel-row'; + var arrow=document.createElement('span'); + arrow.className='erd-rel-arrow'; + arrow.textContent=outgoing?'\u2192':'\u2190'; + var name=document.createElement('span'); + name.className='erd-rel-name'; + name.textContent=other?other.name:otherId; + var detail=document.createElement('span'); + detail.className='erd-rel-detail'; + detail.textContent=rel.toColumns.join(',')+' \u2192 '+ + (rel.fromColumns.join(',')||'PK'); + var meta=document.createElement('span'); + meta.className='erd-rel-meta'; + meta.textContent=(rel.cardinality==='one-to-one'?'1:1':'1:N')+ + (rel.optional?' optional':'')+(rel.name?' \u00b7 '+rel.name:''); + row.appendChild(arrow); + row.appendChild(name); + row.appendChild(detail); + row.appendChild(meta); + row.title='Select '+name.textContent; + row.addEventListener('click',function(){ + selectEntity(otherId); + var card=cardEls[otherId]; + if(card&&card.scrollIntoView){ + card.scrollIntoView({block:'nearest',inline:'nearest',behavior:'smooth'}); + } + }); + inspector.appendChild(row); + }); + } + group('References (FK out)',result.relationships.filter(function(rel){ + return rel.toId===selected.id; + }),true); + group('Referenced by (FK in)',result.relationships.filter(function(rel){ + return rel.fromId===selected.id&&rel.toId!==selected.id; + }),false); + if(!result.relationships.some(function(rel){ + return rel.fromId===selected.id||rel.toId===selected.id; + })){ + var none=document.createElement('p'); + none.className='erd-inspector-empty'; + none.textContent='No declared foreign keys.'; + inspector.appendChild(none); + } + } + + /* Adjacency and degree are precomputed so selecting a hub table in an + 800-table estate stays O(degree) instead of O(tables × relationships). */ + function renderCards(): void { + if(!cardsHost||!result) return; + adjacency={}; + relCounts={}; + result.relationships.forEach(function(rel){ + (adjacency[rel.fromId]=adjacency[rel.fromId]||[]).push(rel.toId); + (adjacency[rel.toId]=adjacency[rel.toId]||[]).push(rel.fromId); + relCounts[rel.fromId]=(relCounts[rel.fromId]||0)+1; + relCounts[rel.toId]=(relCounts[rel.toId]||0)+1; + }); + if(!compactTouched&&result.entities.length>150){ + compactMode=true; + if(compactInput) compactInput.checked=true; + } + cardsHost.classList.toggle('compact',compactMode); + if(Object.keys(cardOffsets).length){ + var keptOffsets: Record={}; + result.entities.forEach(function(entity){ + if(cardOffsets[entity.id]) keptOffsets[entity.id]=cardOffsets[entity.id]; + }); + cardOffsets=keptOffsets; + } + cardEls={}; + cardsHost.textContent=''; + var frag=document.createDocumentFragment(); + result.entities.forEach(function(entity){ + var card=buildCard(entity); + var offset=cardOffsets[entity.id]; + if(offset&&(offset.x||offset.y)){ + card.style.transform='translate('+offset.x+'px,'+offset.y+'px)'; + card.classList.add('moved'); + } + cardEls[entity.id]=card; + frag.appendChild(card); + }); + cardsHost.appendChild(frag); + if(empty) empty.hidden=result.entities.length>0; + applyZoomLayout(); + } + + interface ErdBox { + cx: number; cy: number; + left: number; top: number; right: number; bottom: number; + } + + var cachedCanvasRect: DOMRect | null=null; + + function entityBox(entityId: string): ErdBox | null { + var el=cardEls[entityId], c=canvas; + if(!el||!c) return null; + var r=el.getBoundingClientRect(); + if(!r.width&&!r.height) return null; + var cr=cachedCanvasRect||c.getBoundingClientRect(); + var left=r.left-cr.left+c.scrollLeft, top=r.top-cr.top+c.scrollTop; + return {left:left,top:top,right:left+r.width,bottom:top+r.height, + cx:left+r.width/2,cy:top+r.height/2}; + } + + /* Intersection of the line from a box centre toward (tx, ty) with the box + edge, so relationship lines stop at the entity border. */ + function edgePoint(box: ErdBox, tx: number, ty: number): {x: number; y: number} { + var dx=tx-box.cx, dy=ty-box.cy; + if(!dx&&!dy) return {x:box.cx,y:box.cy}; + var sx=dx?Math.abs((box.right-box.left)/2/dx):Infinity; + var sy=dy?Math.abs((box.bottom-box.top)/2/dy):Infinity; + var s=Math.min(sx,sy); + return {x:box.cx+dx*s,y:box.cy+dy*s}; + } + + function svgEl(name: string, attrs?: Record): SVGElement { + var el=document.createElementNS('http://www.w3.org/2000/svg',name); + if(attrs) Object.keys(attrs).forEach(function(k){ el.setAttribute(k,String(attrs[k])); }); + return el; + } + + function scheduleOverlay(): void { + if(overlayRaf) return; + overlayRaf=requestAnimationFrame(function(){ + overlayRaf=0; + drawOverlay(); + }); + } + + /* Manual placement: offsets survive re-renders (keyed by entity id) and are + cleared per card by double-click or all at once by Reset layout. */ + function resetLayout(): void { + cardOffsets={}; + Object.keys(cardEls).forEach(function(id){ + cardEls[id].style.transform=''; + cardEls[id].classList.remove('moved'); + }); + scheduleOverlay(); + } + + var ERD_MIN_ZOOM=0.02, ERD_MAX_ZOOM=2; + + function currentZoom(): number { + if(!canvas) return 1; + var value=parseFloat(canvas.style.getPropertyValue('--erd-zoom')); + return isNaN(value)?1:value; + } + + /* The card stage is laid out once at 100% and scaled with a transform, so + the grid never reflows while zooming (reflowing made repeated Fit clicks + shrink forever). A spacer carries the scaled scroll area. */ + function applyZoomLayout(): void { + if(!canvas||!cardsHost||!space) return; + var zoom=currentZoom(); + cardsHost.style.width=canvas.clientWidth+'px'; + var width=Math.ceil(cardsHost.offsetWidth*zoom)+40; + var height=Math.ceil(cardsHost.offsetHeight*zoom)+40; + space.style.width=Math.max(width,canvas.clientWidth)+'px'; + space.style.height=Math.max(height,canvas.clientHeight)+'px'; + } + + function setZoom(value: number): void { + if(!canvas) return; + var zoom=Math.max(ERD_MIN_ZOOM,Math.min(ERD_MAX_ZOOM,value)); + canvas.style.setProperty('--erd-zoom',String(zoom)); + canvas.classList.toggle('zoomed-out',zoom<0.5); + var label=$('erd-zoom-val'); + if(label) label.textContent=Math.round(zoom*100)+'%'; + applyZoomLayout(); + drawOverlay(); + } + + /* Zoom keeping the point under the cursor fixed. */ + function zoomAt(clientX: number, clientY: number, factor: number): void { + if(!canvas) return; + var from=currentZoom(); + var to=Math.max(ERD_MIN_ZOOM,Math.min(ERD_MAX_ZOOM,from*factor)); + if(to===from) return; + var rect=canvas.getBoundingClientRect(); + var offsetX=clientX-rect.left, offsetY=clientY-rect.top; + var logicalX=(canvas.scrollLeft+offsetX)/from; + var logicalY=(canvas.scrollTop+offsetY)/from; + setZoom(to); + canvas.scrollLeft=logicalX*to-offsetX; + canvas.scrollTop=logicalY*to-offsetY; + } + + function zoomBy(factor: number): void { + if(!canvas) return; + var rect=canvas.getBoundingClientRect(); + zoomAt(rect.left+canvas.clientWidth/2,rect.top+canvas.clientHeight/2,factor); + } + + /* Fit the whole estate, or — with a table selected — that table and its + declared neighbours, so the highlighted entity is immediately readable. */ + function fitView(): void { + if(!result||!canvas) return; + var ids: string[]=selectedId + ? [selectedId].concat(adjacency[selectedId]||[]) + : result.entities.map(function(entity){ return entity.id; }); + var minX=Infinity, minY=Infinity, maxX=-Infinity, maxY=-Infinity; + ids.forEach(function(id){ + var box=entityBox(id); + if(!box) return; + minX=Math.min(minX,box.left); + minY=Math.min(minY,box.top); + maxX=Math.max(maxX,box.right); + maxY=Math.max(maxY,box.bottom); + }); + if(minX===Infinity) return; + var pad=40; + var width=maxX-minX+pad*2, height=maxY-minY+pad*2; + var from=currentZoom(); + var to=Math.max(ERD_MIN_ZOOM,Math.min(ERD_MAX_ZOOM, + from*Math.min(canvas.clientWidth/width,canvas.clientHeight/height))); + var ratio=to/from; + setZoom(to); + canvas.scrollLeft=(minX+maxX)/2*ratio-canvas.clientWidth/2; + canvas.scrollTop=(minY+maxY)/2*ratio-canvas.clientHeight/2; + } + + function drawOverlay(): void { + if(!overlay||!canvas||!result) return; + while(overlay.firstChild) overlay.removeChild(overlay.firstChild); + var width=Math.max(space?space.scrollWidth:cardsHost.scrollWidth+40,canvas.clientWidth); + var height=Math.max(space?space.scrollHeight:cardsHost.scrollHeight+40,canvas.clientHeight); + overlay.setAttribute('width',String(width)); + overlay.setAttribute('height',String(height)); + overlay.setAttribute('viewBox','0 0 '+width+' '+height); + cachedCanvasRect=canvas.getBoundingClientRect(); + var boxCache: Record={}; + function boxOf(id: string): ErdBox | null { + if(!(id in boxCache)) boxCache[id]=entityBox(id); + return boxCache[id]; + } + result.relationships.forEach(function(rel){ + var from=boxOf(rel.fromId), to=boxOf(rel.toId); + if(!from||!to) return; + var active=!!selectedId; + var connected=!active||rel.fromId===selectedId||rel.toId===selectedId; + var dash=rel.resolution==='exact'?'':(rel.resolution==='heuristic'?'7 4':'2 4'); + var color=rel.resolution==='opaque'?'#e4645e': + (rel.resolution==='heuristic'?'#e8a33d':'#7ea6e0'); + var d: string, labelAt: {x: number; y: number}[], midAt: {x: number; y: number}; + if(rel.fromId===rel.toId){ + var loopX=from.right+10, loopY=from.cy; + d='M '+from.right+' '+(from.top+14)+' C '+(loopX+34)+' '+(from.top-14)+', '+ + (loopX+34)+' '+(from.bottom+14)+', '+from.right+' '+(from.bottom-14); + labelAt=[{x:loopX+30,y:from.top+6},{x:loopX+30,y:from.bottom-4}]; + midAt={x:loopX+34,y:loopY}; + } else { + var p1=edgePoint(from,to.cx,to.cy), p2=edgePoint(to,from.cx,from.cy); + var midX=(p1.x+p2.x)/2; + d='M '+p1.x+' '+p1.y+' C '+midX+' '+p1.y+', '+midX+' '+p2.y+', '+p2.x+' '+p2.y; + labelAt=[{x:p1.x+(p2.x-p1.x)*0.16,y:p1.y+(p2.y-p1.y)*0.16}, + {x:p1.x+(p2.x-p1.x)*0.84,y:p1.y+(p2.y-p1.y)*0.84}]; + midAt={x:midX,y:(p1.y+p2.y)/2}; + } + var path=svgEl('path',{d:d,fill:'none',stroke:color, + 'stroke-width':active&&connected?2.6:(connected?2:1.4), + 'stroke-dasharray':dash,opacity:active?(connected?0.95:0.07):0.95, + 'stroke-linecap':'round'}); + path.setAttribute('data-relationship',rel.id); + overlay.appendChild(path); + if(!active||connected){ + var leftLabel=rel.optional?'0..1':'1', rightLabel=rel.unique?'1':'N'; + [{text:leftLabel,at:labelAt[0]},{text:rightLabel,at:labelAt[1]}].forEach(function(item){ + var text=svgEl('text',{x:item.at.x,y:item.at.y,fill:color,'font-size':10, + 'font-family':'ui-monospace,Consolas,monospace', + opacity:active?(connected?1:0.1):1, + 'text-anchor':'middle','dominant-baseline':'middle'}); + text.textContent=item.text; + overlay.appendChild(text); + }); + } + if(active&&connected){ + var label=rel.name||(rel.toColumns.join(',')+ ' \u2192 '+ + (rel.fromColumns.join(',')||'PK')); + var mid=svgEl('text',{x:midAt.x,y:midAt.y,fill:color,'font-size':10, + 'font-family':'ui-monospace,Consolas,monospace', + stroke:'#101b23','stroke-width':3,'paint-order':'stroke', + 'text-anchor':'middle','dominant-baseline':'middle'}); + mid.textContent=label; + overlay.appendChild(mid); + } + }); + /* At estate zoom the card ring scales away; the overlay is unzoomed, so + draw the selection highlight here instead. */ + if(selectedId&¤tZoom()<0.5){ + var ring=boxOf(selectedId); + if(ring){ + overlay.appendChild(svgEl('rect',{x:ring.left-5,y:ring.top-5, + width:ring.right-ring.left+10,height:ring.bottom-ring.top+10,rx:6, + fill:'none',stroke:'#e8a33d','stroke-width':2,'stroke-dasharray':'7 5'})); + } + } + } + + function render(): void { + if(!sql) return; + var text=sql.value; + result=parseSchema(text); + setStat('erd-tables',result.stats.tables); + setStat('erd-views',result.stats.views); + setStat('erd-columns',result.stats.columns); + setStat('erd-relationships',result.stats.relationships); + setStat('erd-unresolved',result.stats.unresolved); + setStat('erd-diagnostics',result.diagnostics.length); + selectedId=null; + renderCards(); + renderInspector(); + showDiagnostics(); + applyFind(false); + updateLargeInputNotice(); + if(mermaidOut) mermaidOut.textContent=toMermaidER(result); + var seq=++renderSeq; + requestAnimationFrame(function(){ + if(seq!==renderSeq) return; + drawOverlay(); + }); + } + + /* Large, exported-estate DDL must not reparse and rebuild hundreds of cards + on every keystroke: auto-draw pauses above the shared local threshold and + resumes when the input shrinks or Refresh is pressed. */ + function updateLargeInputNotice(): boolean { + if(!sql) return false; + var policy=largeInputPolicy(sql.value.length); + if(largeNotice){ + largeNotice.hidden=!policy.large; + if(policy.large){ + largeNotice.textContent='Large DDL ('+policy.length.toLocaleString('en-US')+ + ' characters). Auto-draw is paused — press Refresh (Ctrl+Enter) or edit below '+ + policy.threshold.toLocaleString('en-US')+' characters to resume live updates.'; + } + } + return policy.large; + } + + function schedule(): void { + if(updateLargeInputNotice()) return; + if(scheduleTimer!==null) clearTimeout(scheduleTimer); + scheduleTimer=setTimeout(render,220); + } + var scheduleTimer: ReturnType | null=null; + + function tab(which: 'diagram'|'mermaid'): void { + var diagram=$('view-erd-diagram'), mermaid=$('view-erd-mermaid'); + var diagramTab=$('tab-erd-diagram'), mermaidTab=$('tab-erd-mermaid'); + if(!diagram||!mermaid||!diagramTab||!mermaidTab) return; + var showDiagram=which==='diagram'; + diagram.classList.toggle('active',showDiagram); + mermaid.classList.toggle('active',!showDiagram); + diagramTab.setAttribute('aria-selected',String(showDiagram)); + mermaidTab.setAttribute('aria-selected',String(!showDiagram)); + if(showDiagram) requestAnimationFrame(drawOverlay); + } + + function flash(btn: HTMLElement, word: string): void { + if(!btn) return; + var old=btn.textContent; + btn.textContent=word; + setTimeout(function(){ btn.textContent=old; },1400); + } + + function copyMermaid(): void { + var text=mermaidOut?mermaidOut.textContent:''; + var done=function(): void { flash($('btn-erd-copy'),'Copied'); }; + if(navigator.clipboard&&navigator.clipboard.writeText){ + navigator.clipboard.writeText(text).then(done,function(){ fallbackCopy(text,done); }); + } else fallbackCopy(text,done); + } + + function fallbackCopy(text: string, done: () => void): void { + var area=document.createElement('textarea'); + area.value=text; area.setAttribute('readonly',''); + area.style.position='absolute'; area.style.left='-9999px'; + document.body.appendChild(area); area.select(); + try { document.execCommand('copy'); done(); } catch(err){ /* clipboard unavailable */ } + document.body.removeChild(area); + } + + if(sql){ + sql.value=''; + sql.addEventListener('input',schedule); + sql.addEventListener('scroll',function(){ if(gutter) gutter.scrollTop=sql.scrollTop; }); + sql.addEventListener('keydown',function(event: KeyboardEvent){ + if((event.ctrlKey||event.metaKey)&&event.key==='Enter'){ event.preventDefault(); render(); } + }); + } + var sample=$('btn-erd-sample'); + if(sample) sample.addEventListener('click',function(){ + if(!sql) return; + sql.value=PROCFLOW_ERD_SAMPLE_TSQL; drawGutter(); render(); sql.focus(); + }); + var sampleDb2=$('btn-erd-sample-db2'); + if(sampleDb2) sampleDb2.addEventListener('click',function(){ + if(!sql) return; + sql.value=PROCFLOW_ERD_SAMPLE_DB2; drawGutter(); render(); sql.focus(); + }); + var clear=$('btn-erd-clear'); + if(clear) clear.addEventListener('click',function(){ + if(!sql) return; + sql.value=''; drawGutter(); render(); sql.focus(); + }); + var draw=$('btn-erd-draw'); + if(draw) draw.addEventListener('click',render); + var copy=$('btn-erd-copy'); + if(copy) copy.addEventListener('click',copyMermaid); + var tabDiagram=$('tab-erd-diagram'); + if(tabDiagram) tabDiagram.addEventListener('click',function(){ tab('diagram'); }); + var tabMermaid=$('tab-erd-mermaid'); + if(tabMermaid) tabMermaid.addEventListener('click',function(){ tab('mermaid'); }); + + if(findInput){ + findInput.addEventListener('input',function(){ findIndex=0; applyFind(true); }); + findInput.addEventListener('keydown',function(event: KeyboardEvent){ + if(event.key==='Enter'){ + event.preventDefault(); + if(findMatches.length){ + findIndex=event.shiftKey + ? (findIndex-1+findMatches.length)%findMatches.length + : (findIndex+1)%findMatches.length; + applyFind(true); + } + } else if(event.key==='Escape'){ + findInput.value=''; findIndex=0; applyFind(false); + } + }); + } + if(compactInput) compactInput.addEventListener('change',function(){ + compactTouched=true; + compactMode=!!compactInput.checked; + renderCards(); + applyFind(false); + renderInspector(); + requestAnimationFrame(drawOverlay); + }); + var resetLayoutBtn=$('btn-erd-reset-layout'); + if(resetLayoutBtn) resetLayoutBtn.addEventListener('click',resetLayout); + var zoomOut=$('erd-z-out'); + if(zoomOut) zoomOut.addEventListener('click',function(){ zoomBy(1/1.15); }); + var zoomIn=$('erd-z-in'); + if(zoomIn) zoomIn.addEventListener('click',function(){ zoomBy(1.15); }); + var zoomFit=$('erd-z-fit'); + if(zoomFit) zoomFit.addEventListener('click',fitView); + + var fileInput=$('erd-file-input'); + var importBtn=$('btn-erd-import'); + if(importBtn&&fileInput) importBtn.addEventListener('click',function(){ fileInput.click(); }); + if(fileInput) fileInput.addEventListener('change',function(){ + var files=Array.prototype.slice.call(fileInput.files||[]); + if(!files.length) return; + Promise.all(files.map(function(file: File){ + return file.text(); + })).then(function(texts: string[]){ + if(!sql) return; + var joined=sql.value.trim(); + texts.forEach(function(text){ + joined=(joined?joined+'\nGO\n':'')+text; + }); + sql.value=joined; drawGutter(); render(); + fileInput.value=''; + }); + }); + + window.addEventListener('resize',function(){ + applyZoomLayout(); + requestAnimationFrame(drawOverlay); + }); + if(typeof ResizeObserver!=='undefined'&&cardsHost){ + new ResizeObserver(function(){ drawOverlay(); }).observe(cardsHost); + } + + /* Drag on empty canvas pans; drag on a card moves that card so crowded + relationships can be separated. Click still selects: a drag shorter than + the threshold never suppresses the click, and a real drag always does. */ + if(canvas){ + canvas.addEventListener('pointerdown',function(event: PointerEvent){ + if(event.button!==0) return; + var target=event.target as HTMLElement; + var cardEl=target&&target.closest?target.closest('.erd-card') as HTMLElement:null; + dragMode=cardEl?'card':'pan'; + dragCardId=cardEl?cardEl.getAttribute('data-entity-id'):null; + panning=true; didPan=false; + dragLastDx=0; dragLastDy=0; + panStartX=event.clientX; panStartY=event.clientY; + panStartScrollLeft=canvas.scrollLeft; panStartScrollTop=canvas.scrollTop; + if(dragMode==='card'&&dragCardId){ + var offset=cardOffsets[dragCardId]||{x:0,y:0}; + dragBaseX=offset.x; dragBaseY=offset.y; + if(cardEl) cardEl.classList.add('moving'); + } else { + canvas.classList.add('dragging'); + } + }); + document.addEventListener('pointermove',function(event: PointerEvent){ + if(!panning) return; + var dx=event.clientX-panStartX, dy=event.clientY-panStartY; + dragLastDx=dx; dragLastDy=dy; + if(dragMode==='card'){ + if(Math.abs(dx)>4||Math.abs(dy)>4) didPan=true; + if(didPan&&dragCardId&&cardEls[dragCardId]){ + var zoom=currentZoom(); + cardEls[dragCardId].style.transform= + 'translate('+(dragBaseX+dx/zoom)+'px,'+(dragBaseY+dy/zoom)+'px)'; + scheduleOverlay(); + } + return; + } + if(Math.abs(dx)>6||Math.abs(dy)>6) didPan=true; + canvas.scrollLeft=panStartScrollLeft-dx; + canvas.scrollTop=panStartScrollTop-dy; + }); + var endDrag=function(): void { + if(!panning) return; + if(dragMode==='card'&&dragCardId&&didPan){ + var endZoom=currentZoom(); + cardOffsets[dragCardId]={x:dragBaseX+dragLastDx/endZoom, + y:dragBaseY+dragLastDy/endZoom}; + if(cardEls[dragCardId]){ + cardEls[dragCardId].classList.add('moved'); + cardEls[dragCardId].classList.remove('moving'); + } + } else if(dragCardId&&cardEls[dragCardId]){ + cardEls[dragCardId].classList.remove('moving'); + } + panning=false; dragMode=null; dragCardId=null; + canvas.classList.remove('dragging'); + }; + document.addEventListener('pointerup',endDrag); + document.addEventListener('pointercancel',endDrag); + canvas.addEventListener('click',function(event: MouseEvent){ + if(didPan){ didPan=false; event.stopPropagation(); event.preventDefault(); } + },true); + /* Smooth wheel zoom: continuous and cursor-anchored, instead of stepped + button jumps. Trackpad pinch (ctrl+wheel) works through the same path. */ + canvas.addEventListener('wheel',function(event: WheelEvent){ + event.preventDefault(); + zoomAt(event.clientX,event.clientY,Math.exp(-event.deltaY*0.0015)); + },{passive:false}); + } + document.addEventListener('keydown',function(event: KeyboardEvent){ + if(event.key==='Escape'&&selectedId) selectEntity(null); + }); + + drawGutter(); + render(); + document.documentElement.setAttribute('data-procflow-ready',String( + typeof parseSchema==='function'&&typeof toMermaidER==='function')); +})(); diff --git a/src/ui/splitter.ts b/src/ui/splitter.ts new file mode 100644 index 0000000..6325247 --- /dev/null +++ b/src/ui/splitter.ts @@ -0,0 +1,53 @@ +/* proc>flow v2.1.0 — shared resizable pane divider. + Works on any page with a `.wrap` grid and a `#splitter` element between the + two panes. Pointer, double-click reset, and arrow-key resizing; the width is + session-only and never persisted. */ +(function(){ + if(typeof document==='undefined') return; + var wrap=document.querySelector('.wrap') as HTMLElement | null; + var splitter=document.getElementById('splitter'); + if(!wrap||!splitter) return; + var MIN_LEFT=240, MIN_RIGHT=260, SPLITTER=7; + var dragging=false, startX=0, startLeft=0; + function leftWidth(): number { + var pane=wrap.querySelector('.pane'); + return pane?pane.getBoundingClientRect().width:0; + } + function setLeft(width: number): void { + var rect=wrap.getBoundingClientRect(); + var max=Math.max(MIN_LEFT,rect.width-MIN_RIGHT-SPLITTER); + var value=Math.max(MIN_LEFT,Math.min(width,max)); + wrap.style.setProperty('--pane-left',value+'px'); + } + function reset(): void { + wrap.style.removeProperty('--pane-left'); + } + splitter.addEventListener('pointerdown',function(event: PointerEvent){ + if(event.button!==0) return; + dragging=true; + startX=event.clientX; + startLeft=leftWidth(); + splitter.classList.add('active'); + event.preventDefault(); + }); + document.addEventListener('pointermove',function(event: PointerEvent){ + if(!dragging) return; + setLeft(startLeft+event.clientX-startX); + }); + var stop=function(): void { + if(!dragging) return; + dragging=false; + splitter.classList.remove('active'); + }; + document.addEventListener('pointerup',stop); + document.addEventListener('pointercancel',stop); + splitter.addEventListener('dblclick',reset); + splitter.addEventListener('keydown',function(event: KeyboardEvent){ + if(event.key==='ArrowLeft'){ event.preventDefault(); setLeft(leftWidth()-24); } + else if(event.key==='ArrowRight'){ event.preventDefault(); setLeft(leftWidth()+24); } + else if(event.key==='Home'){ event.preventDefault(); reset(); } + }); + window.addEventListener('resize',function(){ + if(wrap.style.getPropertyValue('--pane-left')) setLeft(leftWidth()); + }); +})(); diff --git a/styles.css b/styles.css index 236eb36..3da3a9b 100644 --- a/styles.css +++ b/styles.css @@ -42,6 +42,14 @@ button,select,textarea,input{font-family:inherit;font-size:inherit;color:inherit .tagline{font-family:var(--cond);text-transform:uppercase;letter-spacing:.14em; font-size:10px;color:var(--ink-faint);margin:0;white-space:nowrap} .top-actions{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap} +.mode-switch{display:flex;gap:2px;padding:2px;border:1px solid var(--rule); + border-radius:5px;background:var(--panel)} +.mode-link{padding:5px 12px;border-radius:3px;color:var(--ink-dim);text-decoration:none; + font-family:var(--cond);text-transform:uppercase;letter-spacing:.1em;font-size:11px; + font-weight:600;white-space:nowrap;flex:1 1 0;min-width:86px;text-align:center} +.mode-link:hover{color:var(--ink);background:#20333f} +.mode-link.active{background:var(--marigold);color:#14202a} +.mode-link:focus-visible{outline:2px solid var(--marigold);outline-offset:2px} .privacy-disclosure{position:relative;color:#b9ddcf;font-size:11px} .privacy-disclosure summary{ display:flex;align-items:center;gap:6px;padding:5px 9px; @@ -85,8 +93,14 @@ button,select,textarea,input{font-family:inherit;font-size:inherit;color:inherit outline:2px solid var(--marigold);outline-offset:2px} /* ---------- layout ---------- */ -.wrap{display:grid;grid-template-columns:minmax(340px,40%) 1fr;gap:1px; - background:var(--rule);flex:1;min-height:0} +.wrap{display:grid;grid-template-columns:var(--pane-left,minmax(340px,40%)) 7px 1fr; + gap:0;background:var(--rule);flex:1;min-height:0} +.splitter{position:relative;background:var(--bg);cursor:col-resize;touch-action:none} +.splitter::before{content:"";position:absolute;top:0;bottom:0;left:calc(50% - .5px); + width:1px;background:var(--rule)} +.splitter:hover::before,.splitter.active::before{background:var(--marigold);width:2px; + left:calc(50% - 1px)} +.splitter:focus-visible{outline:2px solid var(--marigold);outline-offset:-2px} .pane{background:var(--bg);display:flex;flex-direction:column;min-width:0; min-height:0;overflow:hidden} .pane-head{display:flex;align-items:center;gap:10px;padding:11px 16px; @@ -264,6 +278,7 @@ footer{flex:0 0 auto;padding:6px 16px;color:var(--ink-faint);font-size:10.5px; .tagline{display:none} .top-actions{margin-left:auto} .wrap{display:grid;grid-template-columns:1fr;flex:none;min-height:auto} + .splitter{display:none} .pane{overflow:visible;min-height:0} .pane:first-child .editor{min-height:290px} .pane:first-child{min-height:430px} @@ -296,3 +311,118 @@ footer{flex:0 0 auto;padding:6px 16px;color:var(--ink-faint);font-size:10.5px; .output-head .opt select{min-width:0;max-width:120px} } @media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}} + +/* ---------- v2.1.0 ERD page ---------- */ +a.btn{text-decoration:none;display:inline-flex;align-items:center} +#erd-sql{ + flex:1;border:0;background:var(--editor);padding:14px 16px;resize:none; + font-family:var(--mono);font-size:12.5px;line-height:1.6;tab-size:2; + white-space:pre;overflow:auto;outline-offset:-2px; +} +#erd-sql::placeholder{color:var(--ink-faint)} +#erd-canvas{ + flex:1;overflow:auto;position:relative;cursor:grab;touch-action:none; + background-color:var(--canvas); + background-image:radial-gradient(circle at 1px 1px,#22323e 1px,transparent 0); + background-size:22px 22px; +} +#erd-canvas.dragging{cursor:grabbing;user-select:none} +#erd-canvas.dragging .erd-card{cursor:grabbing} +.erd-empty{position:absolute;inset:0;display:grid;place-items:center;color:var(--ink-faint); + padding:40px;pointer-events:none} +.erd-empty p{font-size:12.5px;max-width:360px;text-align:center} +.erd-space{position:relative;min-width:100%;min-height:100%} +.erd-cards{position:absolute;top:0;left:0;display:grid; + grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); + gap:24px;padding:20px;z-index:1; + transform-origin:0 0;transform:scale(var(--erd-zoom,1))} +.erd-overlay{position:absolute;top:0;left:0;pointer-events:none;z-index:0} +.zoomed-out #erd-overlay text{display:none} +.erd-card{background:var(--panel);border:1px solid var(--rule);border-radius:5px; + overflow:hidden;cursor:grab;transition:border-color .15s;align-self:start} +.erd-card.moving{cursor:grabbing;z-index:30;box-shadow:0 14px 30px rgba(0,0,0,.5); + user-select:none} +.erd-card.moved{z-index:2;box-shadow:0 3px 10px rgba(0,0,0,.35)} +.erd-card:hover{border-color:var(--ink-faint)} +.erd-card:focus-visible{outline:2px solid var(--marigold);outline-offset:2px} +.erd-card.focus{border-color:var(--marigold);box-shadow:0 0 0 2px rgba(232,163,61,.55)} +.erd-card.related{border-color:var(--steel);box-shadow:0 0 0 2px rgba(126,166,224,.4)} +.erd-card.dim{opacity:.32} +.erd-card.match{border-color:var(--jade);box-shadow:0 0 0 1px rgba(84,195,155,.4)} +.erd-cards.compact{grid-template-columns:repeat(auto-fill,minmax(185px,1fr));gap:12px;padding:14px} +.erd-card.compact header{padding:6px 8px} +.erd-card.compact h3{font-size:12px} +.erd-summary{margin:0;padding:6px 10px 8px;color:var(--ink-dim); + font-family:var(--mono);font-size:10.5px} +.erd-find-label input{ + width:150px;padding:4px 7px;border:1px solid var(--rule);border-radius:3px; + background:#11222d;color:var(--ink);font-family:var(--mono);font-size:11px +} +.erd-find-count{font-family:var(--mono);font-size:10px;color:var(--ink-faint); + min-width:56px} +.erd-card.unresolved{border-style:dashed;border-color:#6b3a38;background:#1c1a1c} +.erd-card.erd-view{border-color:#2f4a63} +.erd-card header{display:flex;align-items:center;gap:8px;padding:8px 10px; + border-bottom:1px solid var(--rule);background:var(--toolbar)} +.erd-card h3{margin:0;font-size:13px;font-family:var(--mono);font-weight:600; + overflow-wrap:anywhere;min-width:0} +.erd-kind{font-family:var(--cond);font-size:9px;text-transform:uppercase;letter-spacing:.1em; + color:var(--jade);border:1px solid #2c5d4b;border-radius:999px;padding:1px 6px;flex:0 0 auto} +.erd-card.erd-view .erd-kind{color:var(--steel);border-color:#33506f} +.erd-card.unresolved .erd-kind{color:var(--coral);border-color:#6b3a38} +.erd-relcount{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--ink-dim); + border:1px solid var(--rule);border-radius:999px;padding:1px 6px} +.erd-cols{list-style:none;margin:0;padding:4px 0} +.erd-cols li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:8px; + align-items:baseline;padding:3px 10px;font-family:var(--mono);font-size:11px} +.erd-cols li:nth-child(odd){background:#16222b} +.erd-col-name{color:var(--ink);overflow-wrap:anywhere} +.erd-col-type{color:var(--ink-faint);font-size:10px;white-space:nowrap;max-width:120px; + overflow:hidden;text-overflow:ellipsis} +.erd-badges{display:flex;gap:3px} +.erd-badge{font-size:8.5px;letter-spacing:.04em;padding:0 3px;border-radius:2px; + border:1px solid var(--rule);color:var(--ink-dim);font-weight:600} +.erd-badge-pk{color:var(--marigold);border-color:#6d5324} +.erd-badge-fk{color:var(--steel);border-color:#33506f} +.erd-badge-uk{color:var(--jade);border-color:#2c5d4b} +.erd-badge-id{color:#c99ae0;border-color:#4d3a5c} +.erd-badge-gen{color:#e0b76a;border-color:#5c4a2a} +.erd-no-cols{padding:6px 10px;color:var(--ink-faint);font-size:10.5px;font-style:italic} +/* v2.1.0 — selection inspector: declared FKs touching the selected entity */ +.erd-inspector{ + position:absolute;right:14px;bottom:14px;z-index:4; + width:min(370px,calc(100% - 28px));max-height:min(48vh,430px);overflow:auto; + padding:10px 12px;border:1px solid var(--rule);border-radius:5px; + background:rgba(24,35,44,.97);box-shadow:0 14px 34px rgba(0,0,0,.42) +} +.erd-inspector[hidden]{display:none} +.erd-inspector header{display:flex;align-items:baseline;gap:8px;margin-bottom:6px} +.erd-inspector h4{margin:0;font-family:var(--mono);font-size:12.5px;overflow-wrap:anywhere} +.erd-inspector-close{ + margin-left:auto;border:0;background:transparent;color:var(--ink-dim);cursor:pointer; + padding:2px 4px;font-family:var(--cond);font-size:10px;font-weight:600; + text-transform:uppercase;letter-spacing:.08em +} +.erd-inspector-close:hover{color:var(--ink)} +.erd-inspector-close:focus-visible{outline:2px solid var(--marigold);outline-offset:1px} +.erd-inspector-group{margin:8px 0 4px;font-family:var(--cond);font-size:9.5px; + text-transform:uppercase;letter-spacing:.12em;color:var(--ink-faint)} +.erd-rel-row{ + display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px 8px;width:100%; + padding:5px 6px;border:0;border-radius:3px;background:transparent;color:var(--ink); + text-align:left;cursor:pointer;font-family:var(--mono);font-size:11px +} +.erd-rel-row:hover{background:#20333f} +.erd-rel-row:focus-visible{outline:2px solid var(--marigold);outline-offset:-1px} +.erd-rel-arrow{grid-row:1 / span 3;align-self:start;color:var(--steel)} +.erd-rel-name{overflow-wrap:anywhere} +.erd-rel-detail{grid-column:2;color:var(--ink-faint);font-size:10px;overflow-wrap:anywhere} +.erd-rel-meta{grid-column:2;color:var(--ink-dim);font-size:9.5px} +.erd-inspector-empty{margin:6px 0 0;color:var(--ink-faint);font-size:11px} +.erd-zoom{left:14px;right:auto;align-items:center} +.erd-zoom-val{font-family:var(--mono);font-size:10px;color:var(--ink-faint); + min-width:42px;text-align:center} +@media (max-width:900px){ + .erd-cards{grid-template-columns:1fr;gap:18px;padding:14px} + .erd-inspector{right:8px;bottom:8px;width:calc(100% - 16px)} +} diff --git a/tests/index.html b/tests/index.html index 809c9ef..8682f0d 100644 --- a/tests/index.html +++ b/tests/index.html @@ -35,6 +35,8 @@

proc>flow golden tests

+ + @@ -52,6 +54,7 @@

proc>flow golden tests

+ diff --git a/tests/schema.ts b/tests/schema.ts new file mode 100644 index 0000000..28d77f7 --- /dev/null +++ b/tests/schema.ts @@ -0,0 +1,381 @@ +/* proc>flow v2.1.0 — ERD / schema foundation fixtures. + DDL parsing across T-SQL, PostgreSQL, DB2, and SQLite: declared keys and + foreign keys only, composite-key grouping, raw type preservation, + conservative unresolved references, source spans, deterministic output, + and the Mermaid erDiagram export. + + After this suite runs, PROCFLOW_SCHEMA_PASS and PROCFLOW_SCHEMA_RESULT gate + the golden suite (tests/tests.ts). */ +(function(){ + var results: Array<{name: string; pass: boolean; detail: unknown}>=[]; + var mermaidPassed=0, mermaidTotal=0; + function record(name: string, pass: boolean, detail?: unknown): void { + results.push({name:name,pass:pass,detail:pass?'':detail}); + } + function recordMermaid(name: string, pass: boolean, detail?: unknown): void { + mermaidTotal++; + if(pass) mermaidPassed++; + record(name,pass,detail); + } + function has(list: string[], value: string): boolean { + return (list||[]).some(function(v){ return v.toUpperCase()===value.toUpperCase(); }); + } + function entity(result: SchemaResult, id: string): SchemaEntity | null { + return result.entities.filter(function(e){ return e.id===id.toUpperCase(); })[0]||null; + } + function column(result: SchemaResult, id: string, name: string): SchemaColumn | null { + var e=entity(result,id); + return e&&e.columns.filter(function(c){ return c.name.toUpperCase()===name.toUpperCase(); })[0]||null; + } + function key(result: SchemaResult, id: string, kind: string, columns: string[]): SchemaKey | null { + var e=entity(result,id); + if(!e) return null; + return e.keys.filter(function(k){ + return k.kind===kind&& + k.columns.join('|').toUpperCase()===columns.join('|').toUpperCase(); + })[0]||null; + } + function relationship(result: SchemaResult, fromId: string, toId: string): SchemaRelationship | null { + return result.relationships.filter(function(r){ + return r.fromId.toUpperCase()===fromId.toUpperCase()&& + r.toId.toUpperCase()===toId.toUpperCase(); + })[0]||null; + } + function spansValid(result: SchemaResult): boolean { + function ok(span: SourceSpan | null | undefined): boolean { + return !!span&&span.start>=0&&span.end>span.start&&span.end<=result.text.length; + } + return result.entities.every(function(e){ + return ok(e.span)&&e.columns.every(function(c){ return ok(c.span); })&& + e.keys.every(function(k){ return ok(k.span); }); + })&&result.relationships.every(function(r){ return ok(r.span); }); + } + + var TSQL=[ + 'CREATE TABLE dbo.Student (', + ' StudentId INT IDENTITY(1,1) PRIMARY KEY,', + ' Name NVARCHAR(100) NOT NULL,', + ' MentorId INT NULL,', + ' CONSTRAINT FK_Student_Mentor FOREIGN KEY (MentorId)', + ' REFERENCES dbo.Student (StudentId) ON DELETE SET NULL', + ');', + 'GO', + 'CREATE TABLE dbo.Course (', + ' CourseId INT PRIMARY KEY,', + ' Title NVARCHAR(200) NOT NULL', + ');', + 'CREATE TABLE dbo.Enrollment (', + ' StudentId INT NOT NULL,', + ' CourseId INT NOT NULL,', + ' PRIMARY KEY (StudentId, CourseId),', + ' FOREIGN KEY (StudentId) REFERENCES dbo.Student (StudentId),', + ' FOREIGN KEY (CourseId) REFERENCES dbo.Course (CourseId)', + ');', + 'ALTER TABLE dbo.Student ADD CONSTRAINT UQ_Student_Name UNIQUE (Name);' + ].join('\n'); + + var PGSQL=[ + 'CREATE TABLE public.customer (', + ' customer_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,', + ' email text NOT NULL,', + ' CONSTRAINT uq_customer_email UNIQUE (email)', + ');', + 'CREATE TABLE public."Order" (', + ' "Order Id" serial PRIMARY KEY,', + ' "Customer Id" integer NOT NULL REFERENCES public.customer(customer_id) ON DELETE CASCADE,', + ' placed_at timestamp with time zone NOT NULL DEFAULT now(),', + ' total numeric(12,2) GENERATED ALWAYS AS (1) STORED,', + ' note text', + ');', + 'CREATE UNIQUE INDEX uq_order_customer ON public."Order" ("Customer Id");' + ].join('\n'); + + var SQLITE=[ + 'CREATE TABLE IF NOT EXISTS gadget (', + ' id INTEGER PRIMARY KEY AUTOINCREMENT,', + ' label VARCHAR(50) NOT NULL UNIQUE,', + ' owner_id INTEGER REFERENCES owner(id),', + ' oddity TYPO_TYPE', + ');', + 'CREATE TABLE owner (id INTEGER PRIMARY KEY);' + ].join('\n'); + + var DB2=[ + 'CREATE TABLE sales (', + ' sale_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,', + ' amount DECIMAL(31,0) NOT NULL,', + ' region VARCHAR(10),', + ' PRIMARY KEY (sale_id),', + ' FOREIGN KEY (region) REFERENCES region(code) ON DELETE SET NULL', + ');' + ].join('\n'); + + /* ---- T-SQL: declared keys, composite grouping, actions, ALTER ---- */ + try{ + var t=parseSchema(TSQL); + var enrollment=key(t,'DBO.ENROLLMENT','pk',['StudentId','CourseId']); + var mentorFk=key(t,'DBO.STUDENT','fk',['MentorId']); + var studentPk=key(t,'DBO.STUDENT','pk',['StudentId']); + var studentName=key(t,'DBO.STUDENT','unique',['Name']); + var selfRel=relationship(t,'DBO.STUDENT','DBO.STUDENT'); + var studentToEnrollment=relationship(t,'DBO.STUDENT','DBO.ENROLLMENT'); + var courseToEnrollment=relationship(t,'DBO.COURSE','DBO.ENROLLMENT'); + record('v2.1.0 T-SQL tables, composite PK, and declared FK relationships', + t.stats.tables===3&&t.stats.views===0&&t.stats.columns===7&& + t.stats.relationships===3&&t.stats.unresolved===0&& + !!enrollment&&!!studentPk&&!!studentName&&!!mentorFk&& + !!selfRel&&selfRel.optional===true&&selfRel.cardinality==='one-to-many'&& + !!studentToEnrollment&&studentToEnrollment.optional===false&& + studentToEnrollment.toColumns.join(',')==='StudentId'&& + !!courseToEnrollment&&courseToEnrollment.resolution==='exact'&& + mentorFk.onDelete==='SET NULL'&& + !t.diagnostics.some(function(d){ return d.severity==='error'; }), + {stats:t.stats,diagnostics:t.diagnostics,keys:entity(t,'DBO.ENROLLMENT')}); + record('v2.1.0 T-SQL identity, NOT NULL, and composite column flags', + !!column(t,'DBO.STUDENT','StudentId')&&column(t,'DBO.STUDENT','StudentId').identity===true&& + column(t,'DBO.STUDENT','StudentId').primaryKey===true&& + column(t,'DBO.STUDENT','StudentId').nullable===false&& + column(t,'DBO.STUDENT','MentorId').nullable===true&& + column(t,'DBO.ENROLLMENT','StudentId').primaryKey===true&& + column(t,'DBO.ENROLLMENT','CourseId').primaryKey===true&& + column(t,'DBO.STUDENT','Name').type==='NVARCHAR(100)', + entity(t,'DBO.STUDENT')); + record('v2.1.0 schema spans stay inside the source DDL',spansValid(t),t); + record('v2.1.0 DDL parsing is deterministic',JSON.stringify(t)===JSON.stringify(parseSchema(TSQL)),t); + }catch(err){ + record('v2.1.0 T-SQL tables, composite PK, and declared FK relationships',false,String(err&&err.stack||err)); + record('v2.1.0 T-SQL identity, NOT NULL, and composite column flags',false,String(err&&err.stack||err)); + record('v2.1.0 schema spans stay inside the source DDL',false,String(err&&err.stack||err)); + record('v2.1.0 DDL parsing is deterministic',false,String(err&&err.stack||err)); + } + + /* ---- PostgreSQL: quoting, serial/identity, generated, unique index ---- */ + try{ + var p=parseSchema(PGSQL); + var orderRel=relationship(p,'PUBLIC.CUSTOMER','PUBLIC.ORDER'); + record('v2.1.0 PostgreSQL quoted identifiers, serial, and unique-index one-to-one', + p.stats.tables===2&&p.stats.relationships===1&& + !!column(p,'PUBLIC.ORDER','Order Id')&& + column(p,'PUBLIC.ORDER','Order Id').identity===true&& + column(p,'PUBLIC.ORDER','Order Id').primaryKey===true&& + column(p,'PUBLIC.ORDER','Customer Id').type==='integer'&& + !!orderRel&&orderRel.cardinality==='one-to-one'&&orderRel.optional===false&& + orderRel.unique===true&& + orderRel.fromColumns.join(',')==='customer_id'&& + orderRel.toColumns.join(',')==='Customer Id'&& + !!key(p,'PUBLIC.ORDER','unique',['Customer Id']), + {stats:p.stats,rel:orderRel,entity:entity(p,'PUBLIC.ORDER')}); + record('v2.1.0 PostgreSQL raw type fidelity and generated columns', + column(p,'PUBLIC.ORDER','placed_at').type==='timestamp with time zone'&& + column(p,'PUBLIC.ORDER','total').type==='numeric(12,2)'&& + column(p,'PUBLIC.ORDER','total').generated===true&& + column(p,'PUBLIC.ORDER','total').computed===false, + entity(p,'PUBLIC.ORDER')); + }catch(err){ + record('v2.1.0 PostgreSQL quoted identifiers, serial, and unique-index one-to-one',false,String(err&&err.stack||err)); + record('v2.1.0 PostgreSQL raw type fidelity and generated columns',false,String(err&&err.stack||err)); + } + + /* ---- SQLite: affinities preserved, inline REFERENCES, AUTOINCREMENT ---- */ + try{ + var s=parseSchema(SQLITE); + var ownerRel=relationship(s,'OWNER','GADGET'); + record('v2.1.0 SQLite AUTOINCREMENT, inline REFERENCES, and raw affinity text', + s.stats.tables===2&&s.stats.relationships===1&& + column(s,'GADGET','id').identity===true&& + column(s,'GADGET','label').unique===true&& + column(s,'GADGET','label').nullable===false&& + column(s,'GADGET','oddity').type==='TYPO_TYPE'&& + !!ownerRel&&ownerRel.optional===true&& + ownerRel.fromColumns.join(',')==='id'&&ownerRel.toColumns.join(',')==='owner_id', + {stats:s.stats,rel:ownerRel,entity:entity(s,'GADGET')}); + }catch(err){ + record('v2.1.0 SQLite AUTOINCREMENT, inline REFERENCES, and raw affinity text',false,String(err&&err.stack||err)); + } + + /* ---- DB2: generated identity, precise types, unresolved target ---- */ + try{ + var d=parseSchema(DB2); + var sales=entity(d,'SALES'); + var regionRel=relationship(d,'EXTERNAL:REGION','SALES'); + record('v2.1.0 DB2 identity, DECIMAL precision, and explicit unresolved target', + d.stats.tables===1&&d.stats.unresolved===1&&d.stats.relationships===1&& + column(d,'SALES','sale_id').identity===true&& + column(d,'SALES','sale_id').primaryKey===true&& + column(d,'SALES','amount').type==='DECIMAL(31,0)'&& + !!regionRel&®ionRel.resolution==='opaque'&& + d.diagnostics.some(function(x){ return x.code==='schema_unresolved_reference'; })&& + entity(d,'SALES').unresolved===false, + {stats:d.stats,rel:regionRel,diagnostics:d.diagnostics}); + }catch(err){ + record('v2.1.0 DB2 identity, DECIMAL precision, and explicit unresolved target',false,String(err&&err.stack||err)); + } + + /* ---- Views and unknown-column honesty ---- */ + try{ + var v=parseSchema([ + 'CREATE VIEW dbo.vActive (Id, Name) AS SELECT Id, Name FROM dbo.Student;', + 'CREATE VIEW dbo.vUnknown AS SELECT 1;' + ].join('\n')); + var known=entity(v,'DBO.VACTIVE'), unknown=entity(v,'DBO.VUNKNOWN'); + record('v2.1.0 views keep declared columns and report unknown ones', + v.stats.tables===0&&v.stats.views===2&& + !!known&&known.kind==='view'&&known.columns.length===2&&known.keys.length===0&& + !!unknown&&unknown.columns.length===0&& + v.diagnostics.some(function(x){ return x.code==='schema_columns_unknown'; }), + {stats:v.stats,diagnostics:v.diagnostics}); + }catch(err){ + record('v2.1.0 views keep declared columns and report unknown ones',false,String(err&&err.stack||err)); + } + + /* ---- Conservative resolution: duplicate, anonymous ALTER, ambiguity ---- */ + try{ + var dup=parseSchema([ + 'CREATE TABLE a (id INT PRIMARY KEY);', + 'CREATE TABLE a (id INT PRIMARY KEY);', + 'ALTER TABLE ghost ADD COLUMN x INT;' + ].join('\n')); + record('v2.1.0 duplicate entities and unknown ALTER targets are reported, not merged', + dup.entities.length===1&& + dup.diagnostics.some(function(x){ return x.code==='schema_duplicate_entity'; })&& + dup.diagnostics.some(function(x){ return x.code==='schema_alter_unknown_table'; }), + {entities:dup.entities,diagnostics:dup.diagnostics}); + var ambiguous=parseSchema([ + 'CREATE TABLE s1.users (id INT PRIMARY KEY);', + 'CREATE TABLE s2.users (id INT PRIMARY KEY);', + 'CREATE TABLE t (id INT PRIMARY KEY, user_id INT REFERENCES users (id));' + ].join('\n')); + record('v2.1.0 ambiguous FK targets are never guessed into an edge', + ambiguous.relationships.length===0&& + ambiguous.diagnostics.some(function(x){ return x.code==='schema_ambiguous_reference'; }), + {relationships:ambiguous.relationships,diagnostics:ambiguous.diagnostics}); + var heuristic=parseSchema([ + 'CREATE TABLE s1.users (id INT PRIMARY KEY);', + 'CREATE TABLE t (id INT PRIMARY KEY, user_id INT REFERENCES users (id));' + ].join('\n')); + var heuristicRel=heuristic.relationships[0]; + record('v2.1.0 unqualified FK targets resolve by name with a labelled warning', + !!heuristicRel&&heuristicRel.resolution==='heuristic'&& + heuristic.diagnostics.some(function(x){ return x.code==='schema_unresolved_reference'; }), + {relationships:heuristic.relationships,diagnostics:heuristic.diagnostics}); + var empty=parseSchema(''); + record('v2.1.0 empty DDL is reported, not treated as a schema', + empty.entities.length===0&&empty.stats.relationships===0&& + empty.diagnostics.some(function(x){ return x.code==='schema_empty'; }), + empty); + }catch(err){ + record('v2.1.0 duplicate entities and unknown ALTER targets are reported, not merged',false,String(err&&err.stack||err)); + record('v2.1.0 ambiguous FK targets are never guessed into an edge',false,String(err&&err.stack||err)); + record('v2.1.0 unqualified FK targets resolve by name with a labelled warning',false,String(err&&err.stack||err)); + record('v2.1.0 empty DDL is reported, not treated as a schema',false,String(err&&err.stack||err)); + } + + /* ---- Bundled DB2 ERD sample: 8 tables, 4 views, 6 relationships ---- */ + try{ + var db2Sample=parseSchema(PROCFLOW_ERD_SAMPLE_DB2); + function hasNoRelationships(id: string): boolean { + return !db2Sample.relationships.some(function(rel){ + return rel.fromId===id||rel.toId===id; + }); + } + record('v2.1.0 DB2 ERD sample parses 8 tables, 4 views, and 6 relationships', + db2Sample.stats.tables===8&&db2Sample.stats.views===4&& + db2Sample.stats.relationships===6&&db2Sample.stats.unresolved===0&& + !!entity(db2Sample,'SALES.AUDIT_LOG')&&!!entity(db2Sample,'SALES.APP_SETTINGS')&& + hasNoRelationships('SALES.AUDIT_LOG')&&hasNoRelationships('SALES.APP_SETTINGS')&& + !!relationship(db2Sample,'SALES.EMPLOYEE','SALES.ORDERS')&& + !!key(db2Sample,'SALES.PRODUCT','unique',['sku'])&& + !db2Sample.diagnostics.some(function(x){ return x.severity==='error'; }), + {stats:db2Sample.stats,diagnostics:db2Sample.diagnostics}); + }catch(err){ + record('v2.1.0 DB2 ERD sample parses 8 tables, 4 views, and 6 relationships',false,String(err&&err.stack||err)); + } + + /* ---- Bulk estate: a generated 300-table chain parses without drops ---- */ + try{ + var bulkLines=[]; + for(var bulkIndex=1;bulkIndex<=300;bulkIndex++){ + bulkLines.push('CREATE TABLE app.t'+bulkIndex+' ('); + bulkLines.push(' id INT NOT NULL,'); + bulkLines.push(' ref_id INT,'); + bulkLines.push(' CONSTRAINT pk_t'+bulkIndex+' PRIMARY KEY (id),'); + bulkLines.push(' CONSTRAINT fk_t'+bulkIndex+' FOREIGN KEY (ref_id) REFERENCES app.t'+ + (bulkIndex===1?300:bulkIndex-1)+' (id)'); + bulkLines.push(');'); + } + var bulkResult=parseSchema(bulkLines.join('\n')); + record('v2.1.0 bulk DDL estate parses without silent drops', + bulkResult.stats.tables===300&&bulkResult.stats.relationships===300&& + bulkResult.stats.columns===600&&bulkResult.stats.unresolved===0&& + !bulkResult.diagnostics.some(function(x){ return x.severity!=='info'; })&& + spansValid(bulkResult), + bulkResult.stats); + }catch(err){ + record('v2.1.0 bulk DDL estate parses without silent drops',false,String(err&&err.stack||err)); + } + + /* ---- Mermaid erDiagram export ---- */ + try{ + var tm=toMermaidER(parseSchema(TSQL)); + recordMermaid('mermaid erDiagram declares entities with PK/FK/UK attributes', + tm.indexOf('erDiagram')===0&& + tm.indexOf('DBO_STUDENT {')>=0&& + tm.indexOf('INT StudentId PK')>=0&& + tm.indexOf('INT MentorId FK')>=0&& + /DBO_ENROLLMENT \{\n(\s+.*\n)*?\s+\}/.test(tm)&& + tm.indexOf('StudentId PK, FK')>=0&& + tm.indexOf('Name UK')>=0, + tm); + recordMermaid('mermaid relationships encode declared cardinality and optionality', + tm.indexOf('DBO_STUDENT o|--o{ DBO_STUDENT : FK_Student_Mentor')>=0&& + tm.indexOf('DBO_STUDENT ||--o{ DBO_ENROLLMENT')>=0&& + tm.indexOf('DBO_COURSE ||--o{ DBO_ENROLLMENT')>=0, + tm); + recordMermaid('mermaid provenance comments preserve original names and raw types', + tm.indexOf('%% entity DBO_STUDENT = "dbo.Student" (table)')>=0&& + tm.indexOf('%% column DBO_STUDENT.Name : NVARCHAR(100)')>=0&& + tm.indexOf('%% relationship DBO_STUDENT -> DBO_ENROLLMENT')>=0, + tm); + var pg=toMermaidER(parseSchema(PGSQL)); + recordMermaid('mermaid sanitizes identifiers and types, keeping raw text in a comment', + pg.indexOf('timestamp_with_time_zone placed_at "timestamp with time zone"')>=0&& + pg.indexOf('Order_Id')>=0&& + pg.indexOf('PUBLIC_CUSTOMER ||--|| PUBLIC_ORDER')>=0&& + pg.indexOf('PUBLIC_ORDER {')>=0, + pg); + var db2=toMermaidER(parseSchema(DB2)); + recordMermaid('mermaid exports unresolved targets as explicit external entities', + db2.indexOf('EXTERNAL_REGION')>=0&& + /EXTERNAL_REGION o\|--o\{ SALES/.test(db2)&& + db2.indexOf('%% entity EXTERNAL_REGION = "region"')>=0, + db2); + var collisions=toMermaidER(parseSchema([ + 'CREATE TABLE a.b (id INT PRIMARY KEY);', + 'CREATE TABLE a_b (id INT PRIMARY KEY);' + ].join('\n'))); + var idLines=collisions.split('\n').filter(function(line){ + return /\{/.test(line); + }); + recordMermaid('mermaid entity identifiers are deterministic and collision-free', + idLines.length===2&&idLines[0].trim()!==idLines[1].trim()&& + idLines[0].trim()==='A_B {'&&idLines[1].trim()==='A_B_2 {', + collisions); + recordMermaid('mermaid export is deterministic', + tm===toMermaidER(parseSchema(TSQL)), + tm); + }catch(err){ + recordMermaid('mermaid erDiagram declares entities with PK/FK/UK attributes',false,String(err&&err.stack||err)); + recordMermaid('mermaid relationships encode declared cardinality and optionality',false,String(err&&err.stack||err)); + recordMermaid('mermaid provenance comments preserve original names and raw types',false,String(err&&err.stack||err)); + recordMermaid('mermaid sanitizes identifiers and types, keeping raw text in a comment',false,String(err&&err.stack||err)); + recordMermaid('mermaid exports unresolved targets as explicit external entities',false,String(err&&err.stack||err)); + recordMermaid('mermaid entity identifiers are deterministic and collision-free',false,String(err&&err.stack||err)); + recordMermaid('mermaid export is deterministic',false,String(err&&err.stack||err)); + } + + var passed=results.filter(function(r){ return r.pass; }).length; + window.PROCFLOW_SCHEMA_DETAIL=results; + window.PROCFLOW_SCHEMA_RESULT={passed:passed,total:results.length, + mermaidPassed:mermaidPassed,mermaidTotal:mermaidTotal}; + window.PROCFLOW_SCHEMA_PASS=passed===results.length; +})(); diff --git a/tests/tests.ts b/tests/tests.ts index f046b5c..4098841 100644 --- a/tests/tests.ts +++ b/tests/tests.ts @@ -1024,6 +1024,22 @@ record('v2 adversarial semantic qualification matrix',false,String(err&&err.stack||err)); } + /* v2.1.0: ERD / schema foundation — DDL parsing across the four dialects, + declared keys and foreign keys only, composite-key grouping, conservative + unresolved references, source spans, and the Mermaid erDiagram export run + ahead in tests/schema.ts; gate the whole golden page on them. */ + try{ + record('v2.1.0 ERD schema parse and Mermaid erDiagram fixtures', + window.PROCFLOW_SCHEMA_PASS===true&& + !!window.PROCFLOW_SCHEMA_RESULT&& + window.PROCFLOW_SCHEMA_RESULT.passed===window.PROCFLOW_SCHEMA_RESULT.total&& + window.PROCFLOW_SCHEMA_RESULT.mermaidPassed===window.PROCFLOW_SCHEMA_RESULT.mermaidTotal, + window.PROCFLOW_SCHEMA_DETAIL||window.PROCFLOW_SCHEMA_RESULT); + }catch(err){ + record('v2.1.0 ERD schema parse and Mermaid erDiagram fixtures', + false,String(err&&err.stack||err)); + } + var passed=results.filter(function(r){return r.pass;}).length; document.body.className=passed===results.length?'pass':'fail'; document.getElementById('summary').textContent=passed+'/'+results.length+' tests passed';