@gadgetinc/ggt 0.1.10 → 0.1.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/utils/base-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config } from \"@oclif/core\";\nimport { Command, Flags, settings } from \"@oclif/core\";\nimport { ExitError } from \"@oclif/core/lib/errors\";\nimport chalk from \"chalk\";\nimport Debug from \"debug\";\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, GADGET_ENDPOINT } from \"./context\";\nimport { BaseError, UnexpectedError as UnknownError } from \"./errors\";\n\nexport abstract class BaseCommand extends Command {\n /**\n * Determines how high the command is listed in the README. The lower the number, the higher the command is listed. Equal numbers are\n * sorted alphabetically.\n */\n static priority = Infinity;\n\n static override globalFlags = {\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 * If true and the user is not logged in, the user will be prompted to login before the command is run.\n */\n readonly requireUser: boolean = false;\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n\n // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks global 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.globalFlags };\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 await super.init();\n const { flags, argv } = await this.parse({ flags: BaseCommand.globalFlags, strict: false });\n\n // remove global flags from argv so that when the implementation calls parse, it doesn't get confused by them\n this.argv = argv;\n\n if (flags.debug) {\n settings.debug = true;\n Debug.enable(`${this.config.bin}:*`);\n }\n\n context.config = this.config;\n\n if (this.requireUser && !(await context.getUser())) {\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\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(`${GADGET_ENDPOINT}/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\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(`${GADGET_ENDPOINT}/auth/login`);\n url.searchParams.set(\"returnTo\", `${GADGET_ENDPOINT}/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 automatically by oclif when\n * an error is thrown during the `init` or `run` methods.\n */\n override async catch(cause: Error & { exitCode?: number }): Promise<never> {\n const error = cause instanceof BaseError ? cause : new UnknownError(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` method. We still want\n // to end up in oclif's `handle` method, but we don't want it to print the error again so we throw an ExitError instead. This will cause\n // `handle` to not print the error, but still exit with the correct exit 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(process.exitCode ?? cause.exitCode ?? 1);\n }\n}\n"]}
1
+ {"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/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 { ExitError } from \"@oclif/core/lib/errors\";\nimport chalk from \"chalk\";\nimport Debug from \"debug\";\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 as UnknownError } 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\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. Equal numbers are\n * sorted alphabetically.\n */\n static priority = Infinity;\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 * If true and the user is not logged in, the user will be prompted to login before the command is 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 await super.init();\n\n context.config = this.config;\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 if (this.requireUser && !(await context.getUser())) {\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\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\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 automatically by oclif when\n * an error is thrown during the `init` or `run` methods.\n */\n override async catch(cause: Error & { exitCode?: number }): Promise<never> {\n const error = cause instanceof BaseError ? cause : new UnknownError(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` method. We still want\n // to end up in oclif's `handle` method, but we don't want it to print the error again so we throw an ExitError instead. This will cause\n // `handle` to not print the error, but still exit with the correct exit 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(process.exitCode ?? cause.exitCode ?? 1);\n }\n}\n"]}
@@ -32,9 +32,8 @@ class Client {
32
32
  value: void 0
33
33
  });
34
34
  (0, assert_1.default)(context_1.context.app, "context.app must be set before instantiating the Client");
