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.
Files changed (207) hide show
  1. package/README.md +70 -5
  2. package/dist/_chunks/auth_selection-DGgq6ifc.js +83 -0
  3. package/dist/_chunks/cmd_pipeline-CUbBO9U_.js +2818 -0
  4. package/dist/_chunks/credentials-MYdHdKah.js +188 -0
  5. package/dist/_chunks/env-NbA61JR3.js +585 -0
  6. package/dist/_chunks/env_services-Tz9G4JeT.js +531 -0
  7. package/dist/_chunks/paths-DMq0Lt7a.js +151 -0
  8. package/dist/_chunks/profiles-Ir29rqns.js +217 -0
  9. package/dist/_chunks/psql-DWH-kc69.js +2169 -0
  10. package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
  11. package/dist/_chunks/secure_file-BucZj4yQ.js +39 -0
  12. package/dist/analytics.js +163 -207
  13. package/dist/api.js +815 -758
  14. package/dist/auth.js +121 -141
  15. package/dist/auth_context.js +39 -53
  16. package/dist/cli.js +4 -7
  17. package/dist/commands/api.js +220 -250
  18. package/dist/commands/api_keys.js +251 -314
  19. package/dist/commands/auth.js +283 -328
  20. package/dist/commands/bootstrap.js +372 -437
  21. package/dist/commands/branches.js +304 -455
  22. package/dist/commands/bucket.js +374 -514
  23. package/dist/commands/checkout.js +213 -298
  24. package/dist/commands/config.js +573 -690
  25. package/dist/commands/connection_string.js +137 -165
  26. package/dist/commands/data_api.js +238 -260
  27. package/dist/commands/databases.js +67 -76
  28. package/dist/commands/deploy.js +31 -25
  29. package/dist/commands/dev.js +639 -719
  30. package/dist/commands/diff.js +156 -200
  31. package/dist/commands/env.js +255 -305
  32. package/dist/commands/functions.js +275 -355
  33. package/dist/commands/index.js +70 -65
  34. package/dist/commands/init.js +84 -119
  35. package/dist/commands/inspect.js +55 -55
  36. package/dist/commands/ip_allow.js +88 -120
  37. package/dist/commands/link.js +874 -1019
  38. package/dist/commands/logs.js +291 -0
  39. package/dist/commands/neon_auth.js +725 -933
  40. package/dist/commands/operations.js +34 -25
  41. package/dist/commands/orgs.js +28 -18
  42. package/dist/commands/profile.js +615 -846
  43. package/dist/commands/projects.js +313 -373
  44. package/dist/commands/psql.js +60 -58
  45. package/dist/commands/roles.js +55 -58
  46. package/dist/commands/schema_diff.js +87 -131
  47. package/dist/commands/set_context.js +34 -26
  48. package/dist/commands/snapshots.js +288 -413
  49. package/dist/commands/status.js +41 -37
  50. package/dist/commands/user.js +21 -10
  51. package/dist/commands/vpc_endpoints.js +85 -113
  52. package/dist/config.js +7 -6
  53. package/dist/config_format.js +50 -66
  54. package/dist/config_template.js +128 -157
  55. package/dist/context.js +183 -235
  56. package/dist/current_branch_fast_path.js +40 -49
  57. package/dist/dev/env.js +2 -446
  58. package/dist/dev/functions.js +54 -68
  59. package/dist/dev/inputs.js +46 -58
  60. package/dist/dev/runtime.js +135 -164
  61. package/dist/dev/websocket.js +766 -959
  62. package/dist/env.js +27 -33
  63. package/dist/env_file.js +118 -132
  64. package/dist/env_services.js +2 -51
  65. package/dist/errors.js +57 -68
  66. package/dist/functions_api.js +45 -43
  67. package/dist/help.js +189 -140
  68. package/dist/index.js +182 -257
  69. package/dist/init/agents.js +137 -118
  70. package/dist/init/auth.js +58 -68
  71. package/dist/init/bootstrap.js +325 -396
  72. package/dist/init/build_config.js +4 -2
  73. package/dist/init/detect_agent.js +56 -101
  74. package/dist/init/editors.js +35 -52
  75. package/dist/init/enrich_output.js +51 -66
  76. package/dist/init/extension.js +134 -171
  77. package/dist/init/inspect.js +179 -266
  78. package/dist/init/interactive.js +510 -622
  79. package/dist/init/neonctl.js +117 -168
  80. package/dist/init/orchestrate.js +157 -173
  81. package/dist/init/phases/auth.js +188 -202
  82. package/dist/init/phases/cleanup.js +23 -23
  83. package/dist/init/phases/db.js +251 -277
  84. package/dist/init/phases/getting_started.js +213 -223
  85. package/dist/init/phases/mcp.js +174 -224
  86. package/dist/init/phases/migrations.js +247 -248
  87. package/dist/init/phases/neon_auth.js +114 -133
  88. package/dist/init/phases/setup.js +546 -703
  89. package/dist/init/phases/skills.js +75 -86
  90. package/dist/init/phases/status.js +72 -67
  91. package/dist/init/resolve_context.js +102 -99
  92. package/dist/init/route_command.js +91 -98
  93. package/dist/init/skills.js +174 -218
  94. package/dist/init/vsix.js +77 -99
  95. package/dist/log.js +17 -16
  96. package/dist/neon_services.js +104 -129
  97. package/dist/parameters.gen.js +481 -471
  98. package/dist/pkg.js +17 -19
  99. package/dist/profile_keys.js +44 -47
  100. package/dist/psql/cli.js +44 -47
  101. package/dist/psql/command/cmd_cond.js +231 -406
  102. package/dist/psql/command/cmd_connect.js +557 -764
  103. package/dist/psql/command/cmd_copy.js +728 -984
  104. package/dist/psql/command/cmd_describe.js +1499 -1688
  105. package/dist/psql/command/cmd_format.js +733 -905
  106. package/dist/psql/command/cmd_io.js +2 -2193
  107. package/dist/psql/command/cmd_lo.js +297 -359
  108. package/dist/psql/command/cmd_meta.js +727 -878
  109. package/dist/psql/command/cmd_misc.js +138 -172
  110. package/dist/psql/command/cmd_pipeline.js +2 -1148
  111. package/dist/psql/command/cmd_restrict.js +119 -155
  112. package/dist/psql/command/cmd_show.js +529 -688
  113. package/dist/psql/command/dispatch.js +260 -325
  114. package/dist/psql/command/inputQueue.js +35 -33
  115. package/dist/psql/command/shared.js +49 -63
  116. package/dist/psql/complete/filenames.js +90 -133
  117. package/dist/psql/complete/index.js +59 -97
  118. package/dist/psql/complete/matcher.js +236 -300
  119. package/dist/psql/complete/psqlVars.js +218 -223
  120. package/dist/psql/complete/queries.js +159 -177
  121. package/dist/psql/complete/rules.js +1493 -2299
  122. package/dist/psql/core/common.js +2 -1253
  123. package/dist/psql/core/help.js +456 -546
  124. package/dist/psql/core/mainloop.js +692 -1303
  125. package/dist/psql/core/prompt.js +391 -408
  126. package/dist/psql/core/settings.js +429 -644
  127. package/dist/psql/core/sqlHelp.js +480 -554
  128. package/dist/psql/core/startup.js +2 -846
  129. package/dist/psql/core/syncVars.js +67 -110
  130. package/dist/psql/core/variables.js +156 -278
  131. package/dist/psql/describe/formatters.js +884 -1285
  132. package/dist/psql/describe/processNamePattern.js +173 -260
  133. package/dist/psql/describe/queries.js +1368 -2403
  134. package/dist/psql/describe/versionGate.js +32 -41
  135. package/dist/psql/index.js +2 -2030
  136. package/dist/psql/io/history.js +232 -271
  137. package/dist/psql/io/input.js +103 -108
  138. package/dist/psql/io/lineEditor/buffer.js +238 -319
  139. package/dist/psql/io/lineEditor/complete.js +135 -213
  140. package/dist/psql/io/lineEditor/filename.js +139 -148
  141. package/dist/psql/io/lineEditor/index.js +653 -870
  142. package/dist/psql/io/lineEditor/keymap.js +544 -702
  143. package/dist/psql/io/lineEditor/vt100.js +294 -341
  144. package/dist/psql/io/pgpass.js +158 -187
  145. package/dist/psql/io/pgservice.js +146 -183
  146. package/dist/psql/io/psqlrc.js +328 -403
  147. package/dist/psql/print/aligned.js +1020 -1683
  148. package/dist/psql/print/asciidoc.js +180 -214
  149. package/dist/psql/print/crosstab.js +281 -442
  150. package/dist/psql/print/csv.js +48 -70
  151. package/dist/psql/print/html.js +195 -226
  152. package/dist/psql/print/json.js +75 -88
  153. package/dist/psql/print/latex.js +291 -364
  154. package/dist/psql/print/pager.js +171 -242
  155. package/dist/psql/print/troff.js +194 -226
  156. package/dist/psql/print/unaligned.js +69 -95
  157. package/dist/psql/print/units.js +167 -169
  158. package/dist/psql/scanner/slash.js +428 -483
  159. package/dist/psql/scanner/sql.js +445 -889
  160. package/dist/psql/scanner/stringutils.js +309 -379
  161. package/dist/psql/types/index.js +8 -7
  162. package/dist/psql/types/scanner.js +25 -22
  163. package/dist/psql/wire/connection.js +2042 -2803
  164. package/dist/psql/wire/copy.js +84 -100
  165. package/dist/psql/wire/notify.js +39 -59
  166. package/dist/psql/wire/pipeline.js +305 -518
  167. package/dist/psql/wire/protocol.js +349 -417
  168. package/dist/psql/wire/sasl.js +180 -265
  169. package/dist/psql/wire/tls.js +400 -561
  170. package/dist/storage_api.js +115 -129
  171. package/dist/test_utils/fixtures.js +94 -113
  172. package/dist/test_utils/oauth_server.js +10 -7
  173. package/dist/test_utils/project_dir.js +33 -0
  174. package/dist/utils/ai_gateway_notice.js +131 -162
  175. package/dist/utils/api_enums.js +21 -28
  176. package/dist/utils/auth.js +10 -4
  177. package/dist/utils/branch_notice.js +20 -19
  178. package/dist/utils/branch_picker.js +83 -89
  179. package/dist/utils/cli_name.js +15 -12
  180. package/dist/utils/compute_units.js +20 -27
  181. package/dist/utils/config_diff.js +127 -158
  182. package/dist/utils/enrichers.js +95 -148
  183. package/dist/utils/esbuild.js +130 -189
  184. package/dist/utils/flags.js +35 -47
  185. package/dist/utils/formats.js +8 -15
  186. package/dist/utils/git_diff.js +69 -80
  187. package/dist/utils/inspect_db.js +101 -143
  188. package/dist/utils/inspect_queries.js +179 -142
  189. package/dist/utils/middlewares.js +39 -45
  190. package/dist/utils/openapi.js +87 -99
  191. package/dist/utils/package_manager.js +312 -110
  192. package/dist/utils/point_in_time.js +49 -53
  193. package/dist/utils/psql.js +89 -106
  194. package/dist/utils/service_picker.js +55 -58
  195. package/dist/utils/string.js +5 -5
  196. package/dist/utils/ui.js +38 -55
  197. package/dist/utils/write_sync.js +26 -35
  198. package/dist/utils/zip.js +4 -3
  199. package/dist/writer.js +67 -87
  200. package/package.json +11 -6
  201. package/dist/_shared/auth_selection.js +0 -86
  202. package/dist/_shared/credentials.js +0 -209
  203. package/dist/_shared/env-core/env.js +0 -558
  204. package/dist/_shared/env-core/reuse-secrets.js +0 -223
  205. package/dist/_shared/paths.js +0 -148
  206. package/dist/_shared/profiles.js +0 -276
  207. package/dist/_shared/secure_file.js +0 -43
