neon 2.47.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 +395 -0
- package/dist/_shared/env-core/reuse-secrets.js +179 -0
- 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 +575 -658
- 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 +642 -681
- package/dist/commands/diff.js +156 -200
- package/dist/commands/env.js +243 -303
- package/dist/commands/functions.js +275 -341
- 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 -64
- 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 +133 -147
- 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 +9 -7
package/dist/commands/psql.js
CHANGED
|
@@ -1,62 +1,64 @@
|
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
1
2
|
import { EndpointType } from "../utils/api_enums.js";
|
|
2
3
|
import { fillSingleProject } from "../utils/enrichers.js";
|
|
3
|
-
import { handler as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.middleware(fillSingleProject);
|
|
4
|
+
import { SSL_MODES, handler as handler$1 } from "./connection_string.js";
|
|
5
|
+
//#region src/commands/psql.ts
|
|
6
|
+
var psql_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
builder: () => builder,
|
|
8
|
+
command: () => command,
|
|
9
|
+
describe: () => describe,
|
|
10
|
+
handler: () => handler
|
|
11
|
+
});
|
|
12
|
+
const command = "psql [branch]";
|
|
13
|
+
const describe = "Connect to a database via psql";
|
|
14
|
+
const builder = (argv) => {
|
|
15
|
+
return argv.usage("$0 psql [branch] [options] [-- psql-args]").example("$0 psql", "Connect to the default branch via psql").example("$0 psql main", "Connect to the main branch via psql").example("$0 psql main -- -c \"SELECT 1\"", "Run a single query against the main branch").example("$0 psql main@2024-01-01T00:00:00Z", "Connect to the main branch at a specific point in time").positional("branch", {
|
|
16
|
+
describe: `Branch name or id. Defaults to the default branch if omitted. Can be written in the point-in-time format: "branch@timestamp" or "branch@lsn"`,
|
|
17
|
+
type: "string"
|
|
18
|
+
}).options({
|
|
19
|
+
"project-id": {
|
|
20
|
+
type: "string",
|
|
21
|
+
describe: "Project ID"
|
|
22
|
+
},
|
|
23
|
+
"role-name": {
|
|
24
|
+
type: "string",
|
|
25
|
+
describe: "Role name"
|
|
26
|
+
},
|
|
27
|
+
"database-name": {
|
|
28
|
+
type: "string",
|
|
29
|
+
describe: "Database name"
|
|
30
|
+
},
|
|
31
|
+
pooled: {
|
|
32
|
+
type: "boolean",
|
|
33
|
+
describe: "Use pooled connection",
|
|
34
|
+
default: false
|
|
35
|
+
},
|
|
36
|
+
"endpoint-type": {
|
|
37
|
+
type: "string",
|
|
38
|
+
choices: Object.values(EndpointType),
|
|
39
|
+
describe: "Endpoint type"
|
|
40
|
+
},
|
|
41
|
+
ssl: {
|
|
42
|
+
type: "string",
|
|
43
|
+
choices: SSL_MODES,
|
|
44
|
+
default: "require",
|
|
45
|
+
describe: "SSL mode"
|
|
46
|
+
},
|
|
47
|
+
fallback: {
|
|
48
|
+
type: "boolean",
|
|
49
|
+
describe: "Force the embedded TypeScript psql fallback (for testing)",
|
|
50
|
+
default: false,
|
|
51
|
+
hidden: true
|
|
52
|
+
}
|
|
53
|
+
}).middleware(fillSingleProject);
|
|
54
54
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
const handler = async (props) => {
|
|
56
|
+
await handler$1({
|
|
57
|
+
...props,
|
|
58
|
+
psql: true,
|
|
59
|
+
prisma: false,
|
|
60
|
+
extended: false
|
|
61
|
+
});
|
|
62
62
|
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { builder, command, describe, handler, psql_exports };
|
package/dist/commands/roles.js
CHANGED
|
@@ -1,65 +1,62 @@
|
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
1
2
|
import { retryOnLock } from "../api.js";
|
|
2
|
-
import { branchIdFromProps, fillSingleProject } from "../utils/enrichers.js";
|
|
3
3
|
import { writer } from "../writer.js";
|
|
4
|
+
import { branchIdFromProps, fillSingleProject } from "../utils/enrichers.js";
|
|
5
|
+
//#region src/commands/roles.ts
|
|
6
|
+
var roles_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
aliases: () => aliases,
|
|
8
|
+
builder: () => builder,
|
|
9
|
+
command: () => command,
|
|
10
|
+
create: () => create,
|
|
11
|
+
deleteRole: () => deleteRole,
|
|
12
|
+
describe: () => describe,
|
|
13
|
+
handler: () => handler,
|
|
14
|
+
list: () => list
|
|
15
|
+
});
|
|
4
16
|
const ROLES_FIELDS = ["name", "created_at"];
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
boolean: true,
|
|
31
|
-
},
|
|
32
|
-
}), (args) => create(args))
|
|
33
|
-
.command("delete <role>", "Delete a role", (yargs) => yargs, (args) => deleteRole(args));
|
|
34
|
-
export const handler = (args) => {
|
|
35
|
-
return args;
|
|
17
|
+
const command = "roles";
|
|
18
|
+
const describe = "Manage roles";
|
|
19
|
+
const aliases = ["role"];
|
|
20
|
+
const builder = (argv) => argv.usage("$0 roles <sub-command> [options]").options({
|
|
21
|
+
"project-id": {
|
|
22
|
+
describe: "Project ID",
|
|
23
|
+
type: "string"
|
|
24
|
+
},
|
|
25
|
+
branch: {
|
|
26
|
+
describe: "Branch ID or name",
|
|
27
|
+
type: "string"
|
|
28
|
+
}
|
|
29
|
+
}).middleware(fillSingleProject).command("list", "List roles", (yargs) => yargs, (args) => list(args)).command("create", "Create a role", (yargs) => yargs.options({
|
|
30
|
+
name: {
|
|
31
|
+
describe: "Role name",
|
|
32
|
+
type: "string",
|
|
33
|
+
demandOption: true
|
|
34
|
+
},
|
|
35
|
+
"no-login": {
|
|
36
|
+
describe: "Create a passwordless role that cannot login",
|
|
37
|
+
boolean: true
|
|
38
|
+
}
|
|
39
|
+
}), (args) => create(args)).command("delete <role>", "Delete a role", (yargs) => yargs, (args) => deleteRole(args));
|
|
40
|
+
const handler = (args) => {
|
|
41
|
+
return args;
|
|
36
42
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
fields: ROLES_FIELDS,
|
|
42
|
-
});
|
|
43
|
+
const list = async (props) => {
|
|
44
|
+
const branchId = await branchIdFromProps(props);
|
|
45
|
+
const { data } = await props.apiClient.listProjectBranchRoles(props.projectId, branchId);
|
|
46
|
+
writer(props).end(data.roles, { fields: ROLES_FIELDS });
|
|
43
47
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}));
|
|
52
|
-
writer(props).end(data.role, {
|
|
53
|
-
fields: ROLES_FIELDS,
|
|
54
|
-
});
|
|
48
|
+
const create = async (props) => {
|
|
49
|
+
const branchId = await branchIdFromProps(props);
|
|
50
|
+
const { data } = await retryOnLock(() => props.apiClient.createProjectBranchRole(props.projectId, branchId, { role: {
|
|
51
|
+
name: props.name,
|
|
52
|
+
no_login: props["no-login"]
|
|
53
|
+
} }));
|
|
54
|
+
writer(props).end(data.role, { fields: ROLES_FIELDS });
|
|
55
55
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (data) {
|
|
61
|
-
writer(props).end(data.role, {
|
|
62
|
-
fields: ROLES_FIELDS,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
56
|
+
const deleteRole = async (props) => {
|
|
57
|
+
const branchId = await branchIdFromProps(props);
|
|
58
|
+
const { data } = await retryOnLock(() => props.apiClient.deleteProjectBranchRole(props.projectId, branchId, props.role));
|
|
59
|
+
if (data) writer(props).end(data.role, { fields: ROLES_FIELDS });
|
|
65
60
|
};
|
|
61
|
+
//#endregion
|
|
62
|
+
export { aliases, builder, command, create, deleteRole, describe, handler, list, roles_exports };
|
|
@@ -1,151 +1,107 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { createPatch } from "diff";
|
|
3
|
-
import { sendError } from "../analytics.js";
|
|
4
|
-
import { isNeonApiError, messageFromBody } from "../api.js";
|
|
5
1
|
import { log } from "../log.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { isNeonApiError, messageFromBody } from "../api.js";
|
|
3
|
+
import { sendError } from "../analytics.js";
|
|
8
4
|
import { writer } from "../writer.js";
|
|
5
|
+
import { branchIdFromProps } from "../utils/enrichers.js";
|
|
6
|
+
import { parsePointInTime } from "../utils/point_in_time.js";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { createPatch } from "diff";
|
|
9
|
+
//#region src/commands/schema_diff.ts
|
|
9
10
|
const COLORS = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
added: chalk.green,
|
|
12
|
+
removed: chalk.red,
|
|
13
|
+
header: chalk.yellow,
|
|
14
|
+
section: chalk.magenta
|
|
14
15
|
};
|
|
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
|
-
await Promise.all(baseDatabases.map(async (database) => {
|
|
44
|
-
const patch = await createSchemaDiff(baseBranchPoint, pointInTime, database, props);
|
|
45
|
-
writer(props).text(colorize(patch));
|
|
46
|
-
}));
|
|
16
|
+
const schemaDiff = async (props) => {
|
|
17
|
+
props.branch = props.baseBranch || props.branch;
|
|
18
|
+
const baseBranch = await branchIdFromProps(props);
|
|
19
|
+
let pointInTime = await parsePointInTime({
|
|
20
|
+
pointInTime: props.compareSource,
|
|
21
|
+
targetBranchId: baseBranch,
|
|
22
|
+
projectId: props.projectId,
|
|
23
|
+
api: props.apiClient
|
|
24
|
+
});
|
|
25
|
+
const comparingWithParent = props.compareSource.startsWith("^parent");
|
|
26
|
+
let baseBranchPoint = {
|
|
27
|
+
branchId: baseBranch,
|
|
28
|
+
tag: "head"
|
|
29
|
+
};
|
|
30
|
+
[baseBranchPoint, pointInTime] = comparingWithParent ? [pointInTime, baseBranchPoint] : [baseBranchPoint, pointInTime];
|
|
31
|
+
const baseDatabases = await fetchDatabases(baseBranch, props);
|
|
32
|
+
if (props.database) {
|
|
33
|
+
const database = baseDatabases.find((db) => db.name === props.database);
|
|
34
|
+
if (!database) throw new Error(`Database ${props.database} does not exist in base branch ${baseBranch}`);
|
|
35
|
+
const patch = await createSchemaDiff(baseBranchPoint, pointInTime, database, props);
|
|
36
|
+
writer(props).text(colorize(patch));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await Promise.all(baseDatabases.map(async (database) => {
|
|
40
|
+
const patch = await createSchemaDiff(baseBranchPoint, pointInTime, database, props);
|
|
41
|
+
writer(props).text(colorize(patch));
|
|
42
|
+
}));
|
|
47
43
|
};
|
|
48
44
|
const fetchDatabases = async (branch, props) => {
|
|
49
|
-
|
|
50
|
-
.listProjectBranchDatabases(props.projectId, branch)
|
|
51
|
-
.then((response) => response.data.databases);
|
|
45
|
+
return props.apiClient.listProjectBranchDatabases(props.projectId, branch).then((response) => response.data.databases);
|
|
52
46
|
};
|
|
53
47
|
const createSchemaDiff = async (baseBranch, pointInTime, database, props) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
fetchSchema(pointInTime, database, props),
|
|
57
|
-
]);
|
|
58
|
-
return createPatch(`Database: ${database.name}`, baseSchema, compareSchema, generateHeader(baseBranch), generateHeader(pointInTime));
|
|
48
|
+
const [baseSchema, compareSchema] = await Promise.all([fetchSchema(baseBranch, database, props), fetchSchema(pointInTime, database, props)]);
|
|
49
|
+
return createPatch(`Database: ${database.name}`, baseSchema, compareSchema, generateHeader(baseBranch), generateHeader(pointInTime));
|
|
59
50
|
};
|
|
60
51
|
const fetchSchema = async (pointInTime, database, props) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
throw error;
|
|
77
|
-
}
|
|
52
|
+
try {
|
|
53
|
+
return (await props.apiClient.getProjectBranchSchema({
|
|
54
|
+
projectId: props.projectId,
|
|
55
|
+
branchId: pointInTime.branchId,
|
|
56
|
+
db_name: database.name,
|
|
57
|
+
...pointInTimeParams(pointInTime)
|
|
58
|
+
})).data.sql ?? "";
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (isNeonApiError(error)) {
|
|
61
|
+
sendError(error, "API_ERROR");
|
|
62
|
+
throw new Error(messageFromBody(error.data) ?? `Error while fetching schema for branch ${pointInTime.branchId}`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
78
66
|
};
|
|
79
67
|
const colorize = (patch) => {
|
|
80
|
-
|
|
81
|
-
.replace(/^([^\n]+)\n([^\n]+)\n/m, "") // Remove first two lines
|
|
82
|
-
.replace(/^-.*/gm, colorizer("removed"))
|
|
83
|
-
.replace(/^\+.*/gm, colorizer("added"))
|
|
84
|
-
.replace(/^@@.+@@.*/gm, colorizer("section"));
|
|
68
|
+
return patch.replace(/^([^\n]+)\n([^\n]+)\n/m, "").replace(/^-.*/gm, colorizer("removed")).replace(/^\+.*/gm, colorizer("added")).replace(/^@@.+@@.*/gm, colorizer("section"));
|
|
85
69
|
};
|
|
86
70
|
const colorizer = (colorId) => {
|
|
87
|
-
|
|
88
|
-
|
|
71
|
+
const color = COLORS[colorId];
|
|
72
|
+
return (line) => color(line);
|
|
89
73
|
};
|
|
90
74
|
const pointInTimeParams = (pointInTime) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
case "lsn":
|
|
97
|
-
return {
|
|
98
|
-
lsn: pointInTime.lsn ?? undefined,
|
|
99
|
-
};
|
|
100
|
-
default:
|
|
101
|
-
return {};
|
|
102
|
-
}
|
|
75
|
+
switch (pointInTime.tag) {
|
|
76
|
+
case "timestamp": return { timestamp: pointInTime.timestamp };
|
|
77
|
+
case "lsn": return { lsn: pointInTime.lsn ?? void 0 };
|
|
78
|
+
default: return {};
|
|
79
|
+
}
|
|
103
80
|
};
|
|
104
81
|
const generateHeader = (pointInTime) => {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
default:
|
|
112
|
-
return `${header})`;
|
|
113
|
-
}
|
|
82
|
+
const header = `(Branch: ${pointInTime.branchId}`;
|
|
83
|
+
switch (pointInTime.tag) {
|
|
84
|
+
case "timestamp": return `${header} at ${pointInTime.timestamp})`;
|
|
85
|
+
case "lsn": return `${header} at ${pointInTime.lsn})`;
|
|
86
|
+
default: return `${header})`;
|
|
87
|
+
}
|
|
114
88
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const contextBranch = data.branches.find((b) => b.id === props.branch || b.name === props.branch);
|
|
132
|
-
if (contextBranch?.parent_id == undefined) {
|
|
133
|
-
throw new Error(`No branch specified. Your context branch (${props.branch}) has no parent, so no comparison is possible.`);
|
|
134
|
-
}
|
|
135
|
-
log.info(`No branches specified. Comparing your context branch '${props.branch}' with its parent`);
|
|
136
|
-
props.compareSource = "^parent";
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
const { data } = await props.apiClient.listProjectBranches({
|
|
140
|
-
projectId: props.projectId,
|
|
141
|
-
});
|
|
142
|
-
const defaultBranch = data.branches.find((b) => b.default);
|
|
143
|
-
if (defaultBranch?.parent_id == undefined) {
|
|
144
|
-
throw new Error("No branch specified. Include a base branch or add a set-context branch to continue. Your default branch has no parent, so no comparison is possible.");
|
|
145
|
-
}
|
|
146
|
-
log.info(`No branches specified. Comparing default branch with its parent`);
|
|
147
|
-
props.compareSource = "^parent";
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return props;
|
|
89
|
+
const parseSchemaDiffParams = async (props) => {
|
|
90
|
+
if (!props.compareSource) if (props.baseBranch) {
|
|
91
|
+
props.compareSource = props.baseBranch;
|
|
92
|
+
props.baseBranch = props.branch;
|
|
93
|
+
} else if (props.branch) {
|
|
94
|
+
const { data } = await props.apiClient.listProjectBranches({ projectId: props.projectId });
|
|
95
|
+
if (data.branches.find((b) => b.id === props.branch || b.name === props.branch)?.parent_id == void 0) throw new Error(`No branch specified. Your context branch (${props.branch}) has no parent, so no comparison is possible.`);
|
|
96
|
+
log.info(`No branches specified. Comparing your context branch '${props.branch}' with its parent`);
|
|
97
|
+
props.compareSource = "^parent";
|
|
98
|
+
} else {
|
|
99
|
+
const { data } = await props.apiClient.listProjectBranches({ projectId: props.projectId });
|
|
100
|
+
if (data.branches.find((b) => b.default)?.parent_id == void 0) throw new Error("No branch specified. Include a base branch or add a set-context branch to continue. Your default branch has no parent, so no comparison is possible.");
|
|
101
|
+
log.info(`No branches specified. Comparing default branch with its parent`);
|
|
102
|
+
props.compareSource = "^parent";
|
|
103
|
+
}
|
|
104
|
+
return props;
|
|
151
105
|
};
|
|
106
|
+
//#endregion
|
|
107
|
+
export { parseSchemaDiffParams, schemaDiff };
|
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { log } from "../log.js";
|
|
3
|
+
import { applyContext } from "../context.js";
|
|
3
4
|
import { getCliName } from "../utils/cli_name.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
//#region src/commands/set_context.ts
|
|
6
|
+
var set_context_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
builder: () => builder,
|
|
8
|
+
command: () => command,
|
|
9
|
+
describe: () => describe,
|
|
10
|
+
handler: () => handler
|
|
11
|
+
});
|
|
12
|
+
const command = "set-context";
|
|
13
|
+
const describe = `Deprecated: use \`${getCliName()} link\`. Set the .neon context (raw write).`;
|
|
14
|
+
const builder = (argv) => argv.usage("$0 set-context [options]").options({
|
|
15
|
+
"project-id": {
|
|
16
|
+
describe: "Project ID",
|
|
17
|
+
type: "string"
|
|
18
|
+
},
|
|
19
|
+
"org-id": {
|
|
20
|
+
describe: "Organization ID",
|
|
21
|
+
type: "string"
|
|
22
|
+
},
|
|
23
|
+
"branch-id": {
|
|
24
|
+
describe: "Branch ID",
|
|
25
|
+
type: "string"
|
|
26
|
+
}
|
|
19
27
|
});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
applyContext(props.contextFile, context);
|
|
28
|
+
const handler = (props) => {
|
|
29
|
+
log.warning(`\`${getCliName()} set-context\` is deprecated and will be removed in a future release. Use \`${getCliName()} link\` instead — it verifies inputs and infers the org for you (or \`${getCliName()} link --no-checks\` for the same write-without-checks behavior).`);
|
|
30
|
+
const context = {
|
|
31
|
+
projectId: props.projectId,
|
|
32
|
+
orgId: props.orgId,
|
|
33
|
+
branchId: props.branchId
|
|
34
|
+
};
|
|
35
|
+
applyContext(props.contextFile, context);
|
|
30
36
|
};
|
|
37
|
+
//#endregion
|
|
38
|
+
export { builder, command, describe, handler, set_context_exports };
|