neon 3.0.0 → 3.1.0
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/README.md +54 -0
- package/dist/_shared/auth_selection.js +76 -79
- package/dist/_shared/credentials.js +166 -187
- package/dist/_shared/env-core/env.js +354 -517
- package/dist/_shared/env-core/reuse-secrets.js +159 -203
- package/dist/_shared/paths.js +129 -126
- package/dist/_shared/profiles.js +192 -242
- package/dist/_shared/secure_file.js +36 -38
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/analytics.js +163 -207
- package/dist/api.js +815 -758
- package/dist/auth.js +121 -141
- package/dist/auth_context.js +39 -53
- package/dist/cli.js +4 -7
- package/dist/commands/api.js +220 -250
- package/dist/commands/api_keys.js +251 -314
- package/dist/commands/auth.js +283 -328
- package/dist/commands/bootstrap.js +372 -437
- package/dist/commands/branches.js +304 -455
- package/dist/commands/bucket.js +374 -514
- package/dist/commands/checkout.js +213 -298
- package/dist/commands/config.js +573 -690
- package/dist/commands/connection_string.js +137 -165
- package/dist/commands/data_api.js +238 -260
- package/dist/commands/databases.js +67 -76
- package/dist/commands/deploy.js +31 -25
- package/dist/commands/dev.js +639 -719
- package/dist/commands/diff.js +156 -200
- package/dist/commands/env.js +243 -303
- package/dist/commands/functions.js +275 -355
- package/dist/commands/index.js +70 -65
- package/dist/commands/init.js +84 -119
- package/dist/commands/inspect.js +55 -55
- package/dist/commands/ip_allow.js +88 -120
- package/dist/commands/link.js +874 -1019
- package/dist/commands/logs.js +291 -0
- package/dist/commands/neon_auth.js +725 -933
- package/dist/commands/operations.js +34 -25
- package/dist/commands/orgs.js +28 -18
- package/dist/commands/profile.js +614 -845
- package/dist/commands/projects.js +313 -373
- package/dist/commands/psql.js +60 -58
- package/dist/commands/roles.js +55 -58
- package/dist/commands/schema_diff.js +87 -131
- package/dist/commands/set_context.js +34 -26
- package/dist/commands/snapshots.js +288 -413
- package/dist/commands/status.js +41 -37
- package/dist/commands/user.js +21 -10
- package/dist/commands/vpc_endpoints.js +85 -113
- package/dist/config.js +7 -6
- package/dist/config_format.js +50 -66
- package/dist/config_template.js +128 -157
- package/dist/context.js +183 -235
- package/dist/current_branch_fast_path.js +40 -49
- package/dist/dev/env.js +313 -394
- package/dist/dev/functions.js +54 -68
- package/dist/dev/inputs.js +46 -58
- package/dist/dev/runtime.js +135 -164
- package/dist/dev/websocket.js +766 -959
- package/dist/env.js +27 -33
- package/dist/env_file.js +118 -132
- package/dist/env_services.js +36 -38
- package/dist/errors.js +57 -68
- package/dist/functions_api.js +45 -43
- package/dist/help.js +189 -140
- package/dist/index.js +182 -257
- package/dist/init/agents.js +137 -118
- package/dist/init/auth.js +58 -68
- package/dist/init/bootstrap.js +325 -396
- package/dist/init/build_config.js +4 -2
- package/dist/init/detect_agent.js +56 -101
- package/dist/init/editors.js +35 -52
- package/dist/init/enrich_output.js +51 -66
- package/dist/init/extension.js +134 -171
- package/dist/init/inspect.js +179 -266
- package/dist/init/interactive.js +510 -622
- package/dist/init/neonctl.js +117 -168
- package/dist/init/orchestrate.js +157 -173
- package/dist/init/phases/auth.js +188 -202
- package/dist/init/phases/cleanup.js +23 -23
- package/dist/init/phases/db.js +251 -277
- package/dist/init/phases/getting_started.js +213 -223
- package/dist/init/phases/mcp.js +174 -224
- package/dist/init/phases/migrations.js +247 -248
- package/dist/init/phases/neon_auth.js +114 -133
- package/dist/init/phases/setup.js +546 -703
- package/dist/init/phases/skills.js +75 -86
- package/dist/init/phases/status.js +72 -67
- package/dist/init/resolve_context.js +102 -99
- package/dist/init/route_command.js +91 -98
- package/dist/init/skills.js +174 -218
- package/dist/init/vsix.js +77 -99
- package/dist/log.js +17 -16
- package/dist/neon_services.js +104 -129
- package/dist/parameters.gen.js +481 -471
- package/dist/pkg.js +17 -19
- package/dist/profile_keys.js +44 -47
- package/dist/psql/cli.js +44 -47
- package/dist/psql/command/cmd_cond.js +231 -406
- package/dist/psql/command/cmd_connect.js +557 -764
- package/dist/psql/command/cmd_copy.js +727 -983
- package/dist/psql/command/cmd_describe.js +1499 -1688
- package/dist/psql/command/cmd_format.js +733 -905
- package/dist/psql/command/cmd_io.js +1293 -2082
- package/dist/psql/command/cmd_lo.js +297 -359
- package/dist/psql/command/cmd_meta.js +727 -878
- package/dist/psql/command/cmd_misc.js +138 -172
- package/dist/psql/command/cmd_pipeline.js +547 -1099
- package/dist/psql/command/cmd_restrict.js +119 -155
- package/dist/psql/command/cmd_show.js +529 -688
- package/dist/psql/command/dispatch.js +261 -325
- package/dist/psql/command/inputQueue.js +35 -33
- package/dist/psql/command/shared.js +49 -63
- package/dist/psql/complete/filenames.js +90 -133
- package/dist/psql/complete/index.js +59 -97
- package/dist/psql/complete/matcher.js +236 -300
- package/dist/psql/complete/psqlVars.js +218 -223
- package/dist/psql/complete/queries.js +159 -177
- package/dist/psql/complete/rules.js +1493 -2299
- package/dist/psql/core/common.js +762 -1180
- package/dist/psql/core/help.js +456 -546
- package/dist/psql/core/mainloop.js +692 -1302
- package/dist/psql/core/prompt.js +391 -408
- package/dist/psql/core/settings.js +429 -644
- package/dist/psql/core/sqlHelp.js +480 -554
- package/dist/psql/core/startup.js +626 -815
- package/dist/psql/core/syncVars.js +67 -110
- package/dist/psql/core/variables.js +156 -278
- package/dist/psql/describe/formatters.js +884 -1285
- package/dist/psql/describe/processNamePattern.js +173 -260
- package/dist/psql/describe/queries.js +1368 -2403
- package/dist/psql/describe/versionGate.js +32 -41
- package/dist/psql/index.js +1414 -1927
- package/dist/psql/io/history.js +232 -271
- package/dist/psql/io/input.js +103 -108
- package/dist/psql/io/lineEditor/buffer.js +238 -319
- package/dist/psql/io/lineEditor/complete.js +135 -213
- package/dist/psql/io/lineEditor/filename.js +139 -148
- package/dist/psql/io/lineEditor/index.js +653 -870
- package/dist/psql/io/lineEditor/keymap.js +544 -702
- package/dist/psql/io/lineEditor/vt100.js +294 -341
- package/dist/psql/io/pgpass.js +158 -187
- package/dist/psql/io/pgservice.js +146 -183
- package/dist/psql/io/psqlrc.js +328 -403
- package/dist/psql/print/aligned.js +1020 -1683
- package/dist/psql/print/asciidoc.js +180 -214
- package/dist/psql/print/crosstab.js +281 -442
- package/dist/psql/print/csv.js +48 -70
- package/dist/psql/print/html.js +195 -226
- package/dist/psql/print/json.js +75 -88
- package/dist/psql/print/latex.js +291 -364
- package/dist/psql/print/pager.js +171 -242
- package/dist/psql/print/troff.js +194 -226
- package/dist/psql/print/unaligned.js +69 -95
- package/dist/psql/print/units.js +167 -169
- package/dist/psql/scanner/slash.js +428 -483
- package/dist/psql/scanner/sql.js +445 -889
- package/dist/psql/scanner/stringutils.js +309 -379
- package/dist/psql/types/index.js +2 -7
- package/dist/psql/types/scanner.js +25 -22
- package/dist/psql/wire/connection.js +2042 -2803
- package/dist/psql/wire/copy.js +84 -100
- package/dist/psql/wire/notify.js +39 -59
- package/dist/psql/wire/pipeline.js +305 -518
- package/dist/psql/wire/protocol.js +349 -417
- package/dist/psql/wire/sasl.js +180 -265
- package/dist/psql/wire/tls.js +400 -561
- package/dist/storage_api.js +115 -129
- package/dist/test_utils/fixtures.js +94 -113
- package/dist/test_utils/oauth_server.js +10 -7
- package/dist/test_utils/project_dir.js +33 -0
- package/dist/utils/ai_gateway_notice.js +131 -162
- package/dist/utils/api_enums.js +21 -28
- package/dist/utils/auth.js +10 -4
- package/dist/utils/branch_notice.js +20 -19
- package/dist/utils/branch_picker.js +83 -89
- package/dist/utils/cli_name.js +15 -12
- package/dist/utils/compute_units.js +20 -27
- package/dist/utils/config_diff.js +127 -158
- package/dist/utils/enrichers.js +95 -148
- package/dist/utils/esbuild.js +130 -189
- package/dist/utils/flags.js +35 -47
- package/dist/utils/formats.js +8 -15
- package/dist/utils/git_diff.js +69 -80
- package/dist/utils/inspect_db.js +101 -143
- package/dist/utils/inspect_queries.js +179 -142
- package/dist/utils/middlewares.js +37 -44
- package/dist/utils/openapi.js +87 -99
- package/dist/utils/package_manager.js +312 -110
- package/dist/utils/point_in_time.js +49 -53
- package/dist/utils/psql.js +89 -106
- package/dist/utils/service_picker.js +55 -58
- package/dist/utils/string.js +5 -5
- package/dist/utils/ui.js +38 -55
- package/dist/utils/write_sync.js +26 -35
- package/dist/utils/zip.js +4 -3
- package/dist/writer.js +67 -87
- package/package.json +7 -5
package/dist/commands/diff.js
CHANGED
|
@@ -1,222 +1,178 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { isNeonApiError } from "../api.js";
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
import { log } from "../log.js";
|
|
4
|
-
import {
|
|
5
|
-
import { looksLikeBranchId } from "../utils/formats.js";
|
|
6
|
-
import { renderDatabaseSchemaDiff, renderSchemaDiffReport, } from "../utils/git_diff.js";
|
|
3
|
+
import { isNeonApiError } from "../api.js";
|
|
7
4
|
import { writer } from "../writer.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
args.compareBranch = compareBranch;
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
.example([
|
|
51
|
-
[
|
|
52
|
-
"$0 diff main",
|
|
53
|
-
"Diff the current branch's schema against the main branch",
|
|
54
|
-
],
|
|
55
|
-
[
|
|
56
|
-
"$0 diff",
|
|
57
|
-
"Diff the current branch's schema against its parent branch",
|
|
58
|
-
],
|
|
59
|
-
[
|
|
60
|
-
"$0 diff main --branch feature/checkout",
|
|
61
|
-
"Diff an explicit branch against main (ignoring the .neon context)",
|
|
62
|
-
],
|
|
63
|
-
[
|
|
64
|
-
"$0 diff main --db neondb",
|
|
65
|
-
"Diff only the neondb database against main",
|
|
66
|
-
],
|
|
5
|
+
import { looksLikeBranchId } from "../utils/formats.js";
|
|
6
|
+
import { fillSingleProject } from "../utils/enrichers.js";
|
|
7
|
+
import { renderDatabaseSchemaDiff, renderSchemaDiffReport } from "../utils/git_diff.js";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
//#region src/commands/diff.ts
|
|
10
|
+
var diff_exports = /* @__PURE__ */ __exportAll({
|
|
11
|
+
builder: () => builder,
|
|
12
|
+
command: () => command,
|
|
13
|
+
describe: () => describe,
|
|
14
|
+
handler: () => handler
|
|
15
|
+
});
|
|
16
|
+
const command = "diff [compare-branch]";
|
|
17
|
+
const describe = "Show a git-style schema diff between the current branch and another branch";
|
|
18
|
+
const builder = (argv) => argv.usage("$0 diff [compare-branch] [options]").positional("compare-branch", {
|
|
19
|
+
describe: "Branch name or id to compare against (the reference / '---' side). Defaults to the current branch's parent.",
|
|
20
|
+
type: "string"
|
|
21
|
+
}).options({
|
|
22
|
+
"project-id": {
|
|
23
|
+
describe: "Project ID",
|
|
24
|
+
type: "string"
|
|
25
|
+
},
|
|
26
|
+
branch: {
|
|
27
|
+
alias: "b",
|
|
28
|
+
describe: "The branch to review (the '+++' side). Defaults to the branch pinned in the local context (.neon).",
|
|
29
|
+
type: "string"
|
|
30
|
+
},
|
|
31
|
+
database: {
|
|
32
|
+
alias: "db",
|
|
33
|
+
describe: "Limit the diff to a single database. Defaults to every database on the current branch.",
|
|
34
|
+
type: "string"
|
|
35
|
+
}
|
|
36
|
+
}).middleware(fillSingleProject).middleware((args) => {
|
|
37
|
+
const compareBranch = args["compare-branch"];
|
|
38
|
+
if (typeof compareBranch === "string") args.compareBranch = compareBranch;
|
|
39
|
+
}).example([
|
|
40
|
+
["$0 diff main", "Diff the current branch's schema against the main branch"],
|
|
41
|
+
["$0 diff", "Diff the current branch's schema against its parent branch"],
|
|
42
|
+
["$0 diff main --branch feature/checkout", "Diff an explicit branch against main (ignoring the .neon context)"],
|
|
43
|
+
["$0 diff main --db neondb", "Diff only the neondb database against main"]
|
|
67
44
|
]);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
writer(props).text(`${text}\n`);
|
|
45
|
+
const handler = async (props) => {
|
|
46
|
+
const branches = (await props.apiClient.listProjectBranches({ projectId: props.projectId })).data.branches;
|
|
47
|
+
const after = resolveAfterBranch(branches, props.branch);
|
|
48
|
+
const before = resolveBeforeBranch(branches, after, props.compareBranch);
|
|
49
|
+
if (before.branchId === after.branchId) throw new Error(`Nothing to compare: both sides resolve to branch ${after.branchName} (${after.branchId}).`);
|
|
50
|
+
const databases = await resolveDatabases(props, after);
|
|
51
|
+
const diffs = [];
|
|
52
|
+
for (const database of databases) {
|
|
53
|
+
const [beforeSql, afterSql] = await Promise.all([fetchSchemaSql(props, before.branchId, database), fetchSchemaSql(props, after.branchId, database)]);
|
|
54
|
+
diffs.push({
|
|
55
|
+
database,
|
|
56
|
+
before: {
|
|
57
|
+
...before,
|
|
58
|
+
sql: beforeSql
|
|
59
|
+
},
|
|
60
|
+
after: {
|
|
61
|
+
...after,
|
|
62
|
+
sql: afterSql
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (props.output === "json" || props.output === "yaml") {
|
|
67
|
+
writeStructured(props, diffs);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
log.info("%s Comparing schema %s → %s", chalk.dim("→"), chalk.red(`${before.branchName}`), chalk.green(`${after.branchName}`));
|
|
71
|
+
const { hasChanges, text } = renderSchemaDiffReport(diffs, { color: props.color !== false });
|
|
72
|
+
if (!hasChanges) {
|
|
73
|
+
log.info("No schema differences between %s and %s.", before.branchName, after.branchName);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
writer(props).text(`${text}\n`);
|
|
103
77
|
};
|
|
104
78
|
/**
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
79
|
+
* Resolve the branch under review (`+++` side). Prefers the explicit
|
|
80
|
+
* `branch`/`--branch` value (name or `br-…` id), falling back to the project's
|
|
81
|
+
* default branch. An unknown `br-…` id is trusted as-is (it may be too new to
|
|
82
|
+
* appear in the listing); an unknown *name* is a hard error.
|
|
83
|
+
*/
|
|
110
84
|
const resolveAfterBranch = (branches, ref) => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return { branchId: def.id, branchName: def.name ?? def.id };
|
|
85
|
+
if (ref) return resolveRef(branches, ref);
|
|
86
|
+
const def = branches.find((b) => b.default);
|
|
87
|
+
if (!def) throw new Error("No branch specified and no default branch found. Pass --branch <name|id>.");
|
|
88
|
+
return {
|
|
89
|
+
branchId: def.id,
|
|
90
|
+
branchName: def.name ?? def.id
|
|
91
|
+
};
|
|
119
92
|
};
|
|
120
93
|
/**
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
94
|
+
* Resolve the reference branch (`---` side). Uses the `compare-branch`
|
|
95
|
+
* positional when given, otherwise the parent of the branch under review — so a
|
|
96
|
+
* bare `neon diff` answers "what did I change since branching?".
|
|
97
|
+
*/
|
|
125
98
|
const resolveBeforeBranch = (branches, after, ref) => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
"Pass a branch to compare with, e.g. `neon diff main`.");
|
|
134
|
-
}
|
|
135
|
-
const parent = branches.find((b) => b.id === parentId);
|
|
136
|
-
return {
|
|
137
|
-
branchId: parentId,
|
|
138
|
-
branchName: parent?.name ?? parentId,
|
|
139
|
-
};
|
|
99
|
+
if (ref) return resolveRef(branches, ref);
|
|
100
|
+
const parentId = branches.find((b) => b.id === after.branchId)?.parent_id;
|
|
101
|
+
if (!parentId) throw new Error(`Branch "${after.branchName}" has no parent to compare against. Pass a branch to compare with, e.g. \`neon diff main\`.`);
|
|
102
|
+
return {
|
|
103
|
+
branchId: parentId,
|
|
104
|
+
branchName: branches.find((b) => b.id === parentId)?.name ?? parentId
|
|
105
|
+
};
|
|
140
106
|
};
|
|
141
107
|
/** Resolve a branch reference (name or `br-…` id) against the fetched listing. */
|
|
142
108
|
const resolveRef = (branches, ref) => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
throw new Error(`Branch ${ref} not found.\nAvailable branches: ${branches
|
|
155
|
-
.map((b) => b.name)
|
|
156
|
-
.join(", ")}`);
|
|
109
|
+
const found = looksLikeBranchId(ref) ? branches.find((b) => b.id === ref) : branches.find((b) => b.name === ref);
|
|
110
|
+
if (found) return {
|
|
111
|
+
branchId: found.id,
|
|
112
|
+
branchName: found.name ?? found.id
|
|
113
|
+
};
|
|
114
|
+
if (looksLikeBranchId(ref)) return {
|
|
115
|
+
branchId: ref,
|
|
116
|
+
branchName: ref
|
|
117
|
+
};
|
|
118
|
+
throw new Error(`Branch ${ref} not found.\nAvailable branches: ${branches.map((b) => b.name).join(", ")}`);
|
|
157
119
|
};
|
|
158
120
|
/**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
121
|
+
* The databases to diff: the one passed via `--database` (validated against the
|
|
122
|
+
* branch under review), or every database on that branch when none is given.
|
|
123
|
+
*/
|
|
162
124
|
const resolveDatabases = async (props, after) => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
if (databases.length === 0) {
|
|
172
|
-
throw new Error(`No databases found on branch ${after.branchName} (${after.branchId}).`);
|
|
173
|
-
}
|
|
174
|
-
return databases.map((d) => d.name);
|
|
125
|
+
const databases = (await props.apiClient.listProjectBranchDatabases(props.projectId, after.branchId)).data.databases;
|
|
126
|
+
if (props.database !== void 0) {
|
|
127
|
+
if (!databases.find((d) => d.name === props.database)) throw new Error(`Database "${props.database}" not found on branch ${after.branchName}. Available: ${databases.map((d) => d.name).join(", ")}`);
|
|
128
|
+
return [props.database];
|
|
129
|
+
}
|
|
130
|
+
if (databases.length === 0) throw new Error(`No databases found on branch ${after.branchName} (${after.branchId}).`);
|
|
131
|
+
return databases.map((d) => d.name);
|
|
175
132
|
};
|
|
176
133
|
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
134
|
+
* Fetch a branch database's `CREATE …` SQL. A database absent from the branch
|
|
135
|
+
* (404) yields an empty schema, so the diff shows it as fully added/removed
|
|
136
|
+
* rather than failing — the natural outcome when a database exists on only one
|
|
137
|
+
* side of the comparison.
|
|
138
|
+
*/
|
|
182
139
|
const fetchSchemaSql = async (props, branchId, database) => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
140
|
+
try {
|
|
141
|
+
const { data } = await props.apiClient.getProjectBranchSchema({
|
|
142
|
+
projectId: props.projectId,
|
|
143
|
+
branchId,
|
|
144
|
+
db_name: database
|
|
145
|
+
});
|
|
146
|
+
return data.sql ?? "";
|
|
147
|
+
} catch (err) {
|
|
148
|
+
if (isNeonApiError(err) && err.status === 404) {
|
|
149
|
+
log.debug("diff: database %s not found on branch %s; treating schema as empty", database, branchId);
|
|
150
|
+
return "";
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
198
154
|
};
|
|
199
155
|
/** Machine-readable output for `--output json|yaml`: one entry per database. */
|
|
200
156
|
const writeStructured = (props, diffs) => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
],
|
|
221
|
-
});
|
|
157
|
+
const report = diffs.map((diff) => {
|
|
158
|
+
const rendered = renderDatabaseSchemaDiff(diff, { color: false });
|
|
159
|
+
return {
|
|
160
|
+
database: diff.database,
|
|
161
|
+
base_branch: diff.before.branchName,
|
|
162
|
+
base_branch_id: diff.before.branchId,
|
|
163
|
+
compare_branch: diff.after.branchName,
|
|
164
|
+
compare_branch_id: diff.after.branchId,
|
|
165
|
+
has_changes: rendered.hasChanges,
|
|
166
|
+
diff: rendered.text
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
writer(props).end(report, { fields: [
|
|
170
|
+
"database",
|
|
171
|
+
"base_branch",
|
|
172
|
+
"compare_branch",
|
|
173
|
+
"has_changes",
|
|
174
|
+
"diff"
|
|
175
|
+
] });
|
|
222
176
|
};
|
|
177
|
+
//#endregion
|
|
178
|
+
export { builder, command, describe, diff_exports, handler };
|