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
|
@@ -1,89 +1,78 @@
|
|
|
1
1
|
import { getSkillsAgentName } from "../agents.js";
|
|
2
2
|
import { SKILL_REFERENCE_URLS } from "../skills.js";
|
|
3
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
responseMapping: {
|
|
77
|
-
yes: {
|
|
78
|
-
args: [
|
|
79
|
-
"skills",
|
|
80
|
-
"--json",
|
|
81
|
-
...(options.agent ? ["--agent", options.agent] : []),
|
|
82
|
-
"--install",
|
|
83
|
-
],
|
|
84
|
-
},
|
|
85
|
-
skip: { args: agentArgs },
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
};
|
|
3
|
+
//#region src/init/phases/skills.ts
|
|
4
|
+
async function handleSkillsPhase(options) {
|
|
5
|
+
const agentArgs = options.agent ? [
|
|
6
|
+
"--agent",
|
|
7
|
+
options.agent,
|
|
8
|
+
"--json"
|
|
9
|
+
] : ["--json"];
|
|
10
|
+
const skillsAgent = options.agent ? getSkillsAgentName(options.agent) : "claude-code";
|
|
11
|
+
if (options.status) return {
|
|
12
|
+
phase: "tooling",
|
|
13
|
+
status: "skills_check",
|
|
14
|
+
nextAction: {
|
|
15
|
+
type: "agent_check",
|
|
16
|
+
checks: [{
|
|
17
|
+
id: "skills",
|
|
18
|
+
description: "Check if Neon agent skills are installed in this project",
|
|
19
|
+
lookFor: ["A skill file referencing 'neon-postgres' (e.g. .cursor/skills/, CLAUDE.md, .cursorrules)", "A .skills/ directory with neon-related content"]
|
|
20
|
+
}],
|
|
21
|
+
reportBack: {
|
|
22
|
+
type: "run_neon_init",
|
|
23
|
+
args: [
|
|
24
|
+
"skills",
|
|
25
|
+
"--json",
|
|
26
|
+
...options.agent ? ["--agent", options.agent] : [],
|
|
27
|
+
...options.update ? ["--update"] : ["--install"]
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
if (options.install || options.update) return {
|
|
33
|
+
phase: "tooling",
|
|
34
|
+
status: "installing_skills",
|
|
35
|
+
nextAction: {
|
|
36
|
+
type: "run_command",
|
|
37
|
+
command: `npx -y skills add neondatabase/agent-skills --skill neon-postgres --agent ${skillsAgent} -y`,
|
|
38
|
+
description: `Installing Neon agent skills for ${skillsAgent}.`,
|
|
39
|
+
timeout: 3e4,
|
|
40
|
+
onSuccess: {
|
|
41
|
+
type: "run_neon_init",
|
|
42
|
+
args: agentArgs
|
|
43
|
+
},
|
|
44
|
+
onFailure: { other: {
|
|
45
|
+
type: "run_neon_init",
|
|
46
|
+
args: agentArgs
|
|
47
|
+
} }
|
|
48
|
+
},
|
|
49
|
+
skillReferences: SKILL_REFERENCE_URLS
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
phase: "tooling",
|
|
53
|
+
status: "skills_available",
|
|
54
|
+
nextAction: {
|
|
55
|
+
type: "ask_user",
|
|
56
|
+
question: "Would you like to install Neon agent skills for this project? Skills provide your AI assistant with Neon-specific knowledge.",
|
|
57
|
+
options: [{
|
|
58
|
+
value: "yes",
|
|
59
|
+
label: "Yes, install skills"
|
|
60
|
+
}, {
|
|
61
|
+
value: "skip",
|
|
62
|
+
label: "Skip for now"
|
|
63
|
+
}],
|
|
64
|
+
context: "Agent skills include guides for connection patterns, Neon Auth setup, branching, migrations, and more.",
|
|
65
|
+
responseMapping: {
|
|
66
|
+
yes: { args: [
|
|
67
|
+
"skills",
|
|
68
|
+
"--json",
|
|
69
|
+
...options.agent ? ["--agent", options.agent] : [],
|
|
70
|
+
"--install"
|
|
71
|
+
] },
|
|
72
|
+
skip: { args: agentArgs }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
89
76
|
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { handleSkillsPhase };
|
|
@@ -1,70 +1,75 @@
|
|
|
1
1
|
import { isAuthenticated } from "../auth.js";
|
|
2
2
|
import { inspectProject } from "../inspect.js";
|
|
3
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
3
|
+
//#region src/init/phases/status.ts
|
|
4
|
+
async function handleStatusPhase(_options) {
|
|
5
|
+
const authed = await isAuthenticated();
|
|
6
|
+
const inspection = await inspectProject([
|
|
7
|
+
{
|
|
8
|
+
id: "mcp_server",
|
|
9
|
+
description: "",
|
|
10
|
+
lookFor: []
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "database_url",
|
|
14
|
+
description: "",
|
|
15
|
+
lookFor: []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "skills",
|
|
19
|
+
description: "",
|
|
20
|
+
lookFor: []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "migrations",
|
|
24
|
+
description: "",
|
|
25
|
+
lookFor: []
|
|
26
|
+
}
|
|
27
|
+
]);
|
|
28
|
+
const hasDatabaseUrl = inspection.databaseUrl === true;
|
|
29
|
+
const mcpConfigured = inspection.mcpConfigured === true;
|
|
30
|
+
const skillsInstalled = inspection.skillsInstalled === true;
|
|
31
|
+
const migrationTool = inspection.migrationTool ?? null;
|
|
32
|
+
const hasMigrations = migrationTool !== null && migrationTool !== "none" && inspection.migrationDir !== "none";
|
|
33
|
+
const recommendations = [];
|
|
34
|
+
if (!authed) recommendations.push({
|
|
35
|
+
priority: "high",
|
|
36
|
+
message: "Not authenticated with Neon",
|
|
37
|
+
command: `neon init --agent --data '{"step":"auth"}'`
|
|
38
|
+
});
|
|
39
|
+
if (!hasDatabaseUrl) recommendations.push({
|
|
40
|
+
priority: "high",
|
|
41
|
+
message: "No DATABASE_URL found in .env",
|
|
42
|
+
command: `neon init --agent --data '{"step":"db"}'`
|
|
43
|
+
});
|
|
44
|
+
if (!skillsInstalled) recommendations.push({
|
|
45
|
+
priority: "medium",
|
|
46
|
+
message: "Neon agent skills not detected in this project",
|
|
47
|
+
command: `neon init --agent --data '{"step":"skills","install":true}'`
|
|
48
|
+
});
|
|
49
|
+
if (migrationTool && !hasMigrations) recommendations.push({
|
|
50
|
+
priority: "medium",
|
|
51
|
+
message: `${migrationTool} detected but no migrations found`,
|
|
52
|
+
command: `neon init --agent --data '{"step":"migrations"}'`
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
auth: { authenticated: authed },
|
|
56
|
+
tooling: {
|
|
57
|
+
mcpServer: {
|
|
58
|
+
configured: mcpConfigured,
|
|
59
|
+
scope: inspection.mcpScope || null
|
|
60
|
+
},
|
|
61
|
+
skills: {
|
|
62
|
+
installed: skillsInstalled,
|
|
63
|
+
scope: inspection.skillsScope || null
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
project: { databaseUrl: hasDatabaseUrl },
|
|
67
|
+
migrations: {
|
|
68
|
+
tool: migrationTool,
|
|
69
|
+
hasMigrations
|
|
70
|
+
},
|
|
71
|
+
recommendations
|
|
72
|
+
};
|
|
70
73
|
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { handleStatusPhase };
|
|
@@ -1,107 +1,110 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolves the Neon org/project from a DATABASE_URL in .env.
|
|
3
|
-
* Parses the endpoint hostname, then queries the Neon API to find
|
|
4
|
-
* which project it belongs to.
|
|
5
|
-
*/
|
|
6
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
2
|
import { resolve } from "node:path";
|
|
8
3
|
import { execa } from "execa";
|
|
4
|
+
//#region src/init/resolve_context.ts
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the Neon org/project from a DATABASE_URL in .env.
|
|
7
|
+
* Parses the endpoint hostname, then queries the Neon API to find
|
|
8
|
+
* which project it belongs to.
|
|
9
|
+
*/
|
|
9
10
|
/**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
* Extracts the Neon endpoint host from .env's DATABASE_URL or PGHOST.
|
|
12
|
+
* Returns the hostname (e.g. "ep-cool-name-12345.us-east-2.aws.neon.tech") or null.
|
|
13
|
+
*/
|
|
13
14
|
function extractNeonHost(cwd) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (pgHostMatch)
|
|
27
|
-
return pgHostMatch[1];
|
|
28
|
-
}
|
|
29
|
-
catch { }
|
|
30
|
-
}
|
|
31
|
-
return null;
|
|
15
|
+
for (const envFile of [".env", ".env.local"]) {
|
|
16
|
+
const envPath = resolve(cwd, envFile);
|
|
17
|
+
if (!existsSync(envPath)) continue;
|
|
18
|
+
try {
|
|
19
|
+
const content = readFileSync(envPath, "utf-8");
|
|
20
|
+
const dbUrlMatch = content.match(/^DATABASE_URL=.*@([^/:\s]+\.neon\.tech)/m);
|
|
21
|
+
if (dbUrlMatch) return dbUrlMatch[1];
|
|
22
|
+
const pgHostMatch = content.match(/^PGHOST=([^\s]+\.neon\.tech)/m);
|
|
23
|
+
if (pgHostMatch) return pgHostMatch[1];
|
|
24
|
+
} catch {}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
32
27
|
}
|
|
33
28
|
/**
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
29
|
+
* Resolves the Neon org and project that own the endpoint in DATABASE_URL.
|
|
30
|
+
*
|
|
31
|
+
* Strategy:
|
|
32
|
+
* 1. Extract endpoint hostname from .env
|
|
33
|
+
* 2. List orgs via neonctl
|
|
34
|
+
* 3. For each org, list projects
|
|
35
|
+
* 4. For each project, get connection string and compare hostnames
|
|
36
|
+
* 5. Return the matching org/project
|
|
37
|
+
*/
|
|
38
|
+
async function resolveNeonContext(cwd) {
|
|
39
|
+
const neonHost = extractNeonHost(cwd);
|
|
40
|
+
if (!neonHost) return null;
|
|
41
|
+
let orgs;
|
|
42
|
+
try {
|
|
43
|
+
const result = await execa("npx", [
|
|
44
|
+
"-y",
|
|
45
|
+
"neonctl",
|
|
46
|
+
"orgs",
|
|
47
|
+
"list",
|
|
48
|
+
"--output",
|
|
49
|
+
"json"
|
|
50
|
+
], {
|
|
51
|
+
stdio: "pipe",
|
|
52
|
+
timeout: 3e4,
|
|
53
|
+
env: {
|
|
54
|
+
...process.env,
|
|
55
|
+
CI: void 0
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
orgs = JSON.parse(result.stdout);
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (orgs.length === 0) return null;
|
|
63
|
+
for (const org of orgs) {
|
|
64
|
+
let projects;
|
|
65
|
+
try {
|
|
66
|
+
const result = await execa("npx", [
|
|
67
|
+
"-y",
|
|
68
|
+
"neonctl",
|
|
69
|
+
"projects",
|
|
70
|
+
"list",
|
|
71
|
+
"--org-id",
|
|
72
|
+
org.id,
|
|
73
|
+
"--output",
|
|
74
|
+
"json"
|
|
75
|
+
], {
|
|
76
|
+
stdio: "pipe",
|
|
77
|
+
timeout: 3e4,
|
|
78
|
+
env: {
|
|
79
|
+
...process.env,
|
|
80
|
+
CI: void 0
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
projects = JSON.parse(result.stdout);
|
|
84
|
+
} catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
for (const project of projects) try {
|
|
88
|
+
if ((await execa("npx", [
|
|
89
|
+
"-y",
|
|
90
|
+
"neonctl",
|
|
91
|
+
"connection-string",
|
|
92
|
+
"--project-id",
|
|
93
|
+
project.id
|
|
94
|
+
], {
|
|
95
|
+
stdio: "pipe",
|
|
96
|
+
timeout: 15e3,
|
|
97
|
+
env: {
|
|
98
|
+
...process.env,
|
|
99
|
+
CI: void 0
|
|
100
|
+
}
|
|
101
|
+
})).stdout.trim().includes(neonHost)) return {
|
|
102
|
+
orgId: org.id,
|
|
103
|
+
projectId: project.id
|
|
104
|
+
};
|
|
105
|
+
} catch {}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
107
108
|
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { resolveNeonContext };
|