@prairielearn/postgres-tools 1.1.17 → 2.0.1
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/CHANGELOG.md +19 -0
- package/dist/bin/pg-describe.js +22 -27
- package/dist/bin/pg-describe.js.map +1 -1
- package/dist/bin/pg-diff.js +7 -12
- package/dist/bin/pg-diff.js.map +1 -1
- package/dist/describe.js +28 -36
- package/dist/describe.js.map +1 -1
- package/dist/diff.js +41 -51
- package/dist/diff.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -11
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
- package/src/bin/pg-describe.ts +4 -3
- package/src/bin/pg-diff.ts +2 -2
- package/src/describe.ts +2 -1
- package/src/diff.ts +4 -3
- package/src/index.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @prairielearn/postgres-tools
|
|
2
2
|
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 901fce8: Upgrade all JavaScript dependencies
|
|
8
|
+
- Updated dependencies [901fce8]
|
|
9
|
+
- @prairielearn/postgres@2.0.1
|
|
10
|
+
|
|
11
|
+
## 2.0.0
|
|
12
|
+
|
|
13
|
+
### Major Changes
|
|
14
|
+
|
|
15
|
+
- 4f30b7e: Publish as native ESM
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [4f30b7e]
|
|
20
|
+
- @prairielearn/postgres@2.0.0
|
|
21
|
+
|
|
3
22
|
## 1.1.17
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/bin/pg-describe.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const yargs_1 = __importDefault(require("yargs"));
|
|
13
|
-
const describe_1 = require("../describe");
|
|
14
|
-
const args = yargs_1.default
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import async from 'async';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
import _ from 'lodash';
|
|
7
|
+
import yargs from 'yargs';
|
|
8
|
+
import { describeDatabase, formatDatabaseDescription } from '../describe.js';
|
|
9
|
+
const args = yargs(process.argv.slice(2))
|
|
15
10
|
.usage('Usage: $0 <database name> [options]')
|
|
16
11
|
.demandCommand(1)
|
|
17
12
|
.option('output', {
|
|
@@ -55,7 +50,7 @@ function formatText(text, formatter) {
|
|
|
55
50
|
}
|
|
56
51
|
return text;
|
|
57
52
|
}
|
|
58
|
-
|
|
53
|
+
describeDatabase(argv._[0].toString(), options).then(async (description) => {
|
|
59
54
|
if (argv.output) {
|
|
60
55
|
await writeDescriptionToDisk(description, argv.output);
|
|
61
56
|
}
|
|
@@ -68,28 +63,28 @@ function formatText(text, formatter) {
|
|
|
68
63
|
process.exit(1);
|
|
69
64
|
});
|
|
70
65
|
function printDescription(description) {
|
|
71
|
-
const formattedDescription =
|
|
72
|
-
|
|
73
|
-
process.stdout.write(formatText(`[table] ${tableName}\n`,
|
|
66
|
+
const formattedDescription = formatDatabaseDescription(description, { coloredOutput });
|
|
67
|
+
_.forEach(_.sortBy(_.keys(formattedDescription.tables)), (tableName) => {
|
|
68
|
+
process.stdout.write(formatText(`[table] ${tableName}\n`, chalk.bold));
|
|
74
69
|
process.stdout.write(formattedDescription.tables[tableName]);
|
|
75
70
|
process.stdout.write('\n\n');
|
|
76
71
|
});
|
|
77
|
-
|
|
78
|
-
process.stdout.write(formatText(`[enum] ${enumName}\n`,
|
|
72
|
+
_.forEach(_.sortBy(_.keys(formattedDescription.enums)), (enumName) => {
|
|
73
|
+
process.stdout.write(formatText(`[enum] ${enumName}\n`, chalk.bold));
|
|
79
74
|
process.stdout.write(formattedDescription.enums[enumName]);
|
|
80
75
|
process.stdout.write('\n\n');
|
|
81
76
|
});
|
|
82
77
|
}
|
|
83
78
|
async function writeDescriptionToDisk(description, dir) {
|
|
84
|
-
const formattedDescription =
|
|
85
|
-
await
|
|
86
|
-
await
|
|
87
|
-
await
|
|
88
|
-
await
|
|
89
|
-
await
|
|
79
|
+
const formattedDescription = formatDatabaseDescription(description, { coloredOutput: false });
|
|
80
|
+
await fs.emptyDir(dir);
|
|
81
|
+
await fs.mkdir(path.join(dir, 'tables'));
|
|
82
|
+
await fs.mkdir(path.join(dir, 'enums'));
|
|
83
|
+
await async.eachOf(formattedDescription.tables, async (value, key) => {
|
|
84
|
+
await fs.writeFile(path.join(dir, 'tables', `${key}.pg`), value);
|
|
90
85
|
});
|
|
91
|
-
await
|
|
92
|
-
await
|
|
86
|
+
await async.eachOf(formattedDescription.enums, async (value, key) => {
|
|
87
|
+
await fs.writeFile(path.join(dir, 'enums', `${key}.pg`), value);
|
|
93
88
|
});
|
|
94
89
|
}
|
|
95
90
|
//# sourceMappingURL=pg-describe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-describe.js","sourceRoot":"","sources":["../../src/bin/pg-describe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pg-describe.js","sourceRoot":"","sources":["../../src/bin/pg-describe.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'path';\n\nimport async from 'async';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport yargs from 'yargs';\n\nimport { describeDatabase, formatDatabaseDescription, DatabaseDescription } from '../describe.js';\n\nconst args = yargs(process.argv.slice(2))\n .usage('Usage: $0 <database name> [options]')\n .demandCommand(1)\n .option('output', {\n alias: 'o',\n nargs: 1,\n string: true,\n description: 'Specify a directory to output files to',\n })\n .option('ignore-tables', {\n array: true,\n description: 'a list of tables to ignore',\n })\n .option('ignore-enums', {\n array: true,\n description: 'a list of enums to ignore',\n })\n .option('ignore-columns', {\n array: true,\n description: 'a list of columns to ignore, formatted like [table].[column]',\n })\n .help('h')\n .alias('h', 'help')\n .example('$0 postgres', 'Describe the \"postgres\" database')\n .example(\n '$0 userdb -o db_description --ignore-tables a b --ignore-columns a.col1 a.col2',\n 'Describe the \"userdb\" database; ignore specific tables and columns',\n )\n .strict();\n\nconst argv = args.parseSync();\n\nif (argv._.length !== 1) {\n args.showHelp();\n process.exit(1);\n}\n\n// Disable color if we're not attached to a tty\nconst coloredOutput = !argv.output && process.stdout.isTTY;\n\nconst options = {\n ignoreTables: (argv['ignore-tables'] ?? []).map((table) => table.toString()),\n ignoreEnums: (argv['ignore-enums'] ?? []).map((enumName) => enumName.toString()),\n ignoreColumns: (argv['ignore-columns'] ?? []).map((column) => column.toString()),\n};\n\nfunction formatText(text: string, formatter: (text: string) => string) {\n if (!argv.output && coloredOutput) {\n return formatter(text);\n }\n return text;\n}\n\ndescribeDatabase(argv._[0].toString(), options).then(\n async (description) => {\n if (argv.output) {\n await writeDescriptionToDisk(description, argv.output);\n } else {\n printDescription(description);\n }\n process.exit(0);\n },\n (err) => {\n console.error(err);\n process.exit(1);\n },\n);\n\nfunction printDescription(description: DatabaseDescription) {\n const formattedDescription = formatDatabaseDescription(description, { coloredOutput });\n _.forEach(_.sortBy(_.keys(formattedDescription.tables)), (tableName) => {\n process.stdout.write(formatText(`[table] ${tableName}\\n`, chalk.bold));\n process.stdout.write(formattedDescription.tables[tableName]);\n process.stdout.write('\\n\\n');\n });\n\n _.forEach(_.sortBy(_.keys(formattedDescription.enums)), (enumName) => {\n process.stdout.write(formatText(`[enum] ${enumName}\\n`, chalk.bold));\n process.stdout.write(formattedDescription.enums[enumName]);\n process.stdout.write('\\n\\n');\n });\n}\n\nasync function writeDescriptionToDisk(description: DatabaseDescription, dir: string) {\n const formattedDescription = formatDatabaseDescription(description, { coloredOutput: false });\n await fs.emptyDir(dir);\n await fs.mkdir(path.join(dir, 'tables'));\n await fs.mkdir(path.join(dir, 'enums'));\n await async.eachOf(formattedDescription.tables, async (value, key) => {\n await fs.writeFile(path.join(dir, 'tables', `${key}.pg`), value);\n });\n await async.eachOf(formattedDescription.enums, async (value, key) => {\n await fs.writeFile(path.join(dir, 'enums', `${key}.pg`), value);\n });\n}\n"]}
|
package/dist/bin/pg-diff.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const yargs_1 = __importDefault(require("yargs"));
|
|
8
|
-
const diff_1 = require("../diff");
|
|
9
|
-
const args = yargs_1.default
|
|
2
|
+
import yargs from 'yargs';
|
|
3
|
+
import { diffDatabases, diffDirectories, diffDatabaseAndDirectory, diffDirectoryAndDatabase, } from '../diff.js';
|
|
4
|
+
const args = yargs(process.argv.slice(2))
|
|
10
5
|
.usage('Usage: $0 [options]')
|
|
11
6
|
.option('db', {
|
|
12
7
|
description: 'reads a description from the named database',
|
|
@@ -27,17 +22,17 @@ const options = {
|
|
|
27
22
|
if (argv.db && typeof argv.db === 'string' && argv.dir && typeof argv.dir === 'string') {
|
|
28
23
|
// Ensure correct ordering for the sake of diffs
|
|
29
24
|
if (process.argv.indexOf('--db') < process.argv.indexOf('--dir')) {
|
|
30
|
-
|
|
25
|
+
diffDatabaseAndDirectory(argv.db, argv.dir, options).then(handleResults, handleError);
|
|
31
26
|
}
|
|
32
27
|
else {
|
|
33
|
-
|
|
28
|
+
diffDirectoryAndDatabase(argv.dir, argv.db, options).then(handleResults, handleError);
|
|
34
29
|
}
|
|
35
30
|
}
|
|
36
31
|
else if (argv.db && Array.isArray(argv.db) && argv.db.length === 2 && !argv.dir) {
|
|
37
|
-
|
|
32
|
+
diffDatabases(argv.db[0], argv.db[1], options).then(handleResults, handleError);
|
|
38
33
|
}
|
|
39
34
|
else if (argv.dir && Array.isArray(argv.dir) && argv.dir.length === 2 && !argv.db) {
|
|
40
|
-
|
|
35
|
+
diffDirectories(argv.dir[0], argv.dir[1], options).then(handleResults, handleError);
|
|
41
36
|
}
|
|
42
37
|
else {
|
|
43
38
|
args.showHelp();
|
package/dist/bin/pg-diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-diff.js","sourceRoot":"","sources":["../../src/bin/pg-diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pg-diff.js","sourceRoot":"","sources":["../../src/bin/pg-diff.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport yargs from 'yargs';\n\nimport {\n diffDatabases,\n diffDirectories,\n diffDatabaseAndDirectory,\n diffDirectoryAndDatabase,\n} from '../diff.js';\n\nconst args = yargs(process.argv.slice(2))\n .usage('Usage: $0 [options]')\n .option('db', {\n description: 'reads a description from the named database',\n })\n .option('dir', {\n description: \"reads a description from a directory that's been generated by pg-describe\",\n })\n .help('h')\n .alias('h', 'help')\n .example(\n '$0 --db postgres --dir db_dump',\n 'Diffs the database \"postgres\" with the description in the directory \"db_dump\"',\n )\n .example(\n '$0 --db postgres --db old_restore',\n 'Diffs the database \"postgres\" with the database \"old_restore\"',\n )\n .strict();\n\nconst argv = args.parseSync();\n\nconst options = {\n outputFormat: 'string',\n coloredOutput: process.stdout.isTTY,\n};\n\nif (argv.db && typeof argv.db === 'string' && argv.dir && typeof argv.dir === 'string') {\n // Ensure correct ordering for the sake of diffs\n if (process.argv.indexOf('--db') < process.argv.indexOf('--dir')) {\n diffDatabaseAndDirectory(argv.db, argv.dir, options).then(handleResults, handleError);\n } else {\n diffDirectoryAndDatabase(argv.dir, argv.db, options).then(handleResults, handleError);\n }\n} else if (argv.db && Array.isArray(argv.db) && argv.db.length === 2 && !argv.dir) {\n diffDatabases(argv.db[0], argv.db[1], options).then(handleResults, handleError);\n} else if (argv.dir && Array.isArray(argv.dir) && argv.dir.length === 2 && !argv.db) {\n diffDirectories(argv.dir[0], argv.dir[1], options).then(handleResults, handleError);\n} else {\n args.showHelp();\n process.exit(1);\n}\n\nfunction handleResults(results: string) {\n process.stdout.write(results);\n process.exit(0);\n}\n\nfunction handleError(err: any) {\n console.error(err);\n process.exit(1);\n}\n"]}
|
package/dist/describe.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
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.formatDatabaseDescription = exports.describeDatabase = void 0;
|
|
7
1
|
// @ts-check
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const sql = (
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { parse as parsePostgresArray } from 'postgres-array';
|
|
4
|
+
import { loadSqlEquiv, PostgresPool } from '@prairielearn/postgres';
|
|
5
|
+
const sql = loadSqlEquiv(import.meta.url);
|
|
12
6
|
async function describeWithPool(pool, options) {
|
|
13
7
|
const ignoreTables = options?.ignoreTables || [];
|
|
14
8
|
const ignoreEnums = options?.ignoreEnums || [];
|
|
@@ -77,7 +71,7 @@ async function describeWithPool(pool, options) {
|
|
|
77
71
|
return ignoreEnums.indexOf(row.name) === -1;
|
|
78
72
|
});
|
|
79
73
|
rows.forEach((row) => {
|
|
80
|
-
output.enums[row.name] = (
|
|
74
|
+
output.enums[row.name] = parsePostgresArray(row.values);
|
|
81
75
|
});
|
|
82
76
|
return output;
|
|
83
77
|
}
|
|
@@ -85,9 +79,9 @@ async function describeWithPool(pool, options) {
|
|
|
85
79
|
* Will produce a description of a given database's schema. This will include
|
|
86
80
|
* information about tables, enums, constraints, indices, etc.
|
|
87
81
|
*/
|
|
88
|
-
async function describeDatabase(databaseName, options = {}) {
|
|
82
|
+
export async function describeDatabase(databaseName, options = {}) {
|
|
89
83
|
// Connect to the database.
|
|
90
|
-
const pool = new
|
|
84
|
+
const pool = new PostgresPool();
|
|
91
85
|
const pgConfig = {
|
|
92
86
|
user: 'postgres',
|
|
93
87
|
database: databaseName,
|
|
@@ -106,8 +100,7 @@ async function describeDatabase(databaseName, options = {}) {
|
|
|
106
100
|
await pool.closeAsync();
|
|
107
101
|
}
|
|
108
102
|
}
|
|
109
|
-
|
|
110
|
-
function formatDatabaseDescription(description, options = { coloredOutput: true }) {
|
|
103
|
+
export function formatDatabaseDescription(description, options = { coloredOutput: true }) {
|
|
111
104
|
const output = {
|
|
112
105
|
tables: {},
|
|
113
106
|
enums: {},
|
|
@@ -125,16 +118,16 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
125
118
|
}
|
|
126
119
|
Object.entries(description.tables).forEach(([tableName, table]) => {
|
|
127
120
|
if (table.columns.length > 0) {
|
|
128
|
-
output.tables[tableName] += formatText('columns\n',
|
|
121
|
+
output.tables[tableName] += formatText('columns\n', chalk.underline);
|
|
129
122
|
output.tables[tableName] += table.columns
|
|
130
123
|
.map((row) => {
|
|
131
|
-
let rowText = formatText(` ${row.name}`,
|
|
132
|
-
rowText += ':' + formatText(` ${row.type}`,
|
|
124
|
+
let rowText = formatText(` ${row.name}`, chalk.bold);
|
|
125
|
+
rowText += ':' + formatText(` ${row.type}`, chalk.green);
|
|
133
126
|
if (row.notnull) {
|
|
134
|
-
rowText += formatText(' not null',
|
|
127
|
+
rowText += formatText(' not null', chalk.gray);
|
|
135
128
|
}
|
|
136
129
|
if (row.default) {
|
|
137
|
-
rowText += formatText(` default ${row.default}`,
|
|
130
|
+
rowText += formatText(` default ${row.default}`, chalk.gray);
|
|
138
131
|
}
|
|
139
132
|
return rowText;
|
|
140
133
|
})
|
|
@@ -144,11 +137,11 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
144
137
|
if (output.tables[tableName].length !== 0) {
|
|
145
138
|
output.tables[tableName] += '\n\n';
|
|
146
139
|
}
|
|
147
|
-
output.tables[tableName] += formatText('indexes\n',
|
|
140
|
+
output.tables[tableName] += formatText('indexes\n', chalk.underline);
|
|
148
141
|
output.tables[tableName] += table.indexes
|
|
149
142
|
.map((row) => {
|
|
150
143
|
const using = row.indexdef.substring(row.indexdef.indexOf('USING '));
|
|
151
|
-
let rowText = formatText(` ${row.name}`,
|
|
144
|
+
let rowText = formatText(` ${row.name}`, chalk.bold) + ':';
|
|
152
145
|
// Primary indexes are implicitly unique, so we don't need to
|
|
153
146
|
// capture that explicitly.
|
|
154
147
|
if (row.isunique && !row.isprimary) {
|
|
@@ -156,11 +149,11 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
156
149
|
// Some unique indexes don't include the UNIQUE constraint
|
|
157
150
|
// as part of the constraint definition, so we need to capture
|
|
158
151
|
// that manually.
|
|
159
|
-
rowText += formatText(` UNIQUE`,
|
|
152
|
+
rowText += formatText(` UNIQUE`, chalk.green);
|
|
160
153
|
}
|
|
161
154
|
}
|
|
162
|
-
rowText += row.constraintdef ? formatText(` ${row.constraintdef}`,
|
|
163
|
-
rowText += using ? formatText(` ${using}`,
|
|
155
|
+
rowText += row.constraintdef ? formatText(` ${row.constraintdef}`, chalk.green) : '';
|
|
156
|
+
rowText += using ? formatText(` ${using}`, chalk.green) : '';
|
|
164
157
|
return rowText;
|
|
165
158
|
})
|
|
166
159
|
.join('\n');
|
|
@@ -169,7 +162,7 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
169
162
|
if (output.tables[tableName].length !== 0) {
|
|
170
163
|
output.tables[tableName] += '\n\n';
|
|
171
164
|
}
|
|
172
|
-
output.tables[tableName] += formatText('check constraints\n',
|
|
165
|
+
output.tables[tableName] += formatText('check constraints\n', chalk.underline);
|
|
173
166
|
output.tables[tableName] += table.checkConstraints
|
|
174
167
|
.map((row) => {
|
|
175
168
|
// Particularly long constraints are formatted as multiple lines.
|
|
@@ -182,8 +175,8 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
182
175
|
// The second replace handles all other lines: we want to collapse
|
|
183
176
|
// all leading whitespace into a single space.
|
|
184
177
|
const def = row.def.replace(/\(\n/g, '(').replace(/\n\s*/g, ' ');
|
|
185
|
-
let rowText = formatText(` ${row.name}:`,
|
|
186
|
-
rowText += formatText(` ${def}`,
|
|
178
|
+
let rowText = formatText(` ${row.name}:`, chalk.bold);
|
|
179
|
+
rowText += formatText(` ${def}`, chalk.green);
|
|
187
180
|
return rowText;
|
|
188
181
|
})
|
|
189
182
|
.join('\n');
|
|
@@ -192,11 +185,11 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
192
185
|
if (output.tables[tableName].length !== 0) {
|
|
193
186
|
output.tables[tableName] += '\n\n';
|
|
194
187
|
}
|
|
195
|
-
output.tables[tableName] += formatText('foreign-key constraints\n',
|
|
188
|
+
output.tables[tableName] += formatText('foreign-key constraints\n', chalk.underline);
|
|
196
189
|
output.tables[tableName] += table.foreignKeyConstraints
|
|
197
190
|
.map((row) => {
|
|
198
|
-
let rowText = formatText(` ${row.name}:`,
|
|
199
|
-
rowText += formatText(` ${row.def}`,
|
|
191
|
+
let rowText = formatText(` ${row.name}:`, chalk.bold);
|
|
192
|
+
rowText += formatText(` ${row.def}`, chalk.green);
|
|
200
193
|
return rowText;
|
|
201
194
|
})
|
|
202
195
|
.join('\n');
|
|
@@ -205,18 +198,18 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
205
198
|
if (output.tables[tableName].length !== 0) {
|
|
206
199
|
output.tables[tableName] += '\n\n';
|
|
207
200
|
}
|
|
208
|
-
output.tables[tableName] += formatText('referenced by\n',
|
|
201
|
+
output.tables[tableName] += formatText('referenced by\n', chalk.underline);
|
|
209
202
|
output.tables[tableName] += table.references
|
|
210
203
|
?.map((row) => {
|
|
211
|
-
let rowText = formatText(` ${row.table}:`,
|
|
212
|
-
rowText += formatText(` ${row.condef}`,
|
|
204
|
+
let rowText = formatText(` ${row.table}:`, chalk.bold);
|
|
205
|
+
rowText += formatText(` ${row.condef}`, chalk.green);
|
|
213
206
|
return rowText;
|
|
214
207
|
})
|
|
215
208
|
.join('\n');
|
|
216
209
|
}
|
|
217
210
|
});
|
|
218
211
|
Object.entries(description.enums).forEach(([enumName, enumValues]) => {
|
|
219
|
-
output.enums[enumName] = formatText(enumValues.join(', '),
|
|
212
|
+
output.enums[enumName] = formatText(enumValues.join(', '), chalk.gray);
|
|
220
213
|
});
|
|
221
214
|
// We need to tack on a newline to everything.
|
|
222
215
|
Object.entries(output.tables).forEach(([tableName, table]) => {
|
|
@@ -227,5 +220,4 @@ function formatDatabaseDescription(description, options = { coloredOutput: true
|
|
|
227
220
|
});
|
|
228
221
|
return output;
|
|
229
222
|
}
|
|
230
|
-
exports.formatDatabaseDescription = formatDatabaseDescription;
|
|
231
223
|
//# sourceMappingURL=describe.js.map
|
package/dist/describe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,IAAI,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAqD1C,KAAK,UAAU,gBAAgB,CAC7B,IAAkB,EAClB,OAAwB;IAExB,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;IAC/C,IAAI,aAAa,GAA6B,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAwB;QAClC,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,gEAAgE;IAChE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEzF,kEAAkE;IAClE,kBAAkB;IAClB,IAAI,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,aAAa,GAAG,OAAO,CAAC,aAAa;aAClC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC;aACD,MAAM,CACL,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChB,MAAM,GAAG,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC;QAChB,CAAC,EACD,EAA8B,CAC/B,CAAC;IACN,CAAC;IAED,iCAAiC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE;YACrE,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAChD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE;YACpE,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,UAAU,CACvD,GAAG,CAAC,qCAAqC,EACzC;YACE,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CACF,CAAC;QAEF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE;YAC3E,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACtD,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,+BAA+B,EAAE;YACxF,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;YAC1B,OAAO;YACP,OAAO,EAAE,YAAY,CAAC,IAAI;YAC1B,qBAAqB,EAAE,2BAA2B,CAAC,IAAI;YACvD,UAAU;YACV,gBAAgB,EAAE,sBAAsB,CAAC,IAAI;SAC9C,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE1D,uBAAuB;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,UAA2B,EAAE;IAE7B,2BAA2B;IAC3B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,EAAE;QACP,iBAAiB,EAAE,KAAK;KACzB,CAAC;IACF,SAAS,gBAAgB,CAAC,GAAU;QAClC,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,WAAgC,EAChC,OAAO,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE;IAEjC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,EAA4B;QACpC,KAAK,EAAE,EAA4B;KACpC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAExF;;;OAGG;IACH,SAAS,UAAU,CAAC,IAAY,EAAE,SAAgC;QAChE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO;iBACtC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxD,OAAO,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAChB,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAChB,OAAO,IAAI,UAAU,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO;iBACtC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrE,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;gBAC9D,6DAA6D;gBAC7D,2BAA2B;gBAC3B,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACrE,0DAA0D;wBAC1D,8DAA8D;wBAC9D,iBAAiB;wBACjB,OAAO,IAAI,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,gBAAgB;iBAC/C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,iEAAiE;gBACjE,kEAAkE;gBAClE,sBAAsB;gBACtB,EAAE;gBACF,kEAAkE;gBAClE,mEAAmE;gBACnE,EAAE;gBACF,kEAAkE;gBAClE,8CAA8C;gBAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAEjE,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9C,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,2BAA2B,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACrF,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,qBAAqB;iBACpD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU;gBAC1C,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1D,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;QAC3D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE;QAC9D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["// @ts-check\nimport chalk from 'chalk';\nimport { parse as parsePostgresArray } from 'postgres-array';\n\nimport { loadSqlEquiv, PostgresPool } from '@prairielearn/postgres';\n\nconst sql = loadSqlEquiv(import.meta.url);\n\ninterface ColumnDescription {\n name: string;\n type: string;\n notnull: boolean;\n default: any;\n}\n\ninterface IndexDescription {\n name: string;\n isprimary: boolean;\n isunique: boolean;\n indexdef: string;\n constraintdef: string;\n contype: string;\n}\n\ninterface ForeignKeyConstraintDescription {\n name: string;\n def: string;\n}\n\ninterface ReferenceDescription {\n name: string;\n table: string;\n condef: string;\n}\n\ninterface CheckConstraintDescription {\n name: string;\n def: string;\n}\n\ninterface TableDescription {\n columns: ColumnDescription[];\n indexes: IndexDescription[];\n foreignKeyConstraints: ForeignKeyConstraintDescription[];\n references: ReferenceDescription[];\n checkConstraints: CheckConstraintDescription[];\n}\n\nexport interface DatabaseDescription {\n tables: Record<string, TableDescription>;\n enums: Record<string, string[]>;\n}\n\ninterface DescribeOptions {\n ignoreTables?: string[];\n ignoreColumns?: string[];\n ignoreEnums?: string[];\n}\n\nasync function describeWithPool(\n pool: PostgresPool,\n options: DescribeOptions,\n): Promise<DatabaseDescription> {\n const ignoreTables = options?.ignoreTables || [];\n const ignoreEnums = options?.ignoreEnums || [];\n let ignoreColumns: Record<string, string[]> = {};\n\n const output: DatabaseDescription = {\n tables: {},\n enums: {},\n };\n\n // Get the names of the tables and filter out any ignored tables\n const tablesRes = await pool.queryAsync(sql.get_tables, []);\n const tables = tablesRes.rows.filter((table) => ignoreTables.indexOf(table.name) === -1);\n\n // Transform ignored columns into a map from table names to arrays\n // of column names\n if (options.ignoreColumns && Array.isArray(options.ignoreColumns)) {\n ignoreColumns = options.ignoreColumns\n .filter((ignore) => {\n return /^[^\\s.]*\\.[^\\s.]*$/.test(ignore);\n })\n .reduce(\n (result, value) => {\n const res = /^(([^\\s.]*)\\.([^\\s.]*))$/.exec(value);\n if (!res) {\n throw new Error(`Invalid ignore column: ${value}`);\n }\n const table = res[2];\n const column = res[3];\n (result[table] || (result[table] = [])).push(column);\n return result;\n },\n {} as Record<string, string[]>,\n );\n }\n\n // Get column info for each table\n for (const table of tables) {\n const columnResults = await pool.queryAsync(sql.get_columns_for_table, {\n oid: table.oid,\n });\n\n const columns = columnResults.rows.filter((row) => {\n return (ignoreColumns[table.name] || []).indexOf(row.name) === -1;\n });\n\n const indexResults = await pool.queryAsync(sql.get_indexes_for_table, {\n oid: table.oid,\n });\n\n const foreignKeyConstraintResults = await pool.queryAsync(\n sql.get_foreign_key_constraints_for_table,\n {\n oid: table.oid,\n },\n );\n\n const referenceResults = await pool.queryAsync(sql.get_references_for_table, {\n oid: table.oid,\n });\n\n // Filter out references from ignored tables\n const references = referenceResults.rows.filter((row) => {\n return ignoreTables.indexOf(row.table) === -1;\n });\n\n const checkConstraintResults = await pool.queryAsync(sql.get_check_constraints_for_table, {\n oid: table.oid,\n });\n\n output.tables[table.name] = {\n columns,\n indexes: indexResults.rows,\n foreignKeyConstraints: foreignKeyConstraintResults.rows,\n references,\n checkConstraints: checkConstraintResults.rows,\n };\n }\n\n // Get all enums\n const enumsRes = await pool.queryAsync(sql.get_enums, []);\n\n // Filter ignored enums\n const rows = enumsRes.rows.filter((row) => {\n return ignoreEnums.indexOf(row.name) === -1;\n });\n\n rows.forEach((row) => {\n output.enums[row.name] = parsePostgresArray(row.values);\n });\n\n return output;\n}\n\n/**\n * Will produce a description of a given database's schema. This will include\n * information about tables, enums, constraints, indices, etc.\n */\nexport async function describeDatabase(\n databaseName: string,\n options: DescribeOptions = {},\n): Promise<DatabaseDescription> {\n // Connect to the database.\n const pool = new PostgresPool();\n const pgConfig = {\n user: 'postgres',\n database: databaseName,\n host: 'localhost',\n max: 10,\n idleTimeoutMillis: 30000,\n };\n function idleErrorHandler(err: Error) {\n throw err;\n }\n await pool.initAsync(pgConfig, idleErrorHandler);\n\n try {\n return await describeWithPool(pool, options);\n } finally {\n await pool.closeAsync();\n }\n}\n\nexport function formatDatabaseDescription(\n description: DatabaseDescription,\n options = { coloredOutput: true },\n): { tables: Record<string, string>; enums: Record<string, string> } {\n const output = {\n tables: {} as Record<string, string>,\n enums: {} as Record<string, string>,\n };\n\n Object.keys(description.tables).forEach((tableName) => (output.tables[tableName] = ''));\n\n /**\n * Optionally applies the given formatter to the text if colored output is\n * enabled.\n */\n function formatText(text: string, formatter: (s: string) => string): string {\n if (options.coloredOutput) {\n return formatter(text);\n }\n return text;\n }\n\n Object.entries(description.tables).forEach(([tableName, table]) => {\n if (table.columns.length > 0) {\n output.tables[tableName] += formatText('columns\\n', chalk.underline);\n output.tables[tableName] += table.columns\n .map((row) => {\n let rowText = formatText(` ${row.name}`, chalk.bold);\n rowText += ':' + formatText(` ${row.type}`, chalk.green);\n if (row.notnull) {\n rowText += formatText(' not null', chalk.gray);\n }\n if (row.default) {\n rowText += formatText(` default ${row.default}`, chalk.gray);\n }\n return rowText;\n })\n .join('\\n');\n }\n\n if (table.indexes.length > 0) {\n if (output.tables[tableName].length !== 0) {\n output.tables[tableName] += '\\n\\n';\n }\n output.tables[tableName] += formatText('indexes\\n', chalk.underline);\n output.tables[tableName] += table.indexes\n .map((row) => {\n const using = row.indexdef.substring(row.indexdef.indexOf('USING '));\n let rowText = formatText(` ${row.name}`, chalk.bold) + ':';\n // Primary indexes are implicitly unique, so we don't need to\n // capture that explicitly.\n if (row.isunique && !row.isprimary) {\n if (!row.constraintdef || row.constraintdef.indexOf('UNIQUE') === -1) {\n // Some unique indexes don't include the UNIQUE constraint\n // as part of the constraint definition, so we need to capture\n // that manually.\n rowText += formatText(` UNIQUE`, chalk.green);\n }\n }\n rowText += row.constraintdef ? formatText(` ${row.constraintdef}`, chalk.green) : '';\n rowText += using ? formatText(` ${using}`, chalk.green) : '';\n return rowText;\n })\n .join('\\n');\n }\n\n if (table.checkConstraints.length > 0) {\n if (output.tables[tableName].length !== 0) {\n output.tables[tableName] += '\\n\\n';\n }\n output.tables[tableName] += formatText('check constraints\\n', chalk.underline);\n output.tables[tableName] += table.checkConstraints\n .map((row) => {\n // Particularly long constraints are formatted as multiple lines.\n // We'll collapse them into a single line for better appearance in\n // the resulting file.\n //\n // The first replace handles lines that end with a parenthesis: we\n // want to avoid spaces between the parenthesis and the next token.\n //\n // The second replace handles all other lines: we want to collapse\n // all leading whitespace into a single space.\n const def = row.def.replace(/\\(\\n/g, '(').replace(/\\n\\s*/g, ' ');\n\n let rowText = formatText(` ${row.name}:`, chalk.bold);\n rowText += formatText(` ${def}`, chalk.green);\n return rowText;\n })\n .join('\\n');\n }\n\n if (table.foreignKeyConstraints.length > 0) {\n if (output.tables[tableName].length !== 0) {\n output.tables[tableName] += '\\n\\n';\n }\n output.tables[tableName] += formatText('foreign-key constraints\\n', chalk.underline);\n output.tables[tableName] += table.foreignKeyConstraints\n .map((row) => {\n let rowText = formatText(` ${row.name}:`, chalk.bold);\n rowText += formatText(` ${row.def}`, chalk.green);\n return rowText;\n })\n .join('\\n');\n }\n\n if (table.references.length > 0) {\n if (output.tables[tableName].length !== 0) {\n output.tables[tableName] += '\\n\\n';\n }\n output.tables[tableName] += formatText('referenced by\\n', chalk.underline);\n output.tables[tableName] += table.references\n ?.map((row) => {\n let rowText = formatText(` ${row.table}:`, chalk.bold);\n rowText += formatText(` ${row.condef}`, chalk.green);\n return rowText;\n })\n .join('\\n');\n }\n });\n\n Object.entries(description.enums).forEach(([enumName, enumValues]) => {\n output.enums[enumName] = formatText(enumValues.join(', '), chalk.gray);\n });\n\n // We need to tack on a newline to everything.\n Object.entries(output.tables).forEach(([tableName, table]) => {\n output.tables[tableName] = table + '\\n';\n });\n Object.entries(output.enums).forEach(([enumName, enumValues]) => {\n output.enums[enumName] = enumValues + '\\n';\n });\n\n return output;\n}\n"]}
|
package/dist/diff.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
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.diffDirectories = exports.diffDirectoryAndDatabase = exports.diffDatabaseAndDirectory = exports.diffDatabases = void 0;
|
|
7
1
|
// @ts-check
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { structuredPatch } from 'diff';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
import _ from 'lodash';
|
|
7
|
+
import { describeDatabase, formatDatabaseDescription } from './describe.js';
|
|
14
8
|
async function diff(db1, db2, options) {
|
|
15
9
|
function formatText(text, formatter) {
|
|
16
10
|
if (options.coloredOutput && formatter) {
|
|
@@ -19,46 +13,46 @@ async function diff(db1, db2, options) {
|
|
|
19
13
|
return text;
|
|
20
14
|
}
|
|
21
15
|
const db2Name = db2.type === 'database' ? db2.name : db2.path;
|
|
22
|
-
const db2NameBold = formatText(db2Name,
|
|
16
|
+
const db2NameBold = formatText(db2Name, chalk.bold);
|
|
23
17
|
let result = '';
|
|
24
18
|
const description1 = await loadDescription(db1);
|
|
25
19
|
const description2 = await loadDescription(db2);
|
|
26
20
|
// Determine if both databases have the same tables
|
|
27
|
-
const tablesMissingFrom1 =
|
|
28
|
-
const tablesMissingFrom2 =
|
|
21
|
+
const tablesMissingFrom1 = _.difference(_.keys(description2.tables), _.keys(description1.tables));
|
|
22
|
+
const tablesMissingFrom2 = _.difference(_.keys(description1.tables), _.keys(description2.tables));
|
|
29
23
|
if (tablesMissingFrom1.length > 0) {
|
|
30
|
-
result += formatText(`Tables added to ${db2NameBold} (${db2.type})\n`,
|
|
31
|
-
result += formatText(tablesMissingFrom1.map((table) => `+ ${table}`).join('\n') + '\n\n',
|
|
24
|
+
result += formatText(`Tables added to ${db2NameBold} (${db2.type})\n`, chalk.underline);
|
|
25
|
+
result += formatText(tablesMissingFrom1.map((table) => `+ ${table}`).join('\n') + '\n\n', chalk.green);
|
|
32
26
|
}
|
|
33
27
|
if (tablesMissingFrom2.length > 0) {
|
|
34
|
-
result += formatText(`Tables missing from ${db2NameBold} (${db2.type})\n`,
|
|
35
|
-
result += formatText(tablesMissingFrom2.map((table) => `- ${table}`).join('\n') + '\n\n',
|
|
28
|
+
result += formatText(`Tables missing from ${db2NameBold} (${db2.type})\n`, chalk.underline);
|
|
29
|
+
result += formatText(tablesMissingFrom2.map((table) => `- ${table}`).join('\n') + '\n\n', chalk.red);
|
|
36
30
|
}
|
|
37
31
|
// Determine if both databases have the same enums
|
|
38
|
-
const enumsMissingFrom1 =
|
|
39
|
-
const enumsMissingFrom2 =
|
|
32
|
+
const enumsMissingFrom1 = _.difference(_.keys(description2.enums), _.keys(description1.enums));
|
|
33
|
+
const enumsMissingFrom2 = _.difference(_.keys(description1.enums), _.keys(description2.enums));
|
|
40
34
|
if (enumsMissingFrom1.length > 0) {
|
|
41
|
-
result += formatText(`Enums added to ${db2NameBold} (${db1.type})\n`,
|
|
42
|
-
result += formatText(enumsMissingFrom1.map((enumName) => `+ ${enumName}`).join('\n') + '\n\n',
|
|
35
|
+
result += formatText(`Enums added to ${db2NameBold} (${db1.type})\n`, chalk.underline);
|
|
36
|
+
result += formatText(enumsMissingFrom1.map((enumName) => `+ ${enumName}`).join('\n') + '\n\n', chalk.green);
|
|
43
37
|
}
|
|
44
38
|
if (enumsMissingFrom2.length > 0) {
|
|
45
|
-
result += formatText(`Enums missing from ${db2NameBold} (${db2.type})\n`,
|
|
46
|
-
result += formatText(enumsMissingFrom2.map((enumName) => `- ${enumName}`).join('\n') + '\n\n',
|
|
39
|
+
result += formatText(`Enums missing from ${db2NameBold} (${db2.type})\n`, chalk.underline);
|
|
40
|
+
result += formatText(enumsMissingFrom2.map((enumName) => `- ${enumName}`).join('\n') + '\n\n', chalk.red);
|
|
47
41
|
}
|
|
48
42
|
// Determine if the columns of any table differ
|
|
49
|
-
const intersection =
|
|
50
|
-
|
|
51
|
-
const patch =
|
|
43
|
+
const intersection = _.intersection(_.keys(description1.tables), _.keys(description2.tables));
|
|
44
|
+
_.forEach(intersection, (table) => {
|
|
45
|
+
const patch = structuredPatch(`tables/${table}`, `tables/${table}`, description1.tables[table], description2.tables[table]);
|
|
52
46
|
if (patch.hunks.length === 0)
|
|
53
47
|
return;
|
|
54
|
-
const boldTable = formatText(table,
|
|
55
|
-
result += formatText(`Differences in ${boldTable} table\n`,
|
|
48
|
+
const boldTable = formatText(table, chalk.bold);
|
|
49
|
+
result += formatText(`Differences in ${boldTable} table\n`, chalk.underline);
|
|
56
50
|
patch.hunks.forEach((hunk, index) => {
|
|
57
51
|
if (index !== 0) {
|
|
58
|
-
result += formatText('...\n',
|
|
52
|
+
result += formatText('...\n', chalk.gray);
|
|
59
53
|
}
|
|
60
54
|
hunk.lines.forEach((line) => {
|
|
61
|
-
const color = line[0] === '+' ?
|
|
55
|
+
const color = line[0] === '+' ? chalk.green : line[0] === '-' ? chalk.red : null;
|
|
62
56
|
result += formatText(line, color);
|
|
63
57
|
result += '\n';
|
|
64
58
|
});
|
|
@@ -66,15 +60,15 @@ async function diff(db1, db2, options) {
|
|
|
66
60
|
result += '\n\n';
|
|
67
61
|
});
|
|
68
62
|
// Determine if the values of any enums differ
|
|
69
|
-
const enumsIntersection =
|
|
70
|
-
|
|
63
|
+
const enumsIntersection = _.intersection(_.keys(description1.enums), _.keys(description2.enums));
|
|
64
|
+
_.forEach(enumsIntersection, (enumName) => {
|
|
71
65
|
// We don't need to do a particularly fancy diff here, since
|
|
72
66
|
// enums are just represented here as strings
|
|
73
67
|
if (description1.enums[enumName].trim() !== description2.enums[enumName].trim()) {
|
|
74
|
-
const boldEnum = formatText(enumName,
|
|
68
|
+
const boldEnum = formatText(enumName, chalk.bold);
|
|
75
69
|
result += formatText(`Differences in ${boldEnum} enum\n`);
|
|
76
|
-
result += formatText(`- ${description1.enums[enumName].trim()}\n`,
|
|
77
|
-
result += formatText(`+ ${description2.enums[enumName].trim()}\n`,
|
|
70
|
+
result += formatText(`- ${description1.enums[enumName].trim()}\n`, chalk.red);
|
|
71
|
+
result += formatText(`+ ${description2.enums[enumName].trim()}\n`, chalk.green);
|
|
78
72
|
result += '\n\n';
|
|
79
73
|
}
|
|
80
74
|
});
|
|
@@ -85,21 +79,21 @@ async function loadDescriptionFromDisk(dirPath) {
|
|
|
85
79
|
tables: {},
|
|
86
80
|
enums: {},
|
|
87
81
|
};
|
|
88
|
-
const tables = await
|
|
82
|
+
const tables = await fs.readdir(path.join(dirPath, 'tables'));
|
|
89
83
|
for (const table of tables) {
|
|
90
|
-
const data = await
|
|
84
|
+
const data = await fs.readFile(path.join(dirPath, 'tables', table), 'utf8');
|
|
91
85
|
description.tables[table.replace('.pg', '')] = data;
|
|
92
86
|
}
|
|
93
|
-
const enums = await
|
|
87
|
+
const enums = await fs.readdir(path.join(dirPath, 'enums'));
|
|
94
88
|
for (const enumName of enums) {
|
|
95
|
-
const data = await
|
|
89
|
+
const data = await fs.readFile(path.join(dirPath, 'enums', enumName), 'utf8');
|
|
96
90
|
description.enums[enumName.replace('.pg', '')] = data;
|
|
97
91
|
}
|
|
98
92
|
return description;
|
|
99
93
|
}
|
|
100
94
|
async function loadDescriptionFromDatabase(name) {
|
|
101
|
-
const description = await
|
|
102
|
-
return
|
|
95
|
+
const description = await describeDatabase(name);
|
|
96
|
+
return formatDatabaseDescription(description, { coloredOutput: false });
|
|
103
97
|
}
|
|
104
98
|
async function loadDescription(db) {
|
|
105
99
|
if (db.type === 'database') {
|
|
@@ -112,7 +106,7 @@ async function loadDescription(db) {
|
|
|
112
106
|
throw new Error('Invalid database type');
|
|
113
107
|
}
|
|
114
108
|
}
|
|
115
|
-
async function diffDatabases(database1, database2, options) {
|
|
109
|
+
export async function diffDatabases(database1, database2, options) {
|
|
116
110
|
return diff({
|
|
117
111
|
type: 'database',
|
|
118
112
|
name: database1,
|
|
@@ -121,8 +115,7 @@ async function diffDatabases(database1, database2, options) {
|
|
|
121
115
|
name: database2,
|
|
122
116
|
}, options);
|
|
123
117
|
}
|
|
124
|
-
|
|
125
|
-
async function diffDatabaseAndDirectory(database, directory, options) {
|
|
118
|
+
export async function diffDatabaseAndDirectory(database, directory, options) {
|
|
126
119
|
return diff({
|
|
127
120
|
type: 'database',
|
|
128
121
|
name: database,
|
|
@@ -131,8 +124,7 @@ async function diffDatabaseAndDirectory(database, directory, options) {
|
|
|
131
124
|
path: directory,
|
|
132
125
|
}, options);
|
|
133
126
|
}
|
|
134
|
-
|
|
135
|
-
async function diffDirectoryAndDatabase(directory, database, options) {
|
|
127
|
+
export async function diffDirectoryAndDatabase(directory, database, options) {
|
|
136
128
|
return diff({
|
|
137
129
|
type: 'directory',
|
|
138
130
|
path: directory,
|
|
@@ -141,8 +133,7 @@ async function diffDirectoryAndDatabase(directory, database, options) {
|
|
|
141
133
|
name: database,
|
|
142
134
|
}, options);
|
|
143
135
|
}
|
|
144
|
-
|
|
145
|
-
async function diffDirectories(directory1, directory2, options) {
|
|
136
|
+
export async function diffDirectories(directory1, directory2, options) {
|
|
146
137
|
return diff({
|
|
147
138
|
type: 'directory',
|
|
148
139
|
path: directory1,
|
|
@@ -151,5 +142,4 @@ async function diffDirectories(directory1, directory2, options) {
|
|
|
151
142
|
path: directory2,
|
|
152
143
|
}, options);
|
|
153
144
|
}
|
|
154
|
-
exports.diffDirectories = diffDirectories;
|
|
155
145
|
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-check\nimport path from 'node:path';\n\nimport chalk from 'chalk';\nimport { structuredPatch } from 'diff';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\n\nimport { describeDatabase, formatDatabaseDescription } from './describe.js';\n\ninterface DatabaseInfo {\n type: 'database';\n name: string;\n}\n\ninterface DirectoryInfo {\n type: 'directory';\n path: string;\n}\n\ntype DiffTarget = DatabaseInfo | DirectoryInfo;\n\ninterface DiffOptions {\n coloredOutput?: boolean;\n}\n\ninterface Description {\n tables: Record<string, string>;\n enums: Record<string, string>;\n}\n\nasync function diff(db1: DiffTarget, db2: DiffTarget, options: DiffOptions): Promise<string> {\n function formatText(text: string, formatter?: ((s: string) => string) | null): string {\n if (options.coloredOutput && formatter) {\n return formatter(text);\n }\n return text;\n }\n\n const db2Name = db2.type === 'database' ? db2.name : db2.path;\n const db2NameBold = formatText(db2Name, chalk.bold);\n\n let result = '';\n\n const description1 = await loadDescription(db1);\n const description2 = await loadDescription(db2);\n\n // Determine if both databases have the same tables\n const tablesMissingFrom1 = _.difference(_.keys(description2.tables), _.keys(description1.tables));\n const tablesMissingFrom2 = _.difference(_.keys(description1.tables), _.keys(description2.tables));\n\n if (tablesMissingFrom1.length > 0) {\n result += formatText(`Tables added to ${db2NameBold} (${db2.type})\\n`, chalk.underline);\n result += formatText(\n tablesMissingFrom1.map((table) => `+ ${table}`).join('\\n') + '\\n\\n',\n chalk.green,\n );\n }\n\n if (tablesMissingFrom2.length > 0) {\n result += formatText(`Tables missing from ${db2NameBold} (${db2.type})\\n`, chalk.underline);\n result += formatText(\n tablesMissingFrom2.map((table) => `- ${table}`).join('\\n') + '\\n\\n',\n chalk.red,\n );\n }\n\n // Determine if both databases have the same enums\n const enumsMissingFrom1 = _.difference(_.keys(description2.enums), _.keys(description1.enums));\n const enumsMissingFrom2 = _.difference(_.keys(description1.enums), _.keys(description2.enums));\n\n if (enumsMissingFrom1.length > 0) {\n result += formatText(`Enums added to ${db2NameBold} (${db1.type})\\n`, chalk.underline);\n result += formatText(\n enumsMissingFrom1.map((enumName) => `+ ${enumName}`).join('\\n') + '\\n\\n',\n chalk.green,\n );\n }\n\n if (enumsMissingFrom2.length > 0) {\n result += formatText(`Enums missing from ${db2NameBold} (${db2.type})\\n`, chalk.underline);\n result += formatText(\n enumsMissingFrom2.map((enumName) => `- ${enumName}`).join('\\n') + '\\n\\n',\n chalk.red,\n );\n }\n\n // Determine if the columns of any table differ\n const intersection = _.intersection(_.keys(description1.tables), _.keys(description2.tables));\n _.forEach(intersection, (table) => {\n const patch = structuredPatch(\n `tables/${table}`,\n `tables/${table}`,\n description1.tables[table],\n description2.tables[table],\n );\n\n if (patch.hunks.length === 0) return;\n\n const boldTable = formatText(table, chalk.bold);\n result += formatText(`Differences in ${boldTable} table\\n`, chalk.underline);\n\n patch.hunks.forEach((hunk, index) => {\n if (index !== 0) {\n result += formatText('...\\n', chalk.gray);\n }\n hunk.lines.forEach((line) => {\n const color = line[0] === '+' ? chalk.green : line[0] === '-' ? chalk.red : null;\n result += formatText(line, color);\n result += '\\n';\n });\n });\n\n result += '\\n\\n';\n });\n\n // Determine if the values of any enums differ\n const enumsIntersection = _.intersection(_.keys(description1.enums), _.keys(description2.enums));\n _.forEach(enumsIntersection, (enumName) => {\n // We don't need to do a particularly fancy diff here, since\n // enums are just represented here as strings\n if (description1.enums[enumName].trim() !== description2.enums[enumName].trim()) {\n const boldEnum = formatText(enumName, chalk.bold);\n result += formatText(`Differences in ${boldEnum} enum\\n`);\n result += formatText(`- ${description1.enums[enumName].trim()}\\n`, chalk.red);\n result += formatText(`+ ${description2.enums[enumName].trim()}\\n`, chalk.green);\n result += '\\n\\n';\n }\n });\n\n return result;\n}\n\nasync function loadDescriptionFromDisk(dirPath: string): Promise<Description> {\n const description: Description = {\n tables: {},\n enums: {},\n };\n\n const tables = await fs.readdir(path.join(dirPath, 'tables'));\n for (const table of tables) {\n const data = await fs.readFile(path.join(dirPath, 'tables', table), 'utf8');\n description.tables[table.replace('.pg', '')] = data;\n }\n\n const enums = await fs.readdir(path.join(dirPath, 'enums'));\n for (const enumName of enums) {\n const data = await fs.readFile(path.join(dirPath, 'enums', enumName), 'utf8');\n description.enums[enumName.replace('.pg', '')] = data;\n }\n\n return description;\n}\n\nasync function loadDescriptionFromDatabase(name: string) {\n const description = await describeDatabase(name);\n return formatDatabaseDescription(description, { coloredOutput: false });\n}\n\nasync function loadDescription(db: DiffTarget): Promise<Description> {\n if (db.type === 'database') {\n return loadDescriptionFromDatabase(db.name);\n } else if (db.type === 'directory') {\n return loadDescriptionFromDisk(db.path);\n } else {\n throw new Error('Invalid database type');\n }\n}\n\nexport async function diffDatabases(database1: string, database2: string, options: DiffOptions) {\n return diff(\n {\n type: 'database',\n name: database1,\n },\n {\n type: 'database',\n name: database2,\n },\n options,\n );\n}\n\nexport async function diffDatabaseAndDirectory(\n database: string,\n directory: string,\n options: DiffOptions,\n) {\n return diff(\n {\n type: 'database',\n name: database,\n },\n {\n type: 'directory',\n path: directory,\n },\n options,\n );\n}\n\nexport async function diffDirectoryAndDatabase(\n directory: string,\n database: string,\n options: DiffOptions,\n) {\n return diff(\n {\n type: 'directory',\n path: directory,\n },\n {\n type: 'database',\n name: database,\n },\n options,\n );\n}\n\nexport async function diffDirectories(\n directory1: string,\n directory2: string,\n options: DiffOptions,\n) {\n return diff(\n {\n type: 'directory',\n path: directory1,\n },\n {\n type: 'directory',\n path: directory2,\n },\n options,\n );\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { describeDatabase, formatDatabaseDescription } from './describe';
|
|
2
|
-
export { diffDatabases, diffDirectories, diffDatabaseAndDirectory, diffDirectoryAndDatabase, } from './diff';
|
|
1
|
+
export { describeDatabase, formatDatabaseDescription } from './describe.js';
|
|
2
|
+
export { diffDatabases, diffDirectories, diffDatabaseAndDirectory, diffDirectoryAndDatabase, } from './diff.js';
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.diffDirectoryAndDatabase = exports.diffDatabaseAndDirectory = exports.diffDirectories = exports.diffDatabases = exports.formatDatabaseDescription = exports.describeDatabase = void 0;
|
|
4
|
-
var describe_1 = require("./describe");
|
|
5
|
-
Object.defineProperty(exports, "describeDatabase", { enumerable: true, get: function () { return describe_1.describeDatabase; } });
|
|
6
|
-
Object.defineProperty(exports, "formatDatabaseDescription", { enumerable: true, get: function () { return describe_1.formatDatabaseDescription; } });
|
|
7
|
-
var diff_1 = require("./diff");
|
|
8
|
-
Object.defineProperty(exports, "diffDatabases", { enumerable: true, get: function () { return diff_1.diffDatabases; } });
|
|
9
|
-
Object.defineProperty(exports, "diffDirectories", { enumerable: true, get: function () { return diff_1.diffDirectories; } });
|
|
10
|
-
Object.defineProperty(exports, "diffDatabaseAndDirectory", { enumerable: true, get: function () { return diff_1.diffDatabaseAndDirectory; } });
|
|
11
|
-
Object.defineProperty(exports, "diffDirectoryAndDatabase", { enumerable: true, get: function () { return diff_1.diffDirectoryAndDatabase; } });
|
|
1
|
+
export { describeDatabase, formatDatabaseDescription } from './describe.js';
|
|
2
|
+
export { diffDatabases, diffDirectories, diffDatabaseAndDirectory, diffDirectoryAndDatabase, } from './diff.js';
|
|
12
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EACL,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,WAAW,CAAC","sourcesContent":["export { describeDatabase, formatDatabaseDescription } from './describe.js';\nexport {\n diffDatabases,\n diffDirectories,\n diffDatabaseAndDirectory,\n diffDirectoryAndDatabase,\n} from './diff.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/postgres-tools",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"main": "./dist/index.js",
|
|
5
6
|
"bin": {
|
|
6
7
|
"pg-describe": "./dist/bin/pg-describe.js",
|
|
@@ -17,18 +18,18 @@
|
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|
|
19
20
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
20
|
-
"@types/diff": "^5.
|
|
21
|
+
"@types/diff": "^5.2.1",
|
|
21
22
|
"@types/fs-extra": "^11.0.4",
|
|
22
|
-
"@types/lodash": "^4.17.
|
|
23
|
-
"@types/node": "^20.12.
|
|
23
|
+
"@types/lodash": "^4.17.1",
|
|
24
|
+
"@types/node": "^20.12.11",
|
|
24
25
|
"@types/yargs": "^17.0.32",
|
|
25
|
-
"typescript": "^5.4.
|
|
26
|
+
"typescript": "^5.4.5",
|
|
26
27
|
"typescript-cp": "^0.1.9"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@prairielearn/postgres": "^
|
|
30
|
+
"@prairielearn/postgres": "^2.0.1",
|
|
30
31
|
"async": "^3.2.5",
|
|
31
|
-
"chalk": "^
|
|
32
|
+
"chalk": "^5.3.0",
|
|
32
33
|
"diff": "^5.2.0",
|
|
33
34
|
"fs-extra": "^11.2.0",
|
|
34
35
|
"lodash": "^4.17.21",
|
package/src/bin/pg-describe.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
3
5
|
import async from 'async';
|
|
4
6
|
import chalk from 'chalk';
|
|
5
7
|
import fs from 'fs-extra';
|
|
6
8
|
import _ from 'lodash';
|
|
7
|
-
import path from 'path';
|
|
8
9
|
import yargs from 'yargs';
|
|
9
10
|
|
|
10
|
-
import { describeDatabase, formatDatabaseDescription, DatabaseDescription } from '../describe';
|
|
11
|
+
import { describeDatabase, formatDatabaseDescription, DatabaseDescription } from '../describe.js';
|
|
11
12
|
|
|
12
|
-
const args = yargs
|
|
13
|
+
const args = yargs(process.argv.slice(2))
|
|
13
14
|
.usage('Usage: $0 <database name> [options]')
|
|
14
15
|
.demandCommand(1)
|
|
15
16
|
.option('output', {
|
package/src/bin/pg-diff.ts
CHANGED
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
diffDirectories,
|
|
8
8
|
diffDatabaseAndDirectory,
|
|
9
9
|
diffDirectoryAndDatabase,
|
|
10
|
-
} from '../diff';
|
|
10
|
+
} from '../diff.js';
|
|
11
11
|
|
|
12
|
-
const args = yargs
|
|
12
|
+
const args = yargs(process.argv.slice(2))
|
|
13
13
|
.usage('Usage: $0 [options]')
|
|
14
14
|
.option('db', {
|
|
15
15
|
description: 'reads a description from the named database',
|
package/src/describe.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { parse as parsePostgresArray } from 'postgres-array';
|
|
4
|
+
|
|
4
5
|
import { loadSqlEquiv, PostgresPool } from '@prairielearn/postgres';
|
|
5
6
|
|
|
6
|
-
const sql = loadSqlEquiv(
|
|
7
|
+
const sql = loadSqlEquiv(import.meta.url);
|
|
7
8
|
|
|
8
9
|
interface ColumnDescription {
|
|
9
10
|
name: string;
|
package/src/diff.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import fs from 'fs-extra';
|
|
3
2
|
import path from 'node:path';
|
|
3
|
+
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import _ from 'lodash';
|
|
6
5
|
import { structuredPatch } from 'diff';
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import _ from 'lodash';
|
|
7
8
|
|
|
8
|
-
import { describeDatabase, formatDatabaseDescription } from './describe';
|
|
9
|
+
import { describeDatabase, formatDatabaseDescription } from './describe.js';
|
|
9
10
|
|
|
10
11
|
interface DatabaseInfo {
|
|
11
12
|
type: 'database';
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { describeDatabase, formatDatabaseDescription } from './describe';
|
|
1
|
+
export { describeDatabase, formatDatabaseDescription } from './describe.js';
|
|
2
2
|
export {
|
|
3
3
|
diffDatabases,
|
|
4
4
|
diffDirectories,
|
|
5
5
|
diffDatabaseAndDirectory,
|
|
6
6
|
diffDirectoryAndDatabase,
|
|
7
|
-
} from './diff';
|
|
7
|
+
} from './diff.js';
|