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
package/dist/analytics.js
CHANGED
|
@@ -1,233 +1,189 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { OAUTH, inspectCredentials } from "./_shared/credentials.js";
|
|
2
|
+
import { getGithubEnvVars, isCi } from "./env.js";
|
|
3
|
+
import { log } from "./log.js";
|
|
4
|
+
import pkg_default from "./pkg.js";
|
|
3
5
|
import { getApiClient, isNeonApiError } from "./api.js";
|
|
6
|
+
import { credentialsPath } from "./_shared/paths.js";
|
|
7
|
+
import "./config.js";
|
|
4
8
|
import { getAuthContext } from "./auth_context.js";
|
|
5
|
-
import { credentialsPath } from "./config.js";
|
|
6
9
|
import { isCurrentBranchProbe } from "./context.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import pkg from "./pkg.js";
|
|
10
|
+
import { Analytics } from "@segment/analytics-node";
|
|
11
|
+
//#region src/analytics.ts
|
|
10
12
|
const WRITE_KEY = "3SQXn5ejjXWLEJ8xU2PRYhAotLtTaeeV";
|
|
11
13
|
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
* Raw-argv fallback for the offline `--current-branch` probe. The init
|
|
15
|
+
* middleware runs before validation, where the parsed `currentBranch` flag may
|
|
16
|
+
* not be populated yet, so we also scan `process.argv` directly to be safe.
|
|
17
|
+
*/
|
|
16
18
|
const hasCurrentBranchArgv = () => process.argv.includes("--current-branch");
|
|
17
19
|
const ANONYMOUS = "anonymous";
|
|
18
20
|
/**
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
* Who to attribute an event to, given whatever identified this invocation.
|
|
22
|
+
*
|
|
23
|
+
* Nothing is guaranteed to have identified it: a command can run with no credentials at all,
|
|
24
|
+
* leaving the id empty. Segment accepts an empty `userId` and forwards it as-is rather than
|
|
25
|
+
* rejecting it, so the substitution has to happen here. `""` is falsy but not nullish, which
|
|
26
|
+
* is why the fallback has to be `||`.
|
|
27
|
+
*
|
|
28
|
+
* Exported for tests.
|
|
29
|
+
*/
|
|
30
|
+
const analyticsUserId = (userId) => userId || ANONYMOUS;
|
|
29
31
|
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
* The account an invocation that presented no API key may claim, which is nothing at all
|
|
33
|
+
* unless stored credentials named a user.
|
|
34
|
+
*
|
|
35
|
+
* Both fields are omitted together. An empty account reported under a named method describes
|
|
36
|
+
* an authentication that did not happen, which is worse than reporting neither.
|
|
37
|
+
*
|
|
38
|
+
* Exported for tests.
|
|
39
|
+
*/
|
|
40
|
+
const storedCredentialAttribution = (storedUserId) => storedUserId ? {
|
|
41
|
+
accountId: storedUserId,
|
|
42
|
+
authMethod: OAUTH
|
|
43
|
+
} : {};
|
|
39
44
|
/**
|
|
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
|
-
return {
|
|
70
|
-
apiKey,
|
|
71
|
-
credentialsPath: authContext.credentialsPath ?? defaultCredentialsPath,
|
|
72
|
-
};
|
|
45
|
+
* Which credential telemetry may describe this invocation with.
|
|
46
|
+
*
|
|
47
|
+
* `ensureAuth` records a context only when it selected a credential for this invocation, so a
|
|
48
|
+
* missing context means the global auth middleware selected nothing before this ran. A key
|
|
49
|
+
* sitting in `args.apiKey` is then not the credential the middleware chose — `neon profile list`
|
|
50
|
+
* never used it — and must not be queried on its behalf, which would attribute the run to an
|
|
51
|
+
* account it never authenticated as and add a telemetry-only API call. The local default is the
|
|
52
|
+
* guess.
|
|
53
|
+
*
|
|
54
|
+
* The boundary is deliberately the credential the middleware selected, not every key a handler
|
|
55
|
+
* may go on to use. Several `profile` subcommands authenticate inside their own handlers —
|
|
56
|
+
* `create --api-key` verifies the key it is about to store, `rotate-key` mints and revokes — and
|
|
57
|
+
* those runs are attributed to the local default rather than to the account the handler talked
|
|
58
|
+
* to. Attributing them to that key puts an `identify` for the signed-in user beside an
|
|
59
|
+
* `accountId` for a different account.
|
|
60
|
+
*
|
|
61
|
+
* A selected key records no file, because it authenticates as its own account rather than out
|
|
62
|
+
* of one. Reading `DEFAULT` for it would identify the run as whoever is signed in locally, and
|
|
63
|
+
* that borrowed id would suppress the API lookup that names the key's real owner.
|
|
64
|
+
*
|
|
65
|
+
* Exported for tests.
|
|
66
|
+
*/
|
|
67
|
+
const telemetryCredential = (authContext, apiKey, defaultCredentialsPath) => {
|
|
68
|
+
if (authContext === null) return { credentialsPath: defaultCredentialsPath };
|
|
69
|
+
if (authContext.source === "api-key") return { apiKey };
|
|
70
|
+
return {
|
|
71
|
+
apiKey,
|
|
72
|
+
credentialsPath: authContext.credentialsPath ?? defaultCredentialsPath
|
|
73
|
+
};
|
|
73
74
|
};
|
|
74
75
|
let client;
|
|
75
76
|
let clientInitialized = false;
|
|
76
77
|
let userId = "";
|
|
77
78
|
let errorEventContext;
|
|
78
79
|
/**
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
clientInitialized = true;
|
|
95
|
-
errorEventContext = getErrorAnalyticsEventContext(args);
|
|
96
|
-
client = new Analytics({
|
|
97
|
-
writeKey: WRITE_KEY,
|
|
98
|
-
host: "https://track.neon.tech",
|
|
99
|
-
});
|
|
100
|
-
log.debug("Initialized CLI analytics client");
|
|
101
|
-
client.identify({
|
|
102
|
-
userId: ANONYMOUS,
|
|
103
|
-
});
|
|
80
|
+
* Phase 1: Run before validation so the Segment client exists if any
|
|
81
|
+
* middleware (e.g. auth) fails. Enables sendError() in the fail handler.
|
|
82
|
+
* Does not resolve user id or send CLI Started.
|
|
83
|
+
*/
|
|
84
|
+
const initAnalyticsClientMiddleware = (args) => {
|
|
85
|
+
if (!args.analytics || clientInitialized) return;
|
|
86
|
+
if (isCurrentBranchProbe(args) || hasCurrentBranchArgv()) return;
|
|
87
|
+
clientInitialized = true;
|
|
88
|
+
errorEventContext = getErrorAnalyticsEventContext(args);
|
|
89
|
+
client = new Analytics({
|
|
90
|
+
writeKey: WRITE_KEY,
|
|
91
|
+
host: "https://track.neon.tech"
|
|
92
|
+
});
|
|
93
|
+
log.debug("Initialized CLI analytics client");
|
|
94
|
+
client.identify({ userId: ANONYMOUS });
|
|
104
95
|
};
|
|
105
96
|
/**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (!userId && authDetails.auth_method !== "api_key_org") {
|
|
147
|
-
const resp = await apiClient?.getCurrentUserInfo?.();
|
|
148
|
-
userId = resp?.data?.id;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
const { accountId, authMethod } = storedCredentialAttribution(userId);
|
|
153
|
-
args.accountId = accountId;
|
|
154
|
-
args.authMethod = authMethod;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
catch (err) {
|
|
158
|
-
log.debug("Failed to get user id from api", err);
|
|
159
|
-
}
|
|
160
|
-
client.identify({
|
|
161
|
-
userId: analyticsUserId(userId),
|
|
162
|
-
});
|
|
163
|
-
client.track({
|
|
164
|
-
userId: analyticsUserId(userId),
|
|
165
|
-
event: "CLI Started",
|
|
166
|
-
properties: getAnalyticsEventProperties(args),
|
|
167
|
-
context: {
|
|
168
|
-
direct: true,
|
|
169
|
-
},
|
|
170
|
-
});
|
|
97
|
+
* Phase 2: Run after auth. Resolves user id from credentials,
|
|
98
|
+
* identifies the user, and sends CLI Started.
|
|
99
|
+
*/
|
|
100
|
+
const analyticsMiddleware = async (args) => {
|
|
101
|
+
if (!client || !args.analytics) return;
|
|
102
|
+
if (isCurrentBranchProbe(args)) return;
|
|
103
|
+
const { apiKey: keyToQuery, credentialsPath: fileToRead } = telemetryCredential(getAuthContext(), args.apiKey, credentialsPath(args.configDir));
|
|
104
|
+
if (fileToRead !== void 0) try {
|
|
105
|
+
const read = inspectCredentials(fileToRead);
|
|
106
|
+
if (read.kind === "ok" && typeof read.credentials.user_id === "string") userId = read.credentials.user_id;
|
|
107
|
+
else if (read.kind !== "ok") log.debug("No usable credentials at %s", fileToRead);
|
|
108
|
+
} catch (err) {
|
|
109
|
+
log.debug("Could not read %s: %s", fileToRead, err);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
if (keyToQuery) {
|
|
113
|
+
const apiClient = getApiClient({
|
|
114
|
+
apiKey: keyToQuery,
|
|
115
|
+
apiHost: args.apiHost
|
|
116
|
+
});
|
|
117
|
+
const authDetails = (await apiClient.getAuthDetails()).data;
|
|
118
|
+
args.accountId = authDetails.account_id;
|
|
119
|
+
args.authMethod = authDetails.auth_method;
|
|
120
|
+
args.authData = authDetails.auth_data;
|
|
121
|
+
if (!userId && authDetails.auth_method !== "api_key_org") userId = (await apiClient?.getCurrentUserInfo?.())?.data?.id;
|
|
122
|
+
} else {
|
|
123
|
+
const { accountId, authMethod } = storedCredentialAttribution(userId);
|
|
124
|
+
args.accountId = accountId;
|
|
125
|
+
args.authMethod = authMethod;
|
|
126
|
+
}
|
|
127
|
+
} catch (err) {
|
|
128
|
+
log.debug("Failed to get user id from api", err);
|
|
129
|
+
}
|
|
130
|
+
client.identify({ userId: analyticsUserId(userId) });
|
|
131
|
+
client.track({
|
|
132
|
+
userId: analyticsUserId(userId),
|
|
133
|
+
event: "CLI Started",
|
|
134
|
+
properties: getAnalyticsEventProperties(args),
|
|
135
|
+
context: { direct: true }
|
|
136
|
+
});
|
|
171
137
|
};
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
await client.closeAndFlush(opts);
|
|
179
|
-
log.debug("Flushed CLI analytics");
|
|
180
|
-
}
|
|
138
|
+
const closeAnalytics = async (opts) => {
|
|
139
|
+
if (client) {
|
|
140
|
+
log.debug("Flushing CLI analytics");
|
|
141
|
+
await client.closeAndFlush(opts);
|
|
142
|
+
log.debug("Flushed CLI analytics");
|
|
143
|
+
}
|
|
181
144
|
};
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
145
|
+
const getErrorAnalyticsEventProperties = (err, errCode, context) => {
|
|
146
|
+
const apiError = isNeonApiError(err) ? err : void 0;
|
|
147
|
+
const requestId = apiError?.headers?.["x-neon-ret-request-id"];
|
|
148
|
+
return {
|
|
149
|
+
...context,
|
|
150
|
+
message: err.message,
|
|
151
|
+
stack: err.stack,
|
|
152
|
+
errCode,
|
|
153
|
+
statusCode: apiError?.status,
|
|
154
|
+
requestId
|
|
155
|
+
};
|
|
193
156
|
};
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
event: "CLI Error",
|
|
205
|
-
userId: analyticsUserId(userId),
|
|
206
|
-
properties: getErrorAnalyticsEventProperties(err, errCode, errorEventContext),
|
|
207
|
-
});
|
|
208
|
-
log.debug("Sent CLI error event: %s", errCode);
|
|
157
|
+
const sendError = (err, errCode) => {
|
|
158
|
+
if (!client) return;
|
|
159
|
+
const requestId = (isNeonApiError(err) ? err : void 0)?.headers?.["x-neon-ret-request-id"];
|
|
160
|
+
if (requestId) log.debug("Failed request ID: %s", requestId);
|
|
161
|
+
client.track({
|
|
162
|
+
event: "CLI Error",
|
|
163
|
+
userId: analyticsUserId(userId),
|
|
164
|
+
properties: getErrorAnalyticsEventProperties(err, errCode, errorEventContext)
|
|
165
|
+
});
|
|
166
|
+
log.debug("Sent CLI error event: %s", errCode);
|
|
209
167
|
};
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
});
|
|
219
|
-
log.debug("Sent CLI event: %s", event);
|
|
168
|
+
const trackEvent = (event, properties) => {
|
|
169
|
+
if (!client) return;
|
|
170
|
+
client.track({
|
|
171
|
+
event,
|
|
172
|
+
userId: analyticsUserId(userId),
|
|
173
|
+
properties
|
|
174
|
+
});
|
|
175
|
+
log.debug("Sent CLI event: %s", event);
|
|
220
176
|
};
|
|
221
177
|
const getErrorAnalyticsEventContext = (_args) => ({
|
|
222
|
-
|
|
223
|
-
|
|
178
|
+
version: pkg_default.version,
|
|
179
|
+
ci: isCi()
|
|
224
180
|
});
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
ci: isCi(),
|
|
232
|
-
githubEnvVars: getGithubEnvVars(process.env),
|
|
181
|
+
const getAnalyticsEventProperties = (args) => ({
|
|
182
|
+
version: pkg_default.version,
|
|
183
|
+
command: args._.join(" "),
|
|
184
|
+
flags: { output: args.output },
|
|
185
|
+
ci: isCi(),
|
|
186
|
+
githubEnvVars: getGithubEnvVars(process.env)
|
|
233
187
|
});
|
|
188
|
+
//#endregion
|
|
189
|
+
export { analyticsMiddleware, analyticsUserId, closeAnalytics, getAnalyticsEventProperties, getErrorAnalyticsEventProperties, initAnalyticsClientMiddleware, sendError, storedCredentialAttribution, telemetryCredential, trackEvent };
|