neon 3.0.0 → 3.1.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/README.md +70 -5
- package/dist/_chunks/auth_selection-DGgq6ifc.js +83 -0
- package/dist/_chunks/cmd_pipeline-CUbBO9U_.js +2818 -0
- package/dist/_chunks/credentials-MYdHdKah.js +188 -0
- package/dist/_chunks/env-NbA61JR3.js +585 -0
- package/dist/_chunks/env_services-Tz9G4JeT.js +531 -0
- package/dist/_chunks/paths-DMq0Lt7a.js +151 -0
- package/dist/_chunks/profiles-Ir29rqns.js +217 -0
- package/dist/_chunks/psql-DWH-kc69.js +2169 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/secure_file-BucZj4yQ.js +39 -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 +255 -305
- 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 +615 -846
- 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 +2 -446
- 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 +2 -51
- 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 +728 -984
- 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 +2 -2193
- 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 +2 -1148
- package/dist/psql/command/cmd_restrict.js +119 -155
- package/dist/psql/command/cmd_show.js +529 -688
- package/dist/psql/command/dispatch.js +260 -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 +2 -1253
- package/dist/psql/core/help.js +456 -546
- package/dist/psql/core/mainloop.js +692 -1303
- 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 +2 -846
- 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 +2 -2030
- 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 +8 -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 +39 -45
- 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 +11 -6
- package/dist/_shared/auth_selection.js +0 -86
- package/dist/_shared/credentials.js +0 -209
- package/dist/_shared/env-core/env.js +0 -558
- package/dist/_shared/env-core/reuse-secrets.js +0 -223
- package/dist/_shared/paths.js +0 -148
- package/dist/_shared/profiles.js +0 -276
- package/dist/_shared/secure_file.js +0 -43
|
@@ -1,285 +1,263 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as __exportAll } from "../_chunks/rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { log } from "../log.js";
|
|
3
|
+
import { isNeonApiError, retryOnLock } from "../api.js";
|
|
3
4
|
import { getCliName } from "../utils/cli_name.js";
|
|
4
|
-
import { branchIdFromProps, fillSingleProject, resolveSingleDatabase, } from "../utils/enrichers.js";
|
|
5
5
|
import { writer } from "../writer.js";
|
|
6
|
+
import { branchIdFromProps, fillSingleProject, resolveSingleDatabase } from "../utils/enrichers.js";
|
|
7
|
+
//#region src/commands/data_api.ts
|
|
8
|
+
var data_api_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
+
builder: () => builder,
|
|
10
|
+
command: () => command,
|
|
11
|
+
describe: () => describe,
|
|
12
|
+
handler: () => handler
|
|
13
|
+
});
|
|
6
14
|
const SETTINGS_FIELDS = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
"db_aggregates_enabled",
|
|
16
|
+
"db_anon_role",
|
|
17
|
+
"db_extra_search_path",
|
|
18
|
+
"db_max_rows",
|
|
19
|
+
"db_schemas",
|
|
20
|
+
"jwt_role_claim_key",
|
|
21
|
+
"jwt_cache_max_lifetime",
|
|
22
|
+
"openapi_mode",
|
|
23
|
+
"server_cors_allowed_origins",
|
|
24
|
+
"server_timing_enabled"
|
|
17
25
|
];
|
|
18
26
|
const settingsFlags = {
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
27
|
+
"db-aggregates-enabled": {
|
|
28
|
+
type: "boolean",
|
|
29
|
+
describe: "Enable aggregate functions in queries"
|
|
30
|
+
},
|
|
31
|
+
"db-anon-role": {
|
|
32
|
+
type: "string",
|
|
33
|
+
describe: "Database role used for anonymous (unauthenticated) requests"
|
|
34
|
+
},
|
|
35
|
+
"db-extra-search-path": {
|
|
36
|
+
type: "string",
|
|
37
|
+
describe: "Extra schemas appended to the search path"
|
|
38
|
+
},
|
|
39
|
+
"db-max-rows": {
|
|
40
|
+
type: "number",
|
|
41
|
+
describe: "Maximum number of rows returned by a single request"
|
|
42
|
+
},
|
|
43
|
+
"db-schemas": {
|
|
44
|
+
type: "string",
|
|
45
|
+
describe: "Comma-separated list of schemas exposed via the Data API"
|
|
46
|
+
},
|
|
47
|
+
"jwt-role-claim-key": {
|
|
48
|
+
type: "string",
|
|
49
|
+
describe: "JWT claim path used to extract the role"
|
|
50
|
+
},
|
|
51
|
+
"jwt-cache-max-lifetime": {
|
|
52
|
+
type: "number",
|
|
53
|
+
describe: "Maximum JWT cache lifetime in seconds"
|
|
54
|
+
},
|
|
55
|
+
"openapi-mode": {
|
|
56
|
+
type: "string",
|
|
57
|
+
choices: ["ignore-privileges", "disabled"],
|
|
58
|
+
describe: "OpenAPI mode"
|
|
59
|
+
},
|
|
60
|
+
"server-cors-allowed-origins": {
|
|
61
|
+
type: "string",
|
|
62
|
+
describe: "CORS allowed origins"
|
|
63
|
+
},
|
|
64
|
+
"server-timing-enabled": {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
describe: "Enable Server-Timing response headers"
|
|
67
|
+
}
|
|
60
68
|
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
describe: "Replace settings with only the flags provided. Omitted settings revert to server defaults.",
|
|
114
|
-
},
|
|
115
|
-
...settingsFlags,
|
|
116
|
-
}), (args) => update(args))
|
|
117
|
-
.command("refresh-schema", "Refresh the Data API schema cache without changing settings", (yargs) => yargs, (args) => refreshSchema(args))
|
|
118
|
-
.command("delete", "Tear down the Neon Data API for a database", (yargs) => yargs, (args) => deleteDataApi(args));
|
|
119
|
-
export const handler = (args) => {
|
|
120
|
-
return args;
|
|
69
|
+
const command = "data-api";
|
|
70
|
+
const describe = "Manage the Neon Data API for a database";
|
|
71
|
+
const builder = (argv) => argv.usage("$0 data-api <sub-command> [options]").options({
|
|
72
|
+
"project-id": {
|
|
73
|
+
describe: "Project ID",
|
|
74
|
+
type: "string"
|
|
75
|
+
},
|
|
76
|
+
branch: {
|
|
77
|
+
describe: "Branch ID or name",
|
|
78
|
+
type: "string"
|
|
79
|
+
},
|
|
80
|
+
database: {
|
|
81
|
+
describe: "Database name",
|
|
82
|
+
type: "string"
|
|
83
|
+
}
|
|
84
|
+
}).middleware(fillSingleProject).command("create", "Provision the Neon Data API for a database", (yargs) => yargs.options({
|
|
85
|
+
"auth-provider": {
|
|
86
|
+
type: "string",
|
|
87
|
+
choices: ["neon_auth", "external"],
|
|
88
|
+
describe: "Authentication provider"
|
|
89
|
+
},
|
|
90
|
+
"jwks-url": {
|
|
91
|
+
type: "string",
|
|
92
|
+
describe: "URL that lists the JWKS (used with external auth)"
|
|
93
|
+
},
|
|
94
|
+
"provider-name": {
|
|
95
|
+
type: "string",
|
|
96
|
+
describe: "Name of the auth provider (e.g. Clerk, Stytch, Auth0)"
|
|
97
|
+
},
|
|
98
|
+
"jwt-audience": {
|
|
99
|
+
type: "string",
|
|
100
|
+
describe: "Expected JWT audience claim"
|
|
101
|
+
},
|
|
102
|
+
"add-default-grants": {
|
|
103
|
+
type: "boolean",
|
|
104
|
+
describe: "Grant all permissions on tables in the public schema to authenticated users"
|
|
105
|
+
},
|
|
106
|
+
"skip-auth-schema": {
|
|
107
|
+
type: "boolean",
|
|
108
|
+
describe: "Skip creating the auth schema and RLS functions"
|
|
109
|
+
},
|
|
110
|
+
...settingsFlags
|
|
111
|
+
}), (args) => create(args)).command("get", "Show the Neon Data API status and settings", (yargs) => yargs, (args) => get(args)).command("update", "Update Neon Data API settings (merges with current settings by default)", (yargs) => yargs.options({
|
|
112
|
+
replace: {
|
|
113
|
+
type: "boolean",
|
|
114
|
+
default: false,
|
|
115
|
+
describe: "Replace settings with only the flags provided. Omitted settings revert to server defaults."
|
|
116
|
+
},
|
|
117
|
+
...settingsFlags
|
|
118
|
+
}), (args) => update(args)).command("refresh-schema", "Refresh the Data API schema cache without changing settings", (yargs) => yargs, (args) => refreshSchema(args)).command("delete", "Tear down the Neon Data API for a database", (yargs) => yargs, (args) => deleteDataApi(args));
|
|
119
|
+
const handler = (args) => {
|
|
120
|
+
return args;
|
|
121
121
|
};
|
|
122
122
|
const TOP_LEVEL_CREATE_FIELDS = [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
123
|
+
"auth_provider",
|
|
124
|
+
"jwks_url",
|
|
125
|
+
"provider_name",
|
|
126
|
+
"jwt_audience",
|
|
127
|
+
"add_default_grants",
|
|
128
|
+
"skip_auth_schema"
|
|
129
129
|
];
|
|
130
130
|
const argKey = (snake) => snake.replace(/_/g, "-");
|
|
131
131
|
const buildSettings = (args) => {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
.map((s) => s.trim())
|
|
141
|
-
.filter(Boolean);
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
settings[field] = value;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return Object.keys(settings).length > 0
|
|
148
|
-
? settings
|
|
149
|
-
: undefined;
|
|
132
|
+
const settings = {};
|
|
133
|
+
for (const field of SETTINGS_FIELDS) {
|
|
134
|
+
const value = args[argKey(field)];
|
|
135
|
+
if (value === void 0) continue;
|
|
136
|
+
if (field === "db_schemas" && typeof value === "string") settings[field] = value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
137
|
+
else settings[field] = value;
|
|
138
|
+
}
|
|
139
|
+
return Object.keys(settings).length > 0 ? settings : void 0;
|
|
150
140
|
};
|
|
151
141
|
const buildCreateBody = (args) => {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
body.settings = settings;
|
|
161
|
-
return body;
|
|
142
|
+
const body = {};
|
|
143
|
+
for (const field of TOP_LEVEL_CREATE_FIELDS) {
|
|
144
|
+
const value = args[argKey(field)];
|
|
145
|
+
if (value !== void 0) body[field] = value;
|
|
146
|
+
}
|
|
147
|
+
const settings = buildSettings(args);
|
|
148
|
+
if (settings) body.settings = settings;
|
|
149
|
+
return body;
|
|
162
150
|
};
|
|
163
151
|
const create = async (props) => {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
152
|
+
const branchId = await branchIdFromProps(props);
|
|
153
|
+
const database = await resolveSingleDatabase({
|
|
154
|
+
apiClient: props.apiClient,
|
|
155
|
+
projectId: props.projectId,
|
|
156
|
+
branchId,
|
|
157
|
+
database: props.database
|
|
158
|
+
});
|
|
159
|
+
const body = buildCreateBody(props);
|
|
160
|
+
const { data } = await retryOnLock(() => props.apiClient.createProjectBranchDataApi(props.projectId, branchId, database, body));
|
|
161
|
+
writer(props).end(data, { fields: ["url"] });
|
|
174
162
|
};
|
|
175
|
-
const GET_FIELDS = [
|
|
163
|
+
const GET_FIELDS = [
|
|
164
|
+
"url",
|
|
165
|
+
"status",
|
|
166
|
+
"db_schemas"
|
|
167
|
+
];
|
|
176
168
|
const get = async (props) => {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
169
|
+
const branchId = await branchIdFromProps(props);
|
|
170
|
+
const database = await resolveSingleDatabase({
|
|
171
|
+
apiClient: props.apiClient,
|
|
172
|
+
projectId: props.projectId,
|
|
173
|
+
branchId,
|
|
174
|
+
database: props.database
|
|
175
|
+
});
|
|
176
|
+
const { data } = await props.apiClient.getProjectBranchDataApi(props.projectId, branchId, database);
|
|
177
|
+
const { available_schemas: _ignored, ...publicData } = data;
|
|
178
|
+
const tableRow = {
|
|
179
|
+
url: publicData.url,
|
|
180
|
+
status: publicData.status,
|
|
181
|
+
db_schemas: (publicData.settings?.db_schemas ?? []).join(", ")
|
|
182
|
+
};
|
|
183
|
+
if (props.output === "json" || props.output === "yaml") {
|
|
184
|
+
writer(props).end(publicData, { fields: [
|
|
185
|
+
"url",
|
|
186
|
+
"status",
|
|
187
|
+
"settings"
|
|
188
|
+
] });
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
writer(props).end(tableRow, { fields: GET_FIELDS });
|
|
200
192
|
};
|
|
201
193
|
const update = async (props) => {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
await retryOnLock(() => props.apiClient.updateProjectBranchDataApi(props.projectId, branchId, database, body));
|
|
239
|
-
}
|
|
240
|
-
catch (err) {
|
|
241
|
-
if (isNeonApiError(err) && err.status === 404) {
|
|
242
|
-
throw new Error(`Data API is not provisioned for ${database} on branch ${branchId}. Run \`${getCliName()} data-api create\` first.`);
|
|
243
|
-
}
|
|
244
|
-
throw err;
|
|
245
|
-
}
|
|
246
|
-
log.info(`Data API settings updated for ${database} on branch ${branchId}`);
|
|
194
|
+
const branchId = await branchIdFromProps(props);
|
|
195
|
+
const database = await resolveSingleDatabase({
|
|
196
|
+
apiClient: props.apiClient,
|
|
197
|
+
projectId: props.projectId,
|
|
198
|
+
branchId,
|
|
199
|
+
database: props.database
|
|
200
|
+
});
|
|
201
|
+
const userSettings = buildSettings(props);
|
|
202
|
+
if (!userSettings) throw new Error("No settings flags provided. Pass at least one setting flag to update, or use `data-api refresh-schema` to refresh the schema cache without changing settings.");
|
|
203
|
+
let settings;
|
|
204
|
+
if (props.replace) settings = userSettings;
|
|
205
|
+
else {
|
|
206
|
+
let current;
|
|
207
|
+
try {
|
|
208
|
+
const { data } = await props.apiClient.getProjectBranchDataApi(props.projectId, branchId, database);
|
|
209
|
+
current = data.settings ?? void 0;
|
|
210
|
+
} catch (err) {
|
|
211
|
+
if (isNeonApiError(err) && err.status === 404) throw new Error(`Data API is not provisioned for ${database} on branch ${branchId}. Run \`${getCliName()} data-api create\` first.`);
|
|
212
|
+
throw err;
|
|
213
|
+
}
|
|
214
|
+
if (!current) throw new Error(`Could not read current Data API settings for ${database} on branch ${branchId}. Retry, or pass --replace to overwrite.`);
|
|
215
|
+
settings = {
|
|
216
|
+
...current,
|
|
217
|
+
...userSettings ?? {}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const body = {};
|
|
221
|
+
if (settings) body.settings = settings;
|
|
222
|
+
try {
|
|
223
|
+
await retryOnLock(() => props.apiClient.updateProjectBranchDataApi(props.projectId, branchId, database, body));
|
|
224
|
+
} catch (err) {
|
|
225
|
+
if (isNeonApiError(err) && err.status === 404) throw new Error(`Data API is not provisioned for ${database} on branch ${branchId}. Run \`${getCliName()} data-api create\` first.`);
|
|
226
|
+
throw err;
|
|
227
|
+
}
|
|
228
|
+
log.info(`Data API settings updated for ${database} on branch ${branchId}`);
|
|
247
229
|
};
|
|
248
230
|
const refreshSchema = async (props) => {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
throw err;
|
|
264
|
-
}
|
|
265
|
-
log.info(`Data API schema cache refreshed for ${database} on branch ${branchId}`);
|
|
231
|
+
const branchId = await branchIdFromProps(props);
|
|
232
|
+
const database = await resolveSingleDatabase({
|
|
233
|
+
apiClient: props.apiClient,
|
|
234
|
+
projectId: props.projectId,
|
|
235
|
+
branchId,
|
|
236
|
+
database: props.database
|
|
237
|
+
});
|
|
238
|
+
try {
|
|
239
|
+
await retryOnLock(() => props.apiClient.updateProjectBranchDataApi(props.projectId, branchId, database, {}));
|
|
240
|
+
} catch (err) {
|
|
241
|
+
if (isNeonApiError(err) && err.status === 404) throw new Error(`Data API is not provisioned for ${database} on branch ${branchId}. Run \`${getCliName()} data-api create\` first.`);
|
|
242
|
+
throw err;
|
|
243
|
+
}
|
|
244
|
+
log.info(`Data API schema cache refreshed for ${database} on branch ${branchId}`);
|
|
266
245
|
};
|
|
267
246
|
const deleteDataApi = async (props) => {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
throw err;
|
|
283
|
-
}
|
|
284
|
-
log.info(`Data API deleted for ${database} on branch ${branchId}`);
|
|
247
|
+
const branchId = await branchIdFromProps(props);
|
|
248
|
+
const database = await resolveSingleDatabase({
|
|
249
|
+
apiClient: props.apiClient,
|
|
250
|
+
projectId: props.projectId,
|
|
251
|
+
branchId,
|
|
252
|
+
database: props.database
|
|
253
|
+
});
|
|
254
|
+
try {
|
|
255
|
+
await retryOnLock(() => props.apiClient.deleteProjectBranchDataApi(props.projectId, branchId, database));
|
|
256
|
+
} catch (err) {
|
|
257
|
+
if (isNeonApiError(err) && err.status === 404) throw new Error(`Data API is not provisioned for ${database} on branch ${branchId}.`);
|
|
258
|
+
throw err;
|
|
259
|
+
}
|
|
260
|
+
log.info(`Data API deleted for ${database} on branch ${branchId}`);
|
|
285
261
|
};
|
|
262
|
+
//#endregion
|
|
263
|
+
export { builder, command, describe, handler, data_api_exports as t };
|