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.
Files changed (198) hide show
  1. package/README.md +54 -0
  2. package/dist/_shared/auth_selection.js +76 -79
  3. package/dist/_shared/credentials.js +166 -187
  4. package/dist/_shared/env-core/env.js +354 -517
  5. package/dist/_shared/env-core/reuse-secrets.js +159 -203
  6. package/dist/_shared/paths.js +129 -126
  7. package/dist/_shared/profiles.js +192 -242
  8. package/dist/_shared/secure_file.js +36 -38
  9. package/dist/_virtual/_rolldown/runtime.js +13 -0
  10. package/dist/analytics.js +163 -207
  11. package/dist/api.js +815 -758
  12. package/dist/auth.js +121 -141
  13. package/dist/auth_context.js +39 -53
  14. package/dist/cli.js +4 -7
  15. package/dist/commands/api.js +220 -250
  16. package/dist/commands/api_keys.js +251 -314
  17. package/dist/commands/auth.js +283 -328
  18. package/dist/commands/bootstrap.js +372 -437
  19. package/dist/commands/branches.js +304 -455
  20. package/dist/commands/bucket.js +374 -514
  21. package/dist/commands/checkout.js +213 -298
  22. package/dist/commands/config.js +573 -690
  23. package/dist/commands/connection_string.js +137 -165
  24. package/dist/commands/data_api.js +238 -260
  25. package/dist/commands/databases.js +67 -76
  26. package/dist/commands/deploy.js +31 -25
  27. package/dist/commands/dev.js +639 -719
  28. package/dist/commands/diff.js +156 -200
  29. package/dist/commands/env.js +243 -303
  30. package/dist/commands/functions.js +275 -355
  31. package/dist/commands/index.js +70 -65
  32. package/dist/commands/init.js +84 -119
  33. package/dist/commands/inspect.js +55 -55
  34. package/dist/commands/ip_allow.js +88 -120
  35. package/dist/commands/link.js +874 -1019
  36. package/dist/commands/logs.js +291 -0
  37. package/dist/commands/neon_auth.js +725 -933
  38. package/dist/commands/operations.js +34 -25
  39. package/dist/commands/orgs.js +28 -18
  40. package/dist/commands/profile.js +614 -845
  41. package/dist/commands/projects.js +313 -373
  42. package/dist/commands/psql.js +60 -58
  43. package/dist/commands/roles.js +55 -58
  44. package/dist/commands/schema_diff.js +87 -131
  45. package/dist/commands/set_context.js +34 -26
  46. package/dist/commands/snapshots.js +288 -413
  47. package/dist/commands/status.js +41 -37
  48. package/dist/commands/user.js +21 -10
  49. package/dist/commands/vpc_endpoints.js +85 -113
  50. package/dist/config.js +7 -6
  51. package/dist/config_format.js +50 -66
  52. package/dist/config_template.js +128 -157
  53. package/dist/context.js +183 -235
  54. package/dist/current_branch_fast_path.js +40 -49
  55. package/dist/dev/env.js +313 -394
  56. package/dist/dev/functions.js +54 -68
  57. package/dist/dev/inputs.js +46 -58
  58. package/dist/dev/runtime.js +135 -164
  59. package/dist/dev/websocket.js +766 -959
  60. package/dist/env.js +27 -33
  61. package/dist/env_file.js +118 -132
  62. package/dist/env_services.js +36 -38
  63. package/dist/errors.js +57 -68
  64. package/dist/functions_api.js +45 -43
  65. package/dist/help.js +189 -140
  66. package/dist/index.js +182 -257
  67. package/dist/init/agents.js +137 -118
  68. package/dist/init/auth.js +58 -68
  69. package/dist/init/bootstrap.js +325 -396
  70. package/dist/init/build_config.js +4 -2
  71. package/dist/init/detect_agent.js +56 -101
  72. package/dist/init/editors.js +35 -52
  73. package/dist/init/enrich_output.js +51 -66
  74. package/dist/init/extension.js +134 -171
  75. package/dist/init/inspect.js +179 -266
  76. package/dist/init/interactive.js +510 -622
  77. package/dist/init/neonctl.js +117 -168
  78. package/dist/init/orchestrate.js +157 -173
  79. package/dist/init/phases/auth.js +188 -202
  80. package/dist/init/phases/cleanup.js +23 -23
  81. package/dist/init/phases/db.js +251 -277
  82. package/dist/init/phases/getting_started.js +213 -223
  83. package/dist/init/phases/mcp.js +174 -224
  84. package/dist/init/phases/migrations.js +247 -248
  85. package/dist/init/phases/neon_auth.js +114 -133
  86. package/dist/init/phases/setup.js +546 -703
  87. package/dist/init/phases/skills.js +75 -86
  88. package/dist/init/phases/status.js +72 -67
  89. package/dist/init/resolve_context.js +102 -99
  90. package/dist/init/route_command.js +91 -98
  91. package/dist/init/skills.js +174 -218
  92. package/dist/init/vsix.js +77 -99
  93. package/dist/log.js +17 -16
  94. package/dist/neon_services.js +104 -129
  95. package/dist/parameters.gen.js +481 -471
  96. package/dist/pkg.js +17 -19
  97. package/dist/profile_keys.js +44 -47
  98. package/dist/psql/cli.js +44 -47
  99. package/dist/psql/command/cmd_cond.js +231 -406
  100. package/dist/psql/command/cmd_connect.js +557 -764
  101. package/dist/psql/command/cmd_copy.js +727 -983
  102. package/dist/psql/command/cmd_describe.js +1499 -1688
  103. package/dist/psql/command/cmd_format.js +733 -905
  104. package/dist/psql/command/cmd_io.js +1293 -2082
  105. package/dist/psql/command/cmd_lo.js +297 -359
  106. package/dist/psql/command/cmd_meta.js +727 -878
  107. package/dist/psql/command/cmd_misc.js +138 -172
  108. package/dist/psql/command/cmd_pipeline.js +547 -1099
  109. package/dist/psql/command/cmd_restrict.js +119 -155
  110. package/dist/psql/command/cmd_show.js +529 -688
  111. package/dist/psql/command/dispatch.js +261 -325
  112. package/dist/psql/command/inputQueue.js +35 -33
  113. package/dist/psql/command/shared.js +49 -63
  114. package/dist/psql/complete/filenames.js +90 -133
  115. package/dist/psql/complete/index.js +59 -97
  116. package/dist/psql/complete/matcher.js +236 -300
  117. package/dist/psql/complete/psqlVars.js +218 -223
  118. package/dist/psql/complete/queries.js +159 -177
  119. package/dist/psql/complete/rules.js +1493 -2299
  120. package/dist/psql/core/common.js +762 -1180
  121. package/dist/psql/core/help.js +456 -546
  122. package/dist/psql/core/mainloop.js +692 -1302
  123. package/dist/psql/core/prompt.js +391 -408
  124. package/dist/psql/core/settings.js +429 -644
  125. package/dist/psql/core/sqlHelp.js +480 -554
  126. package/dist/psql/core/startup.js +626 -815
  127. package/dist/psql/core/syncVars.js +67 -110
  128. package/dist/psql/core/variables.js +156 -278
  129. package/dist/psql/describe/formatters.js +884 -1285
  130. package/dist/psql/describe/processNamePattern.js +173 -260
  131. package/dist/psql/describe/queries.js +1368 -2403
  132. package/dist/psql/describe/versionGate.js +32 -41
  133. package/dist/psql/index.js +1414 -1927
  134. package/dist/psql/io/history.js +232 -271
  135. package/dist/psql/io/input.js +103 -108
  136. package/dist/psql/io/lineEditor/buffer.js +238 -319
  137. package/dist/psql/io/lineEditor/complete.js +135 -213
  138. package/dist/psql/io/lineEditor/filename.js +139 -148
  139. package/dist/psql/io/lineEditor/index.js +653 -870
  140. package/dist/psql/io/lineEditor/keymap.js +544 -702
  141. package/dist/psql/io/lineEditor/vt100.js +294 -341
  142. package/dist/psql/io/pgpass.js +158 -187
  143. package/dist/psql/io/pgservice.js +146 -183
  144. package/dist/psql/io/psqlrc.js +328 -403
  145. package/dist/psql/print/aligned.js +1020 -1683
  146. package/dist/psql/print/asciidoc.js +180 -214
  147. package/dist/psql/print/crosstab.js +281 -442
  148. package/dist/psql/print/csv.js +48 -70
  149. package/dist/psql/print/html.js +195 -226
  150. package/dist/psql/print/json.js +75 -88
  151. package/dist/psql/print/latex.js +291 -364
  152. package/dist/psql/print/pager.js +171 -242
  153. package/dist/psql/print/troff.js +194 -226
  154. package/dist/psql/print/unaligned.js +69 -95
  155. package/dist/psql/print/units.js +167 -169
  156. package/dist/psql/scanner/slash.js +428 -483
  157. package/dist/psql/scanner/sql.js +445 -889
  158. package/dist/psql/scanner/stringutils.js +309 -379
  159. package/dist/psql/types/index.js +2 -7
  160. package/dist/psql/types/scanner.js +25 -22
  161. package/dist/psql/wire/connection.js +2042 -2803
  162. package/dist/psql/wire/copy.js +84 -100
  163. package/dist/psql/wire/notify.js +39 -59
  164. package/dist/psql/wire/pipeline.js +305 -518
  165. package/dist/psql/wire/protocol.js +349 -417
  166. package/dist/psql/wire/sasl.js +180 -265
  167. package/dist/psql/wire/tls.js +400 -561
  168. package/dist/storage_api.js +115 -129
  169. package/dist/test_utils/fixtures.js +94 -113
  170. package/dist/test_utils/oauth_server.js +10 -7
  171. package/dist/test_utils/project_dir.js +33 -0
  172. package/dist/utils/ai_gateway_notice.js +131 -162
  173. package/dist/utils/api_enums.js +21 -28
  174. package/dist/utils/auth.js +10 -4
  175. package/dist/utils/branch_notice.js +20 -19
  176. package/dist/utils/branch_picker.js +83 -89
  177. package/dist/utils/cli_name.js +15 -12
  178. package/dist/utils/compute_units.js +20 -27
  179. package/dist/utils/config_diff.js +127 -158
  180. package/dist/utils/enrichers.js +95 -148
  181. package/dist/utils/esbuild.js +130 -189
  182. package/dist/utils/flags.js +35 -47
  183. package/dist/utils/formats.js +8 -15
  184. package/dist/utils/git_diff.js +69 -80
  185. package/dist/utils/inspect_db.js +101 -143
  186. package/dist/utils/inspect_queries.js +179 -142
  187. package/dist/utils/middlewares.js +37 -44
  188. package/dist/utils/openapi.js +87 -99
  189. package/dist/utils/package_manager.js +312 -110
  190. package/dist/utils/point_in_time.js +49 -53
  191. package/dist/utils/psql.js +89 -106
  192. package/dist/utils/service_picker.js +55 -58
  193. package/dist/utils/string.js +5 -5
  194. package/dist/utils/ui.js +38 -55
  195. package/dist/utils/write_sync.js +26 -35
  196. package/dist/utils/zip.js +4 -3
  197. package/dist/writer.js +67 -87
  198. package/package.json +7 -5
