@rawsql-ts/ddl-docs-cli 0.2.2
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/AGENTS.md +27 -0
- package/README.md +86 -0
- package/dist/src/analyzer/columnConcepts.d.ts +12 -0
- package/dist/src/analyzer/columnConcepts.js +185 -0
- package/dist/src/analyzer/columnConcepts.js.map +1 -0
- package/dist/src/analyzer/dictionary.d.ts +3 -0
- package/dist/src/analyzer/dictionary.js +39 -0
- package/dist/src/analyzer/dictionary.js.map +1 -0
- package/dist/src/analyzer/typeNormalization.d.ts +7 -0
- package/dist/src/analyzer/typeNormalization.js +76 -0
- package/dist/src/analyzer/typeNormalization.js.map +1 -0
- package/dist/src/cli.d.ts +8 -0
- package/dist/src/cli.js +264 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/generate.d.ts +5 -0
- package/dist/src/commands/generate.js +266 -0
- package/dist/src/commands/generate.js.map +1 -0
- package/dist/src/commands/prune.d.ts +2 -0
- package/dist/src/commands/prune.js +17 -0
- package/dist/src/commands/prune.js.map +1 -0
- package/dist/src/config.d.ts +5 -0
- package/dist/src/config.js +57 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/parser/snapshotTableDocs.d.ts +6 -0
- package/dist/src/parser/snapshotTableDocs.js +1001 -0
- package/dist/src/parser/snapshotTableDocs.js.map +1 -0
- package/dist/src/render/columnPages.d.ts +6 -0
- package/dist/src/render/columnPages.js +226 -0
- package/dist/src/render/columnPages.js.map +1 -0
- package/dist/src/render/indexPages.d.ts +6 -0
- package/dist/src/render/indexPages.js +156 -0
- package/dist/src/render/indexPages.js.map +1 -0
- package/dist/src/render/referencesPage.d.ts +6 -0
- package/dist/src/render/referencesPage.js +51 -0
- package/dist/src/render/referencesPage.js.map +1 -0
- package/dist/src/render/tableMarkdown.d.ts +36 -0
- package/dist/src/render/tableMarkdown.js +243 -0
- package/dist/src/render/tableMarkdown.js.map +1 -0
- package/dist/src/render/types.d.ts +7 -0
- package/dist/src/render/types.js +3 -0
- package/dist/src/render/types.js.map +1 -0
- package/dist/src/state/manifest.d.ts +14 -0
- package/dist/src/state/manifest.js +153 -0
- package/dist/src/state/manifest.js.map +1 -0
- package/dist/src/types.d.ts +193 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/ddlInputDedupe.d.ts +9 -0
- package/dist/src/utils/ddlInputDedupe.js +25 -0
- package/dist/src/utils/ddlInputDedupe.js.map +1 -0
- package/dist/src/utils/fs.d.ts +13 -0
- package/dist/src/utils/fs.js +187 -0
- package/dist/src/utils/fs.js.map +1 -0
- package/dist/src/utils/io.d.ts +2 -0
- package/dist/src/utils/io.js +13 -0
- package/dist/src/utils/io.js.map +1 -0
- package/dist/src/utils/markdown.d.ts +12 -0
- package/dist/src/utils/markdown.js +34 -0
- package/dist/src/utils/markdown.js.map +1 -0
- package/dist/src/utils/pgDumpFilter.d.ts +8 -0
- package/dist/src/utils/pgDumpFilter.js +104 -0
- package/dist/src/utils/pgDumpFilter.js.map +1 -0
- package/dist/src/utils/slug.d.ts +1 -0
- package/dist/src/utils/slug.js +13 -0
- package/dist/src/utils/slug.js.map +1 -0
- package/package.json +43 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Package Scope
|
|
2
|
+
- Applies to `packages/ddl-docs-cli`.
|
|
3
|
+
- Defines contract rules for the development CLI package.
|
|
4
|
+
|
|
5
|
+
# Policy
|
|
6
|
+
## REQUIRED
|
|
7
|
+
- SQL parsing behavior MUST stay AST-first through `rawsql-ts` APIs.
|
|
8
|
+
- Regex parsing fallback MUST be guarded and limited to unsupported AST gaps.
|
|
9
|
+
- Package dependency footprint MUST remain minimal.
|
|
10
|
+
|
|
11
|
+
## ALLOWED
|
|
12
|
+
- CLI-only development usage MAY depend on package-local tooling.
|
|
13
|
+
|
|
14
|
+
## PROHIBITED
|
|
15
|
+
- Treating this package as runtime application `src/` dependency.
|
|
16
|
+
|
|
17
|
+
# Mandatory Workflow
|
|
18
|
+
- Before committing changes under `packages/ddl-docs-cli`, run:
|
|
19
|
+
- `pnpm --filter @rawsql-ts/ddl-docs-cli lint`
|
|
20
|
+
- `pnpm --filter @rawsql-ts/ddl-docs-cli test`
|
|
21
|
+
- `pnpm --filter @rawsql-ts/ddl-docs-cli build`
|
|
22
|
+
|
|
23
|
+
# Hygiene
|
|
24
|
+
- Temporary debug output MUST be removed before commit.
|
|
25
|
+
|
|
26
|
+
# References
|
|
27
|
+
- Parent policy context: [../../AGENTS.md](../../AGENTS.md)
|
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @rawsql-ts/ddl-docs-cli
|
|
2
|
+
|
|
3
|
+
Generate Markdown table definition documents from DDL files.
|
|
4
|
+
|
|
5
|
+
- DDL is treated as SSOT.
|
|
6
|
+
- SQL parsing uses `rawsql-ts`.
|
|
7
|
+
- `CREATE TABLE` and `ALTER TABLE ... ADD CONSTRAINT` are applied across the full DDL stream.
|
|
8
|
+
- `COMMENT ON TABLE/COLUMN` is parsed via `rawsql-ts`.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pnpm --filter @rawsql-ts/ddl-docs-cli build
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ddl-docs generate --ddl-dir ztd/ddl --out-dir ztd/docs/tables
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Show help:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ddl-docs help
|
|
26
|
+
ddl-docs help generate
|
|
27
|
+
ddl-docs help prune
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Generated layout:
|
|
31
|
+
|
|
32
|
+
- `ztd/docs/tables/index.md`
|
|
33
|
+
- `ztd/docs/tables/<schema>/index.md`
|
|
34
|
+
- `ztd/docs/tables/<schema>/<table>.md`
|
|
35
|
+
|
|
36
|
+
Options:
|
|
37
|
+
|
|
38
|
+
- `--ddl-dir <directory>` repeatable recursive directory input
|
|
39
|
+
- `--ddl-file <file>` repeatable explicit file input
|
|
40
|
+
- `--ddl <file>` alias of `--ddl-file`
|
|
41
|
+
- `--ddl-glob <pattern>` repeatable glob pattern input
|
|
42
|
+
- `--extensions <csv>` default `.sql`
|
|
43
|
+
- `--out-dir <directory>` output root (default `ztd/docs/tables`)
|
|
44
|
+
- `--config <path>` optional `ztd.config.json` path
|
|
45
|
+
- `--default-schema <name>` schema override for unqualified table names
|
|
46
|
+
- `--search-path <csv>` schema search path override
|
|
47
|
+
- `--no-index` skip index page generation
|
|
48
|
+
- `--strict` fail when warnings exist
|
|
49
|
+
- `--column-order <mode>` `definition` (default) or `name`
|
|
50
|
+
|
|
51
|
+
Prune generated files:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
ddl-docs prune --out-dir ztd/docs/tables
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Prune preview:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
ddl-docs prune --out-dir ztd/docs/tables --dry-run
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Optional orphan cleanup:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ddl-docs prune --out-dir ztd/docs/tables --prune-orphans
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## VitePress Integration
|
|
70
|
+
|
|
71
|
+
This tool emits plain Markdown files and index pages.
|
|
72
|
+
If you prefer VitePress-side navigation generation, run with `--no-index` and let your site config build navigation from the generated table pages.
|
|
73
|
+
|
|
74
|
+
## Warnings
|
|
75
|
+
|
|
76
|
+
Warnings are emitted to `<outDir>/_meta/warnings.json`.
|
|
77
|
+
Use `--strict` in CI to treat warnings as failures.
|
|
78
|
+
|
|
79
|
+
## Memory Notes
|
|
80
|
+
|
|
81
|
+
Current implementation prioritizes correctness by applying the full DDL stream and aggregating table metadata before rendering.
|
|
82
|
+
For large schemas (for example, ~300 tables), follow-up optimization should focus on reducing peak memory by keeping only compact table metadata and discarding statement-level objects early.
|
|
83
|
+
|
|
84
|
+
## Minimal E2E Sample
|
|
85
|
+
|
|
86
|
+
See `packages/ddl-docs-cli/examples/minimal-e2e`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ColumnDictionary, FindingItem, ObservedColumnDictionary, SuggestionItem, TableDocModel } from '../types';
|
|
2
|
+
interface AnalyzeOptions {
|
|
3
|
+
locale: string;
|
|
4
|
+
dictionary: ColumnDictionary | null;
|
|
5
|
+
}
|
|
6
|
+
export interface AnalyzeResult {
|
|
7
|
+
observed: ObservedColumnDictionary;
|
|
8
|
+
findings: FindingItem[];
|
|
9
|
+
suggestions: SuggestionItem[];
|
|
10
|
+
}
|
|
11
|
+
export declare function analyzeColumns(tables: TableDocModel[], options: AnalyzeOptions): AnalyzeResult;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeColumns = analyzeColumns;
|
|
4
|
+
const KNOWN_RAW_TYPES = new Set(['text', 'date']);
|
|
5
|
+
const FLEXIBLE_CANONICAL_TYPES = new Set(['date', 'text']);
|
|
6
|
+
const PG_INT_ALIASES = {
|
|
7
|
+
int: 'integer',
|
|
8
|
+
int2: 'smallint',
|
|
9
|
+
int4: 'integer',
|
|
10
|
+
int8: 'bigint',
|
|
11
|
+
};
|
|
12
|
+
function analyzeColumns(tables, options) {
|
|
13
|
+
var _a, _b, _c, _d;
|
|
14
|
+
const conceptMap = new Map();
|
|
15
|
+
const findings = [];
|
|
16
|
+
const suggestions = [];
|
|
17
|
+
const commentCatalog = buildCommentCatalog(tables);
|
|
18
|
+
for (const table of tables) {
|
|
19
|
+
for (const column of table.columns) {
|
|
20
|
+
const concept = column.concept;
|
|
21
|
+
const conceptItem = (_a = conceptMap.get(concept)) !== null && _a !== void 0 ? _a : {
|
|
22
|
+
concept,
|
|
23
|
+
conceptSlug: column.conceptSlug,
|
|
24
|
+
typeDistribution: {},
|
|
25
|
+
usages: [],
|
|
26
|
+
};
|
|
27
|
+
conceptItem.typeDistribution[column.typeKey] = ((_b = conceptItem.typeDistribution[column.typeKey]) !== null && _b !== void 0 ? _b : 0) + 1;
|
|
28
|
+
conceptItem.usages.push({
|
|
29
|
+
schema: table.schema,
|
|
30
|
+
table: table.table,
|
|
31
|
+
column: column.name,
|
|
32
|
+
tableSlug: table.tableSlug,
|
|
33
|
+
schemaSlug: table.schemaSlug,
|
|
34
|
+
typeKey: column.typeKey,
|
|
35
|
+
canonicalType: column.canonicalType,
|
|
36
|
+
nullable: column.nullable,
|
|
37
|
+
defaultValue: column.defaultValue,
|
|
38
|
+
comment: column.comment.trim(),
|
|
39
|
+
hasComment: Boolean(column.comment.trim()),
|
|
40
|
+
});
|
|
41
|
+
conceptMap.set(concept, conceptItem);
|
|
42
|
+
if (column.unknownType && !KNOWN_RAW_TYPES.has(column.typeName.toLowerCase())) {
|
|
43
|
+
findings.push({
|
|
44
|
+
kind: 'UNSUPPORTED_OR_UNKNOWN_TYPE',
|
|
45
|
+
severity: 'info',
|
|
46
|
+
message: `Unknown type treated as raw for ${table.schema}.${table.table}.${column.name}: ${column.typeName}`,
|
|
47
|
+
scope: { schema: table.schema, table: table.table, column: column.name, concept },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const suggestedComment = pickCommentSuggestion(commentCatalog, table.schema, concept);
|
|
51
|
+
if (!column.comment.trim() && suggestedComment) {
|
|
52
|
+
findings.push({
|
|
53
|
+
kind: 'MISSING_COMMENT_SUGGESTED',
|
|
54
|
+
severity: 'warning',
|
|
55
|
+
message: `Missing comment for ${table.schema}.${table.table}.${column.name}.`,
|
|
56
|
+
scope: { schema: table.schema, table: table.table, column: column.name, concept },
|
|
57
|
+
});
|
|
58
|
+
suggestions.push({
|
|
59
|
+
kind: 'column_comment',
|
|
60
|
+
schema: table.schema,
|
|
61
|
+
table: table.table,
|
|
62
|
+
column: column.name,
|
|
63
|
+
sql: `COMMENT ON COLUMN ${quoteQualifiedColumn(table.schema, table.table, column.name)} IS '${escapeSqlLiteral(suggestedComment)}';`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const dictionaryEntry = (_d = (_c = options.dictionary) === null || _c === void 0 ? void 0 : _c.columns) === null || _d === void 0 ? void 0 : _d[concept];
|
|
67
|
+
if (!dictionaryEntry) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const dictionaryComment = buildSuggestedComment(dictionaryEntry, options.locale);
|
|
71
|
+
if (column.comment.trim() && dictionaryComment && normalizeCompare(column.comment) !== normalizeCompare(dictionaryComment)) {
|
|
72
|
+
findings.push({
|
|
73
|
+
kind: 'COMMENT_VS_DICTIONARY_MISMATCH',
|
|
74
|
+
severity: 'warning',
|
|
75
|
+
message: `Comment differs from dictionary for ${table.schema}.${table.table}.${column.name}.`,
|
|
76
|
+
scope: { schema: table.schema, table: table.table, column: column.name, concept },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const conceptItem of conceptMap.values()) {
|
|
82
|
+
const divergenceBases = new Set(conceptItem.usages
|
|
83
|
+
.map((usage) => {
|
|
84
|
+
var _a;
|
|
85
|
+
const base = usage.canonicalType.replace(/\(.*\)/, '').replace(/\{serial\}/, '');
|
|
86
|
+
const normalizedBase = base.toLowerCase();
|
|
87
|
+
return (_a = PG_INT_ALIASES[normalizedBase]) !== null && _a !== void 0 ? _a : normalizedBase;
|
|
88
|
+
})
|
|
89
|
+
.filter((base) => !FLEXIBLE_CANONICAL_TYPES.has(base.toLowerCase())));
|
|
90
|
+
if (divergenceBases.size > 1) {
|
|
91
|
+
findings.push({
|
|
92
|
+
kind: 'COLUMN_NAME_TYPE_DIVERGENCE',
|
|
93
|
+
severity: 'info',
|
|
94
|
+
message: `Type variation detected for concept "${conceptItem.concept}".`,
|
|
95
|
+
scope: { concept: conceptItem.concept },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const concepts = Array.from(conceptMap.values())
|
|
100
|
+
.map((concept) => ({
|
|
101
|
+
...concept,
|
|
102
|
+
usages: concept.usages.sort((a, b) => `${a.schema}.${a.table}.${a.column}|${a.typeKey}`.localeCompare(`${b.schema}.${b.table}.${b.column}|${b.typeKey}`)),
|
|
103
|
+
}))
|
|
104
|
+
.sort((a, b) => a.concept.localeCompare(b.concept));
|
|
105
|
+
return {
|
|
106
|
+
observed: {
|
|
107
|
+
version: 1,
|
|
108
|
+
generatedAt: '1970-01-01T00:00:00.000Z',
|
|
109
|
+
concepts,
|
|
110
|
+
},
|
|
111
|
+
findings: findings.sort((a, b) => `${a.kind}|${a.message}`.localeCompare(`${b.kind}|${b.message}`)),
|
|
112
|
+
suggestions: suggestions.sort((a, b) => a.sql.localeCompare(b.sql)),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function buildSuggestedComment(entry, locale) {
|
|
116
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
117
|
+
const label = (_d = (_b = (_a = entry.labels) === null || _a === void 0 ? void 0 : _a[locale]) !== null && _b !== void 0 ? _b : (_c = entry.labels) === null || _c === void 0 ? void 0 : _c.en) !== null && _d !== void 0 ? _d : Object.values((_e = entry.labels) !== null && _e !== void 0 ? _e : {})[0];
|
|
118
|
+
const note = (_j = (_g = (_f = entry.notes) === null || _f === void 0 ? void 0 : _f[locale]) !== null && _g !== void 0 ? _g : (_h = entry.notes) === null || _h === void 0 ? void 0 : _h.en) !== null && _j !== void 0 ? _j : Object.values((_k = entry.notes) !== null && _k !== void 0 ? _k : {})[0];
|
|
119
|
+
if (label && note) {
|
|
120
|
+
return `${label} - ${note}`;
|
|
121
|
+
}
|
|
122
|
+
return (_l = label !== null && label !== void 0 ? label : note) !== null && _l !== void 0 ? _l : '';
|
|
123
|
+
}
|
|
124
|
+
function escapeSqlLiteral(input) {
|
|
125
|
+
return input.replace(/'/g, "''");
|
|
126
|
+
}
|
|
127
|
+
function normalizeCompare(input) {
|
|
128
|
+
return input.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
129
|
+
}
|
|
130
|
+
function buildCommentCatalog(tables) {
|
|
131
|
+
var _a, _b;
|
|
132
|
+
const catalog = new Map();
|
|
133
|
+
for (const table of tables) {
|
|
134
|
+
for (const column of table.columns) {
|
|
135
|
+
const comment = column.comment.trim();
|
|
136
|
+
if (!comment) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const concept = column.concept;
|
|
140
|
+
const entry = (_a = catalog.get(concept)) !== null && _a !== void 0 ? _a : {
|
|
141
|
+
sameSchema: new Map(),
|
|
142
|
+
global: [],
|
|
143
|
+
};
|
|
144
|
+
const schemaComments = (_b = entry.sameSchema.get(table.schema)) !== null && _b !== void 0 ? _b : [];
|
|
145
|
+
schemaComments.push(comment);
|
|
146
|
+
entry.sameSchema.set(table.schema, schemaComments);
|
|
147
|
+
entry.global.push({ schema: table.schema, comment });
|
|
148
|
+
catalog.set(concept, entry);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const entry of catalog.values()) {
|
|
152
|
+
for (const [schema, comments] of entry.sameSchema.entries()) {
|
|
153
|
+
entry.sameSchema.set(schema, Array.from(new Set(comments)).sort((a, b) => a.localeCompare(b)));
|
|
154
|
+
}
|
|
155
|
+
const deduped = new Map();
|
|
156
|
+
for (const item of entry.global) {
|
|
157
|
+
deduped.set(`${item.schema}|${item.comment}`, item);
|
|
158
|
+
}
|
|
159
|
+
entry.global = Array.from(deduped.values()).sort((a, b) => `${a.schema}|${a.comment}`.localeCompare(`${b.schema}|${b.comment}`));
|
|
160
|
+
}
|
|
161
|
+
return catalog;
|
|
162
|
+
}
|
|
163
|
+
function pickCommentSuggestion(catalog, schema, concept) {
|
|
164
|
+
var _a, _b, _c, _d;
|
|
165
|
+
const entry = catalog.get(concept);
|
|
166
|
+
if (!entry) {
|
|
167
|
+
return '';
|
|
168
|
+
}
|
|
169
|
+
const sameSchema = (_a = entry.sameSchema.get(schema)) !== null && _a !== void 0 ? _a : [];
|
|
170
|
+
if (sameSchema.length > 0) {
|
|
171
|
+
return (_b = sameSchema[0]) !== null && _b !== void 0 ? _b : '';
|
|
172
|
+
}
|
|
173
|
+
if (entry.global.length > 0) {
|
|
174
|
+
return (_d = (_c = entry.global[0]) === null || _c === void 0 ? void 0 : _c.comment) !== null && _d !== void 0 ? _d : '';
|
|
175
|
+
}
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
178
|
+
function quoteQualifiedColumn(schema, table, column) {
|
|
179
|
+
return [schema, table, column].map(quoteIdentifier).join('.');
|
|
180
|
+
}
|
|
181
|
+
function quoteIdentifier(value) {
|
|
182
|
+
const normalized = value.replace(/^"|"$/g, '');
|
|
183
|
+
return `"${normalized.replace(/"/g, '""')}"`;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=columnConcepts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnConcepts.js","sourceRoot":"","sources":["../../../src/analyzer/columnConcepts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadDictionary = loadDictionary;
|
|
4
|
+
exports.resolveLocale = resolveLocale;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
function loadDictionary(pathValue) {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
if (!pathValue) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
if (!(0, node_fs_1.existsSync)(pathValue)) {
|
|
12
|
+
throw new Error(`Dictionary file not found: ${pathValue}`);
|
|
13
|
+
}
|
|
14
|
+
const raw = (0, node_fs_1.readFileSync)(pathValue, 'utf8');
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
if (typeof parsed !== 'object' || parsed === null || !parsed.columns) {
|
|
17
|
+
throw new Error(`Invalid dictionary format: ${pathValue}`);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
version: (_a = parsed.version) !== null && _a !== void 0 ? _a : 1,
|
|
21
|
+
locales: (_b = parsed.locales) !== null && _b !== void 0 ? _b : ['en'],
|
|
22
|
+
columns: parsed.columns,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function resolveLocale(requested, dictionary) {
|
|
26
|
+
var _a, _b, _c, _d, _e;
|
|
27
|
+
if (requested && requested.trim()) {
|
|
28
|
+
return requested.trim();
|
|
29
|
+
}
|
|
30
|
+
const lang = (_a = process.env.LANG) === null || _a === void 0 ? void 0 : _a.split(/[._-]/)[0];
|
|
31
|
+
if (lang && ((_b = dictionary === null || dictionary === void 0 ? void 0 : dictionary.locales) === null || _b === void 0 ? void 0 : _b.includes(lang))) {
|
|
32
|
+
return lang;
|
|
33
|
+
}
|
|
34
|
+
if ((_c = dictionary === null || dictionary === void 0 ? void 0 : dictionary.locales) === null || _c === void 0 ? void 0 : _c.includes('en')) {
|
|
35
|
+
return 'en';
|
|
36
|
+
}
|
|
37
|
+
return (_e = (_d = dictionary === null || dictionary === void 0 ? void 0 : dictionary.locales) === null || _d === void 0 ? void 0 : _d[0]) !== null && _e !== void 0 ? _e : 'en';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=dictionary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../src/analyzer/dictionary.ts"],"names":[],"mappings":";;AAGA,wCAiBC;AAED,sCAYC;AAlCD,qCAAmD;AAGnD,SAAgB,cAAc,CAAC,SAA6B;;IAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;IAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAA,MAAM,CAAC,OAAO,mCAAI,CAAC;QAC5B,OAAO,EAAE,MAAA,MAAM,CAAC,OAAO,mCAAI,CAAC,IAAI,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,SAA6B,EAAE,UAAmC;;IAC9F,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,IAAI,0CAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,KAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,0CAAE,QAAQ,CAAC,IAAI,CAAC,CAAA,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,0CAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,0CAAG,CAAC,CAAC,mCAAI,IAAI,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePostgresType = normalizePostgresType;
|
|
4
|
+
function normalizePostgresType(rawTypeName) {
|
|
5
|
+
const raw = rawTypeName.trim();
|
|
6
|
+
const lower = raw.toLowerCase().replace(/\s+/g, ' ');
|
|
7
|
+
if (!lower) {
|
|
8
|
+
return asRaw('unknown');
|
|
9
|
+
}
|
|
10
|
+
if (lower === 'smallint' || lower === 'int2') {
|
|
11
|
+
return known('int2', 'int2');
|
|
12
|
+
}
|
|
13
|
+
if (lower === 'integer' || lower === 'int' || lower === 'int4') {
|
|
14
|
+
return known('int4', 'int4');
|
|
15
|
+
}
|
|
16
|
+
if (lower === 'bigint' || lower === 'int8') {
|
|
17
|
+
return known('int8', 'int8');
|
|
18
|
+
}
|
|
19
|
+
if (lower === 'smallserial' || lower === 'serial2') {
|
|
20
|
+
return known('int2', 'int2{serial}', 'int2');
|
|
21
|
+
}
|
|
22
|
+
if (lower === 'serial' || lower === 'serial4') {
|
|
23
|
+
return known('int4', 'int4{serial}', 'int4');
|
|
24
|
+
}
|
|
25
|
+
if (lower === 'bigserial' || lower === 'serial8') {
|
|
26
|
+
return known('int8', 'int8{serial}', 'int8');
|
|
27
|
+
}
|
|
28
|
+
if (lower === 'boolean' || lower === 'bool') {
|
|
29
|
+
return known('bool', 'bool');
|
|
30
|
+
}
|
|
31
|
+
if (lower === 'uuid') {
|
|
32
|
+
return known('uuid', 'uuid');
|
|
33
|
+
}
|
|
34
|
+
if (lower === 'timestamp without time zone' || lower === 'timestamp') {
|
|
35
|
+
return known('timestamp', 'timestamp');
|
|
36
|
+
}
|
|
37
|
+
if (lower === 'timestamp with time zone' || lower === 'timestamptz') {
|
|
38
|
+
return known('timestamptz', 'timestamptz');
|
|
39
|
+
}
|
|
40
|
+
const numeric = lower.match(/^(numeric|decimal)\s*\((\d+)\s*,\s*(\d+)\)$/);
|
|
41
|
+
if (numeric) {
|
|
42
|
+
const p = numeric[2];
|
|
43
|
+
const s = numeric[3];
|
|
44
|
+
return known(`numeric(${p},${s})`, `numeric(${p},${s})`, 'numeric');
|
|
45
|
+
}
|
|
46
|
+
if (lower === 'numeric' || lower === 'decimal') {
|
|
47
|
+
return known('numeric', 'numeric', 'numeric');
|
|
48
|
+
}
|
|
49
|
+
const varchar = lower.match(/^(character varying|varchar)\s*\((\d+)\)$/);
|
|
50
|
+
if (varchar) {
|
|
51
|
+
const n = varchar[2];
|
|
52
|
+
return known(`varchar(${n})`, `varchar(${n})`, 'varchar');
|
|
53
|
+
}
|
|
54
|
+
if (lower === 'character varying' || lower === 'varchar') {
|
|
55
|
+
return known('varchar', 'varchar', 'varchar');
|
|
56
|
+
}
|
|
57
|
+
return asRaw(raw);
|
|
58
|
+
}
|
|
59
|
+
function known(canonicalType, typeKey, baseForDivergence) {
|
|
60
|
+
return {
|
|
61
|
+
canonicalType,
|
|
62
|
+
typeKey,
|
|
63
|
+
unknown: false,
|
|
64
|
+
baseForDivergence: baseForDivergence !== null && baseForDivergence !== void 0 ? baseForDivergence : canonicalType.replace(/\(.*\)/, ''),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function asRaw(raw) {
|
|
68
|
+
const normalizedRaw = raw.replace(/\s+/g, ' ').trim();
|
|
69
|
+
return {
|
|
70
|
+
canonicalType: normalizedRaw,
|
|
71
|
+
typeKey: `raw:${normalizedRaw}`,
|
|
72
|
+
unknown: true,
|
|
73
|
+
baseForDivergence: `raw:${normalizedRaw.toLowerCase()}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=typeNormalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeNormalization.js","sourceRoot":"","sources":["../../../src/analyzer/typeNormalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs ddl-docs-cli command dispatch and executes generate/prune subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @param argv Command-line arguments without the node executable and script path.
|
|
5
|
+
* @returns A promise that resolves when command execution completes.
|
|
6
|
+
* Side effects include console output and filesystem writes/removals via subcommands.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runCli(argv: string[]): Promise<void>;
|