35
- const domain = context_1.context.env.productionLike ? "gadget.app" : "ggt.pub:3000";
36
35
  this._client = (0, graphql_ws_1.createClient)({
37
- url: `wss://${context_1.context.app.slug}.${domain}/edit/api/graphql-ws`,
36
+ url: `wss://${context_1.context.app.slug}.${context_1.context.domains.app}/edit/api/graphql-ws`,
38
37
  shouldRetry: () => true,
39
38
  webSocketImpl: class extends ws_1.default {
40
39
  constructor(address, protocols, wsOptions) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/utils/client.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport Debug from \"debug\";\nimport type { GraphQLError } from \"graphql\";\nimport type { ExecutionResult, SubscribePayload } from \"graphql-ws\";\nimport { createClient } from \"graphql-ws\";\nimport type { ClientRequestArgs } from \"http\";\nimport { isFunction, noop } from \"lodash\";\nimport type { JsonObject, SetOptional } from \"type-fest\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport { context } from \"./context\";\nimport { ClientError } from \"./errors\";\n\nconst debug = Debug(\"ggt:client\");\n\nenum ConnectionStatus {\n CONNECTED,\n DISCONNECTED,\n RECONNECTING,\n}\n\nexport class Client {\n // assume the client is going to connect\n status = ConnectionStatus.CONNECTED;\n\n private _client: ReturnType<typeof createClient>;\n\n constructor() {\n assert(context.app, \"context.app must be set before instantiating the Client\");\n const domain = context.env.productionLike ? \"gadget.app\" : \"ggt.pub:3000\";\n\n this._client = createClient({\n url: `wss://${context.app.slug}.${domain}/edit/api/graphql-ws`,\n shouldRetry: () => true,\n webSocketImpl: class extends WebSocket {\n constructor(address: string | URL, protocols?: string | string[], wsOptions?: WebSocket.ClientOptions | ClientRequestArgs) {\n assert(context.session, \"context.session must be set before instantiating the Client\");\n super(address, protocols, {\n ...wsOptions,\n headers: {\n ...wsOptions?.headers,\n \"user-agent\": context.config.userAgent,\n cookie: `session=${encodeURIComponent(context.session)};`,\n },\n });\n }\n },\n on: {\n connecting: () => {\n switch (this.status) {\n case ConnectionStatus.DISCONNECTED:\n this.status = ConnectionStatus.RECONNECTING;\n debug(\"reconnecting...\");\n break;\n case ConnectionStatus.RECONNECTING:\n debug(\"retrying...\");\n break;\n default:\n debug(\"connecting...\");\n break;\n }\n },\n connected: () => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n debug(\"reconnected\");\n } else {\n debug(\"connected\");\n }\n\n // let the other on connected listeners see what status we're in\n setImmediate(() => (this.status = ConnectionStatus.CONNECTED));\n },\n closed: (e) => {\n const event = e as CloseEvent;\n if (event.wasClean) {\n debug(\"connection closed\");\n return;\n }\n\n if (this.status === ConnectionStatus.CONNECTED) {\n this.status = ConnectionStatus.DISCONNECTED;\n debug(\"disconnected\");\n }\n },\n error: (error) => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n debug(\"failed to reconnect %o\", { error });\n } else {\n debug(\"connection error %o\", { error });\n }\n },\n },\n });\n }\n\n subscribe<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>,\n sink: SetOptional<Sink<Data, Extensions>, \"complete\">\n ): () => void {\n let subscribePayload: SubscribePayload;\n let removeConnectedListener: () => void;\n\n if (isFunction(payload.variables)) {\n // the caller wants us to re-evaluate the variables every time graphql-ws re-subscribes after reconnecting\n subscribePayload = { ...payload, variables: payload.variables() };\n removeConnectedListener = this._client.on(\"connected\", () => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n // subscribePayload.variables is supposed to be readonly (it's not) and payload.variables may have been re-assigned (it won't)\n (subscribePayload as any).variables = (payload.variables as any)();\n debug(\"re-sending %s%s%O\", subscribePayload.query.split(/\\s+/g, 1)[0], subscribePayload.query, subscribePayload.variables);\n }\n });\n } else {\n subscribePayload = payload as SubscribePayload;\n }\n\n debug(\"sending %s%s%O\", subscribePayload.query.split(/\\s+/g, 1)[0], subscribePayload.query, subscribePayload.variables);\n const unsubscribe = this._client.subscribe(subscribePayload, {\n next: (result: ExecutionResult<Data, Extensions>) => sink.next(result),\n error: (error) => sink.error(new ClientError(subscribePayload, error as Error | GraphQLError[] | CloseEvent | ErrorEvent)),\n complete: () => sink.complete?.() ?? noop,\n });\n\n return () => {\n removeConnectedListener?.();\n unsubscribe();\n };\n }\n\n subscribeUnwrap<Data extends JsonObject, Variables extends JsonObject>(\n payload: Payload<Data, Variables>,\n sink: { next: (data: Data) => void; error: (error: ClientError) => void }\n ): () => void {\n const unsubscribe = this.subscribe(payload, {\n ...sink,\n next: (result) => {\n if (result.errors) {\n unsubscribe();\n sink.error(new ClientError(payload, result.errors));\n return;\n }\n\n if (!result.data) {\n sink.error(new ClientError(payload, \"We received a response without data\"));\n unsubscribe();\n return;\n }\n\n sink.next(result.data);\n },\n });\n\n return unsubscribe;\n }\n\n query<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>\n ): Promise<ExecutionResult<Data, Extensions>> {\n return new Promise((resolve, reject) => {\n this.subscribe<Data, Variables, Extensions>(payload, { next: resolve, error: reject });\n });\n }\n\n async queryUnwrap<Data extends JsonObject, Variables extends JsonObject>(payload: Payload<Data, Variables>): Promise<Data> {\n const result = await this.query(payload);\n if (result.errors) throw new ClientError(payload, result.errors);\n if (!result.data) throw new ClientError(payload, \"We received a response without data\");\n return result.data;\n }\n\n async dispose(): Promise<void> {\n await this._client.dispose();\n }\n}\n\nexport type Query<\n Data extends JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject\n> = string & {\n __TData?: Data;\n __TVariables?: Variables;\n __TExtensions?: Extensions;\n};\n\nexport interface Payload<Data extends JsonObject, Variables extends JsonObject> {\n readonly query: Query<Data, Variables>;\n readonly variables?: Variables | (() => Variables) | null;\n}\n\nexport interface Sink<Data extends JsonObject, Extensions extends JsonObject> {\n next(value: ExecutionResult<Data, Extensions>): void;\n error(error: ClientError): void;\n complete(): void;\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/utils/client.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport Debug from \"debug\";\nimport type { GraphQLError } from \"graphql\";\nimport type { ExecutionResult, SubscribePayload } from \"graphql-ws\";\nimport { createClient } from \"graphql-ws\";\nimport type { ClientRequestArgs } from \"http\";\nimport { isFunction, noop } from \"lodash\";\nimport type { JsonObject, SetOptional } from \"type-fest\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport { context } from \"./context\";\nimport { ClientError } from \"./errors\";\n\nconst debug = Debug(\"ggt:client\");\n\nenum ConnectionStatus {\n CONNECTED,\n DISCONNECTED,\n RECONNECTING,\n}\n\nexport class Client {\n // assume the client is going to connect\n status = ConnectionStatus.CONNECTED;\n\n private _client: ReturnType<typeof createClient>;\n\n constructor() {\n assert(context.app, \"context.app must be set before instantiating the Client\");\n\n this._client = createClient({\n url: `wss://${context.app.slug}.${context.domains.app}/edit/api/graphql-ws`,\n shouldRetry: () => true,\n webSocketImpl: class extends WebSocket {\n constructor(address: string | URL, protocols?: string | string[], wsOptions?: WebSocket.ClientOptions | ClientRequestArgs) {\n assert(context.session, \"context.session must be set before instantiating the Client\");\n super(address, protocols, {\n ...wsOptions,\n headers: {\n ...wsOptions?.headers,\n \"user-agent\": context.config.userAgent,\n cookie: `session=${encodeURIComponent(context.session)};`,\n },\n });\n }\n },\n on: {\n connecting: () => {\n switch (this.status) {\n case ConnectionStatus.DISCONNECTED:\n this.status = ConnectionStatus.RECONNECTING;\n debug(\"reconnecting...\");\n break;\n case ConnectionStatus.RECONNECTING:\n debug(\"retrying...\");\n break;\n default:\n debug(\"connecting...\");\n break;\n }\n },\n connected: () => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n debug(\"reconnected\");\n } else {\n debug(\"connected\");\n }\n\n // let the other on connected listeners see what status we're in\n setImmediate(() => (this.status = ConnectionStatus.CONNECTED));\n },\n closed: (e) => {\n const event = e as CloseEvent;\n if (event.wasClean) {\n debug(\"connection closed\");\n return;\n }\n\n if (this.status === ConnectionStatus.CONNECTED) {\n this.status = ConnectionStatus.DISCONNECTED;\n debug(\"disconnected\");\n }\n },\n error: (error) => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n debug(\"failed to reconnect %o\", { error });\n } else {\n debug(\"connection error %o\", { error });\n }\n },\n },\n });\n }\n\n subscribe<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>,\n sink: SetOptional<Sink<Data, Extensions>, \"complete\">\n ): () => void {\n let subscribePayload: SubscribePayload;\n let removeConnectedListener: () => void;\n\n if (isFunction(payload.variables)) {\n // the caller wants us to re-evaluate the variables every time graphql-ws re-subscribes after reconnecting\n subscribePayload = { ...payload, variables: payload.variables() };\n removeConnectedListener = this._client.on(\"connected\", () => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n // subscribePayload.variables is supposed to be readonly (it's not) and payload.variables may have been re-assigned (it won't)\n (subscribePayload as any).variables = (payload.variables as any)();\n debug(\"re-sending %s%s%O\", subscribePayload.query.split(/\\s+/g, 1)[0], subscribePayload.query, subscribePayload.variables);\n }\n });\n } else {\n subscribePayload = payload as SubscribePayload;\n }\n\n debug(\"sending %s%s%O\", subscribePayload.query.split(/\\s+/g, 1)[0], subscribePayload.query, subscribePayload.variables);\n const unsubscribe = this._client.subscribe(subscribePayload, {\n next: (result: ExecutionResult<Data, Extensions>) => sink.next(result),\n error: (error) => sink.error(new ClientError(subscribePayload, error as Error | GraphQLError[] | CloseEvent | ErrorEvent)),\n complete: () => sink.complete?.() ?? noop,\n });\n\n return () => {\n removeConnectedListener?.();\n unsubscribe();\n };\n }\n\n subscribeUnwrap<Data extends JsonObject, Variables extends JsonObject>(\n payload: Payload<Data, Variables>,\n sink: { next: (data: Data) => void; error: (error: ClientError) => void }\n ): () => void {\n const unsubscribe = this.subscribe(payload, {\n ...sink,\n next: (result) => {\n if (result.errors) {\n unsubscribe();\n sink.error(new ClientError(payload, result.errors));\n return;\n }\n\n if (!result.data) {\n sink.error(new ClientError(payload, \"We received a response without data\"));\n unsubscribe();\n return;\n }\n\n sink.next(result.data);\n },\n });\n\n return unsubscribe;\n }\n\n query<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>\n ): Promise<ExecutionResult<Data, Extensions>> {\n return new Promise((resolve, reject) => {\n this.subscribe<Data, Variables, Extensions>(payload, { next: resolve, error: reject });\n });\n }\n\n async queryUnwrap<Data extends JsonObject, Variables extends JsonObject>(payload: Payload<Data, Variables>): Promise<Data> {\n const result = await this.query(payload);\n if (result.errors) throw new ClientError(payload, result.errors);\n if (!result.data) throw new ClientError(payload, \"We received a response without data\");\n return result.data;\n }\n\n async dispose(): Promise<void> {\n await this._client.dispose();\n }\n}\n\nexport type Query<\n Data extends JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject\n> = string & {\n __TData?: Data;\n __TVariables?: Variables;\n __TExtensions?: Extensions;\n};\n\nexport interface Payload<Data extends JsonObject, Variables extends JsonObject> {\n readonly query: Query<Data, Variables>;\n readonly variables?: Variables | (() => Variables) | null;\n}\n\nexport interface Sink<Data extends JsonObject, Extensions extends JsonObject> {\n next(value: ExecutionResult<Data, Extensions>): void;\n error(error: ClientError): void;\n complete(): void;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Config } from "@oclif/core";
2
- declare class Context {
2
+ export declare class Context {
3
3
  /**
4
4
  * A reference to oclif's {@linkcode Config}.
5
5
  *
@@ -9,10 +9,15 @@ declare class Context {
9
9
  config: Config;
10
10
  env: Env;
11
11
  app?: App;
12
+ domains: {
13
+ app: string;
14
+ services: string;
15
+ };
12
16
  private _session?;
13
17
  private _user?;
14
18
  private _availableApps;
15
19
  private _request;
20
+ constructor();
16
21
  get session(): string | undefined;
17
22
  set session(value: string | undefined);
18
23
  /**
@@ -48,5 +53,4 @@ export interface App {
48
53
  hasSplitEnvironments: boolean;
49
54
  }
50
55
  export declare const context: Context;
51
- export declare const GADGET_ENDPOINT: string;
52
56
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GADGET_ENDPOINT = exports.context = void 0;
3
+ exports.context = exports.Context = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const assert_1 = tslib_1.__importDefault(require("assert"));
6
6
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
@@ -34,6 +34,12 @@ class Context {
34
34
  writable: true,
35
35
  value: void 0
36
36
  });
37
+ Object.defineProperty(this, "domains", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
37
43
  Object.defineProperty(this, "_session", {
38
44
  enumerable: true,
39
45
  configurable: true,
@@ -61,7 +67,7 @@ class Context {
61
67
  beforeRequest: [
62
68
  (options) => {
63
69
  options.headers["user-agent"] = this.config.userAgent;
64
- if (options.url.origin === exports.GADGET_ENDPOINT && this.session) {
70
+ if (options.url.host === this.domains.services && this.session) {
65
71
  options.headers["cookie"] = `session=${encodeURIComponent(this.session)};`;
66
72
  }
67
73
  },
@@ -69,6 +75,10 @@ class Context {
69
75
  },
70
76
  })
71
77
  });
78
+ this.domains = {
79
+ app: process.env["GGT_GADGET_APP_DOMAIN"] || (this.env.productionLike ? "gadget.app" : "ggt.pub"),
80
+ services: process.env["GGT_GADGET_SERVICES_DOMAIN"] || (this.env.productionLike ? "app.gadget.dev" : "app.ggt.dev"),
81
+ };
72
82
  }
73
83
  get session() {
74
84
  if (this._session)
@@ -101,7 +111,7 @@ class Context {
101
111
  if (this._user)
102
112
  return this._user;
103
113
  try {
104
- this._user = await this._request(`${exports.GADGET_ENDPOINT}/auth/api/current-user`).json();
114
+ this._user = await this._request(`https://${this.domains.services}/auth/api/current-user`).json();
105
115
  return this._user;
106
116
  }
107
117
  catch (error) {
@@ -120,7 +130,7 @@ class Context {
120
130
  return [];
121
131
  if (this._availableApps.length > 0)
122
132
  return this._availableApps;
123
- this._availableApps = await this._request(`${exports.GADGET_ENDPOINT}/auth/api/apps`).json();
133
+ this._availableApps = await this._request(`https://${this.domains.services}/auth/api/apps`).json();
124
134
  return this._availableApps;
125
135
  }
126
136
  async setApp(value) {
@@ -140,6 +150,7 @@ class Context {
140
150
  this._availableApps = [];
141
151
  }
142
152
  }
153
+ exports.Context = Context;
143
154
  /**
144
155
  * Captures the name and nature of the environment
145
156
  */
@@ -161,5 +172,4 @@ class Env {
161
172
  }
162
173
  }
163
174
  exports.context = new Context();
164
- exports.GADGET_ENDPOINT = exports.context.env.productionLike ? "https://app.gadget.dev" : "https://app.ggt.dev:3000";
165
175
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config } from \"@oclif/core\";\nimport assert from \"assert\";\nimport fs from \"fs-extra\";\nimport got, { HTTPError } from \"got\";\nimport { isString } from \"lodash\";\nimport path from \"path\";\nimport { ignoreEnoent } from \"./fs-utils\";\n\nclass Context {\n /**\n * A reference to oclif's {@linkcode Config}.\n *\n * By default, oclif's {@linkcode Config} is only available as an instance property on a Command, but we want to be able to access it from\n * anywhere. To do this, we created this global variable that references the Config. It is set by the init function in the BaseCommand.\n */\n config!: Config;\n\n env = new Env();\n\n app?: App;\n\n private _session?: string;\n\n private _user?: User;\n\n private _availableApps: App[] = [];\n\n private _request = got.extend({\n hooks: {\n beforeRequest: [\n (options) => {\n options.headers[\"user-agent\"] = this.config.userAgent;\n if (options.url.origin === GADGET_ENDPOINT && this.session) {\n options.headers[\"cookie\"] = `session=${encodeURIComponent(this.session)};`;\n }\n },\n ],\n },\n });\n\n get session(): string | undefined {\n if (this._session) return this._session;\n\n try {\n this._session = fs.readFileSync(path.join(this.config.configDir, \"session.txt\"), \"utf-8\");\n return this._session;\n } catch (error) {\n ignoreEnoent(error);\n return undefined;\n }\n }\n\n set session(value: string | undefined) {\n this.clear();\n this._session = value;\n if (this._session) {\n fs.outputFileSync(path.join(this.config.configDir, \"session.txt\"), this._session);\n } else {\n fs.removeSync(path.join(this.config.configDir, \"session.txt\"));\n }\n }\n\n /**\n * @returns The current user, or undefined if the user is not logged in.\n */\n async getUser(): Promise<User | undefined> {\n if (!this.session) return undefined;\n if (this._user) return this._user;\n\n try {\n this._user = await this._request(`${GADGET_ENDPOINT}/auth/api/current-user`).json<User>();\n return this._user;\n } catch (error) {\n if (error instanceof HTTPError && error.response.statusCode === 401) {\n this.session = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * @returns The list of Gadget applications the current user has access to.\n */\n async getAvailableApps(): Promise<App[]> {\n if (!this.session) return [];\n if (this._availableApps.length > 0) return this._availableApps;\n\n this._availableApps = await this._request(`${GADGET_ENDPOINT}/auth/api/apps`).json<App[]>();\n return this._availableApps;\n }\n\n async setApp(value: App | string | undefined): Promise<void> {\n if (isString(value)) {\n const app = await this.getAvailableApps().then((apps) => apps.find((app) => app.name == value || app.slug == value));\n assert(app, `attempted to set app to \"${value}\" but no app with that name or slug was found`);\n this.app = app;\n } else {\n this.app = value;\n }\n }\n\n clear(): void {\n this._session = undefined;\n this._user = undefined;\n this.app = undefined;\n this._availableApps = [];\n }\n}\n\n/**\n * Captures the name and nature of the environment\n */\nclass Env {\n get value(): string {\n return process.env[\"GGT_ENV\"] || \"production\";\n }\n\n get productionLike(): boolean {\n return this.value.startsWith(\"production\");\n }\n\n get developmentLike(): boolean {\n return this.value.startsWith(\"development\");\n }\n\n get testLike(): boolean {\n return this.value.startsWith(\"test\");\n }\n\n get developmentOrTestLike(): boolean {\n return this.developmentLike || this.testLike;\n }\n}\n\nexport interface User {\n id: string | number;\n email: string;\n name?: string;\n}\n\nexport interface App {\n id: string | number;\n name: string;\n slug: string;\n hasSplitEnvironments: boolean;\n}\n\nexport const context = new Context();\n\nexport const GADGET_ENDPOINT = context.env.productionLike ? \"https://app.gadget.dev\" : \"https://app.ggt.dev:3000\";\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config } from \"@oclif/core\";\nimport assert from \"assert\";\nimport fs from \"fs-extra\";\nimport got, { HTTPError } from \"got\";\nimport { isString } from \"lodash\";\nimport path from \"path\";\nimport { ignoreEnoent } from \"./fs-utils\";\n\nexport class Context {\n /**\n * A reference to oclif's {@linkcode Config}.\n *\n * By default, oclif's {@linkcode Config} is only available as an instance property on a Command, but we want to be able to access it from\n * anywhere. To do this, we created this global variable that references the Config. It is set by the init function in the BaseCommand.\n */\n config!: Config;\n\n env = new Env();\n\n app?: App;\n\n domains: {\n app: string;\n services: string;\n };\n\n private _session?: string;\n\n private _user?: User;\n\n private _availableApps: App[] = [];\n\n private _request = got.extend({\n hooks: {\n beforeRequest: [\n (options) => {\n options.headers[\"user-agent\"] = this.config.userAgent;\n if (options.url.host === this.domains.services && this.session) {\n options.headers[\"cookie\"] = `session=${encodeURIComponent(this.session)};`;\n }\n },\n ],\n },\n });\n\n constructor() {\n this.domains = {\n app: process.env[\"GGT_GADGET_APP_DOMAIN\"] || (this.env.productionLike ? \"gadget.app\" : \"ggt.pub\"),\n services: process.env[\"GGT_GADGET_SERVICES_DOMAIN\"] || (this.env.productionLike ? \"app.gadget.dev\" : \"app.ggt.dev\"),\n };\n }\n\n get session(): string | undefined {\n if (this._session) return this._session;\n\n try {\n this._session = fs.readFileSync(path.join(this.config.configDir, \"session.txt\"), \"utf-8\");\n return this._session;\n } catch (error) {\n ignoreEnoent(error);\n return undefined;\n }\n }\n\n set session(value: string | undefined) {\n this.clear();\n this._session = value;\n if (this._session) {\n fs.outputFileSync(path.join(this.config.configDir, \"session.txt\"), this._session);\n } else {\n fs.removeSync(path.join(this.config.configDir, \"session.txt\"));\n }\n }\n\n /**\n * @returns The current user, or undefined if the user is not logged in.\n */\n async getUser(): Promise<User | undefined> {\n if (!this.session) return undefined;\n if (this._user) return this._user;\n\n try {\n this._user = await this._request(`https://${this.domains.services}/auth/api/current-user`).json<User>();\n return this._user;\n } catch (error) {\n if (error instanceof HTTPError && error.response.statusCode === 401) {\n this.session = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * @returns The list of Gadget applications the current user has access to.\n */\n async getAvailableApps(): Promise<App[]> {\n if (!this.session) return [];\n if (this._availableApps.length > 0) return this._availableApps;\n\n this._availableApps = await this._request(`https://${this.domains.services}/auth/api/apps`).json<App[]>();\n return this._availableApps;\n }\n\n async setApp(value: App | string | undefined): Promise<void> {\n if (isString(value)) {\n const app = await this.getAvailableApps().then((apps) => apps.find((app) => app.name == value || app.slug == value));\n assert(app, `attempted to set app to \"${value}\" but no app with that name or slug was found`);\n this.app = app;\n } else {\n this.app = value;\n }\n }\n\n clear(): void {\n this._session = undefined;\n this._user = undefined;\n this.app = undefined;\n this._availableApps = [];\n }\n}\n\n/**\n * Captures the name and nature of the environment\n */\nclass Env {\n get value(): string {\n return process.env[\"GGT_ENV\"] || \"production\";\n }\n\n get productionLike(): boolean {\n return this.value.startsWith(\"production\");\n }\n\n get developmentLike(): boolean {\n return this.value.startsWith(\"development\");\n }\n\n get testLike(): boolean {\n return this.value.startsWith(\"test\");\n }\n\n get developmentOrTestLike(): boolean {\n return this.developmentLike || this.testLike;\n }\n}\n\nexport interface User {\n id: string | number;\n email: string;\n name?: string;\n}\n\nexport interface App {\n id: string | number;\n name: string;\n slug: string;\n hasSplitEnvironments: boolean;\n}\n\nexport const context = new Context();\n"]}
@@ -94,5 +94,5 @@ export declare class InvalidSyncFileError extends BaseError {
94
94
  protected body(): string;
95
95
  }
96
96
  export declare class InvalidSyncAppFlagError extends FlagError {
97
- constructor(sync: Sync, app: string);
97
+ constructor(sync: Sync);
98
98
  }
@@ -345,17 +345,17 @@ class InvalidSyncFileError extends BaseError {
345
345
  }
346
346
  exports.InvalidSyncFileError = InvalidSyncFileError;
347
347
  class InvalidSyncAppFlagError extends FlagError {
348
- constructor(sync, app) {
348
+ constructor(sync) {
349
349
  super({ name: "app", char: "a" }, (0, ts_dedent_1.default) `
350
350
  You were about to sync the following app to the following directory:
351
351
 
352
- ${app} → ${sync.dir}
352
+ ${sync.flags.app} → ${sync.dir}
353
353
 
354
354
  However, that directory has already been synced with this app:
355
355
 
356
356
  ${sync.metadata.app}
357
357
 
358
- If you're sure that you want to sync "${app}" to "${sync.dir}", run \`ggt sync\` again with the \`--force\` flag:
358
+ If you're sure that you want to sync "${sync.flags.app}" to "${sync.dir}", run \`ggt sync\` again with the \`--force\` flag:
359
359
 
360
360
  $ ggt sync ${sync.argv.join(" ")} --force
361
361
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import cleanStack from \"clean-stack\";\nimport { HTTPError } from \"got\";\nimport type { GraphQLError } from \"graphql\";\nimport { isArray, isBoolean, isError, isNil, isNumber, isString, noop, uniqBy } from \"lodash\";\nimport { serializeError as baseSerializeError } from \"serialize-error\";\nimport dedent from \"ts-dedent\";\nimport type { SetOptional } from \"type-fest\";\nimport { inspect } from \"util\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport type Sync from \"../commands/sync\";\nimport type { Payload } from \"./client\";\nimport { context } from \"./context\";\nimport * as Sentry from \"@sentry/node\";\nimport os from \"os\";\nimport { randomUUID } from \"crypto\";\n\nif (context.env.productionLike) {\n Sentry.init({ dsn: \"https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266\" });\n}\n\n/**\n * Base class for all errors.\n *\n * Inspired by gadget's GadgetError and oclif's PrettyPrintableError.\n */\nexport abstract class BaseError extends Error {\n /**\n * A GGT_CLI_SOMETHING human/machine readable unique identifier for this error.\n */\n code: string;\n\n /**\n * The Sentry event ID for this error.\n */\n sentryEventId = context.env.testLike ? \"00000000-0000-0000-0000-000000000000\" : randomUUID();\n\n /**\n * The underlying *thing* that caused this error.\n */\n override cause?: any;\n\n /**\n * Assume the stack trace exists.\n */\n override stack!: string;\n\n /**\n * Indicates whether this error is considered a bug or not.\n */\n abstract isBug: IsBug;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n Error.captureStackTrace(this, this.constructor);\n }\n\n async capture(): Promise<void> {\n if (this.isBug == IsBug.NO) return;\n\n const user = await context.getUser().catch(noop);\n\n Sentry.getCurrentHub().captureException(this, {\n event_id: this.sentryEventId,\n captureContext: {\n user: user ? { id: String(user.id), email: user.email, username: user.name } : undefined,\n tags: {\n applicationId: context.app?.id,\n arch: context.config.arch,\n isBug: this.isBug,\n code: this.code,\n environment: context.env.value,\n platform: context.config.platform,\n shell: context.config.shell,\n version: context.config.version,\n },\n contexts: {\n cause: this.cause ? serializeError(this.cause) : undefined,\n app: {\n command: `${context.config.bin} ${process.argv.slice(2).join(\" \")}`,\n argv: process.argv,\n },\n device: {\n name: os.hostname(),\n family: os.type(),\n arch: os.arch(),\n },\n runtime: {\n name: process.release.name,\n version: process.version,\n },\n },\n },\n });\n\n await Sentry.flush(2000);\n }\n\n /**\n * Turns this error into a user-friendly message that explains what went wrong and how to fix it. A good write up of what an error should\n * look like can be found here: {@link https://clig.dev/#errors}\n */\n render(): string {\n const rendered = dedent`\n ${this.header()}\n\n ${this.body()}\n `;\n\n const footer = this.footer();\n if (!footer) return rendered;\n\n return dedent`\n ${rendered}\n\n ${footer}\n `;\n }\n\n protected header(): string {\n return `${this.code}: ${this.message}`;\n }\n\n protected footer(): string {\n if (this.isBug == IsBug.NO) return \"\";\n\n return dedent`\n ${this.isBug == IsBug.YES ? \"This is a bug\" : \"If you think this is a bug\"}, please submit an issue using the link below.\n\n https://github.com/gadget-inc/ggt/issues/new?template=bug_report.yml&error-id=${this.sentryEventId}\n `;\n }\n\n protected abstract body(): string;\n}\n\n/**\n * Universal Error object to json blob serializer.\n * Wraps `serialize-error` with some handy stuff, like special support for Got HTTP errors\n */\nexport function serializeError(error: Error | string | unknown): Record<string, any> {\n let serialized = baseSerializeError(isArray(error) ? new AggregateError(error) : error);\n if (typeof serialized == \"string\") {\n serialized = { message: serialized };\n }\n\n if (error instanceof HTTPError && error.name === \"RequestError\") {\n delete serialized[\"timings\"];\n serialized[\"options\"] = { method: error.options.method, url: error.options.url.toJSON() };\n serialized[\"responseBody\"] = inspect(error.response?.body);\n }\n\n return serialized;\n}\n\nexport enum IsBug {\n YES = \"yes\",\n NO = \"no\",\n MAYBE = \"maybe\",\n}\n\n/**\n * Our \"catch all\" error. If this error is thrown, we almost certainly have a bug.\n *\n * Whenever possible, we should use a more specific error so that we can provide more useful information.\n */\nexport class UnexpectedError extends BaseError {\n isBug = IsBug.YES;\n\n constructor(override cause: Error) {\n super(\"GGT_CLI_UNEXPECTED_ERROR\", \"An unexpected error occurred\");\n }\n\n protected body(): string {\n return cleanStack(this.cause.stack ?? this.stack);\n }\n}\n\nexport class ClientError extends BaseError {\n isBug = IsBug.MAYBE;\n\n constructor(readonly payload: Payload<any, any>, override cause: string | Error | readonly GraphQLError[] | CloseEvent | ErrorEvent) {\n super(\"GGT_CLI_CLIENT_ERROR\", \"An error occurred while communicating with Gadget\");\n\n // ErrorEvent and CloseEvent aren't serializable, so we reconstruct them into an object. We discard the `target` property because it's large and not that useful\n if (isErrorEvent(cause)) {\n this.cause = {\n type: cause.type,\n message: cause.message,\n error: serializeError(cause.error),\n } as any;\n } else if (isCloseEvent(cause)) {\n this.cause = {\n type: cause.type,\n code: cause.code,\n reason: cause.reason,\n wasClean: cause.wasClean,\n } as any;\n }\n }\n\n override body(): string {\n if (isGraphQLErrors(this.cause)) {\n if (this.cause.length > 1) {\n const errors = uniqBy(this.cause, \"message\");\n\n let output = \"Gadget responded with multiple errors:\\n\";\n for (let i = 0; i < errors.length; i++) {\n output += `\\n ${i + 1}. ${errors[i]?.message}`;\n }\n\n return output;\n } else {\n return dedent`\n Gadget responded with the following error:\n\n ${this.cause[0]?.message}\n `;\n }\n }\n\n if (isCloseEvent(this.cause)) {\n return \"The connection to Gadget closed unexpectedly.\";\n }\n\n if (isErrorEvent(this.cause) || isError(this.cause)) {\n return this.cause.message;\n }\n\n return this.cause;\n }\n}\n\nexport class YarnNotFoundError extends BaseError {\n isBug = IsBug.NO;\n\n constructor() {\n super(\"GGT_CLI_YARN_NOT_FOUND\", \"Yarn not found\");\n }\n\n protected body(): string {\n return dedent`\n Yarn must be installed to sync your application. You can install it by running:\n\n $ npm install --global yarn\n\n For more information, see: https://classic.yarnpkg.com/en/docs/install\n `;\n }\n}\n\nexport class FlagError<T extends { name: string; char?: string } = { name: string; char?: string }> extends BaseError {\n isBug = IsBug.NO;\n\n constructor(readonly flag: T, readonly description: string) {\n const name = flag.char ? `-${flag.char}, --${flag.name}` : `--${flag.name}`;\n super(\"GGT_CLI_FLAG_ERROR\", `Invalid value provided for the ${name} flag`);\n }\n\n protected body(): string {\n return this.description;\n }\n}\n\nexport class InvalidSyncFileError extends BaseError {\n isBug = IsBug.MAYBE;\n\n constructor(override readonly cause: unknown, readonly sync: Sync, readonly app: string | undefined) {\n super(\"GGT_CLI_INVALID_SYNC_FILE\", \"The .gadget/sync.json file was invalid or not found\");\n }\n\n protected body(): string {\n return dedent`\n We failed to read the Gadget metadata file in this directory:\n\n ${this.sync.dir}\n\n If you're running \\`ggt sync\\` for the first time, we recommend using an empty directory such as:\n\n ~/gadget/${this.app || \"<name of app>\"}\n\n Otherwise, if you're sure you want to sync the contents of that directory to Gadget, run \\`ggt sync\\` again with the \\`--force\\` flag:\n\n $ ggt sync ${this.sync.argv.join(\" \")} --force\n\n You will be prompted to either merge your local files with your remote ones or reset your local files to your remote ones.\n `;\n }\n}\n\nexport class InvalidSyncAppFlagError extends FlagError {\n constructor(sync: Sync, app: string) {\n super(\n { name: \"app\", char: \"a\" },\n dedent`\n You were about to sync the following app to the following directory:\n\n ${app} → ${sync.dir}\n\n However, that directory has already been synced with this app:\n\n ${sync.metadata.app}\n\n If you're sure that you want to sync \"${app}\" to \"${sync.dir}\", run \\`ggt sync\\` again with the \\`--force\\` flag:\n\n $ ggt sync ${sync.argv.join(\" \")} --force\n `\n );\n }\n}\n\nfunction isCloseEvent(e: any): e is SetOptional<CloseEvent, \"target\"> {\n return !isNil(e) && isString(e.type) && isNumber(e.code) && isString(e.reason) && isBoolean(e.wasClean);\n}\n\nfunction isErrorEvent(e: any): e is SetOptional<ErrorEvent, \"target\"> {\n return !isNil(e) && isString(e.type) && isString(e.message) && !isNil(e.error);\n}\n\nfunction isGraphQLErrors(e: any): e is readonly GraphQLError[] {\n return isArray(e) && e.every((e) => !isNil(e) && isString(e.message) && isArray(e.locations ?? []) && isArray(e.path ?? []));\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import cleanStack from \"clean-stack\";\nimport { HTTPError } from \"got\";\nimport type { GraphQLError } from \"graphql\";\nimport { isArray, isBoolean, isError, isNil, isNumber, isString, noop, uniqBy } from \"lodash\";\nimport { serializeError as baseSerializeError } from \"serialize-error\";\nimport dedent from \"ts-dedent\";\nimport type { SetOptional } from \"type-fest\";\nimport { inspect } from \"util\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport type Sync from \"../commands/sync\";\nimport type { Payload } from \"./client\";\nimport { context } from \"./context\";\nimport * as Sentry from \"@sentry/node\";\nimport os from \"os\";\nimport { randomUUID } from \"crypto\";\n\nif (context.env.productionLike) {\n Sentry.init({ dsn: \"https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266\" });\n}\n\n/**\n * Base class for all errors.\n *\n * Inspired by gadget's GadgetError and oclif's PrettyPrintableError.\n */\nexport abstract class BaseError extends Error {\n /**\n * A GGT_CLI_SOMETHING human/machine readable unique identifier for this error.\n */\n code: string;\n\n /**\n * The Sentry event ID for this error.\n */\n sentryEventId = context.env.testLike ? \"00000000-0000-0000-0000-000000000000\" : randomUUID();\n\n /**\n * The underlying *thing* that caused this error.\n */\n override cause?: any;\n\n /**\n * Assume the stack trace exists.\n */\n override stack!: string;\n\n /**\n * Indicates whether this error is considered a bug or not.\n */\n abstract isBug: IsBug;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n Error.captureStackTrace(this, this.constructor);\n }\n\n async capture(): Promise<void> {\n if (this.isBug == IsBug.NO) return;\n\n const user = await context.getUser().catch(noop);\n\n Sentry.getCurrentHub().captureException(this, {\n event_id: this.sentryEventId,\n captureContext: {\n user: user ? { id: String(user.id), email: user.email, username: user.name } : undefined,\n tags: {\n applicationId: context.app?.id,\n arch: context.config.arch,\n isBug: this.isBug,\n code: this.code,\n environment: context.env.value,\n platform: context.config.platform,\n shell: context.config.shell,\n version: context.config.version,\n },\n contexts: {\n cause: this.cause ? serializeError(this.cause) : undefined,\n app: {\n command: `${context.config.bin} ${process.argv.slice(2).join(\" \")}`,\n argv: process.argv,\n },\n device: {\n name: os.hostname(),\n family: os.type(),\n arch: os.arch(),\n },\n runtime: {\n name: process.release.name,\n version: process.version,\n },\n },\n },\n });\n\n await Sentry.flush(2000);\n }\n\n /**\n * Turns this error into a user-friendly message that explains what went wrong and how to fix it. A good write up of what an error should\n * look like can be found here: {@link https://clig.dev/#errors}\n */\n render(): string {\n const rendered = dedent`\n ${this.header()}\n\n ${this.body()}\n `;\n\n const footer = this.footer();\n if (!footer) return rendered;\n\n return dedent`\n ${rendered}\n\n ${footer}\n `;\n }\n\n protected header(): string {\n return `${this.code}: ${this.message}`;\n }\n\n protected footer(): string {\n if (this.isBug == IsBug.NO) return \"\";\n\n return dedent`\n ${this.isBug == IsBug.YES ? \"This is a bug\" : \"If you think this is a bug\"}, please submit an issue using the link below.\n\n https://github.com/gadget-inc/ggt/issues/new?template=bug_report.yml&error-id=${this.sentryEventId}\n `;\n }\n\n protected abstract body(): string;\n}\n\n/**\n * Universal Error object to json blob serializer.\n * Wraps `serialize-error` with some handy stuff, like special support for Got HTTP errors\n */\nexport function serializeError(error: Error | string | unknown): Record<string, any> {\n let serialized = baseSerializeError(isArray(error) ? new AggregateError(error) : error);\n if (typeof serialized == \"string\") {\n serialized = { message: serialized };\n }\n\n if (error instanceof HTTPError && error.name === \"RequestError\") {\n delete serialized[\"timings\"];\n serialized[\"options\"] = { method: error.options.method, url: error.options.url.toJSON() };\n serialized[\"responseBody\"] = inspect(error.response?.body);\n }\n\n return serialized;\n}\n\nexport enum IsBug {\n YES = \"yes\",\n NO = \"no\",\n MAYBE = \"maybe\",\n}\n\n/**\n * Our \"catch all\" error. If this error is thrown, we almost certainly have a bug.\n *\n * Whenever possible, we should use a more specific error so that we can provide more useful information.\n */\nexport class UnexpectedError extends BaseError {\n isBug = IsBug.YES;\n\n constructor(override cause: Error) {\n super(\"GGT_CLI_UNEXPECTED_ERROR\", \"An unexpected error occurred\");\n }\n\n protected body(): string {\n return cleanStack(this.cause.stack ?? this.stack);\n }\n}\n\nexport class ClientError extends BaseError {\n isBug = IsBug.MAYBE;\n\n constructor(readonly payload: Payload<any, any>, override cause: string | Error | readonly GraphQLError[] | CloseEvent | ErrorEvent) {\n super(\"GGT_CLI_CLIENT_ERROR\", \"An error occurred while communicating with Gadget\");\n\n // ErrorEvent and CloseEvent aren't serializable, so we reconstruct them into an object. We discard the `target` property because it's large and not that useful\n if (isErrorEvent(cause)) {\n this.cause = {\n type: cause.type,\n message: cause.message,\n error: serializeError(cause.error),\n } as any;\n } else if (isCloseEvent(cause)) {\n this.cause = {\n type: cause.type,\n code: cause.code,\n reason: cause.reason,\n wasClean: cause.wasClean,\n } as any;\n }\n }\n\n override body(): string {\n if (isGraphQLErrors(this.cause)) {\n if (this.cause.length > 1) {\n const errors = uniqBy(this.cause, \"message\");\n\n let output = \"Gadget responded with multiple errors:\\n\";\n for (let i = 0; i < errors.length; i++) {\n output += `\\n ${i + 1}. ${errors[i]?.message}`;\n }\n\n return output;\n } else {\n return dedent`\n Gadget responded with the following error:\n\n ${this.cause[0]?.message}\n `;\n }\n }\n\n if (isCloseEvent(this.cause)) {\n return \"The connection to Gadget closed unexpectedly.\";\n }\n\n if (isErrorEvent(this.cause) || isError(this.cause)) {\n return this.cause.message;\n }\n\n return this.cause;\n }\n}\n\nexport class YarnNotFoundError extends BaseError {\n isBug = IsBug.NO;\n\n constructor() {\n super(\"GGT_CLI_YARN_NOT_FOUND\", \"Yarn not found\");\n }\n\n protected body(): string {\n return dedent`\n Yarn must be installed to sync your application. You can install it by running:\n\n $ npm install --global yarn\n\n For more information, see: https://classic.yarnpkg.com/en/docs/install\n `;\n }\n}\n\nexport class FlagError<T extends { name: string; char?: string } = { name: string; char?: string }> extends BaseError {\n isBug = IsBug.NO;\n\n constructor(readonly flag: T, readonly description: string) {\n const name = flag.char ? `-${flag.char}, --${flag.name}` : `--${flag.name}`;\n super(\"GGT_CLI_FLAG_ERROR\", `Invalid value provided for the ${name} flag`);\n }\n\n protected body(): string {\n return this.description;\n }\n}\n\nexport class InvalidSyncFileError extends BaseError {\n isBug = IsBug.MAYBE;\n\n constructor(override readonly cause: unknown, readonly sync: Sync, readonly app: string | undefined) {\n super(\"GGT_CLI_INVALID_SYNC_FILE\", \"The .gadget/sync.json file was invalid or not found\");\n }\n\n protected body(): string {\n return dedent`\n We failed to read the Gadget metadata file in this directory:\n\n ${this.sync.dir}\n\n If you're running \\`ggt sync\\` for the first time, we recommend using an empty directory such as:\n\n ~/gadget/${this.app || \"<name of app>\"}\n\n Otherwise, if you're sure you want to sync the contents of that directory to Gadget, run \\`ggt sync\\` again with the \\`--force\\` flag:\n\n $ ggt sync ${this.sync.argv.join(\" \")} --force\n\n You will be prompted to either merge your local files with your remote ones or reset your local files to your remote ones.\n `;\n }\n}\n\nexport class InvalidSyncAppFlagError extends FlagError {\n constructor(sync: Sync) {\n super(\n { name: \"app\", char: \"a\" },\n dedent`\n You were about to sync the following app to the following directory:\n\n ${sync.flags.app} → ${sync.dir}\n\n However, that directory has already been synced with this app:\n\n ${sync.metadata.app}\n\n If you're sure that you want to sync \"${sync.flags.app}\" to \"${sync.dir}\", run \\`ggt sync\\` again with the \\`--force\\` flag:\n\n $ ggt sync ${sync.argv.join(\" \")} --force\n `\n );\n }\n}\n\nfunction isCloseEvent(e: any): e is SetOptional<CloseEvent, \"target\"> {\n return !isNil(e) && isString(e.type) && isNumber(e.code) && isString(e.reason) && isBoolean(e.wasClean);\n}\n\nfunction isErrorEvent(e: any): e is SetOptional<ErrorEvent, \"target\"> {\n return !isNil(e) && isString(e.type) && isString(e.message) && !isNil(e.error);\n}\n\nfunction isGraphQLErrors(e: any): e is readonly GraphQLError[] {\n return isArray(e) && e.every((e) => !isNil(e) && isString(e.message) && isArray(e.locations ?? []) && isArray(e.path ?? []));\n}\n"]}
@@ -1 +1 @@
1
- export declare const app: import("@oclif/core/lib/interfaces").Definition<string, Record<string, unknown>>;
1
+ export declare const app: import("@oclif/core/lib/interfaces/parser").FlagDefinition<string, Record<string, unknown>>;
@@ -1,5 +1,5 @@
1
+ import type { Command } from "@oclif/core";
1
2
  import { CommandHelp as OclifCommandHelp, Help as OclifHelp } from "@oclif/core";
2
- import type { Example } from "@oclif/core/lib/interfaces";
3
3
  export default class Help extends OclifHelp {
4
4
  CommandHelpClass: typeof CommandHelp;
5
5
  }
@@ -14,6 +14,6 @@ declare class CommandHelp extends OclifCommandHelp {
14
14
  /**
15
15
  * Same as above, but for examples.
16
16
  */
17
- protected examples(examples: string | string[] | Example[] | undefined): string | undefined;
17
+ protected examples(examples: string | string[] | Command.Example[] | undefined): string | undefined;
18
18
  }
19
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/utils/help.ts"],"names":[],"mappings":";;AAAA,sCAAiF;AAEjF,mCAAkC;AAElC,MAAqB,IAAK,SAAQ,WAAS;IAA3C;;QACE;;;;mBAA4B,WAAW;WAAC;IAC1C,CAAC;CAAA;AAFD,uBAEC;AAED,MAAM,WAAY,SAAQ,kBAAgB;IACxC;;;;;OAKG;IACgB,WAAW;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;SACjC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACgB,QAAQ,CAAC,QAAmD;QAC7E,IAAI,IAAA,iBAAQ,EAAC,QAAQ,CAAC,EAAE;YACtB,OAAO,QAAQ,CAAC;SACjB;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,iBAAQ,CAAC,EAAE;YACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF","sourcesContent":["import { CommandHelp as OclifCommandHelp, Help as OclifHelp } from \"@oclif/core\";\nimport type { Example } from \"@oclif/core/lib/interfaces\";\nimport { isString } from \"lodash\";\n\nexport default class Help extends OclifHelp {\n override CommandHelpClass = CommandHelp;\n}\n\nclass CommandHelp extends OclifCommandHelp {\n /**\n * By default, oclif tries to format the description so that it fit's within the terminal window. However, if the description is already\n * formatted with `dedent`, then the description gets mangled and the help output is not pretty.\n *\n * This overrides the default behavior to just use the description as-is if it already exists.\n */\n protected override description(): string | undefined {\n if (this.command.description) {\n return this.command.description;\n }\n return super.description();\n }\n\n /**\n * Same as above, but for examples.\n */\n protected override examples(examples: string | string[] | Example[] | undefined): string | undefined {\n if (isString(examples)) {\n return examples;\n }\n if (Array.isArray(examples) && examples.every(isString)) {\n return examples.join(\"\\n\\n\");\n }\n return super.examples(examples);\n }\n}\n"]}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/utils/help.ts"],"names":[],"mappings":";;AACA,sCAAiF;AACjF,mCAAkC;AAElC,MAAqB,IAAK,SAAQ,WAAS;IAA3C;;QACE;;;;mBAA4B,WAAW;WAAC;IAC1C,CAAC;CAAA;AAFD,uBAEC;AAED,MAAM,WAAY,SAAQ,kBAAgB;IACxC;;;;;OAKG;IACgB,WAAW;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;SACjC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACgB,QAAQ,CAAC,QAA2D;QACrF,IAAI,IAAA,iBAAQ,EAAC,QAAQ,CAAC,EAAE;YACtB,OAAO,QAAQ,CAAC;SACjB;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,iBAAQ,CAAC,EAAE;YACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF","sourcesContent":["import type { Command } from \"@oclif/core\";\nimport { CommandHelp as OclifCommandHelp, Help as OclifHelp } from \"@oclif/core\";\nimport { isString } from \"lodash\";\n\nexport default class Help extends OclifHelp {\n override CommandHelpClass = CommandHelp;\n}\n\nclass CommandHelp extends OclifCommandHelp {\n /**\n * By default, oclif tries to format the description so that it fit's within the terminal window. However, if the description is already\n * formatted with `dedent`, then the description gets mangled and the help output is not pretty.\n *\n * This overrides the default behavior to just use the description as-is if it already exists.\n */\n protected override description(): string | undefined {\n if (this.command.description) {\n return this.command.description;\n }\n return super.description();\n }\n\n /**\n * Same as above, but for examples.\n */\n protected override examples(examples: string | string[] | Command.Example[] | undefined): string | undefined {\n if (isString(examples)) {\n return examples;\n }\n if (Array.isArray(examples) && examples.every(isString)) {\n return examples.join(\"\\n\\n\");\n }\n return super.examples(examples);\n }\n}\n"]}