neon 2.1.2 → 2.29.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/LICENSE.md +178 -0
- package/README.md +601 -0
- package/dist/analytics.js +156 -0
- package/dist/api.js +665 -0
- package/dist/auth.js +127 -0
- package/dist/callback.html +51 -0
- package/dist/cli.js +9 -0
- package/dist/commands/auth.js +214 -0
- package/dist/commands/bootstrap.js +481 -0
- package/dist/commands/branches.js +481 -0
- package/dist/commands/bucket.js +543 -0
- package/dist/commands/checkout.js +289 -0
- package/dist/commands/config.js +544 -0
- package/dist/commands/connection_string.js +172 -0
- package/dist/commands/data_api.js +285 -0
- package/dist/commands/databases.js +82 -0
- package/dist/commands/deploy.js +26 -0
- package/dist/commands/dev.js +698 -0
- package/dist/commands/env.js +166 -0
- package/dist/commands/functions.js +373 -0
- package/dist/commands/index.js +54 -0
- package/dist/commands/init.js +73 -0
- package/dist/commands/ip_allow.js +137 -0
- package/dist/commands/link.js +1121 -0
- package/dist/commands/neon_auth.js +1028 -0
- package/dist/commands/operations.js +28 -0
- package/dist/commands/orgs.js +24 -0
- package/dist/commands/projects.js +372 -0
- package/dist/commands/psql.js +62 -0
- package/dist/commands/roles.js +65 -0
- package/dist/commands/schema_diff.js +151 -0
- package/dist/commands/set_context.js +29 -0
- package/dist/commands/status.js +40 -0
- package/dist/commands/user.js +15 -0
- package/dist/commands/vpc_endpoints.js +134 -0
- package/dist/config.js +11 -0
- package/dist/config_format.js +72 -0
- package/dist/context.js +177 -0
- package/dist/current_branch_fast_path.js +55 -0
- package/dist/dev/env.js +240 -0
- package/dist/dev/functions.js +70 -0
- package/dist/dev/inputs.js +63 -0
- package/dist/dev/runtime.js +146 -0
- package/dist/env.js +36 -0
- package/dist/env_file.js +159 -0
- package/dist/errors.js +80 -0
- package/dist/functions_api.js +44 -0
- package/dist/help.js +146 -0
- package/dist/index.js +234 -0
- package/dist/log.js +18 -0
- package/dist/parameters.gen.js +480 -0
- package/dist/pkg.js +25 -0
- package/dist/psql/cli.js +53 -0
- package/dist/psql/command/cmd_cond.js +437 -0
- package/dist/psql/command/cmd_connect.js +820 -0
- package/dist/psql/command/cmd_copy.js +1035 -0
- package/dist/psql/command/cmd_describe.js +1815 -0
- package/dist/psql/command/cmd_format.js +922 -0
- package/dist/psql/command/cmd_io.js +2193 -0
- package/dist/psql/command/cmd_lo.js +393 -0
- package/dist/psql/command/cmd_meta.js +970 -0
- package/dist/psql/command/cmd_misc.js +187 -0
- package/dist/psql/command/cmd_pipeline.js +1148 -0
- package/dist/psql/command/cmd_restrict.js +171 -0
- package/dist/psql/command/cmd_show.js +766 -0
- package/dist/psql/command/dispatch.js +343 -0
- package/dist/psql/command/inputQueue.js +42 -0
- package/dist/psql/command/shared.js +71 -0
- package/dist/psql/complete/filenames.js +139 -0
- package/dist/psql/complete/index.js +104 -0
- package/dist/psql/complete/matcher.js +315 -0
- package/dist/psql/complete/psqlVars.js +247 -0
- package/dist/psql/complete/queries.js +493 -0
- package/dist/psql/complete/rules.js +2424 -0
- package/dist/psql/core/common.js +1253 -0
- package/dist/psql/core/help.js +576 -0
- package/dist/psql/core/mainloop.js +1360 -0
- package/dist/psql/core/prompt.js +440 -0
- package/dist/psql/core/settings.js +684 -0
- package/dist/psql/core/sqlHelp.js +1066 -0
- package/dist/psql/core/startup.js +846 -0
- package/dist/psql/core/syncVars.js +116 -0
- package/dist/psql/core/variables.js +287 -0
- package/dist/psql/describe/formatters.js +1290 -0
- package/dist/psql/describe/processNamePattern.js +270 -0
- package/dist/psql/describe/queries.js +2378 -0
- package/dist/psql/describe/versionGate.js +43 -0
- package/dist/psql/index.js +2030 -0
- package/dist/psql/io/history.js +299 -0
- package/dist/psql/io/input.js +120 -0
- package/dist/psql/io/lineEditor/buffer.js +325 -0
- package/dist/psql/io/lineEditor/complete.js +227 -0
- package/dist/psql/io/lineEditor/filename.js +159 -0
- package/dist/psql/io/lineEditor/index.js +894 -0
- package/dist/psql/io/lineEditor/keymap.js +745 -0
- package/dist/psql/io/lineEditor/vt100.js +363 -0
- package/dist/psql/io/pgpass.js +202 -0
- package/dist/psql/io/pgservice.js +194 -0
- package/dist/psql/io/psqlrc.js +422 -0
- package/dist/psql/print/aligned.js +1765 -0
- package/dist/psql/print/asciidoc.js +248 -0
- package/dist/psql/print/crosstab.js +463 -0
- package/dist/psql/print/csv.js +95 -0
- package/dist/psql/print/html.js +258 -0
- package/dist/psql/print/json.js +96 -0
- package/dist/psql/print/latex.js +396 -0
- package/dist/psql/print/pager.js +267 -0
- package/dist/psql/print/troff.js +258 -0
- package/dist/psql/print/unaligned.js +119 -0
- package/dist/psql/print/units.js +135 -0
- package/dist/psql/scanner/slash.js +515 -0
- package/dist/psql/scanner/sql.js +914 -0
- package/dist/psql/scanner/stringutils.js +394 -0
- package/dist/psql/types/backslash.js +1 -0
- package/dist/psql/types/connection.js +1 -0
- package/dist/psql/types/index.js +7 -0
- package/dist/psql/types/printer.js +1 -0
- package/dist/psql/types/repl.js +1 -0
- package/dist/psql/types/scanner.js +24 -0
- package/dist/psql/types/settings.js +1 -0
- package/dist/psql/types/variables.js +1 -0
- package/dist/psql/wire/connection.js +2858 -0
- package/dist/psql/wire/copy.js +108 -0
- package/dist/psql/wire/notify.js +59 -0
- package/dist/psql/wire/pipeline.js +521 -0
- package/dist/psql/wire/protocol.js +466 -0
- package/dist/psql/wire/sasl.js +296 -0
- package/dist/psql/wire/tls.js +602 -0
- package/dist/storage_api.js +147 -0
- package/dist/test_utils/fixtures.js +122 -0
- package/dist/test_utils/oauth_server.js +9 -0
- package/dist/types.js +1 -0
- package/dist/utils/api_enums.js +33 -0
- package/dist/utils/auth.js +5 -0
- package/dist/utils/branch_notice.js +22 -0
- package/dist/utils/branch_picker.js +103 -0
- package/dist/utils/compute_units.js +28 -0
- package/dist/utils/enrichers.js +161 -0
- package/dist/utils/esbuild.js +158 -0
- package/dist/utils/formats.js +18 -0
- package/dist/utils/middlewares.js +20 -0
- package/dist/utils/package_manager.js +68 -0
- package/dist/utils/point_in_time.js +56 -0
- package/dist/utils/psql.js +120 -0
- package/dist/utils/string.js +5 -0
- package/dist/utils/ui.js +59 -0
- package/dist/utils/zip.js +4 -0
- package/dist/writer.js +97 -0
- package/package.json +117 -14
- package/.jshintrc +0 -3
- package/CHANGELOG.markdown +0 -22
- package/LICENSE +0 -21
- package/README.markdown +0 -76
- package/bower.json +0 -23
- package/license.txt +0 -9
- package/neon.js +0 -234
- package/stdlib/bubbling_support.js +0 -32
- package/stdlib/custom_event.js +0 -54
- package/stdlib/custom_event_support.js +0 -195
- package/stdlib/index.js +0 -7
- package/stdlib/node_support.js +0 -123
- package/stdlib/widget.js +0 -340
- package/test/neon_browser.html +0 -11
- package/test/neon_stdlib_browser.html +0 -15
- package/test/neon_stdlib_test.js +0 -84
- package/test/neon_test.js +0 -64
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Analytics } from "@segment/analytics-node";
|
|
4
|
+
import { getApiClient, isNeonApiError } from "./api.js";
|
|
5
|
+
import { CREDENTIALS_FILE } from "./config.js";
|
|
6
|
+
import { isCurrentBranchProbe } from "./context.js";
|
|
7
|
+
import { getGithubEnvVars, isCi } from "./env.js";
|
|
8
|
+
import { log } from "./log.js";
|
|
9
|
+
import pkg from "./pkg.js";
|
|
10
|
+
const WRITE_KEY = "3SQXn5ejjXWLEJ8xU2PRYhAotLtTaeeV";
|
|
11
|
+
/**
|
|
12
|
+
* Raw-argv fallback for the offline `--current-branch` probe. The init
|
|
13
|
+
* middleware runs before validation, where the parsed `currentBranch` flag may
|
|
14
|
+
* not be populated yet, so we also scan `process.argv` directly to be safe.
|
|
15
|
+
*/
|
|
16
|
+
const hasCurrentBranchArgv = () => process.argv.includes("--current-branch");
|
|
17
|
+
let client;
|
|
18
|
+
let clientInitialized = false;
|
|
19
|
+
let userId = "";
|
|
20
|
+
/**
|
|
21
|
+
* Phase 1: Run before validation so the Segment client exists if any
|
|
22
|
+
* middleware (e.g. auth) fails. Enables sendError() in the fail handler.
|
|
23
|
+
* Does not resolve user id or send CLI Started.
|
|
24
|
+
*/
|
|
25
|
+
export const initAnalyticsClientMiddleware = (args) => {
|
|
26
|
+
if (!args.analytics || clientInitialized) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// The offline `--current-branch` probe must make zero network calls. This
|
|
30
|
+
// middleware runs before validation, so guard on the raw argv too (in case
|
|
31
|
+
// the parsed `currentBranch` flag isn't populated this early): never create
|
|
32
|
+
// the Segment client, which keeps trackEvent/closeAnalytics no-ops downstream.
|
|
33
|
+
if (isCurrentBranchProbe(args) || hasCurrentBranchArgv()) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
clientInitialized = true;
|
|
37
|
+
client = new Analytics({
|
|
38
|
+
writeKey: WRITE_KEY,
|
|
39
|
+
host: "https://track.neon.tech",
|
|
40
|
+
});
|
|
41
|
+
log.debug("Initialized CLI analytics client");
|
|
42
|
+
client.identify({
|
|
43
|
+
userId: "anonymous",
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Phase 2: Run after auth. Resolves user id from credentials,
|
|
48
|
+
* identifies the user, and sends CLI Started.
|
|
49
|
+
*/
|
|
50
|
+
export const analyticsMiddleware = async (args) => {
|
|
51
|
+
if (!client || !args.analytics) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (isCurrentBranchProbe(args)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const credentialsPath = join(args.configDir, CREDENTIALS_FILE);
|
|
59
|
+
const credentials = readFileSync(credentialsPath, {
|
|
60
|
+
encoding: "utf-8",
|
|
61
|
+
});
|
|
62
|
+
userId = JSON.parse(credentials).user_id;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
log.debug("Failed to read credentials file", err);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
if (args.apiKey) {
|
|
69
|
+
const apiClient = getApiClient({
|
|
70
|
+
apiKey: args.apiKey,
|
|
71
|
+
apiHost: args.apiHost,
|
|
72
|
+
});
|
|
73
|
+
// Populating api key details for analytics
|
|
74
|
+
const authDetailsResponse = await apiClient.getAuthDetails();
|
|
75
|
+
const authDetails = authDetailsResponse.data;
|
|
76
|
+
args.accountId = authDetails.account_id;
|
|
77
|
+
args.authMethod = authDetails.auth_method;
|
|
78
|
+
args.authData = authDetails.auth_data;
|
|
79
|
+
// Get user id if not org api key
|
|
80
|
+
if (!userId && authDetails.auth_method !== "api_key_org") {
|
|
81
|
+
const resp = await apiClient?.getCurrentUserInfo?.();
|
|
82
|
+
userId = resp?.data?.id;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
args.accountId = userId;
|
|
87
|
+
args.authMethod = "oauth";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
log.debug("Failed to get user id from api", err);
|
|
92
|
+
}
|
|
93
|
+
client.identify({
|
|
94
|
+
userId: userId?.toString() ?? "anonymous",
|
|
95
|
+
});
|
|
96
|
+
client.track({
|
|
97
|
+
userId: userId || "anonymous",
|
|
98
|
+
event: "CLI Started",
|
|
99
|
+
properties: getAnalyticsEventProperties(args),
|
|
100
|
+
context: {
|
|
101
|
+
direct: true,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
export const closeAnalytics = async (opts) => {
|
|
106
|
+
if (client) {
|
|
107
|
+
log.debug("Flushing CLI analytics");
|
|
108
|
+
// `timeout` bounds how long we wait for in-flight events to flush so a
|
|
109
|
+
// slow / unreachable track.neon.tech can't hang a short-lived command
|
|
110
|
+
// (e.g. the psql launch path, which flushes here before process.exit).
|
|
111
|
+
await client.closeAndFlush(opts);
|
|
112
|
+
log.debug("Flushed CLI analytics");
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
export const sendError = (err, errCode) => {
|
|
116
|
+
if (!client) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const apiError = isNeonApiError(err) ? err : undefined;
|
|
120
|
+
const requestId = apiError?.headers?.["x-neon-ret-request-id"];
|
|
121
|
+
if (requestId) {
|
|
122
|
+
log.debug("Failed request ID: %s", requestId);
|
|
123
|
+
}
|
|
124
|
+
client.track({
|
|
125
|
+
event: "CLI Error",
|
|
126
|
+
userId: userId || "anonymous",
|
|
127
|
+
properties: {
|
|
128
|
+
message: err.message,
|
|
129
|
+
stack: err.stack,
|
|
130
|
+
errCode,
|
|
131
|
+
statusCode: apiError?.status,
|
|
132
|
+
requestId: requestId,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
log.debug("Sent CLI error event: %s", errCode);
|
|
136
|
+
};
|
|
137
|
+
export const trackEvent = (event, properties) => {
|
|
138
|
+
if (!client) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
client.track({
|
|
142
|
+
event,
|
|
143
|
+
userId: userId || "anonymous",
|
|
144
|
+
properties,
|
|
145
|
+
});
|
|
146
|
+
log.debug("Sent CLI event: %s", event);
|
|
147
|
+
};
|
|
148
|
+
export const getAnalyticsEventProperties = (args) => ({
|
|
149
|
+
version: pkg.version,
|
|
150
|
+
command: args._.join(" "),
|
|
151
|
+
flags: {
|
|
152
|
+
output: args.output,
|
|
153
|
+
},
|
|
154
|
+
ci: isCi(),
|
|
155
|
+
githubEnvVars: getGithubEnvVars(process.env),
|
|
156
|
+
});
|