@gadgetinc/ggt 0.1.18 → 0.2.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.
Files changed (59) hide show
  1. package/README.md +6 -6
  2. package/bin/dev.js +24 -0
  3. package/bin/run.js +11 -0
  4. package/lib/__generated__/graphql.js +6 -9
  5. package/lib/__generated__/graphql.js.map +1 -1
  6. package/lib/commands/help.js +21 -36
  7. package/lib/commands/help.js.map +1 -1
  8. package/lib/commands/list.js +29 -55
  9. package/lib/commands/list.js.map +1 -1
  10. package/lib/commands/login.js +13 -29
  11. package/lib/commands/login.js.map +1 -1
  12. package/lib/commands/logout.js +17 -34
  13. package/lib/commands/logout.js.map +1 -1
  14. package/lib/commands/sync.js +501 -463
  15. package/lib/commands/sync.js.map +1 -1
  16. package/lib/commands/whoami.js +17 -34
  17. package/lib/commands/whoami.js.map +1 -1
  18. package/lib/index.js +2 -5
  19. package/lib/index.js.map +1 -1
  20. package/lib/utils/base-command.js +105 -146
  21. package/lib/utils/base-command.js.map +1 -1
  22. package/lib/utils/client.js +104 -113
  23. package/lib/utils/client.js.map +1 -1
  24. package/lib/utils/context.js +63 -119
  25. package/lib/utils/context.js.map +1 -1
  26. package/lib/utils/errors.js +161 -242
  27. package/lib/utils/errors.js.map +1 -1
  28. package/lib/utils/flags.js +23 -26
  29. package/lib/utils/flags.js.map +1 -1
  30. package/lib/utils/fs-utils.js +50 -73
  31. package/lib/utils/fs-utils.js.map +1 -1
  32. package/lib/utils/help.js +19 -26
  33. package/lib/utils/help.js.map +1 -1
  34. package/lib/utils/promise.js +32 -78
  35. package/lib/utils/promise.js.map +1 -1
  36. package/lib/utils/sleep.js +6 -11
  37. package/lib/utils/sleep.js.map +1 -1
  38. package/npm-shrinkwrap.json +7848 -7077
  39. package/oclif.manifest.json +1 -21
  40. package/package.json +49 -49
  41. package/bin/dev +0 -20
  42. package/bin/run +0 -7
  43. package/lib/__generated__/graphql.d.ts +0 -294
  44. package/lib/commands/help.d.ts +0 -14
  45. package/lib/commands/list.d.ts +0 -18
  46. package/lib/commands/login.d.ts +0 -7
  47. package/lib/commands/logout.d.ts +0 -7
  48. package/lib/commands/sync.d.ts +0 -146
  49. package/lib/commands/whoami.d.ts +0 -7
  50. package/lib/index.d.ts +0 -1
  51. package/lib/utils/base-command.d.ts +0 -64
  52. package/lib/utils/client.d.ts +0 -42
  53. package/lib/utils/context.d.ts +0 -57
  54. package/lib/utils/errors.d.ts +0 -100
  55. package/lib/utils/flags.d.ts +0 -1
  56. package/lib/utils/fs-utils.d.ts +0 -21
  57. package/lib/utils/help.d.ts +0 -19
  58. package/lib/utils/promise.d.ts +0 -35
  59. package/lib/utils/sleep.d.ts +0 -5
