neon 2.1.1 → 2.29.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 (166) hide show
  1. package/LICENSE.md +178 -0
  2. package/README.md +601 -0
  3. package/dist/analytics.js +156 -0
  4. package/dist/api.js +665 -0
  5. package/dist/auth.js +127 -0
  6. package/dist/callback.html +51 -0
  7. package/dist/cli.js +9 -0
  8. package/dist/commands/auth.js +214 -0
  9. package/dist/commands/bootstrap.js +481 -0
  10. package/dist/commands/branches.js +481 -0
  11. package/dist/commands/bucket.js +543 -0
  12. package/dist/commands/checkout.js +289 -0
  13. package/dist/commands/config.js +544 -0
  14. package/dist/commands/connection_string.js +172 -0
  15. package/dist/commands/data_api.js +285 -0
  16. package/dist/commands/databases.js +82 -0
  17. package/dist/commands/deploy.js +26 -0
  18. package/dist/commands/dev.js +698 -0
  19. package/dist/commands/env.js +166 -0
  20. package/dist/commands/functions.js +373 -0
  21. package/dist/commands/index.js +54 -0
  22. package/dist/commands/init.js +73 -0
  23. package/dist/commands/ip_allow.js +137 -0
  24. package/dist/commands/link.js +1121 -0
  25. package/dist/commands/neon_auth.js +1028 -0
  26. package/dist/commands/operations.js +28 -0
  27. package/dist/commands/orgs.js +24 -0
  28. package/dist/commands/projects.js +372 -0
  29. package/dist/commands/psql.js +62 -0
  30. package/dist/commands/roles.js +65 -0
  31. package/dist/commands/schema_diff.js +151 -0
  32. package/dist/commands/set_context.js +29 -0
  33. package/dist/commands/status.js +40 -0
  34. package/dist/commands/user.js +15 -0
  35. package/dist/commands/vpc_endpoints.js +134 -0
  36. package/dist/config.js +11 -0
  37. package/dist/config_format.js +72 -0
  38. package/dist/context.js +177 -0
  39. package/dist/current_branch_fast_path.js +55 -0
  40. package/dist/dev/env.js +240 -0
  41. package/dist/dev/functions.js +70 -0
  42. package/dist/dev/inputs.js +63 -0
  43. package/dist/dev/runtime.js +146 -0
  44. package/dist/env.js +36 -0
  45. package/dist/env_file.js +159 -0
  46. package/dist/errors.js +80 -0
  47. package/dist/functions_api.js +44 -0
  48. package/dist/help.js +146 -0
  49. package/dist/index.js +234 -0
  50. package/dist/log.js +18 -0
  51. package/dist/parameters.gen.js +480 -0
  52. package/dist/pkg.js +25 -0
  53. package/dist/psql/cli.js +53 -0
  54. package/dist/psql/command/cmd_cond.js +437 -0
  55. package/dist/psql/command/cmd_connect.js +820 -0
  56. package/dist/psql/command/cmd_copy.js +1035 -0
  57. package/dist/psql/command/cmd_describe.js +1815 -0
  58. package/dist/psql/command/cmd_format.js +922 -0
  59. package/dist/psql/command/cmd_io.js +2193 -0
  60. package/dist/psql/command/cmd_lo.js +393 -0
  61. package/dist/psql/command/cmd_meta.js +970 -0
  62. package/dist/psql/command/cmd_misc.js +187 -0
  63. package/dist/psql/command/cmd_pipeline.js +1148 -0
  64. package/dist/psql/command/cmd_restrict.js +171 -0
  65. package/dist/psql/command/cmd_show.js +766 -0
  66. package/dist/psql/command/dispatch.js +343 -0
  67. package/dist/psql/command/inputQueue.js +42 -0
  68. package/dist/psql/command/shared.js +71 -0
  69. package/dist/psql/complete/filenames.js +139 -0
  70. package/dist/psql/complete/index.js +104 -0
  71. package/dist/psql/complete/matcher.js +315 -0
  72. package/dist/psql/complete/psqlVars.js +247 -0
  73. package/dist/psql/complete/queries.js +493 -0
  74. package/dist/psql/complete/rules.js +2424 -0
  75. package/dist/psql/core/common.js +1253 -0
  76. package/dist/psql/core/help.js +576 -0
  77. package/dist/psql/core/mainloop.js +1360 -0
  78. package/dist/psql/core/prompt.js +440 -0
  79. package/dist/psql/core/settings.js +684 -0
  80. package/dist/psql/core/sqlHelp.js +1066 -0
  81. package/dist/psql/core/startup.js +846 -0
  82. package/dist/psql/core/syncVars.js +116 -0
  83. package/dist/psql/core/variables.js +287 -0
  84. package/dist/psql/describe/formatters.js +1290 -0
  85. package/dist/psql/describe/processNamePattern.js +270 -0
  86. package/dist/psql/describe/queries.js +2378 -0
  87. package/dist/psql/describe/versionGate.js +43 -0
  88. package/dist/psql/index.js +2030 -0
  89. package/dist/psql/io/history.js +299 -0
  90. package/dist/psql/io/input.js +120 -0
  91. package/dist/psql/io/lineEditor/buffer.js +325 -0
  92. package/dist/psql/io/lineEditor/complete.js +227 -0
  93. package/dist/psql/io/lineEditor/filename.js +159 -0
  94. package/dist/psql/io/lineEditor/index.js +894 -0
  95. package/dist/psql/io/lineEditor/keymap.js +745 -0
  96. package/dist/psql/io/lineEditor/vt100.js +363 -0
  97. package/dist/psql/io/pgpass.js +202 -0
  98. package/dist/psql/io/pgservice.js +194 -0
  99. package/dist/psql/io/psqlrc.js +422 -0
  100. package/dist/psql/print/aligned.js +1765 -0
  101. package/dist/psql/print/asciidoc.js +248 -0
  102. package/dist/psql/print/crosstab.js +463 -0
  103. package/dist/psql/print/csv.js +95 -0
  104. package/dist/psql/print/html.js +258 -0
  105. package/dist/psql/print/json.js +96 -0
  106. package/dist/psql/print/latex.js +396 -0
  107. package/dist/psql/print/pager.js +267 -0
  108. package/dist/psql/print/troff.js +258 -0
  109. package/dist/psql/print/unaligned.js +119 -0
  110. package/dist/psql/print/units.js +135 -0
  111. package/dist/psql/scanner/slash.js +515 -0
  112. package/dist/psql/scanner/sql.js +914 -0
  113. package/dist/psql/scanner/stringutils.js +394 -0
  114. package/dist/psql/types/backslash.js +1 -0
  115. package/dist/psql/types/connection.js +1 -0
  116. package/dist/psql/types/index.js +7 -0
  117. package/dist/psql/types/printer.js +1 -0
  118. package/dist/psql/types/repl.js +1 -0
  119. package/dist/psql/types/scanner.js +24 -0
  120. package/dist/psql/types/settings.js +1 -0
  121. package/dist/psql/types/variables.js +1 -0
  122. package/dist/psql/wire/connection.js +2858 -0
  123. package/dist/psql/wire/copy.js +108 -0
  124. package/dist/psql/wire/notify.js +59 -0
  125. package/dist/psql/wire/pipeline.js +521 -0
  126. package/dist/psql/wire/protocol.js +466 -0
  127. package/dist/psql/wire/sasl.js +296 -0
  128. package/dist/psql/wire/tls.js +602 -0
  129. package/dist/storage_api.js +147 -0
  130. package/dist/test_utils/fixtures.js +122 -0
  131. package/dist/test_utils/oauth_server.js +9 -0
  132. package/dist/types.js +1 -0
  133. package/dist/utils/api_enums.js +33 -0
  134. package/dist/utils/auth.js +5 -0
  135. package/dist/utils/branch_notice.js +22 -0
  136. package/dist/utils/branch_picker.js +103 -0
  137. package/dist/utils/compute_units.js +28 -0
  138. package/dist/utils/enrichers.js +161 -0
  139. package/dist/utils/esbuild.js +158 -0
  140. package/dist/utils/formats.js +18 -0
  141. package/dist/utils/middlewares.js +20 -0
  142. package/dist/utils/package_manager.js +68 -0
  143. package/dist/utils/point_in_time.js +56 -0
  144. package/dist/utils/psql.js +120 -0
  145. package/dist/utils/string.js +5 -0
  146. package/dist/utils/ui.js +59 -0
  147. package/dist/utils/zip.js +4 -0
  148. package/dist/writer.js +97 -0
  149. package/package.json +117 -14
  150. package/.jshintrc +0 -3
  151. package/CHANGELOG.markdown +0 -22
  152. package/LICENSE +0 -21
  153. package/README.markdown +0 -76
  154. package/bower.json +0 -23
  155. package/license.txt +0 -9
  156. package/neon.js +0 -234
  157. package/stdlib/bubbling_support.js +0 -32
  158. package/stdlib/custom_event.js +0 -54
  159. package/stdlib/custom_event_support.js +0 -195
  160. package/stdlib/index.js +0 -7
  161. package/stdlib/node_support.js +0 -123
  162. package/stdlib/widget.js +0 -340
  163. package/test/neon_browser.html +0 -11
  164. package/test/neon_stdlib_browser.html +0 -15
  165. package/test/neon_stdlib_test.js +0 -84
  166. 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
+ });