@@ -0,0 +1,217 @@
1
+ import { t as writeSecretFile } from "./secure_file-BucZj4yQ.js";
2
+ import { n as credentialsPath, o as resolveConfigFile, r as defaultDir } from "./paths-DMq0Lt7a.js";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { isAbsolute, relative, resolve } from "node:path";
5
+ //#region ../../internals/cli-core/dist/profiles.js
6
+ /**
7
+ * # Profiles — several Neon accounts in one config directory
8
+ *
9
+ * A profile is **a pointer to a credentials file**. Nothing more. That constraint is what
10
+ * keeps the feature small: there is no mirror, no per-profile directory tree, no persistent
11
+ * "active profile" state to fall out of sync, and no migration.
12
+ *
13
+ * ```
14
+ * ~/.config/neon/
15
+ * ├── credentials.json # this IS the DEFAULT profile, not a copy of it
16
+ * ├── credentials.work.json # created by `neon auth --profile work`
17
+ * └── profiles.json # created only once a second profile exists
18
+ * ```
19
+ *
20
+ * `profiles.json` maps a name to a path, and the path may point anywhere — which is what
21
+ * makes adopting an existing directory a one-line edit rather than an import command:
22
+ *
23
+ * ```json
24
+ * {
25
+ * "version": 1,
26
+ * "profiles": {
27
+ * "DEFAULT": { "credentials": "credentials.json" },
28
+ * "work": {
29
+ * "credentials": "../neonctl-databricks/credentials.json",
30
+ * "label": "someone@example.com"
31
+ * }
32
+ * }
33
+ * }
34
+ * ```
35
+ *
36
+ * ## Selection
37
+ *
38
+ * `--profile` → `NEON_PROFILE` → `DEFAULT`. Per invocation, like `AWS_PROFILE`; there is no
39
+ * `profile use` command, so nothing persists that could disagree with what you typed.
40
+ *
41
+ * ## Compatibility
42
+ *
43
+ * An install with no `profiles.json` is already a valid `DEFAULT`-only state: `DEFAULT`
44
+ * resolves to `credentials.json` in the config directory (including an existing one in the
45
+ * legacy `neonctl` directory — see `./paths.ts`). Nothing is created until a second
46
+ * profile is, and nothing is ever moved.
47
+ */
48
+ const PROFILES_FILE = "profiles.json";
49
+ /** The implicit profile. Backed by plain `credentials.json`, with or without a profiles file. */
50
+ const DEFAULT_PROFILE = "DEFAULT";
51
+ /** Profile names become part of a filename, so keep them boring. */
52
+ const NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
53
+ /** Which profile this invocation should use: `--profile` → `NEON_PROFILE` → `DEFAULT`. */
54
+ const selectProfileName = (flag, env = process.env) => nonEmpty(flag) ?? nonEmpty(env.NEON_PROFILE) ?? "DEFAULT";
55
+ const assertValidProfileName = (name) => {
56
+ if (!NAME_PATTERN.test(name)) throw new Error(`Invalid profile name "${name}". Use letters, digits, dot, dash or underscore, starting with a letter or digit.`);
57
+ };
58
+ /** Where `profiles.json` lives for this config directory (whether or not it exists yet). */
59
+ const profilesFilePath = (dir) => resolveConfigFile(PROFILES_FILE, dir === defaultDir ? {} : { dir }).path;
60
+ /**
61
+ * Read and classify `profiles.json` without deciding what to do about it.
62
+ *
63
+ * Entry keys and shapes are validated here rather than at each use. A key is a profile name,
64
+ * and a name that `assertValidProfileName` would reject cannot have been written by this CLI —
65
+ * it would travel into error messages as a recovery command nobody can run, and into a
66
+ * `credentials.<name>.json` filename.
67
+ */
68
+ const inspectProfiles = (dir) => {
69
+ const path = profilesFilePath(dir);
70
+ if (!existsSync(path)) return { kind: "absent" };
71
+ const broken = (why) => ({
72
+ kind: "unusable",
73
+ reason: `${path} could not be read as a profiles file: ${why}`
74
+ });
75
+ let contents;
76
+ try {
77
+ contents = readFileSync(path, "utf8");
78
+ } catch (err) {
79
+ const code = err.code;
80
+ return broken(code ? `reading it failed with ${code}` : "reading it failed");
81
+ }
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(contents);
85
+ } catch {
86
+ return broken("it is not valid JSON");
87
+ }
88
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) return broken("it does not contain an object");
89
+ const profiles = parsed.profiles;
90
+ if (profiles === null || typeof profiles !== "object" || Array.isArray(profiles)) return broken("it has no `profiles` object");
91
+ for (const [name, entry] of Object.entries(profiles)) {
92
+ if (!NAME_PATTERN.test(name)) return broken(`"${name}" is not a valid profile name`);
93
+ if (entry === null || typeof entry !== "object" || typeof entry.credentials !== "string" || entry.credentials.trim() === "") return broken(`profile "${name}" has no \`credentials\` path`);
94
+ }
95
+ return {
96
+ kind: "ok",
97
+ file: {
98
+ version: 1,
99
+ profiles
100
+ }
101
+ };
102
+ };
103
+ /**
104
+ * Read `profiles.json`, or `null` when there is nothing usable there.
105
+ *
106
+ * A malformed file is reported through `onWarn` and treated as absent, because for a *read* the
107
+ * worst case is a named profile turning up missing, which is recoverable — whereas throwing
108
+ * would lock the user out of `neon auth` itself. Writing is the opposite: see
109
+ * {@link upsertProfile}, which refuses rather than rebuilding a file it cannot read.
110
+ */
111
+ const readProfiles = (dir, onWarn = () => {}) => {
112
+ const read = inspectProfiles(dir);
113
+ if (read.kind === "ok") return read.file;
114
+ if (read.kind === "unusable") onWarn(read.reason);
115
+ return null;
116
+ };
117
+ /**
118
+ * Refuse to act on a named profile when the file that defines it cannot be read.
119
+ *
120
+ * Call this **before** anything that writes a credential, opens a browser, or spends an API
121
+ * call. {@link upsertProfile} refuses too, but it runs last: by then `create` has already
122
+ * overwritten `credentials.<name>.json` and revoked the key it replaced, and `neon auth
123
+ * --profile` has already signed in over it — a refusal that arrives after the destruction it
124
+ * exists to prevent. The path resolution itself is the unsound part, since with the metadata
125
+ * unreadable the conventional filename is a guess about which account that file belongs to.
126
+ *
127
+ * `DEFAULT` is exempt: it is defined by the absence of metadata rather than by an entry, so
128
+ * signing in normally must keep working while a broken `profiles.json` is repaired.
129
+ */
130
+ const assertProfilesUsable = (dir, name) => {
131
+ if (name === "DEFAULT") return;
132
+ const read = inspectProfiles(dir);
133
+ if (read.kind === "unusable") throw new Error(`${read.reason}. Fix or delete the file before working with profile "${name}" — it is the only record of where each account's credentials live.`);
134
+ };
135
+ /** Resolve a profile to an absolute credentials path. Throws when a named profile is unknown. */
136
+ const resolveProfile = (dir, name) => {
137
+ const read = inspectProfiles(dir);
138
+ if (read.kind === "unusable" && name !== "DEFAULT") throw new Error(`${read.reason}. Fix or delete the file — every named profile is defined in it.`);
139
+ const file = read.kind === "ok" ? read.file : null;
140
+ const entry = file?.profiles[name];
141
+ if (entry) return {
142
+ name,
143
+ credentialsPath: resolveEntryPath(dir, entry.credentials),
144
+ ...entry.label ? { label: entry.label } : {},
145
+ ...entry.userId ? { userId: entry.userId } : {},
146
+ declared: true
147
+ };
148
+ if (name === "DEFAULT") return {
149
+ name,
150
+ credentialsPath: credentialsPath(dir),
151
+ declared: false
152
+ };
153
+ const known = file ? Object.keys(file.profiles).join(", ") : DEFAULT_PROFILE;
154
+ throw new Error(`Unknown profile "${name}". Known profiles: ${known}. Create it with \`neon profile create ${name}\`.`);
155
+ };
156
+ /** Default location for a new named profile's credentials file. */
157
+ const newProfileCredentialsPath = (dir, name) => resolve(dir, `credentials.${name}.json`);
158
+ /**
159
+ * Record a profile, creating `profiles.json` if this is the first named one.
160
+ *
161
+ * When the file is created, `DEFAULT` is written explicitly and pointed at wherever
162
+ * `credentials.json` actually is. That matters for an install predating the directory
163
+ * rename: `profiles.json` is created in `neon/` while the credentials are still in
164
+ * `neonctl/`, so `DEFAULT` is recorded as `../neonctl/credentials.json` rather than a
165
+ * relative name that would resolve to a file that isn't there.
166
+ */
167
+ const upsertProfile = (dir, name, entry) => {
168
+ assertValidProfileName(name);
169
+ const path = profilesFilePath(dir);
170
+ const read = inspectProfiles(dir);
171
+ if (read.kind === "unusable") throw new Error(`${read.reason}. Refusing to rewrite it, because doing so would discard the profiles it defines. Fix or delete the file, then re-run.`);
172
+ const file = read.kind === "ok" ? read.file : {
173
+ version: 1,
174
+ profiles: { [DEFAULT_PROFILE]: { credentials: relativeToProfiles(path, credentialsPath(dir)) } }
175
+ };
176
+ file.profiles[name] = {
177
+ credentials: relativeToProfiles(path, entry.credentials),
178
+ ...entry.label ? { label: entry.label } : {},
179
+ ...entry.userId ? { userId: entry.userId } : {}
180
+ };
181
+ writeProfiles(path, file);
182
+ };
183
+ /**
184
+ * True when only `DEFAULT` is left, so `profiles.json` no longer earns its place. Mirrors
185
+ * lazy creation: a single-account install has no profiles file, before or after.
186
+ */
187
+ const onlyDefaultRemains = (file) => {
188
+ const names = Object.keys(file.profiles);
189
+ return names.length === 0 || names.length === 1 && names[0] === "DEFAULT";
190
+ };
191
+ const listProfiles = (dir) => {
192
+ const read = inspectProfiles(dir);
193
+ if (read.kind === "unusable") throw new Error(`${read.reason}. Fix or delete the file — every named profile is defined in it.`);
194
+ const file = read.kind === "ok" ? read.file : null;
195
+ if (!file) return [resolveProfile(dir, DEFAULT_PROFILE)];
196
+ const names = Object.keys(file.profiles);
197
+ if (!names.includes("DEFAULT")) names.unshift(DEFAULT_PROFILE);
198
+ return names.map((name) => resolveProfile(dir, name));
199
+ };
200
+ const writeProfiles = (path, file) => {
201
+ writeSecretFile(path, `${JSON.stringify(file, null, 2)}\n`);
202
+ };
203
+ const resolveEntryPath = (dir, entry) => isAbsolute(entry) ? entry : resolve(profilesDir(dir), entry);
204
+ /** `profiles.json` may sit in the legacy directory, so entries resolve against its own dir. */
205
+ const profilesDir = (dir) => resolve(profilesFilePath(dir), "..");
206
+ /** Keep entries relative when they sit near `profiles.json`; absolute paths stay absolute. */
207
+ const relativeToProfiles = (profilesPath, target) => {
208
+ const rel = relative(resolve(profilesPath, ".."), target);
209
+ return rel && !isAbsolute(rel) ? rel : target;
210
+ };
211
+ function nonEmpty(value) {
212
+ if (typeof value !== "string") return void 0;
213
+ const trimmed = value.trim();
214
+ return trimmed === "" ? void 0 : trimmed;
215
+ }
216
+ //#endregion
217
+ export { newProfileCredentialsPath as a, readProfiles as c, upsertProfile as d, listProfiles as i, resolveProfile as l, assertProfilesUsable as n, onlyDefaultRemains as o, assertValidProfileName as r, profilesFilePath as s, DEFAULT_PROFILE as t, selectProfileName as u };