@@ -1,85 +1,43 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BaseCommand = void 0;
4
- const tslib_1 = require("tslib");
5
- const core_1 = require("@oclif/core");
6
- const errors_1 = require("@oclif/errors");
7
- const errors_2 = require("@oclif/core/lib/errors");
8
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
9
- const debug_1 = tslib_1.__importDefault(require("debug"));
10
- const Sentry = tslib_1.__importStar(require("@sentry/node"));
11
- const get_port_1 = tslib_1.__importDefault(require("get-port"));
12
- const http_1 = require("http");
13
- const inquirer_1 = require("inquirer");
14
- const node_notifier_1 = require("node-notifier");
15
- const open_1 = tslib_1.__importDefault(require("open"));
16
- const path_1 = tslib_1.__importDefault(require("path"));
17
- const ts_dedent_1 = tslib_1.__importDefault(require("ts-dedent"));
18
- const context_1 = require("./context");
19
- const errors_3 = require("./errors");
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ import { Command, Flags, settings } from "@oclif/core";
3
+ import { CLIError as CLIError2 } from "@oclif/core/lib/errors/index.js";
4
+ import { CLIError, ExitError } from "@oclif/errors";
5
+ import * as Sentry from "@sentry/node";
6
+ import chalkTemplate from "chalk-template";
7
+ import Debug from "debug";
8
+ import getPort from "get-port";
9
+ import inquirer from "inquirer";
10
+ import notifier from "node-notifier";
11
+ import http from "node:http";
12
+ import path from "node:path";
13
+ import open from "open";
14
+ import { dedent } from "ts-dedent";
15
+ import { context } from "./context.js";
16
+ import { BaseError, UnexpectedError } from "./errors.js";
20
17
  /**
21
18
  * BaseCommand is the base class for all commands in the Gadget CLI.
22
- */
23
- class BaseCommand extends core_1.Command {
24
- constructor(argv, config) {
25
- super(argv, config);
26
- /**
27
- * Determines whether the command requires the user to be logged in or not.
28
- *
29
- * If true and the user is not logged in, the user will be prompted to login before the underlying command is
30
- * initialized and run.
31
- */
32
- Object.defineProperty(this, "requireUser", {
33
- enumerable: true,
34
- configurable: true,
35
- writable: true,
36
- value: false
37
- });
38
- /**
39
- * The parsed flags for the command.
40
- */
41
- Object.defineProperty(this, "flags", {
42
- enumerable: true,
43
- configurable: true,
44
- writable: true,
45
- value: void 0
46
- });
47
- /**
48
- * The parsed arguments for the command.
49
- */
50
- Object.defineProperty(this, "args", {
51
- enumerable: true,
52
- configurable: true,
53
- writable: true,
54
- value: void 0
55
- });
56
- // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks base flags as well.
57
- // warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).
58
- // https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259
59
- this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.baseFlags };
60
- }
19
+ */ export class BaseCommand extends Command {
61
20
  /**
62
- * Indicates whether the command is being run with the `-D/--debug` flag.
63
- */
64
- get debugEnabled() {
65
- return !!core_1.settings.debug;
21
+ * Indicates whether the command is being run with the `-D/--debug` flag.
22
+ */ get debugEnabled() {
23
+ return !!settings.debug;
66
24
  }
67
25
  async init() {
68
- context_1.context.config = this.config;
69
- if (context_1.context.env.productionLike) {
26
+ context.config = this.config;
27
+ if (context.env.productionLike) {
70
28
  Sentry.init({
71
29
  dsn: "https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266",
72
- release: context_1.context.config.version,
30
+ release: context.config.version
73
31
  });
74
32
  }
75
33
  await super.init();
76
- if (this.requireUser && !(await context_1.context.getUser())) {
34
+ if (this.requireUser && !await context.getUser()) {
77
35
  // we purposely log the user in before parsing flags in case one of the flags requires the user to be logged in
78
36
  // e.g. the `--app` flag verifies that the user has access to the app they are trying to use
79
- const { login } = await (0, inquirer_1.prompt)({
37
+ const { login } = await inquirer.prompt({
80
38
  type: "confirm",
81
39
  name: "login",
82
- message: "You must be logged in to use this command. Would you like to log in?",
40
+ message: "You must be logged in to use this command. Would you like to log in?"
83
41
  });
84
42
  if (!login) {
85
43
  return this.exit(0);
@@ -90,101 +48,92 @@ class BaseCommand extends core_1.Command {
90
48
  flags: this.ctor.flags,
91
49
  baseFlags: super.ctor.baseFlags,
92
50
  args: this.ctor.args,
93
- strict: this.ctor.strict,
51
+ strict: this.ctor.strict
94
52
  });
95
53
  this.flags = flags;
96
54
  this.args = args;
97
55
  if (flags.debug) {
98
- core_1.settings.debug = true;
99
- debug_1.default.enable(`${this.config.bin}:*`);
56
+ settings.debug = true;
57
+ Debug.enable(`${this.config.bin}:*`);
100
58
  }
101
59
  }
102
60
  /**
103
- * Sends a native OS notification to the user.
104
- *
105
- * @see {@link https://www.npmjs.com/package/node-notifier node-notifier}
106
- */
107
- notify(notification) {
108
- (0, node_notifier_1.notify)({
61
+ * Sends a native OS notification to the user.
62
+ *
63
+ * @see {@link https://www.npmjs.com/package/node-notifier node-notifier}
64
+ */ notify(notification) {
65
+ notifier.notify({
109
66
  title: "Gadget",
110
- contentImage: path_1.default.join(this.config.root, "assets", "favicon-128@4x.png"),
111
- icon: path_1.default.join(this.config.root, "assets", "favicon-128@4x.png"),
67
+ contentImage: path.join(this.config.root, "assets", "favicon-128@4x.png"),
68
+ icon: path.join(this.config.root, "assets", "favicon-128@4x.png"),
112
69
  sound: true,
113
70
  timeout: false,
114
- ...notification,
115
- }, (error) => {
116
- if (error)
117
- this.warn(error);
71
+ ...notification
72
+ }, (error)=>{
73
+ if (error) this.warn(error);
118
74
  });
119
75
  }
120
76
  /**
121
- * Opens the Gadget login page in the user's default browser and waits for the user to login.
122
- */
123
- async login() {
77
+ * Opens the Gadget login page in the user's default browser and waits for the user to login.
78
+ */ async login() {
124
79
  let server;
125
80
  try {
126
- const port = await (0, get_port_1.default)();
127
- const receiveSession = new Promise((resolve, reject) => {
81
+ const port = await getPort();
82
+ const receiveSession = new Promise((resolve, reject)=>{
128
83
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
129
- server = (0, http_1.createServer)(async (req, res) => {
130
- const redirectTo = new URL(`https://${context_1.context.domains.services}/auth/cli`);
84
+ server = http.createServer(async (req, res)=>{
85
+ const redirectTo = new URL(`https://${context.domains.services}/auth/cli`);
131
86
  try {
132
- if (!req.url)
133
- throw new Error("missing url");
87
+ if (!req.url) throw new Error("missing url");
134
88
  const incomingUrl = new URL(req.url, `http://localhost:${port}`);
135
89
  const value = incomingUrl.searchParams.get("session");
136
- if (!value)
137
- throw new Error("missing session");
138
- context_1.context.session = value;
139
- const user = await context_1.context.getUser();
140
- if (!user)
141
- throw new Error("missing current user");
90
+ if (!value) throw new Error("missing session");
91
+ context.session = value;
92
+ const user = await context.getUser();
93
+ if (!user) throw new Error("missing current user");
142
94
  if (user.name) {
143
- this.log((0, chalk_1.default) `Hello, ${user.name} {gray (${user.email})}`);
144
- }
145
- else {
95
+ this.log(chalkTemplate`Hello, ${user.name} {gray (${user.email})}`);
96
+ } else {
146
97
  this.log(`Hello, ${user.email}`);
147
98
  }
148
99
  this.log();
149
100
  redirectTo.searchParams.set("success", "true");
150
101
  resolve();
151
- }
152
- catch (error) {
153
- context_1.context.session = undefined;
102
+ } catch (error) {
103
+ context.session = undefined;
154
104
  redirectTo.searchParams.set("success", "false");
155
105
  reject(error);
156
- }
157
- finally {
158
- res.writeHead(303, { Location: redirectTo.toString() });
106
+ } finally{
107
+ res.writeHead(303, {
108
+ Location: redirectTo.toString()
109
+ });
159
110
  res.end();
160
111
  }
161
112
  });
162
113
  server.listen(port);
163
114
  });
164
- const url = new URL(`https://${context_1.context.domains.services}/auth/login`);
165
- url.searchParams.set("returnTo", `https://${context_1.context.domains.services}/auth/cli/callback?port=${port}`);
166
- await (0, open_1.default)(url.toString());
167
- this.log((0, ts_dedent_1.default) `
115
+ const url = new URL(`https://${context.domains.services}/auth/login`);
116
+ url.searchParams.set("returnTo", `https://${context.domains.services}/auth/cli/callback?port=${port}`);
117
+ await open(url.toString());
118
+ this.log(dedent`
168
119
  We've opened Gadget's login page using your default browser.
169
120
 
170
121
  Please log in and then return to this terminal.\n
171
122
  `);
172
123
  await receiveSession;
173
- }
174
- finally {
124
+ } finally{
175
125
  server?.close();
176
126
  }
177
127
  }
178
128
  /**
179
- * Overrides the default `catch` behavior so we can control how errors are printed to the user. This is called
180
- * automatically by oclif when an error is thrown during the `init` or `run` methods.
181
- */
182
- async catch(cause) {
183
- if (cause instanceof errors_1.CLIError || cause instanceof errors_2.CLIError) {
129
+ * Overrides the default `catch` behavior so we can control how errors are printed to the user. This is called
130
+ * automatically by oclif when an error is thrown during the `init` or `run` methods.
131
+ */ async catch(cause) {
132
+ if (cause instanceof CLIError || cause instanceof CLIError2) {
184
133
  // CLIErrors are user errors (invalid flag, arg, etc...) and already print nicely formatted error messages
185
134
  throw cause;
186
135
  }
187
- const error = cause instanceof errors_3.BaseError ? cause : new errors_3.UnexpectedError(cause);
136
+ const error = cause instanceof BaseError ? cause : new UnexpectedError(cause);
188
137
  console.error(error.render());
189
138
  await error.capture();
190
139
  // The original implementation of `catch` re-throws the error so that it's caught and printed by oclif's `handle`
@@ -194,36 +143,46 @@ class BaseCommand extends core_1.Command {
194
143
  //
195
144
  // catch: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/command.ts#L261
196
145
  // handle: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/errors/handle.ts#L15
197
- throw new errors_1.ExitError(1);
146
+ throw new ExitError(1);
147
+ }
148
+ constructor(argv, config){
149
+ super(argv, config);
150
+ /**
151
+ * Determines whether the command requires the user to be logged in or not.
152
+ *
153
+ * If true and the user is not logged in, the user will be prompted to login before the underlying command is
154
+ * initialized and run.
155
+ */ _define_property(this, "requireUser", false);
156
+ /**
157
+ * The parsed flags for the command.
158
+ */ _define_property(this, "flags", void 0);
159
+ /**
160
+ * The parsed arguments for the command.
161
+ */ _define_property(this, "args", void 0);
162
+ // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks base flags as well.
163
+ // warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).
164
+ // https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259
165
+ this.ctor.flags = {
166
+ ...this.ctor.flags,
167
+ ...BaseCommand.baseFlags
168
+ };
198
169
  }
199
170
  }
200
171
  /**
201
- * Determines how high the command is listed in the README. The lower the number, the higher the command is listed.
202
- * Equal numbers are sorted alphabetically.
203
- */
204
- Object.defineProperty(BaseCommand, "priority", {
205
- enumerable: true,
206
- configurable: true,
207
- writable: true,
208
- value: Infinity
209
- });
172
+ * Determines how high the command is listed in the README. The lower the number, the higher the command is listed.
173
+ * Equal numbers are sorted alphabetically.
174
+ */ _define_property(BaseCommand, "priority", Infinity);
210
175
  /**
211
- * Flags that are available to all commands.
212
- *
213
- * Short form should be capitalized.
214
- */
215
- Object.defineProperty(BaseCommand, "baseFlags", {
216
- enumerable: true,
217
- configurable: true,
218
- writable: true,
219
- value: {
220
- debug: core_1.Flags.boolean({
221
- char: "D",
222
- summary: "Whether to output debug information.",
223
- helpGroup: "global",
224
- default: false,
225
- }),
226
- }
176
+ * Flags that are available to all commands.
177
+ *
178
+ * Short form should be capitalized.
179
+ */ _define_property(BaseCommand, "baseFlags", {
180
+ debug: Flags.boolean({
181
+ char: "D",
182
+ summary: "Whether to output debug information.",
183
+ helpGroup: "global",
184
+ default: false
185
+ })
227
186
  });
228
- exports.BaseCommand = BaseCommand;
187
+
229
188
  //# sourceMappingURL=base-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-command.js","sourceRoot":"/","sources":["utils/base-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config, Interfaces } from \"@oclif/core\";\nimport { Command, Flags, settings } from \"@oclif/core\";\nimport { CLIError, ExitError } from \"@oclif/errors\";\nimport { CLIError as CLIError2 } from \"@oclif/core/lib/errors\";\nimport chalk from \"chalk\";\nimport Debug from \"debug\";\nimport * as Sentry from \"@sentry/node\";\nimport getPort from \"get-port\";\nimport type { Server } from \"http\";\nimport { createServer } from \"http\";\nimport { prompt } from \"inquirer\";\nimport type { Notification } from \"node-notifier\";\nimport { notify } from \"node-notifier\";\nimport type WindowsBalloon from \"node-notifier/notifiers/balloon\";\nimport type Growl from \"node-notifier/notifiers/growl\";\nimport type NotificationCenter from \"node-notifier/notifiers/notificationcenter\";\nimport type NotifySend from \"node-notifier/notifiers/notifysend\";\nimport type WindowsToaster from \"node-notifier/notifiers/toaster\";\nimport open from \"open\";\nimport path from \"path\";\nimport dedent from \"ts-dedent\";\nimport { context } from \"./context\";\nimport { BaseError, UnexpectedError } from \"./errors\";\n\nexport type Flags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)[\"baseFlags\"] & T[\"flags\"]>;\nexport type Args<T extends typeof Command> = Interfaces.InferredArgs<T[\"args\"]>;\n\n/**\n * BaseCommand is the base class for all commands in the Gadget CLI.\n */\nexport abstract class BaseCommand<T extends typeof Command> extends Command {\n /**\n * Determines how high the command is listed in the README. The lower the number, the higher the command is listed.\n * Equal numbers are sorted alphabetically.\n */\n static priority = Infinity;\n\n /**\n * Flags that are available to all commands.\n *\n * Short form should be capitalized.\n */\n static override baseFlags = {\n debug: Flags.boolean({\n char: \"D\",\n summary: \"Whether to output debug information.\",\n helpGroup: \"global\",\n default: false,\n }),\n };\n\n /**\n * Determines whether the command requires the user to be logged in or not.\n *\n * If true and the user is not logged in, the user will be prompted to login before the underlying command is\n * initialized and run.\n */\n readonly requireUser: boolean = false;\n\n /**\n * The parsed flags for the command.\n */\n flags!: Flags<T>;\n\n /**\n * The parsed arguments for the command.\n */\n args!: Args<T>;\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n\n // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks base flags as well.\n // warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).\n // https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259\n this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.baseFlags };\n }\n\n /**\n * Indicates whether the command is being run with the `-D/--debug` flag.\n */\n get debugEnabled(): boolean {\n return !!settings.debug;\n }\n\n override async init(): Promise<void> {\n context.config = this.config;\n\n if (context.env.productionLike) {\n Sentry.init({\n dsn: \"https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266\",\n release: context.config.version,\n });\n }\n\n await super.init();\n\n if (this.requireUser && !(await context.getUser())) {\n // we purposely log the user in before parsing flags in case one of the flags requires the user to be logged in\n // e.g. the `--app` flag verifies that the user has access to the app they are trying to use\n const { login } = await prompt<{ login: boolean }>({\n type: \"confirm\",\n name: \"login\",\n message: \"You must be logged in to use this command. Would you like to log in?\",\n });\n\n if (!login) {\n return this.exit(0);\n }\n\n await this.login();\n }\n\n const { flags, args } = await this.parse({\n flags: this.ctor.flags,\n baseFlags: (super.ctor as typeof BaseCommand).baseFlags,\n args: this.ctor.args,\n strict: this.ctor.strict,\n });\n\n this.flags = flags as Flags<T>;\n this.args = args as Args<T>;\n\n if (flags.debug) {\n settings.debug = true;\n Debug.enable(`${this.config.bin}:*`);\n }\n }\n\n /**\n * Sends a native OS notification to the user.\n *\n * @see {@link https://www.npmjs.com/package/node-notifier node-notifier}\n */\n notify(\n notification:\n | Notification\n | NotificationCenter.Notification\n | NotifySend.Notification\n | WindowsToaster.Notification\n | WindowsBalloon.Notification\n | Growl.Notification\n ): void {\n notify(\n {\n title: \"Gadget\",\n contentImage: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n icon: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n sound: true,\n timeout: false,\n ...notification,\n },\n (error) => {\n if (error) this.warn(error);\n }\n );\n }\n\n /**\n * Opens the Gadget login page in the user's default browser and waits for the user to login.\n */\n async login(): Promise<void> {\n let server: Server | undefined;\n\n try {\n const port = await getPort();\n const receiveSession = new Promise<void>((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n server = createServer(async (req, res) => {\n const redirectTo = new URL(`https://${context.domains.services}/auth/cli`);\n\n try {\n if (!req.url) throw new Error(\"missing url\");\n const incomingUrl = new URL(req.url, `http://localhost:${port}`);\n\n const value = incomingUrl.searchParams.get(\"session\");\n if (!value) throw new Error(\"missing session\");\n\n context.session = value;\n\n const user = await context.getUser();\n if (!user) throw new Error(\"missing current user\");\n\n if (user.name) {\n this.log(chalk`Hello, ${user.name} {gray (${user.email})}`);\n } else {\n this.log(`Hello, ${user.email}`);\n }\n this.log();\n\n redirectTo.searchParams.set(\"success\", \"true\");\n resolve();\n } catch (error) {\n context.session = undefined;\n redirectTo.searchParams.set(\"success\", \"false\");\n reject(error);\n } finally {\n res.writeHead(303, { Location: redirectTo.toString() });\n res.end();\n }\n });\n\n server.listen(port);\n });\n\n const url = new URL(`https://${context.domains.services}/auth/login`);\n url.searchParams.set(\"returnTo\", `https://${context.domains.services}/auth/cli/callback?port=${port}`);\n await open(url.toString());\n\n this.log(dedent`\n We've opened Gadget's login page using your default browser.\n\n Please log in and then return to this terminal.\\n\n `);\n\n await receiveSession;\n } finally {\n server?.close();\n }\n }\n\n /**\n * Overrides the default `catch` behavior so we can control how errors are printed to the user. This is called\n * automatically by oclif when an error is thrown during the `init` or `run` methods.\n */\n override async catch(cause: Error): Promise<never> {\n if (cause instanceof CLIError || cause instanceof CLIError2) {\n // CLIErrors are user errors (invalid flag, arg, etc...) and already print nicely formatted error messages\n throw cause;\n }\n\n const error = cause instanceof BaseError ? cause : new UnexpectedError(cause);\n console.error(error.render());\n await error.capture();\n\n // The original implementation of `catch` re-throws the error so that it's caught and printed by oclif's `handle`\n // method. We still want to end up in oclif's `handle` method, but we don't want it to print the error again so we\n // throw an ExitError instead. This will cause `handle` to not print the error, but still exit with the correct exit\n // code.\n //\n // catch: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/command.ts#L261\n // handle: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/errors/handle.ts#L15\n throw new ExitError(1);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/base-command.ts"],"sourcesContent":["import type { Config, Interfaces } from \"@oclif/core\";\nimport { Command, Flags, settings } from \"@oclif/core\";\nimport { CLIError as CLIError2 } from \"@oclif/core/lib/errors/index.js\";\nimport { CLIError, ExitError } from \"@oclif/errors\";\nimport * as Sentry from \"@sentry/node\";\nimport chalkTemplate from \"chalk-template\";\nimport Debug from \"debug\";\nimport getPort from \"get-port\";\nimport inquirer from \"inquirer\";\nimport type { Notification } from \"node-notifier\";\nimport notifier from \"node-notifier\";\nimport type WindowsBalloon from \"node-notifier/notifiers/balloon.js\";\nimport type Growl from \"node-notifier/notifiers/growl.js\";\nimport type NotificationCenter from \"node-notifier/notifiers/notificationcenter.js\";\nimport type NotifySend from \"node-notifier/notifiers/notifysend.js\";\nimport type WindowsToaster from \"node-notifier/notifiers/toaster.js\";\nimport type { Server } from \"node:http\";\nimport http from \"node:http\";\nimport path from \"node:path\";\nimport open from \"open\";\nimport { dedent } from \"ts-dedent\";\nimport { context } from \"./context.js\";\nimport { BaseError, UnexpectedError } from \"./errors.js\";\n\nexport type Flags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)[\"baseFlags\"] & T[\"flags\"]>;\nexport type Args<T extends typeof Command> = Interfaces.InferredArgs<T[\"args\"]>;\n\n/**\n * BaseCommand is the base class for all commands in the Gadget CLI.\n */\nexport abstract class BaseCommand<T extends typeof Command> extends Command {\n /**\n * Determines how high the command is listed in the README. The lower the number, the higher the command is listed.\n * Equal numbers are sorted alphabetically.\n */\n static priority = Infinity;\n\n /**\n * Flags that are available to all commands.\n *\n * Short form should be capitalized.\n */\n static override baseFlags = {\n debug: Flags.boolean({\n char: \"D\",\n summary: \"Whether to output debug information.\",\n helpGroup: \"global\",\n default: false,\n }),\n };\n\n /**\n * Determines whether the command requires the user to be logged in or not.\n *\n * If true and the user is not logged in, the user will be prompted to login before the underlying command is\n * initialized and run.\n */\n readonly requireUser: boolean = false;\n\n /**\n * The parsed flags for the command.\n */\n flags!: Flags<T>;\n\n /**\n * The parsed arguments for the command.\n */\n args!: Args<T>;\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n\n // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks base flags as well.\n // warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).\n // https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259\n this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.baseFlags };\n }\n\n /**\n * Indicates whether the command is being run with the `-D/--debug` flag.\n */\n get debugEnabled(): boolean {\n return !!settings.debug;\n }\n\n override async init(): Promise<void> {\n context.config = this.config;\n\n if (context.env.productionLike) {\n Sentry.init({\n dsn: \"https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266\",\n release: context.config.version,\n });\n }\n\n await super.init();\n\n if (this.requireUser && !(await context.getUser())) {\n // we purposely log the user in before parsing flags in case one of the flags requires the user to be logged in\n // e.g. the `--app` flag verifies that the user has access to the app they are trying to use\n const { login } = await inquirer.prompt<{ login: boolean }>({\n type: \"confirm\",\n name: \"login\",\n message: \"You must be logged in to use this command. Would you like to log in?\",\n });\n\n if (!login) {\n return this.exit(0);\n }\n\n await this.login();\n }\n\n const { flags, args } = await this.parse({\n flags: this.ctor.flags,\n baseFlags: (super.ctor as typeof BaseCommand).baseFlags,\n args: this.ctor.args,\n strict: this.ctor.strict,\n });\n\n this.flags = flags as Flags<T>;\n this.args = args as Args<T>;\n\n if (flags.debug) {\n settings.debug = true;\n Debug.enable(`${this.config.bin}:*`);\n }\n }\n\n /**\n * Sends a native OS notification to the user.\n *\n * @see {@link https://www.npmjs.com/package/node-notifier node-notifier}\n */\n notify(\n notification:\n | Notification\n | NotificationCenter.Notification\n | NotifySend.Notification\n | WindowsToaster.Notification\n | WindowsBalloon.Notification\n | Growl.Notification\n ): void {\n notifier.notify(\n {\n title: \"Gadget\",\n contentImage: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n icon: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n sound: true,\n timeout: false,\n ...notification,\n },\n (error) => {\n if (error) this.warn(error);\n }\n );\n }\n\n /**\n * Opens the Gadget login page in the user's default browser and waits for the user to login.\n */\n async login(): Promise<void> {\n let server: Server | undefined;\n\n try {\n const port = await getPort();\n const receiveSession = new Promise<void>((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n server = http.createServer(async (req, res) => {\n const redirectTo = new URL(`https://${context.domains.services}/auth/cli`);\n\n try {\n if (!req.url) throw new Error(\"missing url\");\n const incomingUrl = new URL(req.url, `http://localhost:${port}`);\n\n const value = incomingUrl.searchParams.get(\"session\");\n if (!value) throw new Error(\"missing session\");\n\n context.session = value;\n\n const user = await context.getUser();\n if (!user) throw new Error(\"missing current user\");\n\n if (user.name) {\n this.log(chalkTemplate`Hello, ${user.name} {gray (${user.email})}`);\n } else {\n this.log(`Hello, ${user.email}`);\n }\n this.log();\n\n redirectTo.searchParams.set(\"success\", \"true\");\n resolve();\n } catch (error) {\n context.session = undefined;\n redirectTo.searchParams.set(\"success\", \"false\");\n reject(error);\n } finally {\n res.writeHead(303, { Location: redirectTo.toString() });\n res.end();\n }\n });\n\n server.listen(port);\n });\n\n const url = new URL(`https://${context.domains.services}/auth/login`);\n url.searchParams.set(\"returnTo\", `https://${context.domains.services}/auth/cli/callback?port=${port}`);\n await open(url.toString());\n\n this.log(dedent`\n We've opened Gadget's login page using your default browser.\n\n Please log in and then return to this terminal.\\n\n `);\n\n await receiveSession;\n } finally {\n server?.close();\n }\n }\n\n /**\n * Overrides the default `catch` behavior so we can control how errors are printed to the user. This is called\n * automatically by oclif when an error is thrown during the `init` or `run` methods.\n */\n override async catch(cause: Error): Promise<never> {\n if (cause instanceof CLIError || cause instanceof CLIError2) {\n // CLIErrors are user errors (invalid flag, arg, etc...) and already print nicely formatted error messages\n throw cause;\n }\n\n const error = cause instanceof BaseError ? cause : new UnexpectedError(cause);\n console.error(error.render());\n await error.capture();\n\n // The original implementation of `catch` re-throws the error so that it's caught and printed by oclif's `handle`\n // method. We still want to end up in oclif's `handle` method, but we don't want it to print the error again so we\n // throw an ExitError instead. This will cause `handle` to not print the error, but still exit with the correct exit\n // code.\n //\n // catch: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/command.ts#L261\n // handle: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/errors/handle.ts#L15\n throw new ExitError(1);\n }\n}\n"],"names":["Command","Flags","settings","CLIError","CLIError2","ExitError","Sentry","chalkTemplate","Debug","getPort","inquirer","notifier","http","path","open","dedent","context","BaseError","UnexpectedError","BaseCommand","debugEnabled","debug","init","config","env","productionLike","dsn","release","version","requireUser","getUser","login","prompt","type","name","message","exit","flags","args","parse","ctor","baseFlags","strict","enable","bin","notify","notification","title","contentImage","join","root","icon","sound","timeout","error","warn","server","port","receiveSession","Promise","resolve","reject","createServer","req","res","redirectTo","URL","domains","services","url","Error","incomingUrl","value","searchParams","get","session","user","log","email","set","undefined","writeHead","Location","toString","end","listen","close","catch","cause","console","render","capture","constructor","argv","priority","Infinity","boolean","char","summary","helpGroup","default"],"mappings":"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"}