@rdbms-erd/core 0.1.24 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -81,6 +81,17 @@ function migrateLegacyFkLineVisibility(model) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
+
function normalizeColumnDefaultValues(model) {
|
|
85
|
+
for (const table of model.tables) {
|
|
86
|
+
const cols = table.columns;
|
|
87
|
+
if (!Array.isArray(cols)) continue;
|
|
88
|
+
for (const col of cols) {
|
|
89
|
+
if (col.defaultValue === void 0 || col.defaultValue === null) {
|
|
90
|
+
col.defaultValue = "";
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
84
95
|
function isObject(value) {
|
|
85
96
|
return typeof value === "object" && value !== null;
|
|
86
97
|
}
|
|
@@ -572,6 +583,7 @@ function validateDesignDocument(input, options) {
|
|
|
572
583
|
}
|
|
573
584
|
const doc = input;
|
|
574
585
|
migrateLegacyFkLineVisibility(doc.model);
|
|
586
|
+
normalizeColumnDefaultValues(doc.model);
|
|
575
587
|
return doc;
|
|
576
588
|
}
|
|
577
589
|
function roundTripDesign(doc) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/alignment.ts","../src/index.ts"],"names":["quoteIdentifier","toDefaultExpression"],"mappings":"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","file":"index.js","sourcesContent":["export type AlignCommand =\n | \"left\"\n | \"h-center\"\n | \"right\"\n | \"top\"\n | \"v-center\"\n | \"bottom\"\n | \"h-gap\"\n | \"v-gap\";\n\n/**\n * 멀티 선택된 노드 위치를 bounding box 기준으로 정렬/분배한다.\n * positions는 id -> 좌표 맵이며, 반환값은 동일 키에 갱신된 좌표만 포함한다.\n */\nexport function alignNodePositions(\n selectedIds: string[],\n positions: Record<string, { x: number; y: number }>,\n command: AlignCommand,\n anchorId?: string\n): Record<string, { x: number; y: number }> {\n const entries = selectedIds\n .map((id) => {\n const pos = positions[id];\n return pos ? { id, pos: { ...pos } } : null;\n })\n .filter((e): e is { id: string; pos: { x: number; y: number } } => Boolean(e));\n\n if (entries.length < 2) {\n return {};\n }\n\n const xs = entries.map((e) => e.pos.x);\n const ys = entries.map((e) => e.pos.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const anchorPos = anchorId\n ? entries.find((e) => e.id === anchorId)?.pos\n : undefined;\n const targetX = anchorPos?.x ?? centerX;\n const targetY = anchorPos?.y ?? centerY;\n\n const sortByX = [...entries].sort((a, b) => a.pos.x - b.pos.x);\n const sortByY = [...entries].sort((a, b) => a.pos.y - b.pos.y);\n\n const out: Record<string, { x: number; y: number }> = {};\n\n for (const e of entries) {\n const next = { ...e.pos };\n if (command === \"left\") next.x = anchorPos ? targetX : minX;\n if (command === \"h-center\") next.x = targetX;\n if (command === \"right\") next.x = anchorPos ? targetX : maxX;\n if (command === \"top\") next.y = anchorPos ? targetY : minY;\n if (command === \"v-center\") next.y = targetY;\n if (command === \"bottom\") next.y = anchorPos ? targetY : maxY;\n out[e.id] = next;\n }\n\n if (command === \"h-gap\") {\n const gap = entries.length > 1 ? (maxX - minX) / (entries.length - 1) : 0;\n sortByX.forEach((e, index) => {\n out[e.id] = { ...e.pos, x: minX + gap * index };\n });\n }\n\n if (command === \"v-gap\") {\n const gap = entries.length > 1 ? (maxY - minY) / (entries.length - 1) : 0;\n sortByY.forEach((e, index) => {\n out[e.id] = { ...e.pos, y: minY + gap * index };\n });\n }\n\n return out;\n}\n","export type BuiltinRdbmsDialect =\n | \"mssql\"\n | \"oracle\"\n | \"mysql\"\n | \"postgres\"\n | \"sqlite\";\nexport type RdbmsDialect = BuiltinRdbmsDialect | (string & {});\n\nexport { alignNodePositions, type AlignCommand } from \"./alignment\";\n\nexport const LOGICAL_DATA_TYPES = [\n \"TEXT\",\n \"DATE\",\n \"TIME\",\n \"DATETIME\",\n \"NUMBER\",\n \"DECIMAL\",\n \"FLOAT\",\n \"BOOLEAN\",\n \"JSON\",\n \"UUID\",\n \"BINARY\",\n] as const;\n\nexport type LogicalDataType = (typeof LOGICAL_DATA_TYPES)[number];\n\nexport interface ColumnModel {\n id: string;\n logicalName: string;\n physicalName: string;\n /** 컬럼 설명(업무/도메인 메모). */\n description?: string;\n logicalType: LogicalDataType;\n physicalType: string;\n defaultValue?: string;\n nullable: boolean;\n isPrimaryKey?: boolean;\n isForeignKey?: boolean;\n referencesPrimaryColumnId?: string;\n /** 테이블 노드에서 해당 컬럼 행 배경색 */\n color?: string;\n}\n\nexport interface TableModel {\n id: string;\n logicalName: string;\n physicalName: string;\n /** 테이블 설명(업무/도메인 메모). */\n description?: string;\n /** Dialect-dependent schema/catalog qualifier (e.g. `public`, `dbo`). */\n schemaName?: string;\n color?: string;\n columns: ColumnModel[];\n}\n\nexport interface RelationshipModel {\n id: string;\n /** 참조 원본(PK) 테이블 */\n sourceTableId: string;\n /** 참조 대상(FK) 테이블 */\n targetTableId: string;\n /**\n * 복합 PK→FK 연결에서 컬럼 쌍마다 관계 레코드는 여러 개 두되,\n * 동일 값을 가진 관계들은 캔버스에서 한 줄로 묶어 그린다.\n */\n relationshipGroupId?: string;\n /** source(PK) 컬럼 id */\n sourceColumnId?: string;\n /** target(FK) 컬럼 id */\n targetColumnId?: string;\n /** 연결 시 생성된 FK 컬럼인지 여부(삭제 시 컬럼 정리용) */\n autoCreatedTargetColumn?: boolean;\n /** FK가 최초로 연결된 PK 컬럼 id(컬럼명 변경과 무관) */\n originPkColumnId?: string;\n /** 타깃 cardinality. 기본 1:N */\n cardinality?: \"1:1\" | \"1:N\";\n /** 출발(소스) 엣지의 테이블 내부 절대 Y 좌표(px). */\n sourceLineY?: number;\n /** @deprecated legacy ratio(0~1). sourceLineY가 없을 때만 fallback으로 사용 */\n sourceLineRatio?: number;\n /** 관계선의 중간 꺾임 위치 비율(0~1). 두 테이블 앵커 사이의 비율로 저장한다. */\n linePivotRatio?: number;\n /** true이면 캔버스에서 해당 관계선을 기본적으로 숨긴다. 툴의「숨긴 관계선 보기」로만 표시 가능. */\n canvasLineHidden?: boolean;\n}\n\n/**\n * 캔버스에 관계선을 그릴지 여부.\n * - `revealHiddenLines === false`: `canvasLineHidden`인 관계는 제외.\n * - `revealHiddenLines === true`: 숨김 처리된 관계도 함께 그린다(표시만, 속성은 바꾸지 않음).\n */\nexport function isRelationshipLineRenderable(\n rel: RelationshipModel,\n revealHiddenLines: boolean,\n): boolean {\n if (rel.canvasLineHidden === true) return revealHiddenLines;\n return true;\n}\n\n/** 구버전 `ColumnModel.showFkRelationLine === false`를 관계의 `canvasLineHidden`으로 옮긴 뒤 컬럼 플래그를 제거한다. */\nexport function migrateLegacyFkLineVisibility(model: DesignModel): void {\n for (const table of model.tables) {\n for (const col of table.columns) {\n const legacy = (col as { showFkRelationLine?: boolean })\n .showFkRelationLine;\n if (legacy === false && col.isForeignKey) {\n for (const rel of model.relationships) {\n if (\n rel.targetTableId === table.id &&\n rel.targetColumnId === col.id\n ) {\n rel.canvasLineHidden = true;\n }\n }\n }\n if (\"showFkRelationLine\" in col) {\n delete (col as { showFkRelationLine?: boolean })\n .showFkRelationLine;\n }\n }\n }\n}\n\nexport interface IndexModel {\n id: string;\n tableId: string;\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface DiagramLayout {\n nodePositions: Record<string, { x: number; y: number }>;\n}\n\nexport interface DesignModel {\n dialect: RdbmsDialect;\n tables: TableModel[];\n relationships: RelationshipModel[];\n indexes: IndexModel[];\n}\n\nexport interface DesignDocument {\n schemaVersion: number;\n model: DesignModel;\n layout: DiagramLayout;\n settings?: Record<string, unknown>;\n}\n\nexport interface DialectCapability {\n supportsSchema: boolean;\n}\n\nexport type DdlStyleQuote = \"double\" | \"backtick\" | \"bracket\";\nexport type DdlStyleBooleanLiteral = \"trueFalse\" | \"oneZero\";\n\nexport interface DdlStyle {\n quote: DdlStyleQuote;\n boolLiteral?: DdlStyleBooleanLiteral;\n nowKeyword?: string;\n}\n\nexport interface LogicalTypeMeta {\n id: LogicalDataType;\n label?: string;\n defaultPhysicalType: string;\n}\n\nexport interface DialectMetaJson {\n id: RdbmsDialect;\n label: string;\n supportsSchema: boolean;\n logicalTypes: LogicalTypeMeta[];\n ddlStyle?: DdlStyle;\n}\n\nexport interface DialectMeta {\n id: RdbmsDialect;\n label: string;\n capabilities: DialectCapability;\n logicalTypes: readonly LogicalDataType[];\n defaultPhysicalTypeMap: Partial<Record<LogicalDataType, string>>;\n}\n\nexport type DdlScope =\n | { kind: \"all\" }\n | { kind: \"selected\"; tableIds: string[] };\n\nexport interface DdlGenerateInput {\n doc: DesignDocument;\n dialectId: RdbmsDialect;\n scope: DdlScope;\n}\n\nexport interface DdlGenerateOutput {\n sql: string;\n diagnostics?: DdlDiagnostic[];\n}\n\nexport type DdlGeneratorHook = (\n input: DdlGenerateInput,\n) => DdlGenerateOutput | Promise<DdlGenerateOutput>;\n\nexport interface DdlGeneratorRules {\n quoteIdentifier?: (dialect: RdbmsDialect, identifier: string) => string;\n toDefaultExpression?: (\n dialect: RdbmsDialect,\n col: ColumnModel,\n ) => string | null;\n}\n\nexport interface DbMetaAdapter {\n listDialects: () => DialectMeta[];\n getDialectMeta: (dialect: RdbmsDialect) => DialectMeta | undefined;\n getDefaultPhysicalType: (\n dialect: RdbmsDialect,\n logicalType: LogicalDataType,\n ) => string;\n getDdlRules: (dialect: RdbmsDialect) => DdlGeneratorRules;\n}\n\nexport interface CoreDbMetaOptions {\n dbMetaAdapter?: DbMetaAdapter;\n hostMetas?: DialectMetaJson[];\n hostDdlGenerators?: Record<string, DdlGeneratorHook>;\n fallbackOnHookError?: boolean;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport const BUILTIN_DIALECTS: readonly BuiltinRdbmsDialect[] = [\n \"mssql\",\n \"oracle\",\n \"mysql\",\n \"postgres\",\n \"sqlite\",\n] as const;\n\nconst DIALECT_DEFAULT_TYPE_MAP: Record<\n BuiltinRdbmsDialect,\n Record<LogicalDataType, string>\n> = {\n mssql: {\n TEXT: \"NVARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"DATETIME2\",\n NUMBER: \"INT\",\n DECIMAL: \"DECIMAL(10,2)\",\n FLOAT: \"FLOAT\",\n BOOLEAN: \"BIT\",\n JSON: \"NVARCHAR(MAX)\",\n UUID: \"UNIQUEIDENTIFIER\",\n BINARY: \"VARBINARY(255)\",\n },\n oracle: {\n TEXT: \"VARCHAR2(255)\",\n DATE: \"DATE\",\n TIME: \"TIMESTAMP\",\n DATETIME: \"TIMESTAMP\",\n NUMBER: \"NUMBER(10)\",\n DECIMAL: \"NUMBER(10,2)\",\n FLOAT: \"BINARY_FLOAT\",\n BOOLEAN: \"NUMBER(1)\",\n JSON: \"CLOB\",\n UUID: \"RAW(16)\",\n BINARY: \"RAW(255)\",\n },\n mysql: {\n TEXT: \"VARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"DATETIME\",\n NUMBER: \"INT\",\n DECIMAL: \"DECIMAL(10,2)\",\n FLOAT: \"FLOAT\",\n BOOLEAN: \"BOOLEAN\",\n JSON: \"JSON\",\n UUID: \"CHAR(36)\",\n BINARY: \"VARBINARY(255)\",\n },\n postgres: {\n TEXT: \"VARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"TIMESTAMP\",\n NUMBER: \"INTEGER\",\n DECIMAL: \"NUMERIC(10,2)\",\n FLOAT: \"REAL\",\n BOOLEAN: \"BOOLEAN\",\n JSON: \"JSONB\",\n UUID: \"UUID\",\n BINARY: \"BYTEA\",\n },\n sqlite: {\n TEXT: \"TEXT\",\n DATE: \"TEXT\",\n TIME: \"TEXT\",\n DATETIME: \"TEXT\",\n NUMBER: \"INTEGER\",\n DECIMAL: \"NUMERIC(10,2)\",\n FLOAT: \"REAL\",\n BOOLEAN: \"INTEGER\",\n JSON: \"TEXT\",\n UUID: \"TEXT\",\n BINARY: \"BLOB\",\n },\n};\n\nconst DIALECT_CAPABILITIES: Record<\n BuiltinRdbmsDialect,\n { supportsSchema: boolean }\n> = {\n mssql: { supportsSchema: true },\n oracle: { supportsSchema: true },\n mysql: { supportsSchema: true },\n postgres: { supportsSchema: true },\n sqlite: { supportsSchema: false },\n};\n\nconst DIALECT_LABELS: Record<BuiltinRdbmsDialect, string> = {\n mssql: \"MS SQL Server\",\n oracle: \"Oracle\",\n mysql: \"MySQL\",\n postgres: \"PostgreSQL\",\n sqlite: \"SQLite\",\n};\n\nconst DIALECT_DDL_STYLE: Record<BuiltinRdbmsDialect, DdlStyle> = {\n mssql: {\n quote: \"bracket\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"GETDATE()\",\n },\n oracle: {\n quote: \"double\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n mysql: {\n quote: \"backtick\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n postgres: {\n quote: \"double\",\n boolLiteral: \"trueFalse\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n sqlite: {\n quote: \"double\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n};\n\nfunction toLogicalTypeMetas(dialect: BuiltinRdbmsDialect): LogicalTypeMeta[] {\n return LOGICAL_DATA_TYPES.map((id) => ({\n id,\n defaultPhysicalType: DIALECT_DEFAULT_TYPE_MAP[dialect][id],\n }));\n}\n\nexport const BUILTIN_DIALECT_METAS_JSON: DialectMetaJson[] =\n BUILTIN_DIALECTS.map((dialect) => ({\n id: dialect,\n label: DIALECT_LABELS[dialect],\n supportsSchema: DIALECT_CAPABILITIES[dialect].supportsSchema,\n logicalTypes: toLogicalTypeMetas(dialect),\n ddlStyle: DIALECT_DDL_STYLE[dialect],\n }));\n\nfunction defaultDdlRules(): DdlGeneratorRules {\n return {\n quoteIdentifier: (dialect, identifier) => {\n if (dialect === \"mssql\") return `[${identifier}]`;\n if (dialect === \"mysql\") return `\\`${identifier}\\``;\n return `\"${identifier}\"`;\n },\n toDefaultExpression: (dialect, col) => {\n const raw = col.defaultValue?.trim();\n if (!raw) return null;\n const upper = raw.toUpperCase();\n const isFunctionLike =\n /[()]/.test(raw) ||\n upper === \"NULL\" ||\n upper === \"CURRENT_TIMESTAMP\" ||\n upper === \"CURRENT_DATE\";\n if (isFunctionLike) return raw;\n if (\n col.logicalType === \"NUMBER\" ||\n col.logicalType === \"DECIMAL\" ||\n col.logicalType === \"FLOAT\"\n )\n return raw;\n if (col.logicalType === \"BOOLEAN\") {\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n if (\n dialect === \"mssql\" ||\n dialect === \"oracle\" ||\n dialect === \"sqlite\"\n )\n return upper === \"TRUE\" ? \"1\" : \"0\";\n return upper;\n }\n if (raw === \"1\" || raw === \"0\") return raw;\n return quoteSqlString(raw);\n }\n if (col.logicalType === \"DATE\" || col.logicalType === \"DATETIME\") {\n if (dialect === \"mssql\" && upper === \"NOW\") return \"GETDATE()\";\n if (upper === \"NOW\") return \"CURRENT_TIMESTAMP\";\n return quoteSqlString(raw);\n }\n if (\n (raw.startsWith(\"'\") && raw.endsWith(\"'\")) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n )\n return raw;\n return quoteSqlString(raw);\n },\n };\n}\n\nfunction toAdapterDialectMeta(meta: DialectMetaJson): DialectMeta {\n const typeMap: Partial<Record<LogicalDataType, string>> = {};\n for (const lt of meta.logicalTypes) typeMap[lt.id] = lt.defaultPhysicalType;\n return {\n id: meta.id,\n label: meta.label,\n capabilities: { supportsSchema: meta.supportsSchema },\n logicalTypes: meta.logicalTypes.map((lt) => lt.id),\n defaultPhysicalTypeMap: typeMap,\n };\n}\n\nexport function mergeDialectMetas(\n base: DialectMetaJson[],\n host: DialectMetaJson[] = [],\n): DialectMetaJson[] {\n const byId = new Map<string, DialectMetaJson>(\n base.map((meta) => [meta.id, meta]),\n );\n for (const meta of host) byId.set(meta.id, meta);\n return Array.from(byId.values());\n}\n\nexport function resolveDialectMetas(\n options?: CoreDbMetaOptions,\n): DialectMetaJson[] {\n return mergeDialectMetas(\n BUILTIN_DIALECT_METAS_JSON,\n options?.hostMetas ?? [],\n );\n}\n\nfunction buildDbMetaAdapterFromMetas(metas: DialectMetaJson[]): DbMetaAdapter {\n const byId = new Map<RdbmsDialect, DialectMeta>(\n metas.map((meta) => [meta.id, toAdapterDialectMeta(meta)]),\n );\n const defaultRules = defaultDdlRules();\n return {\n listDialects: () => Array.from(byId.values()),\n getDialectMeta: (dialect) => byId.get(dialect),\n getDefaultPhysicalType: (dialect, logicalType) => {\n const mapped =\n byId.get(dialect)?.defaultPhysicalTypeMap[logicalType];\n return mapped ?? DIALECT_DEFAULT_TYPE_MAP.postgres[logicalType];\n },\n getDdlRules: (dialect) => {\n const json = metas.find((m) => m.id === dialect);\n const style = json?.ddlStyle;\n if (!style) return defaultRules;\n const quoteIdentifier: DdlGeneratorRules[\"quoteIdentifier\"] = (\n _d,\n identifier,\n ) => {\n if (style.quote === \"bracket\") return `[${identifier}]`;\n if (style.quote === \"backtick\") return `\\`${identifier}\\``;\n return `\"${identifier}\"`;\n };\n const toDefaultExpression: DdlGeneratorRules[\"toDefaultExpression\"] =\n (_d, col) => {\n const raw = col.defaultValue?.trim();\n if (!raw) return null;\n const upper = raw.toUpperCase();\n const isFunctionLike =\n /[()]/.test(raw) ||\n upper === \"NULL\" ||\n upper === \"CURRENT_TIMESTAMP\" ||\n upper === \"CURRENT_DATE\";\n if (isFunctionLike) return raw;\n if (\n col.logicalType === \"NUMBER\" ||\n col.logicalType === \"DECIMAL\" ||\n col.logicalType === \"FLOAT\"\n )\n return raw;\n if (col.logicalType === \"BOOLEAN\") {\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n if ((style.boolLiteral ?? \"oneZero\") === \"oneZero\")\n return upper === \"TRUE\" ? \"1\" : \"0\";\n return upper;\n }\n if (raw === \"1\" || raw === \"0\") return raw;\n return quoteSqlString(raw);\n }\n if (\n col.logicalType === \"DATE\" ||\n col.logicalType === \"DATETIME\"\n ) {\n if (upper === \"NOW\")\n return style.nowKeyword ?? \"CURRENT_TIMESTAMP\";\n return quoteSqlString(raw);\n }\n if (\n (raw.startsWith(\"'\") && raw.endsWith(\"'\")) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n )\n return raw;\n return quoteSqlString(raw);\n };\n return { quoteIdentifier, toDefaultExpression };\n },\n };\n}\n\nexport function createDefaultDbMetaAdapter(\n overrides?: Partial<DbMetaAdapter>,\n): DbMetaAdapter {\n const base = buildDbMetaAdapterFromMetas(BUILTIN_DIALECT_METAS_JSON);\n return { ...base, ...overrides };\n}\n\nexport const defaultDbMetaAdapter = createDefaultDbMetaAdapter();\n\nfunction resolveDbMetaAdapter(options?: CoreDbMetaOptions): DbMetaAdapter {\n if (options?.dbMetaAdapter) return options.dbMetaAdapter;\n if (options?.hostMetas && options.hostMetas.length > 0) {\n return buildDbMetaAdapterFromMetas(resolveDialectMetas(options));\n }\n return defaultDbMetaAdapter;\n}\n\nexport function defaultPhysicalType(\n dialect: RdbmsDialect,\n logicalType: LogicalDataType,\n options?: CoreDbMetaOptions,\n): string {\n return resolveDbMetaAdapter(options).getDefaultPhysicalType(\n dialect,\n logicalType,\n );\n}\n\nfunction normalizePhysicalCompare(s: string): string {\n return s.trim().toUpperCase().replace(/\\s+/g, \" \");\n}\n\nfunction physicalTypeBaseName(s: string): string {\n const n = normalizePhysicalCompare(s);\n const p = n.indexOf(\"(\");\n return p >= 0 ? n.slice(0, p).trim() : n;\n}\n\n/**\n * 물리 데이터 유형 문자열에서 방언 메타의 기본 매핑(및 흔한 SQL 별칭)으로 논리 유형을 추정한다.\n */\nexport function inferLogicalTypeFromPhysical(\n dialect: RdbmsDialect,\n physicalType: string,\n options?: CoreDbMetaOptions,\n): LogicalDataType {\n const raw = physicalType?.trim();\n if (!raw) return \"TEXT\";\n\n const metas = resolveDialectMetas(options);\n const meta = metas.find((m) => m.id === dialect);\n const normFull = normalizePhysicalCompare(raw);\n const base = physicalTypeBaseName(raw);\n\n if (meta) {\n for (const lt of meta.logicalTypes) {\n if (\n normalizePhysicalCompare(lt.defaultPhysicalType) === normFull\n ) {\n return lt.id;\n }\n }\n for (const lt of meta.logicalTypes) {\n if (physicalTypeBaseName(lt.defaultPhysicalType) === base) {\n return lt.id;\n }\n }\n }\n\n const b = base;\n if (\n b === \"INT\" ||\n b === \"INTEGER\" ||\n b === \"BIGINT\" ||\n b === \"SMALLINT\" ||\n b === \"TINYINT\" ||\n b === \"NUMBER\" ||\n b === \"SERIAL\" ||\n b === \"SERIAL4\" ||\n b === \"SERIAL8\"\n ) {\n return \"NUMBER\";\n }\n if (\n b === \"DECIMAL\" ||\n b === \"NUMERIC\" ||\n b === \"MONEY\" ||\n b === \"SMALLMONEY\"\n ) {\n return \"DECIMAL\";\n }\n if (\n b === \"FLOAT\" ||\n b === \"REAL\" ||\n b === \"DOUBLE\" ||\n b === \"BINARY_FLOAT\" ||\n b === \"BINARY_DOUBLE\"\n ) {\n return \"FLOAT\";\n }\n if (b === \"BIT\" || b === \"BOOLEAN\" || b === \"BOOL\") {\n return \"BOOLEAN\";\n }\n if (\n b === \"DATETIME\" ||\n b === \"DATETIME2\" ||\n b === \"SMALLDATETIME\" ||\n b === \"TIMESTAMP\" ||\n b === \"TIMESTAMPTZ\"\n ) {\n return \"DATETIME\";\n }\n if (b === \"DATE\") return \"DATE\";\n if (b === \"TIME\" || b === \"TIMETZ\") return \"TIME\";\n if (\n b.includes(\"CHAR\") ||\n b === \"TEXT\" ||\n b === \"CLOB\" ||\n b === \"NCLOB\" ||\n b === \"NCHAR\" ||\n b === \"NVARCHAR\" ||\n b === \"VARCHAR\" ||\n b === \"VARCHAR2\"\n ) {\n return \"TEXT\";\n }\n if (b === \"JSON\" || b === \"JSONB\") return \"JSON\";\n if (b === \"UUID\" || b === \"UNIQUEIDENTIFIER\") return \"UUID\";\n if (\n b === \"BINARY\" ||\n b === \"VARBINARY\" ||\n b === \"RAW\" ||\n b === \"BYTEA\" ||\n b === \"BLOB\" ||\n b === \"IMAGE\"\n ) {\n return \"BINARY\";\n }\n\n return \"TEXT\";\n}\n\nexport function getRdbmsDialectCapability(\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): DialectCapability {\n const meta = resolveDbMetaAdapter(options).getDialectMeta(dialect);\n return meta?.capabilities ?? { supportsSchema: false };\n}\n\nexport function dialectSupportsSchema(\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): boolean {\n return getRdbmsDialectCapability(dialect, options).supportsSchema;\n}\n\nfunction parseTypeArguments(physicalType: string): number[] | null {\n const m = physicalType.match(/\\(([^)]+)\\)/);\n if (!m) return null;\n const values = m[1]\n .split(\",\")\n .map((v) => Number.parseInt(v.trim(), 10))\n .filter((v) => Number.isFinite(v));\n return values.length > 0 ? values : null;\n}\n\n/**\n * 컬럼의 논리 유형을 유지한 채 기존 물리 타입 문자열을 `nextDialect`에 맞게 변환한다.\n * `(` `)` 안의 정밀도·스케일·길이 등은 가능한 범위에서 보존하고, 나머지는 `defaultPhysicalType`으로 맞춘다.\n * `convertDesignDialect`에서 컬럼별 물리 타입을 갱신할 때 사용한다.\n */\nexport function convertPhysicalTypeByLogicalType(\n physicalType: string,\n logicalType: LogicalDataType,\n nextDialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const args = parseTypeArguments(physicalType);\n const precision = args?.[0];\n const scale = args?.[1];\n const length = args?.[0];\n\n if (logicalType === \"NUMBER\") {\n if (nextDialect === \"oracle\") {\n if (precision && scale !== undefined)\n return `NUMBER(${precision},${scale})`;\n if (precision) return `NUMBER(${precision})`;\n return \"NUMBER(10)\";\n }\n if (nextDialect === \"mssql\") {\n if (precision && scale !== undefined)\n return `NUMERIC(${precision},${scale})`;\n if (precision) return `NUMERIC(${precision},0)`;\n return \"INT\";\n }\n if (nextDialect === \"mysql\") {\n if (precision && scale !== undefined)\n return `DECIMAL(${precision},${scale})`;\n if (precision) return `DECIMAL(${precision},0)`;\n return \"INT\";\n }\n if (nextDialect === \"postgres\") {\n if (precision && scale !== undefined)\n return `NUMERIC(${precision},${scale})`;\n if (precision) return `NUMERIC(${precision},0)`;\n return \"INTEGER\";\n }\n return \"INTEGER\";\n }\n\n if (logicalType === \"DECIMAL\") {\n if (precision && scale !== undefined) {\n if (nextDialect === \"oracle\")\n return `NUMBER(${precision},${scale})`;\n if (nextDialect === \"postgres\")\n return `NUMERIC(${precision},${scale})`;\n return `DECIMAL(${precision},${scale})`;\n }\n return defaultPhysicalType(nextDialect, logicalType, options);\n }\n\n if (logicalType === \"FLOAT\") {\n if (nextDialect === \"oracle\") return \"BINARY_FLOAT\";\n if (nextDialect === \"sqlite\") return \"REAL\";\n return \"FLOAT\";\n }\n\n if (logicalType === \"TEXT\") {\n if (nextDialect === \"oracle\")\n return length ? `VARCHAR2(${length})` : \"VARCHAR2(255)\";\n if (nextDialect === \"mssql\")\n return length ? `NVARCHAR(${length})` : \"NVARCHAR(255)\";\n if (nextDialect === \"mysql\")\n return length ? `VARCHAR(${length})` : \"VARCHAR(255)\";\n if (nextDialect === \"postgres\")\n return length ? `VARCHAR(${length})` : \"VARCHAR(255)\";\n return \"TEXT\";\n }\n\n if (logicalType === \"BINARY\") {\n if (nextDialect === \"mssql\")\n return length ? `VARBINARY(${length})` : \"VARBINARY(255)\";\n if (nextDialect === \"oracle\")\n return length ? `RAW(${length})` : \"RAW(255)\";\n if (nextDialect === \"mysql\")\n return length ? `VARBINARY(${length})` : \"VARBINARY(255)\";\n if (nextDialect === \"postgres\") return \"BYTEA\";\n return \"BLOB\";\n }\n\n return defaultPhysicalType(nextDialect, logicalType, options);\n}\n\nexport function convertDesignDialect(\n doc: DesignDocument,\n nextDialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n if (doc.model.dialect === nextDialect) return doc;\n const supportsSchema = dialectSupportsSchema(nextDialect, options);\n return {\n ...doc,\n model: {\n ...doc.model,\n dialect: nextDialect,\n tables: doc.model.tables.map((table) => ({\n ...table,\n schemaName: supportsSchema ? table.schemaName : undefined,\n columns: table.columns.map((col) => ({\n ...col,\n physicalType: convertPhysicalTypeByLogicalType(\n col.physicalType,\n col.logicalType,\n nextDialect,\n options,\n ),\n })),\n })),\n },\n };\n}\n\nexport function applyLogicalTypeChange(\n column: ColumnModel,\n nextLogicalType: LogicalDataType,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): ColumnModel {\n return {\n ...column,\n logicalType: nextLogicalType,\n physicalType: defaultPhysicalType(dialect, nextLogicalType, options),\n };\n}\n\nexport function createColumn(\n dialect: RdbmsDialect,\n params: {\n id: string;\n logicalName: string;\n /** 생략 시 논리 이름과 동일한 물리 이름으로 생성된다. */\n physicalName?: string;\n description?: string;\n logicalType: LogicalDataType;\n defaultValue?: string;\n nullable?: boolean;\n isPrimaryKey?: boolean;\n isForeignKey?: boolean;\n referencesPrimaryColumnId?: string;\n color?: string;\n },\n options?: CoreDbMetaOptions,\n): ColumnModel {\n const physicalName = params.physicalName ?? params.logicalName;\n const isPrimaryKey = params.isPrimaryKey ?? false;\n const isForeignKey = params.isForeignKey ?? false;\n const col: ColumnModel = {\n id: params.id,\n logicalName: params.logicalName,\n physicalName,\n description: params.description,\n logicalType: params.logicalType,\n physicalType: defaultPhysicalType(dialect, params.logicalType, options),\n defaultValue: params.defaultValue,\n nullable: isPrimaryKey ? false : (params.nullable ?? true),\n isPrimaryKey,\n isForeignKey,\n referencesPrimaryColumnId: params.referencesPrimaryColumnId,\n };\n if (params.color !== undefined) col.color = params.color;\n return col;\n}\n\nexport function createEmptyDesign(\n dialect: RdbmsDialect = \"mssql\",\n): DesignDocument {\n return {\n schemaVersion: 1,\n model: {\n dialect,\n tables: [],\n relationships: [],\n indexes: [],\n },\n layout: {\n nodePositions: {},\n },\n };\n}\n\nexport function serializeDesign(doc: DesignDocument): string {\n return JSON.stringify(doc, null, 2);\n}\n\nexport function parseDesign(\n json: string,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n const parsed = JSON.parse(json) as unknown;\n return validateDesignDocument(parsed, options);\n}\n\nexport function validateDesignDocument(\n input: unknown,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n if (!isObject(input)) {\n throw new Error(\"Invalid design document: root must be object\");\n }\n\n if (input.schemaVersion !== 1) {\n throw new Error(\"Unsupported schemaVersion\");\n }\n\n if (\n !isObject(input.model) ||\n !Array.isArray(input.model.tables) ||\n !Array.isArray(input.model.relationships) ||\n !Array.isArray(input.model.indexes)\n ) {\n throw new Error(\"Invalid design document: model is malformed\");\n }\n\n const dialects = new Set(\n resolveDbMetaAdapter(options)\n .listDialects()\n .map((d) => d.id),\n );\n const modelDialect = (input.model as unknown as { dialect?: unknown })\n .dialect;\n if (\n typeof modelDialect !== \"string\" ||\n !dialects.has(modelDialect as RdbmsDialect)\n ) {\n throw new Error(\"Invalid design document: model.dialect is invalid\");\n }\n\n if (!isObject(input.layout) || !isObject(input.layout.nodePositions)) {\n throw new Error(\"Invalid design document: layout is malformed\");\n }\n\n const doc = input as unknown as DesignDocument;\n migrateLegacyFkLineVisibility(doc.model);\n return doc;\n}\n\nexport function roundTripDesign(doc: DesignDocument): DesignDocument {\n return parseDesign(serializeDesign(doc));\n}\n\nfunction quoteIdentifier(\n dialect: RdbmsDialect,\n identifier: string,\n options?: CoreDbMetaOptions,\n): string {\n const quote =\n resolveDbMetaAdapter(options).getDdlRules(dialect).quoteIdentifier ??\n defaultDdlRules().quoteIdentifier!;\n return quote(dialect, identifier);\n}\n\nfunction qualifiedTableName(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const schema = table.schemaName?.trim();\n if (dialectSupportsSchema(dialect, options) && schema) {\n return `${quoteIdentifier(dialect, schema, options)}.${quoteIdentifier(dialect, table.physicalName, options)}`;\n }\n return quoteIdentifier(dialect, table.physicalName, options);\n}\n\nfunction quoteSqlString(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nfunction toDefaultExpression(\n dialect: RdbmsDialect,\n col: ColumnModel,\n options?: CoreDbMetaOptions,\n): string | null {\n const handler =\n resolveDbMetaAdapter(options).getDdlRules(dialect)\n .toDefaultExpression ?? defaultDdlRules().toDefaultExpression!;\n return handler(dialect, col);\n}\n\nfunction joinColumnDefs(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string[] {\n const defs = table.columns.map((col) => {\n const nullable = col.nullable ? \"NULL\" : \"NOT NULL\";\n const defaultExpr = toDefaultExpression(dialect, col, options);\n const defaultSql = defaultExpr ? ` DEFAULT ${defaultExpr}` : \"\";\n return ` ${quoteIdentifier(dialect, col.physicalName, options)} ${col.physicalType}${defaultSql} ${nullable}`;\n });\n const pkColumns = table.columns\n .filter((col) => col.isPrimaryKey)\n .map((col) => quoteIdentifier(dialect, col.physicalName, options));\n if (pkColumns.length > 0) {\n defs.push(` PRIMARY KEY (${pkColumns.join(\", \")})`);\n }\n return defs;\n}\n\nfunction createTableSql(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const columns = joinColumnDefs(table, dialect, options);\n return `CREATE TABLE ${qualifiedTableName(table, dialect, options)} (\\n${columns.join(\",\\n\")}\\n);`;\n}\n\nfunction createRelationshipSql(\n rel: RelationshipModel,\n model: DesignModel,\n dialect: RdbmsDialect,\n index: number,\n options?: CoreDbMetaOptions,\n): string | null {\n const sourceTable = model.tables.find(\n (table) => table.id === rel.sourceTableId,\n );\n const targetTable = model.tables.find(\n (table) => table.id === rel.targetTableId,\n );\n if (\n !sourceTable ||\n !targetTable ||\n !rel.sourceColumnId ||\n !rel.targetColumnId\n ) {\n return null;\n }\n\n const sourceColumn = sourceTable.columns.find(\n (col) => col.id === rel.sourceColumnId,\n );\n const targetColumn = targetTable.columns.find(\n (col) => col.id === rel.targetColumnId,\n );\n if (!sourceColumn || !targetColumn) {\n return null;\n }\n\n const fkName = `FK_${targetTable.physicalName}_${sourceTable.physicalName}_${index + 1}`;\n return [\n `ALTER TABLE ${qualifiedTableName(targetTable, dialect, options)}`,\n ` ADD CONSTRAINT ${quoteIdentifier(dialect, fkName, options)}`,\n ` FOREIGN KEY (${quoteIdentifier(dialect, targetColumn.physicalName, options)})`,\n ` REFERENCES ${qualifiedTableName(sourceTable, dialect, options)} (${quoteIdentifier(dialect, sourceColumn.physicalName, options)});`,\n ].join(\"\\n\");\n}\n\nfunction createIndexSql(\n indexModel: IndexModel,\n model: DesignModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string | null {\n const table = model.tables.find((item) => item.id === indexModel.tableId);\n if (!table || indexModel.columns.length === 0) {\n return null;\n }\n const unique = indexModel.unique ? \"UNIQUE \" : \"\";\n const columns = indexModel.columns\n .map((col) => quoteIdentifier(dialect, col, options))\n .join(\", \");\n return `CREATE ${unique}INDEX ${quoteIdentifier(dialect, indexModel.name, options)} ON ${qualifiedTableName(table, dialect, options)} (${columns});`;\n}\n\nfunction buildDdlSql(doc: DesignDocument, options?: CoreDbMetaOptions): string {\n const { model } = doc;\n const tableSql = model.tables.map((table) =>\n createTableSql(table, model.dialect, options),\n );\n const relSql = model.relationships\n .map((rel, index) =>\n createRelationshipSql(rel, model, model.dialect, index, options),\n )\n .filter((item): item is string => Boolean(item));\n return [...tableSql, ...relSql].join(\"\\n\\n\");\n}\n\nfunction buildIndexDdlSql(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n const { model } = doc;\n const statements = model.indexes\n .map((index) => createIndexSql(index, model, model.dialect, options))\n .filter((item): item is string => Boolean(item));\n return statements.join(\"\\n\\n\");\n}\n\nfunction sliceDocByScope(doc: DesignDocument, scope: DdlScope): DesignDocument {\n if (scope.kind === \"all\") return doc;\n const selected = new Set(scope.tableIds);\n return {\n ...doc,\n model: {\n ...doc.model,\n tables: doc.model.tables.filter((t) => selected.has(t.id)),\n relationships: doc.model.relationships.filter(\n (r) =>\n selected.has(r.sourceTableId) &&\n selected.has(r.targetTableId),\n ),\n indexes: doc.model.indexes.filter((i) => selected.has(i.tableId)),\n },\n };\n}\n\nfunction styleBasedDdlGenerator(\n input: DdlGenerateInput,\n options?: CoreDbMetaOptions,\n): DdlGenerateOutput {\n const scoped = sliceDocByScope(input.doc, input.scope);\n return {\n sql: buildDdlSql(scoped, options),\n diagnostics: analyzeDdlDocument(scoped, options),\n };\n}\n\nfunction hasBuiltinDialect(\n dialectId: RdbmsDialect,\n): dialectId is BuiltinRdbmsDialect {\n return (BUILTIN_DIALECTS as readonly string[]).includes(dialectId);\n}\n\nfunction getBuiltinDdlGenerator(\n dialectId: RdbmsDialect,\n _options?: CoreDbMetaOptions,\n): DdlGeneratorHook | undefined {\n if (!hasBuiltinDialect(dialectId)) return undefined;\n return (input) => styleBasedDdlGenerator(input, _options);\n}\n\nfunction invokeDdlGeneratorSync(\n generator: DdlGeneratorHook,\n input: DdlGenerateInput,\n): DdlGenerateOutput {\n const result = generator(input);\n if (\n result &&\n typeof (result as Promise<DdlGenerateOutput>).then === \"function\"\n ) {\n throw new Error(\"Async DDL generator is not supported in sync API\");\n }\n return result as DdlGenerateOutput;\n}\n\nfunction runDdlGenerator(\n doc: DesignDocument,\n scope: DdlScope,\n options?: CoreDbMetaOptions,\n): DdlGenerateOutput {\n const input: DdlGenerateInput = {\n doc,\n dialectId: doc.model.dialect,\n scope,\n };\n const hostGenerator = options?.hostDdlGenerators?.[doc.model.dialect];\n const builtinGenerator = getBuiltinDdlGenerator(doc.model.dialect, options);\n const fallback = () => styleBasedDdlGenerator(input, options);\n const fallbackOnError = options?.fallbackOnHookError ?? true;\n\n const selectedGenerator = hostGenerator ?? builtinGenerator;\n if (!selectedGenerator) return fallback();\n try {\n return invokeDdlGeneratorSync(selectedGenerator, input);\n } catch (error) {\n if (!fallbackOnError) throw error;\n return fallback();\n }\n}\n\n/** DDL/인덱스 분석 공통 심각도 */\nexport type DdlDiagnosticSeverity = \"error\" | \"warning\";\n\n/** 구조화된 DDL 관련 진단(에러·경고) */\nexport interface DdlDiagnostic {\n severity: DdlDiagnosticSeverity;\n code: string;\n message: string;\n /** 예: relationship:rel1, index:ix1, table:t1 */\n context?: string;\n}\n\n/**\n * 통일된 한 줄 텍스트 포맷.\n * 예: `[WARN][DDL_REL_MISSING_COLUMNS] ... | relationship:rel1`\n */\nexport function formatDdlDiagnostic(d: DdlDiagnostic): string {\n const level = d.severity === \"error\" ? \"ERROR\" : \"WARN\";\n const tail = d.context ? ` | ${d.context}` : \"\";\n return `[${level}][${d.code}] ${d.message}${tail}`;\n}\n\nexport function formatDdlDiagnostics(diagnostics: DdlDiagnostic[]): string {\n return diagnostics.map(formatDdlDiagnostic).join(\"\\n\");\n}\n\n/**\n * 모델 전체에 대한 DDL·인덱스 관련 진단(테이블/관계/인덱스).\n * 검증 예외(Invalid design document)와는 별도로, 생성 가능 여부와 경고를 나열한다.\n */\nexport function analyzeDdlDocument(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): DdlDiagnostic[] {\n const out: DdlDiagnostic[] = [];\n const { model } = doc;\n const tableById = new Map(model.tables.map((t) => [t.id, t]));\n const physicalTableNames = new Map<string, string[]>();\n\n for (const table of model.tables) {\n const qualifiedName =\n dialectSupportsSchema(model.dialect, options) &&\n table.schemaName?.trim()\n ? `${table.schemaName.trim()}.${table.physicalName}`\n : table.physicalName;\n const list = physicalTableNames.get(qualifiedName) ?? [];\n list.push(table.id);\n physicalTableNames.set(qualifiedName, list);\n if (table.columns.length === 0) {\n out.push({\n severity: \"warning\",\n code: \"DDL_EMPTY_TABLE\",\n message:\n \"컬럼이 없는 테이블은 CREATE TABLE 구문이 비어 있거나 무의미할 수 있다.\",\n context: `table:${table.id}`,\n });\n }\n }\n\n for (const [name, ids] of physicalTableNames) {\n if (ids.length > 1) {\n out.push({\n severity: \"warning\",\n code: \"DDL_DUPLICATE_TABLE_NAME\",\n message: `동일한 물리 테이블명 \"${name}\"이 ${ids.length}개 테이블에 사용되었다.`,\n context: `tables:${ids.join(\",\")}`,\n });\n }\n }\n\n for (const rel of model.relationships) {\n const ctx = `relationship:${rel.id}`;\n const sourceTable = tableById.get(rel.sourceTableId);\n const targetTable = tableById.get(rel.targetTableId);\n if (!sourceTable || !targetTable) {\n out.push({\n severity: \"error\",\n code: \"DDL_REL_UNKNOWN_TABLE\",\n message:\n \"관계의 소스 또는 타겟 테이블을 찾을 수 없어 FK DDL을 생성할 수 없다.\",\n context: ctx,\n });\n continue;\n }\n if (!rel.sourceColumnId || !rel.targetColumnId) {\n out.push({\n severity: \"warning\",\n code: \"DDL_REL_MISSING_COLUMNS\",\n message: \"소스/타겟 컬럼이 지정되지 않아 FK DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n const sourceColumn = sourceTable.columns.find(\n (c) => c.id === rel.sourceColumnId,\n );\n const targetColumn = targetTable.columns.find(\n (c) => c.id === rel.targetColumnId,\n );\n if (!sourceColumn || !targetColumn) {\n out.push({\n severity: \"warning\",\n code: \"DDL_REL_UNKNOWN_COLUMN\",\n message:\n \"관계에 지정된 컬럼 id를 테이블에서 찾을 수 없어 FK DDL을 생략한다.\",\n context: ctx,\n });\n }\n }\n\n for (const indexModel of model.indexes) {\n const ctx = `index:${indexModel.id}`;\n const table = tableById.get(indexModel.tableId);\n if (!table) {\n out.push({\n severity: \"warning\",\n code: \"IDX_UNKNOWN_TABLE\",\n message:\n \"인덱스가 가리키는 테이블을 찾을 수 없어 인덱스 DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n if (indexModel.columns.length === 0) {\n out.push({\n severity: \"warning\",\n code: \"IDX_EMPTY_COLUMNS\",\n message: \"인덱스 컬럼 목록이 비어 있어 인덱스 DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n for (const colPhys of indexModel.columns) {\n if (!table.columns.some((c) => c.physicalName === colPhys)) {\n out.push({\n severity: \"warning\",\n code: \"IDX_UNKNOWN_COLUMN\",\n message: `인덱스가 참조하는 물리 컬럼명 \"${colPhys}\"을(를) 테이블 \"${table.physicalName}\"에서 찾을 수 없다.`,\n context: ctx,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function generateDdlWithDiagnostics(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n const out = runDdlGenerator(doc, { kind: \"all\" }, options);\n return {\n sql: out.sql,\n diagnostics: out.diagnostics ?? analyzeDdlDocument(doc, options),\n };\n}\n\nexport function generateIndexDdlWithDiagnostics(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n return {\n sql: buildIndexDdlSql(doc, options),\n diagnostics: analyzeDdlDocument(doc, options),\n };\n}\n\nexport function generateDdl(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n return runDdlGenerator(doc, { kind: \"all\" }, options).sql;\n}\n\nexport function generateDdlForSelection(\n doc: DesignDocument,\n tableIds: string[],\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n const out = runDdlGenerator(doc, { kind: \"selected\", tableIds }, options);\n const diagnostics =\n out.diagnostics ??\n analyzeDdlDocument(\n sliceDocByScope(doc, { kind: \"selected\", tableIds }),\n options,\n );\n return { sql: out.sql, diagnostics };\n}\n\nexport function generateIndexDdl(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n return buildIndexDdlSql(doc, options);\n}\n\n/** 성능·부하 테스트용: 지정 개수의 빈 테이블과 격자 레이아웃을 생성한다. */\nexport function createLargeDesign(\n tableCount: number,\n dialect: RdbmsDialect = \"postgres\",\n): DesignDocument {\n const doc = createEmptyDesign(dialect);\n const cols = 20;\n for (let i = 0; i < tableCount; i++) {\n const id = `t-${i}`;\n doc.model.tables.push({\n id,\n logicalName: `엔티티${i}`,\n physicalName: `TB_T${i}`,\n columns: [\n createColumn(dialect, {\n id: `${id}-pk`,\n logicalName: \"식별자\",\n logicalType: \"NUMBER\",\n nullable: false,\n }),\n ],\n });\n doc.layout.nodePositions[id] = {\n x: (i % cols) * 220,\n y: Math.floor(i / cols) * 120,\n };\n }\n return doc;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/alignment.ts","../src/index.ts"],"names":["quoteIdentifier","toDefaultExpression"],"mappings":"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","file":"index.js","sourcesContent":["export type AlignCommand =\n | \"left\"\n | \"h-center\"\n | \"right\"\n | \"top\"\n | \"v-center\"\n | \"bottom\"\n | \"h-gap\"\n | \"v-gap\";\n\n/**\n * 멀티 선택된 노드 위치를 bounding box 기준으로 정렬/분배한다.\n * positions는 id -> 좌표 맵이며, 반환값은 동일 키에 갱신된 좌표만 포함한다.\n */\nexport function alignNodePositions(\n selectedIds: string[],\n positions: Record<string, { x: number; y: number }>,\n command: AlignCommand,\n anchorId?: string\n): Record<string, { x: number; y: number }> {\n const entries = selectedIds\n .map((id) => {\n const pos = positions[id];\n return pos ? { id, pos: { ...pos } } : null;\n })\n .filter((e): e is { id: string; pos: { x: number; y: number } } => Boolean(e));\n\n if (entries.length < 2) {\n return {};\n }\n\n const xs = entries.map((e) => e.pos.x);\n const ys = entries.map((e) => e.pos.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const anchorPos = anchorId\n ? entries.find((e) => e.id === anchorId)?.pos\n : undefined;\n const targetX = anchorPos?.x ?? centerX;\n const targetY = anchorPos?.y ?? centerY;\n\n const sortByX = [...entries].sort((a, b) => a.pos.x - b.pos.x);\n const sortByY = [...entries].sort((a, b) => a.pos.y - b.pos.y);\n\n const out: Record<string, { x: number; y: number }> = {};\n\n for (const e of entries) {\n const next = { ...e.pos };\n if (command === \"left\") next.x = anchorPos ? targetX : minX;\n if (command === \"h-center\") next.x = targetX;\n if (command === \"right\") next.x = anchorPos ? targetX : maxX;\n if (command === \"top\") next.y = anchorPos ? targetY : minY;\n if (command === \"v-center\") next.y = targetY;\n if (command === \"bottom\") next.y = anchorPos ? targetY : maxY;\n out[e.id] = next;\n }\n\n if (command === \"h-gap\") {\n const gap = entries.length > 1 ? (maxX - minX) / (entries.length - 1) : 0;\n sortByX.forEach((e, index) => {\n out[e.id] = { ...e.pos, x: minX + gap * index };\n });\n }\n\n if (command === \"v-gap\") {\n const gap = entries.length > 1 ? (maxY - minY) / (entries.length - 1) : 0;\n sortByY.forEach((e, index) => {\n out[e.id] = { ...e.pos, y: minY + gap * index };\n });\n }\n\n return out;\n}\n","export type BuiltinRdbmsDialect =\n | \"mssql\"\n | \"oracle\"\n | \"mysql\"\n | \"postgres\"\n | \"sqlite\";\nexport type RdbmsDialect = BuiltinRdbmsDialect | (string & {});\n\nexport { alignNodePositions, type AlignCommand } from \"./alignment\";\n\nexport const LOGICAL_DATA_TYPES = [\n \"TEXT\",\n \"DATE\",\n \"TIME\",\n \"DATETIME\",\n \"NUMBER\",\n \"DECIMAL\",\n \"FLOAT\",\n \"BOOLEAN\",\n \"JSON\",\n \"UUID\",\n \"BINARY\",\n] as const;\n\nexport type LogicalDataType = (typeof LOGICAL_DATA_TYPES)[number];\n\nexport interface ColumnModel {\n id: string;\n logicalName: string;\n physicalName: string;\n /** 컬럼 설명(업무/도메인 메모). */\n description?: string;\n logicalType: LogicalDataType;\n physicalType: string;\n defaultValue?: string;\n nullable: boolean;\n isPrimaryKey?: boolean;\n isForeignKey?: boolean;\n referencesPrimaryColumnId?: string;\n /** 테이블 노드에서 해당 컬럼 행 배경색 */\n color?: string;\n}\n\nexport interface TableModel {\n id: string;\n logicalName: string;\n physicalName: string;\n /** 테이블 설명(업무/도메인 메모). */\n description?: string;\n /** Dialect-dependent schema/catalog qualifier (e.g. `public`, `dbo`). */\n schemaName?: string;\n color?: string;\n columns: ColumnModel[];\n}\n\nexport interface RelationshipModel {\n id: string;\n /** 참조 원본(PK) 테이블 */\n sourceTableId: string;\n /** 참조 대상(FK) 테이블 */\n targetTableId: string;\n /**\n * 복합 PK→FK 연결에서 컬럼 쌍마다 관계 레코드는 여러 개 두되,\n * 동일 값을 가진 관계들은 캔버스에서 한 줄로 묶어 그린다.\n */\n relationshipGroupId?: string;\n /** source(PK) 컬럼 id */\n sourceColumnId?: string;\n /** target(FK) 컬럼 id */\n targetColumnId?: string;\n /** 연결 시 생성된 FK 컬럼인지 여부(삭제 시 컬럼 정리용) */\n autoCreatedTargetColumn?: boolean;\n /** FK가 최초로 연결된 PK 컬럼 id(컬럼명 변경과 무관) */\n originPkColumnId?: string;\n /** 타깃 cardinality. 기본 1:N */\n cardinality?: \"1:1\" | \"1:N\";\n /** 출발(소스) 엣지의 테이블 내부 절대 Y 좌표(px). */\n sourceLineY?: number;\n /** @deprecated legacy ratio(0~1). sourceLineY가 없을 때만 fallback으로 사용 */\n sourceLineRatio?: number;\n /** 관계선의 중간 꺾임 위치 비율(0~1). 두 테이블 앵커 사이의 비율로 저장한다. */\n linePivotRatio?: number;\n /** true이면 캔버스에서 해당 관계선을 기본적으로 숨긴다. 툴의「숨긴 관계선 보기」로만 표시 가능. */\n canvasLineHidden?: boolean;\n}\n\n/**\n * 캔버스에 관계선을 그릴지 여부.\n * - `revealHiddenLines === false`: `canvasLineHidden`인 관계는 제외.\n * - `revealHiddenLines === true`: 숨김 처리된 관계도 함께 그린다(표시만, 속성은 바꾸지 않음).\n */\nexport function isRelationshipLineRenderable(\n rel: RelationshipModel,\n revealHiddenLines: boolean,\n): boolean {\n if (rel.canvasLineHidden === true) return revealHiddenLines;\n return true;\n}\n\n/** 구버전 `ColumnModel.showFkRelationLine === false`를 관계의 `canvasLineHidden`으로 옮긴 뒤 컬럼 플래그를 제거한다. */\nexport function migrateLegacyFkLineVisibility(model: DesignModel): void {\n for (const table of model.tables) {\n for (const col of table.columns) {\n const legacy = (col as { showFkRelationLine?: boolean })\n .showFkRelationLine;\n if (legacy === false && col.isForeignKey) {\n for (const rel of model.relationships) {\n if (\n rel.targetTableId === table.id &&\n rel.targetColumnId === col.id\n ) {\n rel.canvasLineHidden = true;\n }\n }\n }\n if (\"showFkRelationLine\" in col) {\n delete (col as { showFkRelationLine?: boolean })\n .showFkRelationLine;\n }\n }\n }\n}\n\n/**\n * 구버전·수동 JSON 등에서 `defaultValue` 키가 없는 컬럼에 빈 문자열을 넣어 형태를 통일한다.\n * DDL·엑셀은 기존과 같이 빈 값은 기본값 없음으로 취급한다.\n */\nfunction normalizeColumnDefaultValues(model: DesignModel): void {\n for (const table of model.tables) {\n const cols = table.columns;\n if (!Array.isArray(cols)) continue;\n for (const col of cols) {\n if (col.defaultValue === undefined || col.defaultValue === null) {\n col.defaultValue = \"\";\n }\n }\n }\n}\n\nexport interface IndexModel {\n id: string;\n tableId: string;\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface DiagramLayout {\n nodePositions: Record<string, { x: number; y: number }>;\n}\n\nexport interface DesignModel {\n dialect: RdbmsDialect;\n tables: TableModel[];\n relationships: RelationshipModel[];\n indexes: IndexModel[];\n}\n\nexport interface DesignDocument {\n schemaVersion: number;\n model: DesignModel;\n layout: DiagramLayout;\n settings?: Record<string, unknown>;\n}\n\nexport interface DialectCapability {\n supportsSchema: boolean;\n}\n\nexport type DdlStyleQuote = \"double\" | \"backtick\" | \"bracket\";\nexport type DdlStyleBooleanLiteral = \"trueFalse\" | \"oneZero\";\n\nexport interface DdlStyle {\n quote: DdlStyleQuote;\n boolLiteral?: DdlStyleBooleanLiteral;\n nowKeyword?: string;\n}\n\nexport interface LogicalTypeMeta {\n id: LogicalDataType;\n label?: string;\n defaultPhysicalType: string;\n}\n\nexport interface DialectMetaJson {\n id: RdbmsDialect;\n label: string;\n supportsSchema: boolean;\n logicalTypes: LogicalTypeMeta[];\n ddlStyle?: DdlStyle;\n}\n\nexport interface DialectMeta {\n id: RdbmsDialect;\n label: string;\n capabilities: DialectCapability;\n logicalTypes: readonly LogicalDataType[];\n defaultPhysicalTypeMap: Partial<Record<LogicalDataType, string>>;\n}\n\nexport type DdlScope =\n | { kind: \"all\" }\n | { kind: \"selected\"; tableIds: string[] };\n\nexport interface DdlGenerateInput {\n doc: DesignDocument;\n dialectId: RdbmsDialect;\n scope: DdlScope;\n}\n\nexport interface DdlGenerateOutput {\n sql: string;\n diagnostics?: DdlDiagnostic[];\n}\n\nexport type DdlGeneratorHook = (\n input: DdlGenerateInput,\n) => DdlGenerateOutput | Promise<DdlGenerateOutput>;\n\nexport interface DdlGeneratorRules {\n quoteIdentifier?: (dialect: RdbmsDialect, identifier: string) => string;\n toDefaultExpression?: (\n dialect: RdbmsDialect,\n col: ColumnModel,\n ) => string | null;\n}\n\nexport interface DbMetaAdapter {\n listDialects: () => DialectMeta[];\n getDialectMeta: (dialect: RdbmsDialect) => DialectMeta | undefined;\n getDefaultPhysicalType: (\n dialect: RdbmsDialect,\n logicalType: LogicalDataType,\n ) => string;\n getDdlRules: (dialect: RdbmsDialect) => DdlGeneratorRules;\n}\n\nexport interface CoreDbMetaOptions {\n dbMetaAdapter?: DbMetaAdapter;\n hostMetas?: DialectMetaJson[];\n hostDdlGenerators?: Record<string, DdlGeneratorHook>;\n fallbackOnHookError?: boolean;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport const BUILTIN_DIALECTS: readonly BuiltinRdbmsDialect[] = [\n \"mssql\",\n \"oracle\",\n \"mysql\",\n \"postgres\",\n \"sqlite\",\n] as const;\n\nconst DIALECT_DEFAULT_TYPE_MAP: Record<\n BuiltinRdbmsDialect,\n Record<LogicalDataType, string>\n> = {\n mssql: {\n TEXT: \"NVARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"DATETIME2\",\n NUMBER: \"INT\",\n DECIMAL: \"DECIMAL(10,2)\",\n FLOAT: \"FLOAT\",\n BOOLEAN: \"BIT\",\n JSON: \"NVARCHAR(MAX)\",\n UUID: \"UNIQUEIDENTIFIER\",\n BINARY: \"VARBINARY(255)\",\n },\n oracle: {\n TEXT: \"VARCHAR2(255)\",\n DATE: \"DATE\",\n TIME: \"TIMESTAMP\",\n DATETIME: \"TIMESTAMP\",\n NUMBER: \"NUMBER(10)\",\n DECIMAL: \"NUMBER(10,2)\",\n FLOAT: \"BINARY_FLOAT\",\n BOOLEAN: \"NUMBER(1)\",\n JSON: \"CLOB\",\n UUID: \"RAW(16)\",\n BINARY: \"RAW(255)\",\n },\n mysql: {\n TEXT: \"VARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"DATETIME\",\n NUMBER: \"INT\",\n DECIMAL: \"DECIMAL(10,2)\",\n FLOAT: \"FLOAT\",\n BOOLEAN: \"BOOLEAN\",\n JSON: \"JSON\",\n UUID: \"CHAR(36)\",\n BINARY: \"VARBINARY(255)\",\n },\n postgres: {\n TEXT: \"VARCHAR(255)\",\n DATE: \"DATE\",\n TIME: \"TIME\",\n DATETIME: \"TIMESTAMP\",\n NUMBER: \"INTEGER\",\n DECIMAL: \"NUMERIC(10,2)\",\n FLOAT: \"REAL\",\n BOOLEAN: \"BOOLEAN\",\n JSON: \"JSONB\",\n UUID: \"UUID\",\n BINARY: \"BYTEA\",\n },\n sqlite: {\n TEXT: \"TEXT\",\n DATE: \"TEXT\",\n TIME: \"TEXT\",\n DATETIME: \"TEXT\",\n NUMBER: \"INTEGER\",\n DECIMAL: \"NUMERIC(10,2)\",\n FLOAT: \"REAL\",\n BOOLEAN: \"INTEGER\",\n JSON: \"TEXT\",\n UUID: \"TEXT\",\n BINARY: \"BLOB\",\n },\n};\n\nconst DIALECT_CAPABILITIES: Record<\n BuiltinRdbmsDialect,\n { supportsSchema: boolean }\n> = {\n mssql: { supportsSchema: true },\n oracle: { supportsSchema: true },\n mysql: { supportsSchema: true },\n postgres: { supportsSchema: true },\n sqlite: { supportsSchema: false },\n};\n\nconst DIALECT_LABELS: Record<BuiltinRdbmsDialect, string> = {\n mssql: \"MS SQL Server\",\n oracle: \"Oracle\",\n mysql: \"MySQL\",\n postgres: \"PostgreSQL\",\n sqlite: \"SQLite\",\n};\n\nconst DIALECT_DDL_STYLE: Record<BuiltinRdbmsDialect, DdlStyle> = {\n mssql: {\n quote: \"bracket\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"GETDATE()\",\n },\n oracle: {\n quote: \"double\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n mysql: {\n quote: \"backtick\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n postgres: {\n quote: \"double\",\n boolLiteral: \"trueFalse\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n sqlite: {\n quote: \"double\",\n boolLiteral: \"oneZero\",\n nowKeyword: \"CURRENT_TIMESTAMP\",\n },\n};\n\nfunction toLogicalTypeMetas(dialect: BuiltinRdbmsDialect): LogicalTypeMeta[] {\n return LOGICAL_DATA_TYPES.map((id) => ({\n id,\n defaultPhysicalType: DIALECT_DEFAULT_TYPE_MAP[dialect][id],\n }));\n}\n\nexport const BUILTIN_DIALECT_METAS_JSON: DialectMetaJson[] =\n BUILTIN_DIALECTS.map((dialect) => ({\n id: dialect,\n label: DIALECT_LABELS[dialect],\n supportsSchema: DIALECT_CAPABILITIES[dialect].supportsSchema,\n logicalTypes: toLogicalTypeMetas(dialect),\n ddlStyle: DIALECT_DDL_STYLE[dialect],\n }));\n\nfunction defaultDdlRules(): DdlGeneratorRules {\n return {\n quoteIdentifier: (dialect, identifier) => {\n if (dialect === \"mssql\") return `[${identifier}]`;\n if (dialect === \"mysql\") return `\\`${identifier}\\``;\n return `\"${identifier}\"`;\n },\n toDefaultExpression: (dialect, col) => {\n const raw = col.defaultValue?.trim();\n if (!raw) return null;\n const upper = raw.toUpperCase();\n const isFunctionLike =\n /[()]/.test(raw) ||\n upper === \"NULL\" ||\n upper === \"CURRENT_TIMESTAMP\" ||\n upper === \"CURRENT_DATE\";\n if (isFunctionLike) return raw;\n if (\n col.logicalType === \"NUMBER\" ||\n col.logicalType === \"DECIMAL\" ||\n col.logicalType === \"FLOAT\"\n )\n return raw;\n if (col.logicalType === \"BOOLEAN\") {\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n if (\n dialect === \"mssql\" ||\n dialect === \"oracle\" ||\n dialect === \"sqlite\"\n )\n return upper === \"TRUE\" ? \"1\" : \"0\";\n return upper;\n }\n if (raw === \"1\" || raw === \"0\") return raw;\n return quoteSqlString(raw);\n }\n if (col.logicalType === \"DATE\" || col.logicalType === \"DATETIME\") {\n if (dialect === \"mssql\" && upper === \"NOW\") return \"GETDATE()\";\n if (upper === \"NOW\") return \"CURRENT_TIMESTAMP\";\n return quoteSqlString(raw);\n }\n if (\n (raw.startsWith(\"'\") && raw.endsWith(\"'\")) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n )\n return raw;\n return quoteSqlString(raw);\n },\n };\n}\n\nfunction toAdapterDialectMeta(meta: DialectMetaJson): DialectMeta {\n const typeMap: Partial<Record<LogicalDataType, string>> = {};\n for (const lt of meta.logicalTypes) typeMap[lt.id] = lt.defaultPhysicalType;\n return {\n id: meta.id,\n label: meta.label,\n capabilities: { supportsSchema: meta.supportsSchema },\n logicalTypes: meta.logicalTypes.map((lt) => lt.id),\n defaultPhysicalTypeMap: typeMap,\n };\n}\n\nexport function mergeDialectMetas(\n base: DialectMetaJson[],\n host: DialectMetaJson[] = [],\n): DialectMetaJson[] {\n const byId = new Map<string, DialectMetaJson>(\n base.map((meta) => [meta.id, meta]),\n );\n for (const meta of host) byId.set(meta.id, meta);\n return Array.from(byId.values());\n}\n\nexport function resolveDialectMetas(\n options?: CoreDbMetaOptions,\n): DialectMetaJson[] {\n return mergeDialectMetas(\n BUILTIN_DIALECT_METAS_JSON,\n options?.hostMetas ?? [],\n );\n}\n\nfunction buildDbMetaAdapterFromMetas(metas: DialectMetaJson[]): DbMetaAdapter {\n const byId = new Map<RdbmsDialect, DialectMeta>(\n metas.map((meta) => [meta.id, toAdapterDialectMeta(meta)]),\n );\n const defaultRules = defaultDdlRules();\n return {\n listDialects: () => Array.from(byId.values()),\n getDialectMeta: (dialect) => byId.get(dialect),\n getDefaultPhysicalType: (dialect, logicalType) => {\n const mapped =\n byId.get(dialect)?.defaultPhysicalTypeMap[logicalType];\n return mapped ?? DIALECT_DEFAULT_TYPE_MAP.postgres[logicalType];\n },\n getDdlRules: (dialect) => {\n const json = metas.find((m) => m.id === dialect);\n const style = json?.ddlStyle;\n if (!style) return defaultRules;\n const quoteIdentifier: DdlGeneratorRules[\"quoteIdentifier\"] = (\n _d,\n identifier,\n ) => {\n if (style.quote === \"bracket\") return `[${identifier}]`;\n if (style.quote === \"backtick\") return `\\`${identifier}\\``;\n return `\"${identifier}\"`;\n };\n const toDefaultExpression: DdlGeneratorRules[\"toDefaultExpression\"] =\n (_d, col) => {\n const raw = col.defaultValue?.trim();\n if (!raw) return null;\n const upper = raw.toUpperCase();\n const isFunctionLike =\n /[()]/.test(raw) ||\n upper === \"NULL\" ||\n upper === \"CURRENT_TIMESTAMP\" ||\n upper === \"CURRENT_DATE\";\n if (isFunctionLike) return raw;\n if (\n col.logicalType === \"NUMBER\" ||\n col.logicalType === \"DECIMAL\" ||\n col.logicalType === \"FLOAT\"\n )\n return raw;\n if (col.logicalType === \"BOOLEAN\") {\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n if ((style.boolLiteral ?? \"oneZero\") === \"oneZero\")\n return upper === \"TRUE\" ? \"1\" : \"0\";\n return upper;\n }\n if (raw === \"1\" || raw === \"0\") return raw;\n return quoteSqlString(raw);\n }\n if (\n col.logicalType === \"DATE\" ||\n col.logicalType === \"DATETIME\"\n ) {\n if (upper === \"NOW\")\n return style.nowKeyword ?? \"CURRENT_TIMESTAMP\";\n return quoteSqlString(raw);\n }\n if (\n (raw.startsWith(\"'\") && raw.endsWith(\"'\")) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n )\n return raw;\n return quoteSqlString(raw);\n };\n return { quoteIdentifier, toDefaultExpression };\n },\n };\n}\n\nexport function createDefaultDbMetaAdapter(\n overrides?: Partial<DbMetaAdapter>,\n): DbMetaAdapter {\n const base = buildDbMetaAdapterFromMetas(BUILTIN_DIALECT_METAS_JSON);\n return { ...base, ...overrides };\n}\n\nexport const defaultDbMetaAdapter = createDefaultDbMetaAdapter();\n\nfunction resolveDbMetaAdapter(options?: CoreDbMetaOptions): DbMetaAdapter {\n if (options?.dbMetaAdapter) return options.dbMetaAdapter;\n if (options?.hostMetas && options.hostMetas.length > 0) {\n return buildDbMetaAdapterFromMetas(resolveDialectMetas(options));\n }\n return defaultDbMetaAdapter;\n}\n\nexport function defaultPhysicalType(\n dialect: RdbmsDialect,\n logicalType: LogicalDataType,\n options?: CoreDbMetaOptions,\n): string {\n return resolveDbMetaAdapter(options).getDefaultPhysicalType(\n dialect,\n logicalType,\n );\n}\n\nfunction normalizePhysicalCompare(s: string): string {\n return s.trim().toUpperCase().replace(/\\s+/g, \" \");\n}\n\nfunction physicalTypeBaseName(s: string): string {\n const n = normalizePhysicalCompare(s);\n const p = n.indexOf(\"(\");\n return p >= 0 ? n.slice(0, p).trim() : n;\n}\n\n/**\n * 물리 데이터 유형 문자열에서 방언 메타의 기본 매핑(및 흔한 SQL 별칭)으로 논리 유형을 추정한다.\n */\nexport function inferLogicalTypeFromPhysical(\n dialect: RdbmsDialect,\n physicalType: string,\n options?: CoreDbMetaOptions,\n): LogicalDataType {\n const raw = physicalType?.trim();\n if (!raw) return \"TEXT\";\n\n const metas = resolveDialectMetas(options);\n const meta = metas.find((m) => m.id === dialect);\n const normFull = normalizePhysicalCompare(raw);\n const base = physicalTypeBaseName(raw);\n\n if (meta) {\n for (const lt of meta.logicalTypes) {\n if (\n normalizePhysicalCompare(lt.defaultPhysicalType) === normFull\n ) {\n return lt.id;\n }\n }\n for (const lt of meta.logicalTypes) {\n if (physicalTypeBaseName(lt.defaultPhysicalType) === base) {\n return lt.id;\n }\n }\n }\n\n const b = base;\n if (\n b === \"INT\" ||\n b === \"INTEGER\" ||\n b === \"BIGINT\" ||\n b === \"SMALLINT\" ||\n b === \"TINYINT\" ||\n b === \"NUMBER\" ||\n b === \"SERIAL\" ||\n b === \"SERIAL4\" ||\n b === \"SERIAL8\"\n ) {\n return \"NUMBER\";\n }\n if (\n b === \"DECIMAL\" ||\n b === \"NUMERIC\" ||\n b === \"MONEY\" ||\n b === \"SMALLMONEY\"\n ) {\n return \"DECIMAL\";\n }\n if (\n b === \"FLOAT\" ||\n b === \"REAL\" ||\n b === \"DOUBLE\" ||\n b === \"BINARY_FLOAT\" ||\n b === \"BINARY_DOUBLE\"\n ) {\n return \"FLOAT\";\n }\n if (b === \"BIT\" || b === \"BOOLEAN\" || b === \"BOOL\") {\n return \"BOOLEAN\";\n }\n if (\n b === \"DATETIME\" ||\n b === \"DATETIME2\" ||\n b === \"SMALLDATETIME\" ||\n b === \"TIMESTAMP\" ||\n b === \"TIMESTAMPTZ\"\n ) {\n return \"DATETIME\";\n }\n if (b === \"DATE\") return \"DATE\";\n if (b === \"TIME\" || b === \"TIMETZ\") return \"TIME\";\n if (\n b.includes(\"CHAR\") ||\n b === \"TEXT\" ||\n b === \"CLOB\" ||\n b === \"NCLOB\" ||\n b === \"NCHAR\" ||\n b === \"NVARCHAR\" ||\n b === \"VARCHAR\" ||\n b === \"VARCHAR2\"\n ) {\n return \"TEXT\";\n }\n if (b === \"JSON\" || b === \"JSONB\") return \"JSON\";\n if (b === \"UUID\" || b === \"UNIQUEIDENTIFIER\") return \"UUID\";\n if (\n b === \"BINARY\" ||\n b === \"VARBINARY\" ||\n b === \"RAW\" ||\n b === \"BYTEA\" ||\n b === \"BLOB\" ||\n b === \"IMAGE\"\n ) {\n return \"BINARY\";\n }\n\n return \"TEXT\";\n}\n\nexport function getRdbmsDialectCapability(\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): DialectCapability {\n const meta = resolveDbMetaAdapter(options).getDialectMeta(dialect);\n return meta?.capabilities ?? { supportsSchema: false };\n}\n\nexport function dialectSupportsSchema(\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): boolean {\n return getRdbmsDialectCapability(dialect, options).supportsSchema;\n}\n\nfunction parseTypeArguments(physicalType: string): number[] | null {\n const m = physicalType.match(/\\(([^)]+)\\)/);\n if (!m) return null;\n const values = m[1]\n .split(\",\")\n .map((v) => Number.parseInt(v.trim(), 10))\n .filter((v) => Number.isFinite(v));\n return values.length > 0 ? values : null;\n}\n\n/**\n * 컬럼의 논리 유형을 유지한 채 기존 물리 타입 문자열을 `nextDialect`에 맞게 변환한다.\n * `(` `)` 안의 정밀도·스케일·길이 등은 가능한 범위에서 보존하고, 나머지는 `defaultPhysicalType`으로 맞춘다.\n * `convertDesignDialect`에서 컬럼별 물리 타입을 갱신할 때 사용한다.\n */\nexport function convertPhysicalTypeByLogicalType(\n physicalType: string,\n logicalType: LogicalDataType,\n nextDialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const args = parseTypeArguments(physicalType);\n const precision = args?.[0];\n const scale = args?.[1];\n const length = args?.[0];\n\n if (logicalType === \"NUMBER\") {\n if (nextDialect === \"oracle\") {\n if (precision && scale !== undefined)\n return `NUMBER(${precision},${scale})`;\n if (precision) return `NUMBER(${precision})`;\n return \"NUMBER(10)\";\n }\n if (nextDialect === \"mssql\") {\n if (precision && scale !== undefined)\n return `NUMERIC(${precision},${scale})`;\n if (precision) return `NUMERIC(${precision},0)`;\n return \"INT\";\n }\n if (nextDialect === \"mysql\") {\n if (precision && scale !== undefined)\n return `DECIMAL(${precision},${scale})`;\n if (precision) return `DECIMAL(${precision},0)`;\n return \"INT\";\n }\n if (nextDialect === \"postgres\") {\n if (precision && scale !== undefined)\n return `NUMERIC(${precision},${scale})`;\n if (precision) return `NUMERIC(${precision},0)`;\n return \"INTEGER\";\n }\n return \"INTEGER\";\n }\n\n if (logicalType === \"DECIMAL\") {\n if (precision && scale !== undefined) {\n if (nextDialect === \"oracle\")\n return `NUMBER(${precision},${scale})`;\n if (nextDialect === \"postgres\")\n return `NUMERIC(${precision},${scale})`;\n return `DECIMAL(${precision},${scale})`;\n }\n return defaultPhysicalType(nextDialect, logicalType, options);\n }\n\n if (logicalType === \"FLOAT\") {\n if (nextDialect === \"oracle\") return \"BINARY_FLOAT\";\n if (nextDialect === \"sqlite\") return \"REAL\";\n return \"FLOAT\";\n }\n\n if (logicalType === \"TEXT\") {\n if (nextDialect === \"oracle\")\n return length ? `VARCHAR2(${length})` : \"VARCHAR2(255)\";\n if (nextDialect === \"mssql\")\n return length ? `NVARCHAR(${length})` : \"NVARCHAR(255)\";\n if (nextDialect === \"mysql\")\n return length ? `VARCHAR(${length})` : \"VARCHAR(255)\";\n if (nextDialect === \"postgres\")\n return length ? `VARCHAR(${length})` : \"VARCHAR(255)\";\n return \"TEXT\";\n }\n\n if (logicalType === \"BINARY\") {\n if (nextDialect === \"mssql\")\n return length ? `VARBINARY(${length})` : \"VARBINARY(255)\";\n if (nextDialect === \"oracle\")\n return length ? `RAW(${length})` : \"RAW(255)\";\n if (nextDialect === \"mysql\")\n return length ? `VARBINARY(${length})` : \"VARBINARY(255)\";\n if (nextDialect === \"postgres\") return \"BYTEA\";\n return \"BLOB\";\n }\n\n return defaultPhysicalType(nextDialect, logicalType, options);\n}\n\nexport function convertDesignDialect(\n doc: DesignDocument,\n nextDialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n if (doc.model.dialect === nextDialect) return doc;\n const supportsSchema = dialectSupportsSchema(nextDialect, options);\n return {\n ...doc,\n model: {\n ...doc.model,\n dialect: nextDialect,\n tables: doc.model.tables.map((table) => ({\n ...table,\n schemaName: supportsSchema ? table.schemaName : undefined,\n columns: table.columns.map((col) => ({\n ...col,\n physicalType: convertPhysicalTypeByLogicalType(\n col.physicalType,\n col.logicalType,\n nextDialect,\n options,\n ),\n })),\n })),\n },\n };\n}\n\nexport function applyLogicalTypeChange(\n column: ColumnModel,\n nextLogicalType: LogicalDataType,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): ColumnModel {\n return {\n ...column,\n logicalType: nextLogicalType,\n physicalType: defaultPhysicalType(dialect, nextLogicalType, options),\n };\n}\n\nexport function createColumn(\n dialect: RdbmsDialect,\n params: {\n id: string;\n logicalName: string;\n /** 생략 시 논리 이름과 동일한 물리 이름으로 생성된다. */\n physicalName?: string;\n description?: string;\n logicalType: LogicalDataType;\n defaultValue?: string;\n nullable?: boolean;\n isPrimaryKey?: boolean;\n isForeignKey?: boolean;\n referencesPrimaryColumnId?: string;\n color?: string;\n },\n options?: CoreDbMetaOptions,\n): ColumnModel {\n const physicalName = params.physicalName ?? params.logicalName;\n const isPrimaryKey = params.isPrimaryKey ?? false;\n const isForeignKey = params.isForeignKey ?? false;\n const col: ColumnModel = {\n id: params.id,\n logicalName: params.logicalName,\n physicalName,\n description: params.description,\n logicalType: params.logicalType,\n physicalType: defaultPhysicalType(dialect, params.logicalType, options),\n defaultValue: params.defaultValue,\n nullable: isPrimaryKey ? false : (params.nullable ?? true),\n isPrimaryKey,\n isForeignKey,\n referencesPrimaryColumnId: params.referencesPrimaryColumnId,\n };\n if (params.color !== undefined) col.color = params.color;\n return col;\n}\n\nexport function createEmptyDesign(\n dialect: RdbmsDialect = \"mssql\",\n): DesignDocument {\n return {\n schemaVersion: 1,\n model: {\n dialect,\n tables: [],\n relationships: [],\n indexes: [],\n },\n layout: {\n nodePositions: {},\n },\n };\n}\n\nexport function serializeDesign(doc: DesignDocument): string {\n return JSON.stringify(doc, null, 2);\n}\n\nexport function parseDesign(\n json: string,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n const parsed = JSON.parse(json) as unknown;\n return validateDesignDocument(parsed, options);\n}\n\nexport function validateDesignDocument(\n input: unknown,\n options?: CoreDbMetaOptions,\n): DesignDocument {\n if (!isObject(input)) {\n throw new Error(\"Invalid design document: root must be object\");\n }\n\n if (input.schemaVersion !== 1) {\n throw new Error(\"Unsupported schemaVersion\");\n }\n\n if (\n !isObject(input.model) ||\n !Array.isArray(input.model.tables) ||\n !Array.isArray(input.model.relationships) ||\n !Array.isArray(input.model.indexes)\n ) {\n throw new Error(\"Invalid design document: model is malformed\");\n }\n\n const dialects = new Set(\n resolveDbMetaAdapter(options)\n .listDialects()\n .map((d) => d.id),\n );\n const modelDialect = (input.model as unknown as { dialect?: unknown })\n .dialect;\n if (\n typeof modelDialect !== \"string\" ||\n !dialects.has(modelDialect as RdbmsDialect)\n ) {\n throw new Error(\"Invalid design document: model.dialect is invalid\");\n }\n\n if (!isObject(input.layout) || !isObject(input.layout.nodePositions)) {\n throw new Error(\"Invalid design document: layout is malformed\");\n }\n\n const doc = input as unknown as DesignDocument;\n migrateLegacyFkLineVisibility(doc.model);\n normalizeColumnDefaultValues(doc.model);\n return doc;\n}\n\nexport function roundTripDesign(doc: DesignDocument): DesignDocument {\n return parseDesign(serializeDesign(doc));\n}\n\nfunction quoteIdentifier(\n dialect: RdbmsDialect,\n identifier: string,\n options?: CoreDbMetaOptions,\n): string {\n const quote =\n resolveDbMetaAdapter(options).getDdlRules(dialect).quoteIdentifier ??\n defaultDdlRules().quoteIdentifier!;\n return quote(dialect, identifier);\n}\n\nfunction qualifiedTableName(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const schema = table.schemaName?.trim();\n if (dialectSupportsSchema(dialect, options) && schema) {\n return `${quoteIdentifier(dialect, schema, options)}.${quoteIdentifier(dialect, table.physicalName, options)}`;\n }\n return quoteIdentifier(dialect, table.physicalName, options);\n}\n\nfunction quoteSqlString(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nfunction toDefaultExpression(\n dialect: RdbmsDialect,\n col: ColumnModel,\n options?: CoreDbMetaOptions,\n): string | null {\n const handler =\n resolveDbMetaAdapter(options).getDdlRules(dialect)\n .toDefaultExpression ?? defaultDdlRules().toDefaultExpression!;\n return handler(dialect, col);\n}\n\nfunction joinColumnDefs(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string[] {\n const defs = table.columns.map((col) => {\n const nullable = col.nullable ? \"NULL\" : \"NOT NULL\";\n const defaultExpr = toDefaultExpression(dialect, col, options);\n const defaultSql = defaultExpr ? ` DEFAULT ${defaultExpr}` : \"\";\n return ` ${quoteIdentifier(dialect, col.physicalName, options)} ${col.physicalType}${defaultSql} ${nullable}`;\n });\n const pkColumns = table.columns\n .filter((col) => col.isPrimaryKey)\n .map((col) => quoteIdentifier(dialect, col.physicalName, options));\n if (pkColumns.length > 0) {\n defs.push(` PRIMARY KEY (${pkColumns.join(\", \")})`);\n }\n return defs;\n}\n\nfunction createTableSql(\n table: TableModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string {\n const columns = joinColumnDefs(table, dialect, options);\n return `CREATE TABLE ${qualifiedTableName(table, dialect, options)} (\\n${columns.join(\",\\n\")}\\n);`;\n}\n\nfunction createRelationshipSql(\n rel: RelationshipModel,\n model: DesignModel,\n dialect: RdbmsDialect,\n index: number,\n options?: CoreDbMetaOptions,\n): string | null {\n const sourceTable = model.tables.find(\n (table) => table.id === rel.sourceTableId,\n );\n const targetTable = model.tables.find(\n (table) => table.id === rel.targetTableId,\n );\n if (\n !sourceTable ||\n !targetTable ||\n !rel.sourceColumnId ||\n !rel.targetColumnId\n ) {\n return null;\n }\n\n const sourceColumn = sourceTable.columns.find(\n (col) => col.id === rel.sourceColumnId,\n );\n const targetColumn = targetTable.columns.find(\n (col) => col.id === rel.targetColumnId,\n );\n if (!sourceColumn || !targetColumn) {\n return null;\n }\n\n const fkName = `FK_${targetTable.physicalName}_${sourceTable.physicalName}_${index + 1}`;\n return [\n `ALTER TABLE ${qualifiedTableName(targetTable, dialect, options)}`,\n ` ADD CONSTRAINT ${quoteIdentifier(dialect, fkName, options)}`,\n ` FOREIGN KEY (${quoteIdentifier(dialect, targetColumn.physicalName, options)})`,\n ` REFERENCES ${qualifiedTableName(sourceTable, dialect, options)} (${quoteIdentifier(dialect, sourceColumn.physicalName, options)});`,\n ].join(\"\\n\");\n}\n\nfunction createIndexSql(\n indexModel: IndexModel,\n model: DesignModel,\n dialect: RdbmsDialect,\n options?: CoreDbMetaOptions,\n): string | null {\n const table = model.tables.find((item) => item.id === indexModel.tableId);\n if (!table || indexModel.columns.length === 0) {\n return null;\n }\n const unique = indexModel.unique ? \"UNIQUE \" : \"\";\n const columns = indexModel.columns\n .map((col) => quoteIdentifier(dialect, col, options))\n .join(\", \");\n return `CREATE ${unique}INDEX ${quoteIdentifier(dialect, indexModel.name, options)} ON ${qualifiedTableName(table, dialect, options)} (${columns});`;\n}\n\nfunction buildDdlSql(doc: DesignDocument, options?: CoreDbMetaOptions): string {\n const { model } = doc;\n const tableSql = model.tables.map((table) =>\n createTableSql(table, model.dialect, options),\n );\n const relSql = model.relationships\n .map((rel, index) =>\n createRelationshipSql(rel, model, model.dialect, index, options),\n )\n .filter((item): item is string => Boolean(item));\n return [...tableSql, ...relSql].join(\"\\n\\n\");\n}\n\nfunction buildIndexDdlSql(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n const { model } = doc;\n const statements = model.indexes\n .map((index) => createIndexSql(index, model, model.dialect, options))\n .filter((item): item is string => Boolean(item));\n return statements.join(\"\\n\\n\");\n}\n\nfunction sliceDocByScope(doc: DesignDocument, scope: DdlScope): DesignDocument {\n if (scope.kind === \"all\") return doc;\n const selected = new Set(scope.tableIds);\n return {\n ...doc,\n model: {\n ...doc.model,\n tables: doc.model.tables.filter((t) => selected.has(t.id)),\n relationships: doc.model.relationships.filter(\n (r) =>\n selected.has(r.sourceTableId) &&\n selected.has(r.targetTableId),\n ),\n indexes: doc.model.indexes.filter((i) => selected.has(i.tableId)),\n },\n };\n}\n\nfunction styleBasedDdlGenerator(\n input: DdlGenerateInput,\n options?: CoreDbMetaOptions,\n): DdlGenerateOutput {\n const scoped = sliceDocByScope(input.doc, input.scope);\n return {\n sql: buildDdlSql(scoped, options),\n diagnostics: analyzeDdlDocument(scoped, options),\n };\n}\n\nfunction hasBuiltinDialect(\n dialectId: RdbmsDialect,\n): dialectId is BuiltinRdbmsDialect {\n return (BUILTIN_DIALECTS as readonly string[]).includes(dialectId);\n}\n\nfunction getBuiltinDdlGenerator(\n dialectId: RdbmsDialect,\n _options?: CoreDbMetaOptions,\n): DdlGeneratorHook | undefined {\n if (!hasBuiltinDialect(dialectId)) return undefined;\n return (input) => styleBasedDdlGenerator(input, _options);\n}\n\nfunction invokeDdlGeneratorSync(\n generator: DdlGeneratorHook,\n input: DdlGenerateInput,\n): DdlGenerateOutput {\n const result = generator(input);\n if (\n result &&\n typeof (result as Promise<DdlGenerateOutput>).then === \"function\"\n ) {\n throw new Error(\"Async DDL generator is not supported in sync API\");\n }\n return result as DdlGenerateOutput;\n}\n\nfunction runDdlGenerator(\n doc: DesignDocument,\n scope: DdlScope,\n options?: CoreDbMetaOptions,\n): DdlGenerateOutput {\n const input: DdlGenerateInput = {\n doc,\n dialectId: doc.model.dialect,\n scope,\n };\n const hostGenerator = options?.hostDdlGenerators?.[doc.model.dialect];\n const builtinGenerator = getBuiltinDdlGenerator(doc.model.dialect, options);\n const fallback = () => styleBasedDdlGenerator(input, options);\n const fallbackOnError = options?.fallbackOnHookError ?? true;\n\n const selectedGenerator = hostGenerator ?? builtinGenerator;\n if (!selectedGenerator) return fallback();\n try {\n return invokeDdlGeneratorSync(selectedGenerator, input);\n } catch (error) {\n if (!fallbackOnError) throw error;\n return fallback();\n }\n}\n\n/** DDL/인덱스 분석 공통 심각도 */\nexport type DdlDiagnosticSeverity = \"error\" | \"warning\";\n\n/** 구조화된 DDL 관련 진단(에러·경고) */\nexport interface DdlDiagnostic {\n severity: DdlDiagnosticSeverity;\n code: string;\n message: string;\n /** 예: relationship:rel1, index:ix1, table:t1 */\n context?: string;\n}\n\n/**\n * 통일된 한 줄 텍스트 포맷.\n * 예: `[WARN][DDL_REL_MISSING_COLUMNS] ... | relationship:rel1`\n */\nexport function formatDdlDiagnostic(d: DdlDiagnostic): string {\n const level = d.severity === \"error\" ? \"ERROR\" : \"WARN\";\n const tail = d.context ? ` | ${d.context}` : \"\";\n return `[${level}][${d.code}] ${d.message}${tail}`;\n}\n\nexport function formatDdlDiagnostics(diagnostics: DdlDiagnostic[]): string {\n return diagnostics.map(formatDdlDiagnostic).join(\"\\n\");\n}\n\n/**\n * 모델 전체에 대한 DDL·인덱스 관련 진단(테이블/관계/인덱스).\n * 검증 예외(Invalid design document)와는 별도로, 생성 가능 여부와 경고를 나열한다.\n */\nexport function analyzeDdlDocument(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): DdlDiagnostic[] {\n const out: DdlDiagnostic[] = [];\n const { model } = doc;\n const tableById = new Map(model.tables.map((t) => [t.id, t]));\n const physicalTableNames = new Map<string, string[]>();\n\n for (const table of model.tables) {\n const qualifiedName =\n dialectSupportsSchema(model.dialect, options) &&\n table.schemaName?.trim()\n ? `${table.schemaName.trim()}.${table.physicalName}`\n : table.physicalName;\n const list = physicalTableNames.get(qualifiedName) ?? [];\n list.push(table.id);\n physicalTableNames.set(qualifiedName, list);\n if (table.columns.length === 0) {\n out.push({\n severity: \"warning\",\n code: \"DDL_EMPTY_TABLE\",\n message:\n \"컬럼이 없는 테이블은 CREATE TABLE 구문이 비어 있거나 무의미할 수 있다.\",\n context: `table:${table.id}`,\n });\n }\n }\n\n for (const [name, ids] of physicalTableNames) {\n if (ids.length > 1) {\n out.push({\n severity: \"warning\",\n code: \"DDL_DUPLICATE_TABLE_NAME\",\n message: `동일한 물리 테이블명 \"${name}\"이 ${ids.length}개 테이블에 사용되었다.`,\n context: `tables:${ids.join(\",\")}`,\n });\n }\n }\n\n for (const rel of model.relationships) {\n const ctx = `relationship:${rel.id}`;\n const sourceTable = tableById.get(rel.sourceTableId);\n const targetTable = tableById.get(rel.targetTableId);\n if (!sourceTable || !targetTable) {\n out.push({\n severity: \"error\",\n code: \"DDL_REL_UNKNOWN_TABLE\",\n message:\n \"관계의 소스 또는 타겟 테이블을 찾을 수 없어 FK DDL을 생성할 수 없다.\",\n context: ctx,\n });\n continue;\n }\n if (!rel.sourceColumnId || !rel.targetColumnId) {\n out.push({\n severity: \"warning\",\n code: \"DDL_REL_MISSING_COLUMNS\",\n message: \"소스/타겟 컬럼이 지정되지 않아 FK DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n const sourceColumn = sourceTable.columns.find(\n (c) => c.id === rel.sourceColumnId,\n );\n const targetColumn = targetTable.columns.find(\n (c) => c.id === rel.targetColumnId,\n );\n if (!sourceColumn || !targetColumn) {\n out.push({\n severity: \"warning\",\n code: \"DDL_REL_UNKNOWN_COLUMN\",\n message:\n \"관계에 지정된 컬럼 id를 테이블에서 찾을 수 없어 FK DDL을 생략한다.\",\n context: ctx,\n });\n }\n }\n\n for (const indexModel of model.indexes) {\n const ctx = `index:${indexModel.id}`;\n const table = tableById.get(indexModel.tableId);\n if (!table) {\n out.push({\n severity: \"warning\",\n code: \"IDX_UNKNOWN_TABLE\",\n message:\n \"인덱스가 가리키는 테이블을 찾을 수 없어 인덱스 DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n if (indexModel.columns.length === 0) {\n out.push({\n severity: \"warning\",\n code: \"IDX_EMPTY_COLUMNS\",\n message: \"인덱스 컬럼 목록이 비어 있어 인덱스 DDL을 생략한다.\",\n context: ctx,\n });\n continue;\n }\n for (const colPhys of indexModel.columns) {\n if (!table.columns.some((c) => c.physicalName === colPhys)) {\n out.push({\n severity: \"warning\",\n code: \"IDX_UNKNOWN_COLUMN\",\n message: `인덱스가 참조하는 물리 컬럼명 \"${colPhys}\"을(를) 테이블 \"${table.physicalName}\"에서 찾을 수 없다.`,\n context: ctx,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function generateDdlWithDiagnostics(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n const out = runDdlGenerator(doc, { kind: \"all\" }, options);\n return {\n sql: out.sql,\n diagnostics: out.diagnostics ?? analyzeDdlDocument(doc, options),\n };\n}\n\nexport function generateIndexDdlWithDiagnostics(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n return {\n sql: buildIndexDdlSql(doc, options),\n diagnostics: analyzeDdlDocument(doc, options),\n };\n}\n\nexport function generateDdl(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n return runDdlGenerator(doc, { kind: \"all\" }, options).sql;\n}\n\nexport function generateDdlForSelection(\n doc: DesignDocument,\n tableIds: string[],\n options?: CoreDbMetaOptions,\n): { sql: string; diagnostics: DdlDiagnostic[] } {\n const out = runDdlGenerator(doc, { kind: \"selected\", tableIds }, options);\n const diagnostics =\n out.diagnostics ??\n analyzeDdlDocument(\n sliceDocByScope(doc, { kind: \"selected\", tableIds }),\n options,\n );\n return { sql: out.sql, diagnostics };\n}\n\nexport function generateIndexDdl(\n doc: DesignDocument,\n options?: CoreDbMetaOptions,\n): string {\n return buildIndexDdlSql(doc, options);\n}\n\n/** 성능·부하 테스트용: 지정 개수의 빈 테이블과 격자 레이아웃을 생성한다. */\nexport function createLargeDesign(\n tableCount: number,\n dialect: RdbmsDialect = \"postgres\",\n): DesignDocument {\n const doc = createEmptyDesign(dialect);\n const cols = 20;\n for (let i = 0; i < tableCount; i++) {\n const id = `t-${i}`;\n doc.model.tables.push({\n id,\n logicalName: `엔티티${i}`,\n physicalName: `TB_T${i}`,\n columns: [\n createColumn(dialect, {\n id: `${id}-pk`,\n logicalName: \"식별자\",\n logicalType: \"NUMBER\",\n nullable: false,\n }),\n ],\n });\n doc.layout.nodePositions[id] = {\n x: (i % cols) * 220,\n y: Math.floor(i / cols) * 120,\n };\n }\n return doc;\n}\n"]}
|