neon 8.0.4 → 8.0.6
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/dist/analytics.js +126 -46
- package/dist/api.js +8 -2
- package/dist/commands/config.js +90 -5
- package/dist/commands/dev.js +2 -2
- package/dist/commands/env.js +1 -1
- package/dist/index.js +2 -2
- package/package.json +5 -5
package/dist/analytics.js
CHANGED
|
@@ -75,8 +75,12 @@ const telemetryCredential = (authContext, apiKey, defaultCredentialsPath) => {
|
|
|
75
75
|
};
|
|
76
76
|
let client;
|
|
77
77
|
let clientInitialized = false;
|
|
78
|
-
let userId = "";
|
|
79
78
|
let errorEventContext;
|
|
79
|
+
/** Lets tests send to a local collector; the CLI itself always uses track.neon.tech. */
|
|
80
|
+
const useAnalyticsClientForTests = (analytics) => {
|
|
81
|
+
client = analytics;
|
|
82
|
+
clientInitialized = true;
|
|
83
|
+
};
|
|
80
84
|
/**
|
|
81
85
|
* Phase 1: Run before validation so the Segment client exists if any
|
|
82
86
|
* middleware (e.g. auth) fails. Enables sendError() in the fail handler.
|
|
@@ -95,12 +99,37 @@ const initAnalyticsClientMiddleware = (args) => {
|
|
|
95
99
|
client.identify({ userId: ANONYMOUS });
|
|
96
100
|
};
|
|
97
101
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
102
|
+
* The attribution of the current attempt. A 401 retry runs the middleware again and starts a
|
|
103
|
+
* new one; events keep the attempt they were tracked in, even while its lookup is in flight.
|
|
104
|
+
*/
|
|
105
|
+
let attribution = { userId: "" };
|
|
106
|
+
/**
|
|
107
|
+
* Every event goes out through this chain so events tracked while the account lookup is in
|
|
108
|
+
* flight are sent after "CLI Started", with the user id the lookup resolves, in call order.
|
|
100
109
|
*/
|
|
101
|
-
|
|
110
|
+
let queue = Promise.resolve();
|
|
111
|
+
const lookups = /* @__PURE__ */ new Set();
|
|
112
|
+
const enqueue = (send) => {
|
|
113
|
+
const analytics = client;
|
|
114
|
+
if (!analytics) return;
|
|
115
|
+
const attempt = attribution;
|
|
116
|
+
queue = queue.then(() => {
|
|
117
|
+
try {
|
|
118
|
+
send(analytics, attempt);
|
|
119
|
+
} catch (err) {
|
|
120
|
+
log.debug("Could not queue a CLI analytics event: %s", err);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Phase 2: Run after auth. Starts resolving the user id from credentials and returns; the
|
|
126
|
+
* command does not wait for it. Identify and CLI Started go out once it settles.
|
|
127
|
+
*/
|
|
128
|
+
const analyticsMiddleware = (args) => {
|
|
102
129
|
if (!client || !args.analytics) return;
|
|
103
130
|
if (isCurrentBranchProbe(args)) return;
|
|
131
|
+
const attempt = { userId: attribution.userId };
|
|
132
|
+
attribution = attempt;
|
|
104
133
|
const { apiKey: keyToQuery, credentialsPath: fileToRead } = telemetryCredential(getAuthContext(), args.apiKey, credentialsPath(args.configDir));
|
|
105
134
|
if (fileToRead !== void 0) try {
|
|
106
135
|
const listing = storeFor(args.configDir).inspect({
|
|
@@ -108,7 +137,7 @@ const analyticsMiddleware = async (args) => {
|
|
|
108
137
|
storage: "file",
|
|
109
138
|
path: fileToRead
|
|
110
139
|
});
|
|
111
|
-
if (typeof listing.credentials?.user_id === "string") userId = listing.credentials.user_id;
|
|
140
|
+
if (typeof listing.credentials?.user_id === "string") attempt.userId = listing.credentials.user_id;
|
|
112
141
|
else log.debug("No usable credentials at %s", fileToRead);
|
|
113
142
|
} catch (err) {
|
|
114
143
|
log.debug("Could not read %s: %s", fileToRead, err);
|
|
@@ -118,50 +147,76 @@ const analyticsMiddleware = async (args) => {
|
|
|
118
147
|
profile: getAuthContext()?.profile ?? "DEFAULT",
|
|
119
148
|
storage: "keyring"
|
|
120
149
|
});
|
|
121
|
-
if (typeof listing.credentials?.user_id === "string") userId = listing.credentials.user_id;
|
|
150
|
+
if (typeof listing.credentials?.user_id === "string") attempt.userId = listing.credentials.user_id;
|
|
122
151
|
} catch (err) {
|
|
123
152
|
log.debug("Could not read the OS keyring item: %s", err);
|
|
124
153
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
154
|
+
const startedProperties = getAnalyticsEventProperties(args);
|
|
155
|
+
const controller = new AbortController();
|
|
156
|
+
lookups.add(controller);
|
|
157
|
+
const lookup = (async () => {
|
|
158
|
+
try {
|
|
159
|
+
if (keyToQuery) {
|
|
160
|
+
const apiClient = getApiClient({
|
|
161
|
+
apiKey: keyToQuery,
|
|
162
|
+
apiHost: args.apiHost
|
|
163
|
+
});
|
|
164
|
+
const { data: authDetails } = await apiClient.getAuthDetails({ signal: controller.signal });
|
|
165
|
+
attempt.accountId = authDetails.account_id;
|
|
166
|
+
attempt.authMethod = authDetails.auth_method;
|
|
167
|
+
attempt.authData = authDetails.auth_data;
|
|
168
|
+
if (!attempt.userId && authDetails.auth_method !== "api_key_org") {
|
|
169
|
+
const resp = await apiClient.getCurrentUserInfo({ signal: controller.signal });
|
|
170
|
+
attempt.userId = resp.data.id;
|
|
171
|
+
}
|
|
172
|
+
} else Object.assign(attempt, storedCredentialAttribution(attempt.userId));
|
|
173
|
+
} catch (err) {
|
|
174
|
+
log.debug("Failed to get user id from api", err);
|
|
175
|
+
} finally {
|
|
176
|
+
lookups.delete(controller);
|
|
140
177
|
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
178
|
+
})();
|
|
179
|
+
queue = queue.then(() => lookup);
|
|
180
|
+
enqueue((analytics, { userId }) => {
|
|
181
|
+
analytics.identify({ userId: analyticsUserId(userId) });
|
|
182
|
+
analytics.track({
|
|
183
|
+
userId: analyticsUserId(userId),
|
|
184
|
+
event: "CLI Started",
|
|
185
|
+
properties: startedProperties,
|
|
186
|
+
context: { direct: true }
|
|
187
|
+
});
|
|
150
188
|
});
|
|
151
189
|
};
|
|
190
|
+
/** How long closing waits for an unfinished account lookup before aborting it. */
|
|
191
|
+
const ATTRIBUTION_WAIT_MS = 1e3;
|
|
152
192
|
let closing;
|
|
153
193
|
/**
|
|
154
|
-
*
|
|
155
|
-
* launcher starts one while psql runs, and a second `closeAndFlush` would only make the SDK
|
|
156
|
-
* warn about overlapping flushes.
|
|
194
|
+
* Send queued events, then close the client and flush. Later calls share the first close: the
|
|
195
|
+
* psql launcher starts one while psql runs, and a second `closeAndFlush` would only make the SDK
|
|
196
|
+
* warn about overlapping flushes. `timeout` bounds the whole close, lookup wait included.
|
|
157
197
|
*/
|
|
158
198
|
const closeAnalytics = (opts) => {
|
|
159
|
-
|
|
199
|
+
const analytics = client;
|
|
200
|
+
if (!analytics) return Promise.resolve();
|
|
160
201
|
if (!closing) {
|
|
161
|
-
|
|
162
|
-
closing =
|
|
202
|
+
const started = Date.now();
|
|
203
|
+
closing = (async () => {
|
|
204
|
+
const wait = Math.min(ATTRIBUTION_WAIT_MS, (opts?.timeout ?? Infinity) / 2);
|
|
205
|
+
let timer;
|
|
206
|
+
const timedOut = await Promise.race([queue.then(() => false), new Promise((resolve) => {
|
|
207
|
+
timer = setTimeout(() => resolve(true), wait);
|
|
208
|
+
})]);
|
|
209
|
+
clearTimeout(timer);
|
|
210
|
+
if (timedOut) {
|
|
211
|
+
log.debug("Account lookup unfinished; sending events without it");
|
|
212
|
+
for (const controller of lookups) controller.abort();
|
|
213
|
+
await queue;
|
|
214
|
+
}
|
|
215
|
+
log.debug("Flushing CLI analytics");
|
|
216
|
+
const flush = opts?.timeout === void 0 ? void 0 : { timeout: Math.max(1, opts.timeout - (Date.now() - started)) };
|
|
217
|
+
await analytics.closeAndFlush(flush);
|
|
163
218
|
log.debug("Flushed CLI analytics");
|
|
164
|
-
});
|
|
219
|
+
})();
|
|
165
220
|
}
|
|
166
221
|
return closing;
|
|
167
222
|
};
|
|
@@ -188,22 +243,47 @@ const sendError = (err, errCode) => {
|
|
|
188
243
|
if (!client) return;
|
|
189
244
|
const requestId = (isNeonApiError(err) ? err : void 0)?.headers?.["x-neon-ret-request-id"];
|
|
190
245
|
if (requestId) log.debug("Failed request ID: %s", requestId);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
246
|
+
const properties = getErrorAnalyticsEventProperties(err, errCode, errorEventContext);
|
|
247
|
+
enqueue((analytics, { userId }) => {
|
|
248
|
+
analytics.track({
|
|
249
|
+
event: "CLI Error",
|
|
250
|
+
userId: analyticsUserId(userId),
|
|
251
|
+
properties
|
|
252
|
+
});
|
|
195
253
|
});
|
|
196
254
|
log.debug("Sent CLI error event: %s", errCode);
|
|
197
255
|
};
|
|
198
256
|
const trackEvent = (event, properties) => {
|
|
199
257
|
if (!client) return;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
258
|
+
enqueue((analytics, { userId }) => {
|
|
259
|
+
analytics.track({
|
|
260
|
+
event,
|
|
261
|
+
userId: analyticsUserId(userId),
|
|
262
|
+
properties
|
|
263
|
+
});
|
|
204
264
|
});
|
|
205
265
|
log.debug("Sent CLI event: %s", event);
|
|
206
266
|
};
|
|
267
|
+
/**
|
|
268
|
+
* Tracks cli_command_success. The account fields come from the lookup, which may still be in
|
|
269
|
+
* flight when the command finishes, so they are read when the event is sent.
|
|
270
|
+
*/
|
|
271
|
+
const trackCommandSuccess = (args) => {
|
|
272
|
+
if (!client) return;
|
|
273
|
+
const properties = commandSuccessProperties(args);
|
|
274
|
+
enqueue((analytics, { userId, accountId, authMethod, authData }) => {
|
|
275
|
+
analytics.track({
|
|
276
|
+
event: "cli_command_success",
|
|
277
|
+
userId: analyticsUserId(userId),
|
|
278
|
+
properties: {
|
|
279
|
+
...properties,
|
|
280
|
+
accountId,
|
|
281
|
+
authMethod,
|
|
282
|
+
authData
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
};
|
|
207
287
|
let commandSuccessExtras = {};
|
|
208
288
|
const recordCommandSuccessExtras = (patch) => {
|
|
209
289
|
commandSuccessExtras = {
|
|
@@ -242,4 +322,4 @@ const getAnalyticsEventProperties = (args) => ({
|
|
|
242
322
|
githubEnvVars: getGithubEnvVars(process.env)
|
|
243
323
|
});
|
|
244
324
|
//#endregion
|
|
245
|
-
export { analyticsMiddleware, analyticsUserId, closeAnalytics, commandSuccessProperties, getAnalyticsEventProperties, getErrorAnalyticsEventProperties, initAnalyticsClientMiddleware, recordCommandSuccessExtras, recordScaffoldedTemplate, sendError, storedCredentialAttribution, takeCommandSuccessExtras, telemetryCredential, trackEvent };
|
|
325
|
+
export { analyticsMiddleware, analyticsUserId, closeAnalytics, commandSuccessProperties, getAnalyticsEventProperties, getErrorAnalyticsEventProperties, initAnalyticsClientMiddleware, recordCommandSuccessExtras, recordScaffoldedTemplate, sendError, storedCredentialAttribution, takeCommandSuccessExtras, telemetryCredential, trackCommandSuccess, trackEvent, useAnalyticsClientForTests };
|
package/dist/api.js
CHANGED
|
@@ -333,9 +333,15 @@ const getApiClient = ({ apiKey, apiHost, requestTimeoutMs = REQUEST_TIMEOUT_MS }
|
|
|
333
333
|
}
|
|
334
334
|
return {
|
|
335
335
|
request,
|
|
336
|
-
getCurrentUserInfo: () => call(() => raw.getCurrentUserInfo({
|
|
336
|
+
getCurrentUserInfo: (options = {}) => call(() => raw.getCurrentUserInfo({
|
|
337
|
+
client,
|
|
338
|
+
signal: options.signal
|
|
339
|
+
})),
|
|
337
340
|
getCurrentUserOrganizations: () => call(() => raw.getCurrentUserOrganizations({ client })),
|
|
338
|
-
getAuthDetails: () => call(() => raw.getAuthDetails({
|
|
341
|
+
getAuthDetails: (options = {}) => call(() => raw.getAuthDetails({
|
|
342
|
+
client,
|
|
343
|
+
signal: options.signal
|
|
344
|
+
})),
|
|
339
345
|
getActiveRegions: () => call(() => raw.getActiveRegions({ client })),
|
|
340
346
|
listApiKeys: () => call(() => raw.listApiKeys({ client })),
|
|
341
347
|
createApiKey: (body) => call(() => raw.createApiKey({
|
package/dist/commands/config.js
CHANGED
|
@@ -559,11 +559,96 @@ const status = async (props) => {
|
|
|
559
559
|
process.stdout.write(`${JSON.stringify(configView, null, 2)}\n`);
|
|
560
560
|
return;
|
|
561
561
|
}
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
562
|
+
if (props.output !== "table") {
|
|
563
|
+
writer(props).end({
|
|
564
|
+
project: live.project,
|
|
565
|
+
branch: live.branch,
|
|
566
|
+
config: configView
|
|
567
|
+
}, { fields: INSPECT_FIELDS });
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
writeStatusTables(props, live, configView);
|
|
571
|
+
};
|
|
572
|
+
const STATUS_FIELDS = [
|
|
573
|
+
"project",
|
|
574
|
+
"region",
|
|
575
|
+
"postgres_version",
|
|
576
|
+
"organization",
|
|
577
|
+
"branch",
|
|
578
|
+
"parent",
|
|
579
|
+
"default",
|
|
580
|
+
"protected",
|
|
581
|
+
"expires_at",
|
|
582
|
+
"auth",
|
|
583
|
+
"data_api",
|
|
584
|
+
"compute",
|
|
585
|
+
"scale_to_zero",
|
|
586
|
+
"ttl"
|
|
587
|
+
];
|
|
588
|
+
const formatComputeUnits = (settings) => {
|
|
589
|
+
const min = settings?.autoscalingLimitMinCu;
|
|
590
|
+
const max = settings?.autoscalingLimitMaxCu;
|
|
591
|
+
if (min === void 0 && max === void 0) return void 0;
|
|
592
|
+
if (min === void 0) return `max ${max} CU`;
|
|
593
|
+
if (max === void 0) return `min ${min} CU`;
|
|
594
|
+
return min === max ? `${min} CU` : `${min}-${max} CU`;
|
|
595
|
+
};
|
|
596
|
+
/** Human `status`: one summary block, then a table per reported resource kind. */
|
|
597
|
+
const writeStatusTables = (props, live, view) => {
|
|
598
|
+
const compute = view.branch?.postgres?.computeSettings;
|
|
599
|
+
const suspend = compute?.suspendTimeout;
|
|
600
|
+
const out = writer(props);
|
|
601
|
+
out.write({
|
|
602
|
+
project: `${live.project.name} (${live.project.id})`,
|
|
603
|
+
region: live.project.region,
|
|
604
|
+
postgres_version: live.project.pgVersion,
|
|
605
|
+
organization: live.project.orgId,
|
|
606
|
+
branch: `${live.branch.name} (${live.branch.id})`,
|
|
607
|
+
parent: live.branch.parent,
|
|
608
|
+
default: live.branch.isDefault ? "yes" : "no",
|
|
609
|
+
protected: live.branch.protected ? "yes" : "no",
|
|
610
|
+
expires_at: live.branch.expiresAt,
|
|
611
|
+
auth: view.auth ? "enabled" : void 0,
|
|
612
|
+
data_api: view.dataApi ? "enabled" : void 0,
|
|
613
|
+
compute: formatComputeUnits(compute),
|
|
614
|
+
scale_to_zero: suspend === void 0 ? void 0 : suspend === false ? "off" : String(suspend),
|
|
615
|
+
ttl: view.branch?.ttl
|
|
616
|
+
}, {
|
|
617
|
+
fields: STATUS_FIELDS,
|
|
618
|
+
humanTitle: "Status"
|
|
619
|
+
});
|
|
620
|
+
const functions = Object.entries(view.preview?.functions ?? {}).map(([slug, fn]) => ({
|
|
621
|
+
slug,
|
|
622
|
+
name: fn.name
|
|
623
|
+
}));
|
|
624
|
+
if (functions.length > 0) out.write(functions, {
|
|
625
|
+
fields: ["slug", "name"],
|
|
626
|
+
humanTitle: "Functions"
|
|
627
|
+
});
|
|
628
|
+
const buckets = Object.entries(view.preview?.buckets ?? {}).map(([name, bucket]) => ({
|
|
629
|
+
name,
|
|
630
|
+
access: bucket.access
|
|
631
|
+
}));
|
|
632
|
+
if (buckets.length > 0) out.write(buckets, {
|
|
633
|
+
fields: ["name", "access"],
|
|
634
|
+
humanTitle: "Buckets"
|
|
635
|
+
});
|
|
636
|
+
const credentials = (view.preview?.credentials ?? []).map((credential) => ({
|
|
637
|
+
id: credential.id,
|
|
638
|
+
name: credential.name,
|
|
639
|
+
scopes: credential.scopes.join(", "),
|
|
640
|
+
last_used_at: credential.lastUsedAt
|
|
641
|
+
}));
|
|
642
|
+
if (credentials.length > 0) out.write(credentials, {
|
|
643
|
+
fields: [
|
|
644
|
+
"id",
|
|
645
|
+
"name",
|
|
646
|
+
"scopes",
|
|
647
|
+
"last_used_at"
|
|
648
|
+
],
|
|
649
|
+
humanTitle: "Credentials"
|
|
650
|
+
});
|
|
651
|
+
out.end();
|
|
567
652
|
};
|
|
568
653
|
const planCmd = async (props) => {
|
|
569
654
|
const config = await loadConfig(props);
|
package/dist/commands/dev.js
CHANGED
|
@@ -4,11 +4,11 @@ import { isClaimableEnvTarget } from "../claimable/state.js";
|
|
|
4
4
|
import { getCliName } from "../utils/cli_name.js";
|
|
5
5
|
import { readEnvFile, resolveEnvFilePath } from "../env_file.js";
|
|
6
6
|
import { l as functionBaseUrlKey } from "../_chunks/env-N19A7qND.js";
|
|
7
|
-
import { branchIdResolve } from "../utils/enrichers.js";
|
|
8
|
-
import { bundleEntry } from "../utils/esbuild.js";
|
|
9
7
|
import { a as resolveDevEnv } from "../_chunks/env-BgiaRNT1.js";
|
|
10
8
|
import { findConfigFunctionBySource, resolveFunctionsFromConfig } from "../dev/functions.js";
|
|
11
9
|
import { resolveWatchInputs } from "../dev/inputs.js";
|
|
10
|
+
import { branchIdResolve } from "../utils/enrichers.js";
|
|
11
|
+
import { bundleEntry } from "../utils/esbuild.js";
|
|
12
12
|
import { existsSync, mkdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { basename, dirname, join, relative, resolve } from "node:path";
|
|
14
14
|
import { fileURLToPath } from "node:url";
|
package/dist/commands/env.js
CHANGED
|
@@ -7,10 +7,10 @@ import { deprecatedServiceMessage, parseServices, servicesFlagValue, servicesOpt
|
|
|
7
7
|
import { mergeEnvFile, readEnvFile, resolveEnvFilePath } from "../env_file.js";
|
|
8
8
|
import { t as NEON_ENV_VAR_KEYS, u as isFunctionBaseUrlKey } from "../_chunks/env-N19A7qND.js";
|
|
9
9
|
import { ENV_PULL_KEY_HELP, ENV_PULL_SERVICES, envKeysForSelection, envPullFlagValue, ownedEnvServiceKeys, parseEnvPullKeys } from "../env_services.js";
|
|
10
|
+
import { i as dropClaimableUnsupported, o as resolveNeonEnvVars } from "../_chunks/env-BgiaRNT1.js";
|
|
10
11
|
import { fillSingleProject, resolveBranchRef } from "../utils/enrichers.js";
|
|
11
12
|
import { warnAiGateway } from "../utils/ai_gateway_notice.js";
|
|
12
13
|
import { announceTargetBranch } from "../utils/branch_notice.js";
|
|
13
|
-
import { i as dropClaimableUnsupported, o as resolveNeonEnvVars } from "../_chunks/env-BgiaRNT1.js";
|
|
14
14
|
import { existsSync } from "node:fs";
|
|
15
15
|
import chalk from "chalk";
|
|
16
16
|
//#region src/commands/env.ts
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { getAuthContext } from "./auth_context.js";
|
|
|
5
5
|
import { r as defaultDir } from "./_chunks/paths-DMq0Lt7a.js";
|
|
6
6
|
import { ensureConfigDir } from "./config.js";
|
|
7
7
|
import { currentContextFile, enrichFromContext } from "./context.js";
|
|
8
|
-
import { analyticsMiddleware, closeAnalytics,
|
|
8
|
+
import { analyticsMiddleware, closeAnalytics, initAnalyticsClientMiddleware, sendError, takeCommandSuccessExtras, trackCommandSuccess } from "./analytics.js";
|
|
9
9
|
import { NETWORK_ERROR_MESSAGE, isNetworkError, matchErrorCode } from "./errors.js";
|
|
10
10
|
import { AuthRefreshError, defaultClientID } from "./auth.js";
|
|
11
11
|
import { getCliName } from "./utils/cli_name.js";
|
|
@@ -199,7 +199,7 @@ async function handleError(msg, err, canRetry) {
|
|
|
199
199
|
await preloadCommand(builder, hideBin(process.argv));
|
|
200
200
|
while (attempts < MAX_ATTEMPTS) try {
|
|
201
201
|
const args = await builder.argv;
|
|
202
|
-
|
|
202
|
+
trackCommandSuccess(args);
|
|
203
203
|
if (args._.length === 0 || args.help) {
|
|
204
204
|
await showHelp(builder);
|
|
205
205
|
process.exit(0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neon",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.6",
|
|
4
4
|
"description": "CLI tool for Neon, the cloud backend primitives built around Lakebase Postgres",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"neon",
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"yaml": "^2.9.0",
|
|
65
65
|
"yargs": "17.7.2",
|
|
66
66
|
"yoctocolors": "^2.1.2",
|
|
67
|
-
"@neon/config": "1.
|
|
68
|
-
"@neon/
|
|
69
|
-
"@neon/
|
|
67
|
+
"@neon/config-runtime": "1.7.4",
|
|
68
|
+
"@neon/sdk": "7.0.0",
|
|
69
|
+
"@neon/config": "1.8.3"
|
|
70
70
|
},
|
|
71
71
|
"optionalDependencies": {
|
|
72
72
|
"@napi-rs/keyring": "1.3.0",
|
|
@@ -99,8 +99,8 @@
|
|
|
99
99
|
"tsx": "4.22.3",
|
|
100
100
|
"typescript": "^5.9.0",
|
|
101
101
|
"vitest": "^3.0.9",
|
|
102
|
-
"@neon-internals/cli-core": "0.0.0",
|
|
103
102
|
"@neon-internals/env-core": "0.0.26",
|
|
103
|
+
"@neon-internals/cli-core": "0.0.0",
|
|
104
104
|
"@neon/e2e-harness": "0.0.0",
|
|
105
105
|
"@neon/functions": "0.11.0"
|
|
106
106
|
},
|