@@ -1,40 +1,44 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
1
2
  import { fillSingleProject } from "../utils/enrichers.js";
2
3
  import { status } from "./config.js";
4
+ //#region src/commands/status.ts
5
+ var status_exports = /* @__PURE__ */ __exportAll({
6
+ builder: () => builder,
7
+ command: () => command,
8
+ describe: () => describe,
9
+ handler: () => handler
10
+ });
3
11
  /**
4
- * `neon status` is a top-level alias for `neon config status` — the most-reached-for
5
- * config subcommand. It mirrors that command's options (including `--current-branch`,
6
- * the offline branch probe) and delegates to the same `status` handler.
7
- *
8
- * Because it has a handler but no subcommands, `status` must also be listed in
9
- * `NO_SUBCOMMANDS_VERBS` (see index.ts) so the help-fallback middleware doesn't
10
- * intercept a bare `neon status`.
11
- */
12
- export const command = "status";
13
- export const describe = "Show the branch's live Neon state (alias of `config status`)";
14
- export const builder = (argv) => argv
15
- .usage("$0 status [options]")
16
- .options({
17
- "project-id": {
18
- describe: "Project ID",
19
- type: "string",
20
- },
21
- branch: {
22
- describe: "Branch ID or name",
23
- type: "string",
24
- },
25
- "config-json": {
26
- describe: "Print only the branch's live config as neon.ts-shaped JSON " +
27
- "(services + branch tuning + preview), to stdout. Useful for " +
28
- "scripting or copying into a neon.ts.",
29
- type: "boolean",
30
- default: false,
31
- },
32
- "current-branch": {
33
- describe: "Print only the linked branch name from the local .neon file " +
34
- "(no network). Exits non-zero when no branch is pinned.",
35
- type: "boolean",
36
- default: false,
37
- },
38
- })
39
- .middleware(fillSingleProject);
40
- export const handler = (args) => status(args);
12
+ * `neon status` is a top-level alias for `neon config status` — the most-reached-for
13
+ * config subcommand. It mirrors that command's options (including `--current-branch`,
14
+ * the offline branch probe) and delegates to the same `status` handler.
15
+ *
16
+ * Because it has a handler but no subcommands, `status` must also be listed in
17
+ * `NO_SUBCOMMANDS_VERBS` (see index.ts) so the help-fallback middleware doesn't
18
+ * intercept a bare `neon status`.
19
+ */
20
+ const command = "status";
21
+ const describe = "Show the branch's live Neon state (alias of `config status`)";
22
+ const builder = (argv) => argv.usage("$0 status [options]").options({
23
+ "project-id": {
24
+ describe: "Project ID",
25
+ type: "string"
26
+ },
27
+ branch: {
28
+ describe: "Branch ID or name",
29
+ type: "string"
30
+ },
31
+ "config-json": {
32
+ describe: "Print only the branch's live config as neon.ts-shaped JSON (services + branch tuning + preview), to stdout. Useful for scripting or copying into a neon.ts.",
33
+ type: "boolean",
34
+ default: false
35
+ },
36
+ "current-branch": {
37
+ describe: "Print only the linked branch name from the local .neon file (no network). Exits non-zero when no branch is pinned.",
38
+ type: "boolean",
39
+ default: false
40
+ }
41
+ }).middleware(fillSingleProject);
42
+ const handler = (args) => status(args);
43
+ //#endregion
44
+ export { builder, command, describe, handler, status_exports };
@@ -1,15 +1,26 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
1
2
  import { writer } from "../writer.js";
