@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.
Files changed (69) hide show
  1. package/AGENTS.md +27 -0
  2. package/README.md +86 -0
  3. package/dist/src/analyzer/columnConcepts.d.ts +12 -0
  4. package/dist/src/analyzer/columnConcepts.js +185 -0
  5. package/dist/src/analyzer/columnConcepts.js.map +1 -0
  6. package/dist/src/analyzer/dictionary.d.ts +3 -0
  7. package/dist/src/analyzer/dictionary.js +39 -0
  8. package/dist/src/analyzer/dictionary.js.map +1 -0
  9. package/dist/src/analyzer/typeNormalization.d.ts +7 -0
  10. package/dist/src/analyzer/typeNormalization.js +76 -0
  11. package/dist/src/analyzer/typeNormalization.js.map +1 -0
  12. package/dist/src/cli.d.ts +8 -0
  13. package/dist/src/cli.js +264 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/commands/generate.d.ts +5 -0
  16. package/dist/src/commands/generate.js +266 -0
  17. package/dist/src/commands/generate.js.map +1 -0
  18. package/dist/src/commands/prune.d.ts +2 -0
  19. package/dist/src/commands/prune.js +17 -0
  20. package/dist/src/commands/prune.js.map +1 -0
  21. package/dist/src/config.d.ts +5 -0
  22. package/dist/src/config.js +57 -0
  23. package/dist/src/config.js.map +1 -0
  24. package/dist/src/index.d.ts +2 -0
  25. package/dist/src/index.js +9 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/parser/snapshotTableDocs.d.ts +6 -0
  28. package/dist/src/parser/snapshotTableDocs.js +1001 -0
  29. package/dist/src/parser/snapshotTableDocs.js.map +1 -0
  30. package/dist/src/render/columnPages.d.ts +6 -0
  31. package/dist/src/render/columnPages.js +226 -0
  32. package/dist/src/render/columnPages.js.map +1 -0
  33. package/dist/src/render/indexPages.d.ts +6 -0
  34. package/dist/src/render/indexPages.js +156 -0
  35. package/dist/src/render/indexPages.js.map +1 -0
  36. package/dist/src/render/referencesPage.d.ts +6 -0
  37. package/dist/src/render/referencesPage.js +51 -0
  38. package/dist/src/render/referencesPage.js.map +1 -0
  39. package/dist/src/render/tableMarkdown.d.ts +36 -0
  40. package/dist/src/render/tableMarkdown.js +243 -0
  41. package/dist/src/render/tableMarkdown.js.map +1 -0
  42. package/dist/src/render/types.d.ts +7 -0
  43. package/dist/src/render/types.js +3 -0
  44. package/dist/src/render/types.js.map +1 -0
  45. package/dist/src/state/manifest.d.ts +14 -0
  46. package/dist/src/state/manifest.js +153 -0
  47. package/dist/src/state/manifest.js.map +1 -0
  48. package/dist/src/types.d.ts +193 -0
  49. package/dist/src/types.js +3 -0
  50. package/dist/src/types.js.map +1 -0
  51. package/dist/src/utils/ddlInputDedupe.d.ts +9 -0
  52. package/dist/src/utils/ddlInputDedupe.js +25 -0
  53. package/dist/src/utils/ddlInputDedupe.js.map +1 -0
  54. package/dist/src/utils/fs.d.ts +13 -0
  55. package/dist/src/utils/fs.js +187 -0
  56. package/dist/src/utils/fs.js.map +1 -0
  57. package/dist/src/utils/io.d.ts +2 -0
  58. package/dist/src/utils/io.js +13 -0
  59. package/dist/src/utils/io.js.map +1 -0
  60. package/dist/src/utils/markdown.d.ts +12 -0
  61. package/dist/src/utils/markdown.js +34 -0
  62. package/dist/src/utils/markdown.js.map +1 -0
  63. package/dist/src/utils/pgDumpFilter.d.ts +8 -0
  64. package/dist/src/utils/pgDumpFilter.js +104 -0
  65. package/dist/src/utils/pgDumpFilter.js.map +1 -0
  66. package/dist/src/utils/slug.d.ts +1 -0
  67. package/dist/src/utils/slug.js +13 -0
  68. package/dist/src/utils/slug.js.map +1 -0
  69. package/package.json +43 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dedupeDdlInputsByInstanceAndPath = dedupeDdlInputsByInstanceAndPath;