2
- export const command = "me";
3
- export const describe = "Show current user";
4
- export const builder = (yargs) => yargs.option("context-file", {
5
- hidden: true,
3
+ //#region src/commands/user.ts
4
+ var user_exports = /* @__PURE__ */ __exportAll({
5
+ builder: () => builder,
6
+ command: () => "me",
7
+ describe: () => describe,
8
+ handler: () => handler
6
9
  });
7
- export const handler = async (args) => {
8
- await me(args);
10
+ const command = "me";
11
+ const describe = "Show current user";
12
+ const builder = (yargs) => yargs.option("context-file", { hidden: true });
13
+ const handler = async (args) => {
14
+ await me(args);
9
15
  };
10
16
  const me = async (props) => {
11
- const { data } = await props.apiClient.getCurrentUserInfo();
12
- writer(props).end(data, {
13
- fields: ["login", "email", "name", "projects_limit"],
14
- });
17
+ const { data } = await props.apiClient.getCurrentUserInfo();
18
+ writer(props).end(data, { fields: [
19
+ "login",
20
+ "email",
21
+ "name",
22
+ "projects_limit"
23
+ ] });
15
24
  };
25
+ //#endregion
26
+ export { builder, command, describe, handler, user_exports };
@@ -1,134 +1,106 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
1
2
  import { log } from "../log.js";
2
- import { fillSingleOrg, fillSingleProject } from "../utils/enrichers.js";
3
3
  import { writer } from "../writer.js";
4
+ import { fillSingleOrg, fillSingleProject } from "../utils/enrichers.js";
4
5
  import { REGIONS } from "./projects.js";
6
+ //#region src/commands/vpc_endpoints.ts
7
+ var vpc_endpoints_exports = /* @__PURE__ */ __exportAll({
8
+ builder: () => builder,
9
+ command: () => "vpc",
10
+ describe: () => describe
11
+ });
5
12
  const VPC_ENDPOINT_FIELDS = ["vpc_endpoint_id", "label"];
6
13
  const VPC_ENDPOINT_DETAILS_FIELDS = [
7
- "vpc_endpoint_id",
8
- "label",
9
- "state",
10
- "num_restricted_projects",
11
- "example_restricted_projects",
14
+ "vpc_endpoint_id",
15
+ "label",
16
+ "state",
17
+ "num_restricted_projects",
18
+ "example_restricted_projects"
12
19
  ];
13
- export const command = "vpc";
14
- export const describe = "Manage VPC endpoints and project VPC restrictions";
15
- export const builder = (argv) => {
16
- return argv
17
- .usage("$0 vpc <sub-command> [options]")
18
- .command("endpoint", "Manage VPC endpoints.\n" +
19
- "See: https://neon.tech/docs/guides/neon-private-networking\n" +
20
- "After adding an endpoint to an organization, client connections will be accepted\n" +
21
- "from the corresponding VPC for all projects in the organization, unless overridden\n" +
22
- "by a project-level VPC endpoint restriction.", (yargs) => {
23
- return yargs
24
- .options({
25
- "org-id": {
26
- describe: "Organization ID",
27
- type: "string",
28
- },
29
- "region-id": {
30
- describe: `The region ID. Possible values: ${REGIONS.join(", ")}`,
31
- type: "string",
32
- demandOption: true,
33
- },
34
- })
35
- .middleware(fillSingleOrg)
36
- .command("list", "List configured VPC endpoints for this organization.", (yargs) => yargs, async (args) => {
37
- await listOrg(args);
38
- })
39
- .command({
40
- command: "assign <id>",
41
- aliases: ["update <id>", "add <id>"],
42
- describe: "Add or update a VPC endpoint for this organization.\n" +
43
- "Note: Azure regions are not yet supported.",
44
- builder: (yargs) => yargs.options({
45
- label: {
46
- describe: "An optional descriptive label for the VPC endpoint",
47
- type: "string",
48
- },
49
- }),
50
- handler: async (args) => {
51
- await assignOrg(args);
52
- },
53
- })
54
- .command("remove <id>", "Remove a VPC endpoint from this organization.", (yargs) => yargs, async (args) => {
55
- await removeOrg(args);
56
- })
57
- .command("status <id>", "Get the status of a VPC endpoint for this organization.", (yargs) => yargs, async (args) => {
58
- await statusOrg(args);
59
- });
60
- })
61
- .command("project", "Manage project-level VPC endpoint restrictions.\n" +
62
- "By default, connections are accepted from any VPC configured at the organization level.\n" +
63
- "A project-level VPC endpoint restriction can be used to restrict connections to a specific VPC.", (yargs) => {
64
- return yargs
65
- .options({
66
- "project-id": {
67
- describe: "Project ID",
68
- type: "string",
69
- },
70
- })
71
- .middleware(fillSingleProject)
72
- .command("list", "List VPC endpoint restrictions for this project.", (yargs) => yargs, async (args) => {
73
- await listProject(args);
74
- })
75
- .command({
76
- command: "restrict <id>",
77
- aliases: ["update <id>"],
78
- describe: "Configure or update a VPC endpoint restriction for this project.",
79
- builder: (yargs) => yargs.options({
80
- label: {
81
- describe: "An optional descriptive label for the VPC endpoint restriction",
82
- type: "string",
83
- },
84
- }),
85
- handler: async (args) => {
86
- await assignProject(args);
87
- },
88
- })
89
- .command("remove <id>", "Remove a VPC endpoint restriction from this project.", (yargs) => yargs, async (args) => {
90
- await removeProject(args);
91
- });
92
- });
20
+ const command = "vpc";
21
+ const describe = "Manage VPC endpoints and project VPC restrictions";
22
+ const builder = (argv) => {
23
+ return argv.usage("$0 vpc <sub-command> [options]").command("endpoint", "Manage VPC endpoints.\nSee: https://neon.tech/docs/guides/neon-private-networking\nAfter adding an endpoint to an organization, client connections will be accepted\nfrom the corresponding VPC for all projects in the organization, unless overridden\nby a project-level VPC endpoint restriction.", (yargs) => {
24
+ return yargs.options({
25
+ "org-id": {
26
+ describe: "Organization ID",
27
+ type: "string"
28
+ },
29
+ "region-id": {
30
+ describe: `The region ID. Possible values: ${REGIONS.join(", ")}`,
31
+ type: "string",
32
+ demandOption: true
33
+ }
34
+ }).middleware(fillSingleOrg).command("list", "List configured VPC endpoints for this organization.", (yargs) => yargs, async (args) => {
35
+ await listOrg(args);
36
+ }).command({
37
+ command: "assign <id>",
38
+ aliases: ["update <id>", "add <id>"],
39
+ describe: "Add or update a VPC endpoint for this organization.\nNote: Azure regions are not yet supported.",
40
+ builder: (yargs) => yargs.options({ label: {
41
+ describe: "An optional descriptive label for the VPC endpoint",
42
+ type: "string"
43
+ } }),
44
+ handler: async (args) => {
45
+ await assignOrg(args);
46
+ }
47
+ }).command("remove <id>", "Remove a VPC endpoint from this organization.", (yargs) => yargs, async (args) => {
48
+ await removeOrg(args);
49
+ }).command("status <id>", "Get the status of a VPC endpoint for this organization.", (yargs) => yargs, async (args) => {
50
+ await statusOrg(args);
51
+ });
52
+ }).command("project", "Manage project-level VPC endpoint restrictions.\nBy default, connections are accepted from any VPC configured at the organization level.\nA project-level VPC endpoint restriction can be used to restrict connections to a specific VPC.", (yargs) => {
53
+ return yargs.options({ "project-id": {
54
+ describe: "Project ID",
55
+ type: "string"
56
+ } }).middleware(fillSingleProject).command("list", "List VPC endpoint restrictions for this project.", (yargs) => yargs, async (args) => {
57
+ await listProject(args);
58
+ }).command({
59
+ command: "restrict <id>",
60
+ aliases: ["update <id>"],
61
+ describe: "Configure or update a VPC endpoint restriction for this project.",
62
+ builder: (yargs) => yargs.options({ label: {
63
+ describe: "An optional descriptive label for the VPC endpoint restriction",
64
+ type: "string"
65
+ } }),
66
+ handler: async (args) => {
67
+ await assignProject(args);
68
+ }
69
+ }).command("remove <id>", "Remove a VPC endpoint restriction from this project.", (yargs) => yargs, async (args) => {
70
+ await removeProject(args);
71
+ });
72
+ });
93
73
  };
94
74
  const listOrg = async (props) => {
95
- const { data } = await props.apiClient.listOrganizationVpcEndpoints(props.orgId, props.regionId);
96
- writer(props).end(data.endpoints, {
97
- fields: VPC_ENDPOINT_FIELDS,
98
- });
75
+ const { data } = await props.apiClient.listOrganizationVpcEndpoints(props.orgId, props.regionId);
76
+ writer(props).end(data.endpoints, { fields: VPC_ENDPOINT_FIELDS });
99
77
  };
100
78
  const assignOrg = async (props) => {
101
- const vpcEndpointAssignment = {
102
- label: props.label || "",
103
- };
104
- const { data } = await props.apiClient.assignOrganizationVpcEndpoint(props.orgId, props.regionId, props.id, vpcEndpointAssignment);
105
- writer(props).end(data, { fields: [] });
106
- if (props.regionId.startsWith("azure")) {
107
- log.info("VPC endpoint configuration is not supported for Azure regions");
108
- }
79
+ const vpcEndpointAssignment = { label: props.label || "" };
80
+ const { data } = await props.apiClient.assignOrganizationVpcEndpoint(props.orgId, props.regionId, props.id, vpcEndpointAssignment);
81
+ writer(props).end(data, { fields: [] });
82
+ if (props.regionId.startsWith("azure")) log.info("VPC endpoint configuration is not supported for Azure regions");
109
83
  };
110
84
  const removeOrg = async (props) => {
111
- const { data } = await props.apiClient.deleteOrganizationVpcEndpoint(props.orgId, props.regionId, props.id);
112
- writer(props).end(data, { fields: [] });
85
+ const { data } = await props.apiClient.deleteOrganizationVpcEndpoint(props.orgId, props.regionId, props.id);
86
+ writer(props).end(data, { fields: [] });
113
87
  };
114
88
  const statusOrg = async (props) => {
115
- const { data } = await props.apiClient.getOrganizationVpcEndpointDetails(props.orgId, props.regionId, props.id);
116
- writer(props).end(data, { fields: VPC_ENDPOINT_DETAILS_FIELDS });
89
+ const { data } = await props.apiClient.getOrganizationVpcEndpointDetails(props.orgId, props.regionId, props.id);
90
+ writer(props).end(data, { fields: VPC_ENDPOINT_DETAILS_FIELDS });
117
91
  };
118
92
  const listProject = async (props) => {
119
- const { data } = await props.apiClient.listProjectVpcEndpoints(props.projectId);
120
- writer(props).end(data.endpoints, {
121
- fields: VPC_ENDPOINT_FIELDS,
122
- });
93
+ const { data } = await props.apiClient.listProjectVpcEndpoints(props.projectId);
94
+ writer(props).end(data.endpoints, { fields: VPC_ENDPOINT_FIELDS });
123
95
  };
124
96
  const assignProject = async (props) => {
125
- const vpcEndpointAssignment = {
126
- label: props.label || "",
127
- };
128
- const { data } = await props.apiClient.assignProjectVpcEndpoint(props.projectId, props.id, vpcEndpointAssignment);
129
- writer(props).end(data, { fields: [] });
97
+ const vpcEndpointAssignment = { label: props.label || "" };
98
+ const { data } = await props.apiClient.assignProjectVpcEndpoint(props.projectId, props.id, vpcEndpointAssignment);
99
+ writer(props).end(data, { fields: [] });
130
100
  };
131
101
  const removeProject = async (props) => {
132
- const { data } = await props.apiClient.deleteProjectVpcEndpoint(props.projectId, props.id);
133
- writer(props).end(data, { fields: [] });
102
+ const { data } = await props.apiClient.deleteProjectVpcEndpoint(props.projectId, props.id);
103
+ writer(props).end(data, { fields: [] });
134
104
  };
105
+ //#endregion
106
+ export { builder, command, describe, vpc_endpoints_exports };
package/dist/config.js CHANGED
@@ -1,8 +1,9 @@
1
- import { existsSync, mkdirSync } from "node:fs";
2
1
  import { isCi } from "./env.js";
3
- export { CREDENTIALS_FILE, credentialsPath, defaultDir, isInsideConfigDir, isOwnedCredentialPath, } from "./_shared/paths.js";
4
- export const ensureConfigDir = ({ "config-dir": configDirArg, "force-auth": forceAuth, }) => {
5
- if (!existsSync(configDirArg) && (!isCi() || forceAuth)) {
6
- mkdirSync(configDirArg, { recursive: true });
7
- }
2
+ import { CREDENTIALS_FILE, credentialsPath, defaultDir, isInsideConfigDir, isOwnedCredentialPath } from "./_shared/paths.js";
3
+ import { existsSync, mkdirSync } from "node:fs";
4
+ //#region src/config.ts
5
+ const ensureConfigDir = ({ "config-dir": configDirArg, "force-auth": forceAuth }) => {
6
+ if (!existsSync(configDirArg) && (!isCi() || forceAuth)) mkdirSync(configDirArg, { recursive: true });
8
7
  };
8
+ //#endregion
9
+ export { CREDENTIALS_FILE, credentialsPath, defaultDir, ensureConfigDir, isInsideConfigDir, isOwnedCredentialPath };
@@ -1,72 +1,56 @@
1
+ //#region src/config_format.ts
1
2
  /**
2
- * Render a TTL in whole seconds back to the canonical `neon.ts` duration string (e.g.
3
- * `604800` -> `"7d"`), falling back to seconds when no clean unit boundary matches. Mirrors
4
- * the formatter `@neon/config` uses when it emits a TTL, so `config status` shows
5
- * the same value a user would write in `neon.ts`.
6
- */
7
- export const formatDurationSeconds = (totalSeconds) => {
8
- const units = [
9
- ["w", 7 * 24 * 60 * 60],
10
- ["d", 24 * 60 * 60],
11
- ["h", 60 * 60],
12
- ["m", 60],
13
- ];
14
- for (const [unit, perUnit] of units) {
15
- if (totalSeconds % perUnit === 0)
16
- return `${totalSeconds / perUnit}${unit}`;
17
- }
18
- return `${totalSeconds}s`;
3
+ * Render a TTL in whole seconds back to the canonical `neon.ts` duration string (e.g.
4
+ * `604800` -> `"7d"`), falling back to seconds when no clean unit boundary matches. Mirrors
5
+ * the formatter `@neon/config` uses when it emits a TTL, so `config status` shows
6
+ * the same value a user would write in `neon.ts`.
7
+ */
8
+ const formatDurationSeconds = (totalSeconds) => {
9
+ for (const [unit, perUnit] of [
10
+ ["w", 604800],
11
+ ["d", 86400],
12
+ ["h", 3600],
13
+ ["m", 60]
14
+ ]) if (totalSeconds % perUnit === 0) return `${totalSeconds / perUnit}${unit}`;
15
+ return `${totalSeconds}s`;
19
16
  };
20
17
  /**
21
- * Project a resolved branch config (plus the separately-pulled preview state, since
22
- * functions/buckets don't live on the closure) into a {@link NeonConfigView}.
23
- *
24
- * - Service toggles are surfaced as `true` only when enabled (disabled is the absence of
25
- * the key, exactly as in `neon.ts`).
26
- * - `ttlSeconds` is rendered back to a duration string (`7d`).
27
- * - The `branch` section is the JSON-able part of what would otherwise be the `branch`
28
- * closure: `parent` / `ttl` / `protected` / `postgres.computeSettings`.
29
- * - `branch` and `preview` are omitted entirely when they would be empty.
30
- */
31
- export const toNeonConfigView = (resolved, preview) => {
32
- const view = {};
33
- if (resolved.authEnabled)
34
- view.auth = true;
35
- if (resolved.dataApiEnabled)
36
- view.dataApi = true;
37
- const previewView = toPreviewView(preview);
38
- if (previewView)
39
- view.preview = previewView;
40
- const branch = {};
41
- if (resolved.parent !== undefined)
42
- branch.parent = resolved.parent;
43
- if (resolved.ttlSeconds !== undefined)
44
- branch.ttl = formatDurationSeconds(resolved.ttlSeconds);
45
- if (resolved.protected !== undefined)
46
- branch.protected = resolved.protected;
47
- if (resolved.postgres?.computeSettings)
48
- branch.postgres = resolved.postgres;
49
- if (Object.keys(branch).length > 0)
50
- view.branch = branch;
51
- return view;
18
+ * Project a resolved branch config (plus the separately-pulled preview state, since
19
+ * functions/buckets don't live on the closure) into a {@link NeonConfigView}.
20
+ *
21
+ * - Service toggles are surfaced as `true` only when enabled (disabled is the absence of
22
+ * the key, exactly as in `neon.ts`).
23
+ * - `ttlSeconds` is rendered back to a duration string (`7d`).
24
+ * - The `branch` section is the JSON-able part of what would otherwise be the `branch`
25
+ * closure: `parent` / `ttl` / `protected` / `postgres.computeSettings`.
26
+ * - `branch` and `preview` are omitted entirely when they would be empty.
27
+ */
28
+ const toNeonConfigView = (resolved, preview) => {
29
+ const view = {};
30
+ if (resolved.authEnabled) view.auth = true;
31
+ if (resolved.dataApiEnabled) view.dataApi = true;
32
+ const previewView = toPreviewView(preview);
33
+ if (previewView) view.preview = previewView;
34
+ const branch = {};
35
+ if (resolved.parent !== void 0) branch.parent = resolved.parent;
36
+ if (resolved.ttlSeconds !== void 0) branch.ttl = formatDurationSeconds(resolved.ttlSeconds);
37
+ if (resolved.protected !== void 0) branch.protected = resolved.protected;
38
+ if (resolved.postgres?.computeSettings) branch.postgres = resolved.postgres;
39
+ if (Object.keys(branch).length > 0) view.branch = branch;
40
+ return view;
52
41
  };
53
42
  const toPreviewView = (preview) => {
54
- if (!preview)
55
- return undefined;
56
- const out = {};
57
- if (preview.functions.length > 0) {
58
- out.functions = Object.fromEntries(preview.functions.map((fn) => [fn.slug, { name: fn.name }]));
59
- }
60
- if (preview.buckets.length > 0) {
61
- out.buckets = Object.fromEntries(preview.buckets.map((b) => [b.name, { access: b.access }]));
62
- }
63
- if (preview.credentials.length > 0) {
64
- out.credentials = preview.credentials.map((c) => ({
65
- id: c.tokenIdShort,
66
- ...(c.name ? { name: c.name } : {}),
67
- scopes: c.scopes,
68
- ...(c.lastUsedAt ? { lastUsedAt: c.lastUsedAt } : {}),
69
- }));
70
- }
71
- return Object.keys(out).length > 0 ? out : undefined;
43
+ if (!preview) return void 0;
44
+ const out = {};
45
+ if (preview.functions.length > 0) out.functions = Object.fromEntries(preview.functions.map((fn) => [fn.slug, { name: fn.name }]));
46
+ if (preview.buckets.length > 0) out.buckets = Object.fromEntries(preview.buckets.map((b) => [b.name, { access: b.access }]));
47
+ if (preview.credentials.length > 0) out.credentials = preview.credentials.map((c) => ({
48
+ id: c.tokenIdShort,
49
+ ...c.name ? { name: c.name } : {},
50
+ scopes: c.scopes,
51
+ ...c.lastUsedAt ? { lastUsedAt: c.lastUsedAt } : {}
52
+ }));
53
+ return Object.keys(out).length > 0 ? out : void 0;
72
54
  };
55
+ //#endregion
56
+ export { formatDurationSeconds, toNeonConfigView };