4
+ /**
5
+ * Dedupe DDL inputs by the tuple key of (instance, path).
6
+ *
7
+ * Inputs sharing only the path are preserved when their instance differs.
8
+ * The key format intentionally uses a NUL separator to avoid collisions with
9
+ * common path characters on Windows and POSIX.
10
+ */
11
+ function dedupeDdlInputsByInstanceAndPath(inputs) {
12
+ const seen = new Set();
13
+ return inputs.filter((input) => {
14
+ var _a;
15
+ const normalizedInstance = (_a = input.instance) !== null && _a !== void 0 ? _a : '';
16
+ const normalizedPath = input.path;
17
+ const key = `${normalizedInstance}\0${normalizedPath}`;
18
+ if (seen.has(key)) {
19
+ return false;
20
+ }
21
+ seen.add(key);
22
+ return true;
23
+ });
24
+ }
25
+ //# sourceMappingURL=ddlInputDedupe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddlInputDedupe.js","sourceRoot":"","sources":["../../../src/utils/ddlInputDedupe.ts"],"names":[],"mappings":";;AASA,4EAYC;AAnBD;;;;;;GAMG;AACH,SAAgB,gCAAgC,CAAC,MAAkB;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;;QAC7B,MAAM,kBAAkB,GAAG,MAAA,KAAK,CAAC,QAAQ,mCAAI,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,kBAAkB,KAAK,cAAc,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { DdlInput, SqlSource } from '../types';
2
+ export declare function ensureDirectory(directoryPath: string): void;
3
+ export declare function toWorkspaceRelative(filePath: string): string;
4
+ /**
5
+ * Collects SQL sources from directory and file inputs with instance metadata.
6
+ *
7
+ * @param directories Directory inputs as `DdlInput` entries. Each entry carries a path and optional instance.
8
+ * @param files File inputs as `DdlInput` entries. Each entry carries a path and optional instance.
9
+ * @param extensions Allowed SQL file extensions. Values are normalized before matching.
10
+ * @returns Sorted `SqlSource[]` entries containing workspace-relative path, SQL text, and instance.
11
+ */
12
+ export declare function collectSqlFiles(directories: DdlInput[], files: DdlInput[], extensions: string[]): SqlSource[];
13
+ export declare function expandGlobPatterns(patterns: string[]): string[];
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureDirectory = ensureDirectory;
7
+ exports.toWorkspaceRelative = toWorkspaceRelative;
8
+ exports.collectSqlFiles = collectSqlFiles;
9
+ exports.expandGlobPatterns = expandGlobPatterns;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ function ensureDirectory(directoryPath) {
13
+ if (!(0, node_fs_1.existsSync)(directoryPath)) {
14
+ (0, node_fs_1.mkdirSync)(directoryPath, { recursive: true });
15
+ }
16
+ }
17
+ function toWorkspaceRelative(filePath) {
18
+ return node_path_1.default.relative(process.cwd(), filePath).replace(/\\/g, '/');
19
+ }
20
+ /**
21
+ * Collects SQL sources from directory and file inputs with instance metadata.
22
+ *
23
+ * @param directories Directory inputs as `DdlInput` entries. Each entry carries a path and optional instance.
24
+ * @param files File inputs as `DdlInput` entries. Each entry carries a path and optional instance.
25
+ * @param extensions Allowed SQL file extensions. Values are normalized before matching.
26
+ * @returns Sorted `SqlSource[]` entries containing workspace-relative path, SQL text, and instance.
27
+ */
28
+ function collectSqlFiles(directories, files, extensions) {
29
+ const extensionSet = new Set(extensions.map((entry) => normalizeExtension(entry)));
30
+ const sources = [];
31
+ const seen = new Set();
32
+ for (const entry of directories) {
33
+ const { path: directory, instance } = normalizeDdlInput(entry);
34
+ const resolvedDirectory = node_path_1.default.resolve(directory);
35
+ if (!(0, node_fs_1.existsSync)(resolvedDirectory)) {
36
+ throw new Error(`DDL directory not found: ${resolvedDirectory}`);
37
+ }
38
+ // Recommended layout: ddl/{instance}/{schema}.sql
39
+ // If no explicit instance is given, auto-detect from first-level subfolder names.
40
+ // Files placed directly under the root dir get instance = "" (no instance).
41
+ if (instance) {
42
+ scanDirectoryRecursive(resolvedDirectory, extensionSet, sources, seen, instance);
43
+ }
44
+ else {
45
+ scanRootDirectory(resolvedDirectory, extensionSet, sources, seen);
46
+ }
47
+ }
48
+ for (const entry of files) {
49
+ const { path: filePath, instance } = normalizeDdlInput(entry);
50
+ const resolvedPath = node_path_1.default.resolve(filePath);
51
+ if (!(0, node_fs_1.existsSync)(resolvedPath)) {
52
+ throw new Error(`DDL file not found: ${resolvedPath}`);
53
+ }
54
+ appendSqlFile(resolvedPath, extensionSet, sources, seen, instance);
55
+ }
56
+ return sources.sort((a, b) => a.path.localeCompare(b.path));
57
+ }
58
+ function normalizeDdlInput(entry) {
59
+ var _a;
60
+ if (typeof entry === 'string') {
61
+ return { path: entry, instance: '' };
62
+ }
63
+ return {
64
+ path: entry.path,
65
+ instance: (_a = entry.instance) !== null && _a !== void 0 ? _a : '',
66
+ };
67
+ }
68
+ function expandGlobPatterns(patterns) {
69
+ const matches = new Set();
70
+ for (const pattern of patterns) {
71
+ const normalizedPattern = pattern.replace(/\\/g, '/');
72
+ const rootDir = resolveGlobRoot(normalizedPattern);
73
+ if (!(0, node_fs_1.existsSync)(rootDir)) {
74
+ continue;
75
+ }
76
+ const allFiles = [];
77
+ collectAllFiles(rootDir, allFiles);
78
+ const matcher = globToRegExp(node_path_1.default.resolve(normalizedPattern).replace(/\\/g, '/'));
79
+ for (const filePath of allFiles) {
80
+ const normalizedFile = filePath.replace(/\\/g, '/');
81
+ if (matcher.test(normalizedFile)) {
82
+ matches.add(filePath);
83
+ }
84
+ }
85
+ }
86
+ return Array.from(matches).sort((a, b) => a.localeCompare(b));
87
+ }
88
+ /**
89
+ * Scans the root DDL directory.
90
+ * First-level subdirectories become instance names (recommended: ddl/{instance}/{schema}.sql).
91
+ * Files placed directly in the root get instance = "" (no instance).
92
+ */
93
+ function scanRootDirectory(rootDirectory, extensionSet, sources, seen) {
94
+ const entries = (0, node_fs_1.readdirSync)(rootDirectory, { withFileTypes: true });
95
+ for (const entry of entries) {
96
+ const resolved = node_path_1.default.join(rootDirectory, entry.name);
97
+ if (entry.isDirectory()) {
98
+ scanDirectoryRecursive(resolved, extensionSet, sources, seen, entry.name);
99
+ continue;
100
+ }
101
+ if (entry.isFile()) {
102
+ appendSqlFile(resolved, extensionSet, sources, seen, '');
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Recursively scans a directory with a fixed instance name.
108
+ */
109
+ function scanDirectoryRecursive(directory, extensionSet, sources, seen, instance) {
110
+ const entries = (0, node_fs_1.readdirSync)(directory, { withFileTypes: true });
111
+ for (const entry of entries) {
112
+ const resolved = node_path_1.default.join(directory, entry.name);
113
+ if (entry.isDirectory()) {
114
+ scanDirectoryRecursive(resolved, extensionSet, sources, seen, instance);
115
+ continue;
116
+ }
117
+ if (entry.isFile()) {
118
+ appendSqlFile(resolved, extensionSet, sources, seen, instance);
119
+ }
120
+ }
121
+ }
122
+ function appendSqlFile(filePath, extensionSet, sources, seen, instance) {
123
+ const extension = normalizeExtension(node_path_1.default.extname(filePath));
124
+ if (!extensionSet.has(extension)) {
125
+ return;
126
+ }
127
+ const normalizedPath = node_path_1.default.normalize(filePath);
128
+ const dedupeKey = `${instance}\u0000${normalizedPath}`;
129
+ if (seen.has(dedupeKey)) {
130
+ return;
131
+ }
132
+ const sql = (0, node_fs_1.readFileSync)(filePath, 'utf8');
133
+ if (!sql.trim()) {
134
+ return;
135
+ }
136
+ seen.add(dedupeKey);
137
+ sources.push({
138
+ path: toWorkspaceRelative(filePath),
139
+ sql,
140
+ instance,
141
+ });
142
+ }
143
+ function normalizeExtension(extension) {
144
+ const trimmed = extension.trim().toLowerCase();
145
+ if (!trimmed) {
146
+ return '';
147
+ }
148
+ return trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
149
+ }
150
+ function collectAllFiles(directory, acc) {
151
+ const entries = (0, node_fs_1.readdirSync)(directory, { withFileTypes: true });
152
+ for (const entry of entries) {
153
+ const resolved = node_path_1.default.join(directory, entry.name);
154
+ if (entry.isDirectory()) {
155
+ collectAllFiles(resolved, acc);
156
+ continue;
157
+ }
158
+ if (entry.isFile()) {
159
+ acc.push(node_path_1.default.resolve(resolved));
160
+ }
161
+ }
162
+ }
163
+ function resolveGlobRoot(pattern) {
164
+ const absolute = node_path_1.default.resolve(pattern);
165
+ const tokens = absolute.split('/');
166
+ const rootTokens = [];
167
+ for (const token of tokens) {
168
+ if (token.includes('*') || token.includes('?')) {
169
+ break;
170
+ }
171
+ rootTokens.push(token);
172
+ }
173
+ if (rootTokens.length === 0) {
174
+ return process.cwd();
175
+ }
176
+ return rootTokens.join('/');
177
+ }
178
+ function globToRegExp(pattern) {
179
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
180
+ const withGlob = escaped
181
+ .replace(/\\\*\\\*/g, '___DOUBLE_STAR___')
182
+ .replace(/\\\*/g, '[^/]*')
183
+ .replace(/\\\?/g, '[^/]')
184
+ .replace(/___DOUBLE_STAR___/g, '.*');
185
+ return new RegExp(`^${withGlob}$`);
186
+ }
187
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/utils/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function normalizeLf(text: string): string;
2
+ export declare function writeTextFileNormalized(filePath: string, text: string): void;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeLf = normalizeLf;
4
+ exports.writeTextFileNormalized = writeTextFileNormalized;
5
+ const node_fs_1 = require("node:fs");
6
+ function normalizeLf(text) {
7
+ const normalized = text.replace(/\r\n/g, '\n');
8
+ return normalized.endsWith('\n') ? normalized : `${normalized}\n`;
9
+ }
10
+ function writeTextFileNormalized(filePath, text) {
11
+ (0, node_fs_1.writeFileSync)(filePath, normalizeLf(text), 'utf8');
12
+ }
13
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../../src/utils/io.ts"],"names":[],"mappings":";;AAEA,kCAGC;AAED,0DAEC;AATD,qCAAwC;AAExC,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC;AACpE,CAAC;AAED,SAAgB,uBAAuB,CAAC,QAAgB,EAAE,IAAY;IACpE,IAAA,uBAAa,EAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Escapes markdown-sensitive characters for table cells and normalizes line breaks.
3
+ */
4
+ export declare function escapeMarkdownText(input: string): string;
5
+ /**
6
+ * Formats nullable plain-text values for markdown table cells.
7
+ */
8
+ export declare function formatTableCell(value: string | null | undefined): string;
9
+ /**
10
+ * Formats nullable values as inline code for markdown table cells.
11
+ */
12
+ export declare function formatCodeCell(value: string | null | undefined): string;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeMarkdownText = escapeMarkdownText;
4
+ exports.formatTableCell = formatTableCell;
5
+ exports.formatCodeCell = formatCodeCell;
6
+ /**
7
+ * Escapes markdown-sensitive characters for table cells and normalizes line breaks.
8
+ */
9
+ function escapeMarkdownText(input) {
10
+ return input
11
+ .replace(/\|/g, '\\|')
12
+ .replace(/\r?\n/g, '<br>')
13
+ .trim();
14
+ }
15
+ /**
16
+ * Formats nullable plain-text values for markdown table cells.
17
+ */
18
+ function formatTableCell(value) {
19
+ if (value === null || value === undefined || value.trim().length === 0) {
20
+ return '-';
21
+ }
22
+ return escapeMarkdownText(value);
23
+ }
24
+ /**
25
+ * Formats nullable values as inline code for markdown table cells.
26
+ */
27
+ function formatCodeCell(value) {
28
+ if (value === null || value === undefined || value.trim().length === 0) {
29
+ return '-';
30
+ }
31
+ const escaped = value.replace(/`/g, '\\`');
32
+ return `\`${escaped}\``;
33
+ }
34
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/utils/markdown.ts"],"names":[],"mappings":";;AAGA,gDAKC;AAKD,0CAKC;AAKD,wCAMC;AA7BD;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;SACzB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAgC;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAgC;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,OAAO,IAAI,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Removes pg_dump-specific administrative SQL statements from DDL output.
3
+ *
4
+ * Filters out GRANT, REVOKE, ALTER ... OWNER TO, SET, \connect, and
5
+ * SELECT pg_catalog.set_config statements that appear in pg_dump output
6
+ * but are not relevant for schema documentation.
7
+ */
8
+ export declare function filterPgDump(sql: string): string;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterPgDump = filterPgDump;
4
+ // pg_dump administrative statements are line-start keyword driven, so a small
5
+ // regex list is a guarded fallback here instead of a full SQL AST parse.
6
+ const SKIP_PATTERNS = [
7
+ /^GRANT\b/i,
8
+ /^REVOKE\b/i,
9
+ /^ALTER\b.*\bOWNER\s+TO\b/i,
10
+ /^SET\b/i,
11
+ /^SELECT\s+pg_catalog\.set_config\b/i,
12
+ ];
13
+ /**
14
+ * Removes pg_dump-specific administrative SQL statements from DDL output.
15
+ *
16
+ * Filters out GRANT, REVOKE, ALTER ... OWNER TO, SET, \connect, and
17
+ * SELECT pg_catalog.set_config statements that appear in pg_dump output
18
+ * but are not relevant for schema documentation.
19
+ */
20
+ function filterPgDump(sql) {
21
+ const lines = sql.split('\n');
22
+ const output = [];
23
+ let skipping = false;
24
+ for (const line of lines) {
25
+ const trimmed = line.trimStart();
26
+ if (!skipping) {
27
+ if (/^\\connect\b/i.test(trimmed)) {
28
+ continue;
29
+ }
30
+ if (SKIP_PATTERNS.some((pattern) => pattern.test(trimmed))) {
31
+ skipping = true;
32
+ }
33
+ else {
34
+ output.push(line);
35
+ }
36
+ }
37
+ if (skipping && hasStatementTerminator(line)) {
38
+ skipping = false;
39
+ }
40
+ }
41
+ return output.join('\n');
42
+ }
43
+ function hasStatementTerminator(line) {
44
+ let inSingleQuote = false;
45
+ let inDoubleQuote = false;
46
+ let inLineComment = false;
47
+ let inBlockComment = false;
48
+ for (let index = 0; index < line.length; index += 1) {
49
+ const char = line[index];
50
+ const next = line[index + 1];
51
+ if (inLineComment) {
52
+ break;
53
+ }
54
+ if (inBlockComment) {
55
+ if (char === '*' && next === '/') {
56
+ inBlockComment = false;
57
+ index += 1;
58
+ }
59
+ continue;
60
+ }
61
+ if (inSingleQuote) {
62
+ if (char === "'" && next === "'") {
63
+ index += 1;
64
+ continue;
65
+ }
66
+ if (char === "'") {
67
+ inSingleQuote = false;
68
+ }
69
+ continue;
70
+ }
71
+ if (inDoubleQuote) {
72
+ if (char === '"' && next === '"') {
73
+ index += 1;
74
+ continue;
75
+ }
76
+ if (char === '"') {
77
+ inDoubleQuote = false;
78
+ }
79
+ continue;
80
+ }
81
+ if (char === '-' && next === '-') {
82
+ inLineComment = true;
83
+ continue;
84
+ }
85
+ if (char === '/' && next === '*') {
86
+ inBlockComment = true;
87
+ index += 1;
88
+ continue;
89
+ }
90
+ if (char === "'") {
91
+ inSingleQuote = true;
92
+ continue;
93
+ }
94
+ if (char === '"') {
95
+ inDoubleQuote = true;
96
+ continue;
97
+ }
98
+ if (char === ';') {
99
+ return true;
100
+ }
101
+ }
102
+ return false;
103
+ }
104
+ //# sourceMappingURL=pgDumpFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pgDumpFilter.js","sourceRoot":"","sources":["../../../src/utils/pgDumpFilter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function slugifyIdentifier(value: string): string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.slugifyIdentifier = slugifyIdentifier;
4
+ function slugifyIdentifier(value) {
5
+ const normalized = value
6
+ .trim()
7
+ .replace(/^"|"$/g, '')
8
+ .toLowerCase()
9
+ .replace(/[^a-z0-9]+/g, '-')
10
+ .replace(/^-+|-+$/g, '');
11
+ return normalized || 'unnamed';
12
+ }
13
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../src/utils/slug.ts"],"names":[],"mappings":";;AAAA,8CAQC;AARD,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,MAAM,UAAU,GAAG,KAAK;SACrB,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@rawsql-ts/ddl-docs-cli",
3
+ "version": "0.2.2",
4
+ "description": "CLI tool that generates Markdown table definition docs from DDL files using rawsql-ts",
5
+ "main": "dist/src/index.js",
6
+ "bin": {
7
+ "ddl-docs": "dist/src/index.js"
8
+ },
9
+ "scripts": {
10
+ "prepack": "node -e \"const fs=require('fs');const cp=require('child_process');const npm=process.platform==='win32'?'npm.cmd':'npm';if(!fs.existsSync('dist/src/index.js')){process.exit(cp.spawnSync(npm,['run','build'],{stdio:'inherit'}).status??1)}\"",
11
+ "build": "tsc -p tsconfig.json",
12
+ "test": "vitest run",
13
+ "lint": "eslint src --ext .ts"
14
+ },
15
+ "keywords": [
16
+ "rawsql-ts",
17
+ "ddl",
18
+ "markdown",
19
+ "docs",
20
+ "cli"
21
+ ],
22
+ "author": "msugiura",
23
+ "license": "MIT",
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "engines": {
28
+ "node": ">=20"
29
+ },
30
+ "dependencies": {
31
+ "rawsql-ts": "workspace:^"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^22.13.10",
35
+ "typescript": "^5.8.2",
36
+ "vitest": "^4.0.7"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "README.md",
41
+ "AGENTS.md"
42
+ ]
43
+ }