@gadgetinc/ggt 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/bin/dev.js +2 -2
- package/bin/run.js +1 -1
- package/lib/__generated__/graphql.js.map +1 -1
- package/lib/commands/help.js +3 -3
- package/lib/commands/help.js.map +1 -1
- package/lib/commands/list.js +4 -4
- package/lib/commands/list.js.map +1 -1
- package/lib/commands/login.js +2 -2
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/logout.js +2 -2
- package/lib/commands/logout.js.map +1 -1
- package/lib/commands/sync.js +239 -83
- package/lib/commands/sync.js.map +1 -1
- package/lib/commands/whoami.js +2 -2
- package/lib/commands/whoami.js.map +1 -1
- package/lib/{utils → services}/base-command.js +25 -10
- package/lib/services/base-command.js.map +1 -0
- package/lib/{utils → services}/client.js +70 -21
- package/lib/services/client.js.map +1 -0
- package/lib/{utils → services}/context.js +42 -27
- package/lib/services/context.js.map +1 -0
- package/lib/{utils → services}/errors.js +8 -8
- package/lib/services/errors.js.map +1 -0
- package/lib/{utils → services}/flags.js +4 -3
- package/lib/services/flags.js.map +1 -0
- package/lib/{utils → services}/fs-utils.js +6 -2
- package/lib/services/fs-utils.js.map +1 -0
- package/lib/{utils → services}/help.js +1 -1
- package/lib/services/help.js.map +1 -0
- package/lib/services/promise.js.map +1 -0
- package/lib/{utils → services}/sleep.js +6 -2
- package/lib/services/sleep.js.map +1 -0
- package/npm-shrinkwrap.json +2378 -2704
- package/oclif.manifest.json +35 -15
- package/package.json +35 -34
- package/lib/utils/base-command.js.map +0 -1
- package/lib/utils/client.js.map +0 -1
- package/lib/utils/context.js.map +0 -1
- package/lib/utils/errors.js.map +0 -1
- package/lib/utils/flags.js.map +0 -1
- package/lib/utils/fs-utils.js.map +0 -1
- package/lib/utils/help.js.map +0 -1
- package/lib/utils/promise.js.map +0 -1
- package/lib/utils/sleep.js.map +0 -1
- /package/lib/{utils → services}/promise.js +0 -0
package/oclif.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.2.
|
|
2
|
+
"version": "0.2.2",
|
|
3
3
|
"commands": {
|
|
4
4
|
"help": {
|
|
5
5
|
"id": "help",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"pluginType": "core",
|
|
29
29
|
"aliases": [],
|
|
30
30
|
"examples": [
|
|
31
|
-
"$ ggt list\n$ ggt list --extended\n$ ggt list --sort=slug"
|
|
31
|
+
"\u001b[90m$ ggt list\u001b[39m\n\u001b[90m$ ggt list --extended\u001b[39m\n\u001b[90m$ ggt list --sort=slug\u001b[39m"
|
|
32
32
|
],
|
|
33
33
|
"flags": {
|
|
34
34
|
"columns": {
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"pluginType": "core",
|
|
118
118
|
"aliases": [],
|
|
119
119
|
"examples": [
|
|
120
|
-
"$ ggt login\nWe've opened Gadget's login page using your default browser.\n\nPlease log in and then return to this terminal.\n\nHello, Jane Doe (jane@example.com)"
|
|
120
|
+
"\u001b[90m$ ggt login\u001b[39m\nWe've opened Gadget's login page using your default browser.\n\nPlease log in and then return to this terminal.\n\nHello, Jane Doe \u001b[90m(jane@example.com)\u001b[39m"
|
|
121
121
|
],
|
|
122
122
|
"flags": {},
|
|
123
123
|
"args": {}
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"pluginType": "core",
|
|
133
133
|
"aliases": [],
|
|
134
134
|
"examples": [
|
|
135
|
-
"$ ggt logout\nGoodbye"
|
|
135
|
+
"\u001b[90m$ ggt logout\u001b[39m\nGoodbye"
|
|
136
136
|
],
|
|
137
137
|
"flags": {},
|
|
138
138
|
"args": {}
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"sync": {
|
|
141
141
|
"id": "sync",
|
|
142
142
|
"summary": "Sync your Gadget application's source code to and from your local filesystem.",
|
|
143
|
-
"description": "Sync provides the ability to sync your Gadget application's source code to and from your local\nfilesystem. While
|
|
143
|
+
"description": "Sync provides the ability to sync your Gadget application's source code to and from your local\nfilesystem. While \u001b[90mggt sync\u001b[39m is running, local file changes are immediately reflected within\nGadget, while files that are changed remotely are immediately saved to your local filesystem.\n\nUse cases for this include:\n - Developing locally with your own editor like VSCode \u001b[90m(https://code.visualstudio.com/)\u001b[39m\n - Storing your source code in a Git repository like GitHub \u001b[90m(https://github.com/)\u001b[39m\n\nSync includes the concept of a \u001b[90m.ignore\u001b[39m file. This file may contain a list of files and\ndirectories that won't be received or sent to Gadget when syncing. The format of this file is\nidentical to the one used by Git \u001b[90m(https://git-scm.com/docs/gitignore)\u001b[39m.\n\nThe following files and directories are always ignored:\n - .gadget\n - .git\n - node_modules\n\nNote:\n - If you have separate development and production environments, \u001b[90mggt sync\u001b[39m will only sync with your development environment\n - Gadget applications only support installing dependencies with Yarn 1 \u001b[90m(https://classic.yarnpkg.com/lang/en/)\u001b[39m\n - Since file changes are immediately reflected in Gadget, avoid the following while \u001b[90mggt sync\u001b[39m is running:\n - Deleting all your files\n - Moving all your files to a different directory",
|
|
144
144
|
"strict": true,
|
|
145
145
|
"usage": "sync [DIRECTORY] [--app <name>]",
|
|
146
146
|
"pluginName": "@gadgetinc/ggt",
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"pluginType": "core",
|
|
149
149
|
"aliases": [],
|
|
150
150
|
"examples": [
|
|
151
|
-
"$ ggt sync --app my-app ~/gadget/my-app\n\nApp my-app\nEditor https://my-app.gadget.app/edit\nPlayground https://my-app.gadget.app/api/graphql/playground\nDocs https://docs.gadget.dev/api/my-app\n\
|
|
151
|
+
"\u001b[90m$ ggt sync --app my-app ~/gadget/my-app\u001b[39m\n\nApp my-app\nEditor https://my-app.gadget.app/edit\nPlayground https://my-app.gadget.app/api/graphql/playground\nDocs https://docs.gadget.dev/api/my-app\n\n\u001b[4mEndpoints\u001b[24m\n - https://my-app.gadget.app\n - https://my-app--development.gadget.app\n\nWatching for file changes... \u001b[90mPress Ctrl+C to stop\u001b[39m\n\nReceived \u001b[90m12:00:00 PM\u001b[39m\n\u001b[32m←\u001b[39m routes/GET.js \u001b[90m(changed)\u001b[39m\n\u001b[32m←\u001b[39m user/signUp/signIn.js \u001b[90m(changed)\u001b[39m\n\u001b[90m2 files in total. 2 changed, 0 deleted.\u001b[39m\n\nSent \u001b[90m12:00:03 PM\u001b[39m\n\u001b[32m→\u001b[39m routes/GET.ts \u001b[90m(changed)\u001b[39m\n\u001b[90m1 file in total. 1 changed, 0 deleted.\u001b[39m\n\n^C Stopping... \u001b[90m(press Ctrl+C again to force)\u001b[39m\nGoodbye!"
|
|
152
152
|
],
|
|
153
153
|
"flags": {
|
|
154
154
|
"app": {
|
|
@@ -175,25 +175,45 @@
|
|
|
175
175
|
"multiple": false,
|
|
176
176
|
"default": 100
|
|
177
177
|
},
|
|
178
|
-
"file-
|
|
179
|
-
"name": "file-
|
|
178
|
+
"file-watch-debounce": {
|
|
179
|
+
"name": "file-watch-debounce",
|
|
180
180
|
"type": "option",
|
|
181
|
-
"summary": "
|
|
181
|
+
"summary": "Amount of milliseconds to debounce file changed events",
|
|
182
182
|
"hidden": true,
|
|
183
183
|
"helpValue": "ms",
|
|
184
184
|
"helpGroup": "file",
|
|
185
185
|
"multiple": false,
|
|
186
|
-
"default":
|
|
186
|
+
"default": 300
|
|
187
187
|
},
|
|
188
|
-
"file-poll-interval": {
|
|
189
|
-
"name": "file-poll-interval",
|
|
188
|
+
"file-watch-poll-interval": {
|
|
189
|
+
"name": "file-watch-poll-interval",
|
|
190
190
|
"type": "option",
|
|
191
|
-
"
|
|
191
|
+
"summary": "Polling is used as a last resort measure when watching non-existent paths inside non-existent directories, this controls how often polling is performed, in milliseconds. You can set it to a lower value to make the app detect events much more quickly, but don't set it too low if you are watching many paths that require polling as polling is expensive.",
|
|
192
192
|
"hidden": true,
|
|
193
193
|
"helpValue": "ms",
|
|
194
194
|
"helpGroup": "file",
|
|
195
195
|
"multiple": false,
|
|
196
|
-
"default":
|
|
196
|
+
"default": 3000
|
|
197
|
+
},
|
|
198
|
+
"file-watch-poll-timeout": {
|
|
199
|
+
"name": "file-watch-poll-timeout",
|
|
200
|
+
"type": "option",
|
|
201
|
+
"summary": "Sometimes polling will fail, for example if there are too many file descriptors currently open, usually eventually polling will succeed after a few tries though, this controls the amount of milliseconds the library should keep retrying for.",
|
|
202
|
+
"hidden": true,
|
|
203
|
+
"helpValue": "ms",
|
|
204
|
+
"helpGroup": "file",
|
|
205
|
+
"multiple": false,
|
|
206
|
+
"default": 20000
|
|
207
|
+
},
|
|
208
|
+
"file-watch-rename-timeout": {
|
|
209
|
+
"name": "file-watch-rename-timeout",
|
|
210
|
+
"type": "option",
|
|
211
|
+
"summary": "Amount of milliseconds to wait for a potential rename/renameDir event to be detected. The higher this value is the more reliably renames will be detected, but don't set this too high, or the emission of some events could be delayed by that amount. The higher this value is the longer the library will take to emit add/addDir/unlink/unlinkDir events.",
|
|
212
|
+
"hidden": true,
|
|
213
|
+
"helpValue": "ms",
|
|
214
|
+
"helpGroup": "file",
|
|
215
|
+
"multiple": false,
|
|
216
|
+
"default": 1250
|
|
197
217
|
}
|
|
198
218
|
},
|
|
199
219
|
"args": {
|
|
@@ -215,7 +235,7 @@
|
|
|
215
235
|
"pluginType": "core",
|
|
216
236
|
"aliases": [],
|
|
217
237
|
"examples": [
|
|
218
|
-
"$ ggt whoami\nYou are logged in as Jane Doe (jane@example.com)"
|
|
238
|
+
"\u001b[90m$ ggt whoami\u001b[39m\nYou are logged in as Jane Doe \u001b[90m(jane@example.com)\u001b[39m"
|
|
219
239
|
],
|
|
220
240
|
"flags": {},
|
|
221
241
|
"args": {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gadgetinc/ggt",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "The command-line interface for Gadget",
|
|
5
5
|
"homepage": "https://github.com/gadget-inc/ggt",
|
|
6
6
|
"bugs": "https://github.com/gadget-inc/ggt/issues",
|
|
@@ -37,27 +37,26 @@
|
|
|
37
37
|
"version": "changeset version && npm install --package-lock-only && npm run build && npm run readme"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@oclif/core": "^2.
|
|
40
|
+
"@oclif/core": "^2.9.4",
|
|
41
41
|
"@oclif/errors": "^1.3.6",
|
|
42
|
-
"@oclif/plugin-not-found": "^2.3.
|
|
43
|
-
"@oclif/plugin-warn-if-update-available": "^2.0.
|
|
44
|
-
"@sentry/node": "^7.
|
|
42
|
+
"@oclif/plugin-not-found": "^2.3.31",
|
|
43
|
+
"@oclif/plugin-warn-if-update-available": "^2.0.44",
|
|
44
|
+
"@sentry/node": "^7.59.2",
|
|
45
45
|
"@swc/helpers": "^0.5.1",
|
|
46
|
-
"chalk": "^5.
|
|
46
|
+
"chalk": "^5.3.0",
|
|
47
47
|
"chalk-template": "^1.1.0",
|
|
48
|
-
"chokidar": "^3.5.3",
|
|
49
48
|
"clean-stack": "^5.2.0",
|
|
50
49
|
"date-fns": "^2.30.0",
|
|
51
50
|
"debug": "^4.3.4",
|
|
52
51
|
"execa": "^7.1.1",
|
|
53
52
|
"fast-levenshtein": "^3.0.0",
|
|
54
53
|
"fs-extra": "^11.1.1",
|
|
55
|
-
"get-port": "^
|
|
54
|
+
"get-port": "^7.0.0",
|
|
56
55
|
"got": "^13.0.0",
|
|
57
|
-
"graphql": "^16.
|
|
58
|
-
"graphql-ws": "^5.
|
|
56
|
+
"graphql": "^16.7.1",
|
|
57
|
+
"graphql-ws": "^5.14.0",
|
|
59
58
|
"ignore": "^5.2.4",
|
|
60
|
-
"inquirer": "^9.2.
|
|
59
|
+
"inquirer": "^9.2.8",
|
|
61
60
|
"lodash": "^4.17.21",
|
|
62
61
|
"node-notifier": "^10.0.1",
|
|
63
62
|
"normalize-path": "^3.0.0",
|
|
@@ -67,50 +66,52 @@
|
|
|
67
66
|
"pluralize": "^8.0.0",
|
|
68
67
|
"serialize-error": "^11.0.0",
|
|
69
68
|
"ts-dedent": "^2.2.0",
|
|
69
|
+
"watcher": "^2.2.2",
|
|
70
70
|
"which": "^3.0.1",
|
|
71
71
|
"ws": "^8.13.0"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@changesets/cli": "^2.26.
|
|
74
|
+
"@changesets/cli": "^2.26.2",
|
|
75
75
|
"@graphql-codegen/add": "^5.0.0",
|
|
76
76
|
"@graphql-codegen/cli": "^4.0.1",
|
|
77
77
|
"@graphql-codegen/typescript": "^4.0.0",
|
|
78
|
-
"@graphql-codegen/typescript-operations": "^4.0.
|
|
79
|
-
"@oclif/plugin-plugins": "^3.1.
|
|
80
|
-
"@oclif/test": "^2.3.
|
|
78
|
+
"@graphql-codegen/typescript-operations": "^4.0.1",
|
|
79
|
+
"@oclif/plugin-plugins": "^3.1.6",
|
|
80
|
+
"@oclif/test": "^2.3.30",
|
|
81
81
|
"@swc/cli": "^0.1.62",
|
|
82
|
-
"@swc/core": "^1.3.
|
|
82
|
+
"@swc/core": "^1.3.70",
|
|
83
83
|
"@types/debug": "^4.1.8",
|
|
84
|
-
"@types/eslint": "^8.40.
|
|
84
|
+
"@types/eslint": "^8.40.2",
|
|
85
85
|
"@types/fast-levenshtein": "^0.0.2",
|
|
86
86
|
"@types/fs-extra": "^11.0.1",
|
|
87
87
|
"@types/inquirer": "^9.0.3",
|
|
88
88
|
"@types/lodash": "^4.14.195",
|
|
89
|
-
"@types/node": "^20.2
|
|
89
|
+
"@types/node": "^20.4.2",
|
|
90
90
|
"@types/node-notifier": "^8.0.2",
|
|
91
91
|
"@types/normalize-path": "^3.0.0",
|
|
92
|
-
"@types/pluralize": "^0.0.
|
|
92
|
+
"@types/pluralize": "^0.0.30",
|
|
93
93
|
"@types/which": "^3.0.0",
|
|
94
|
-
"@types/ws": "^8.5.
|
|
95
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
96
|
-
"@typescript-eslint/parser": "^
|
|
97
|
-
"concurrently": "^8.
|
|
94
|
+
"@types/ws": "^8.5.5",
|
|
95
|
+
"@typescript-eslint/eslint-plugin": "^6.1.0",
|
|
96
|
+
"@typescript-eslint/parser": "^6.1.0",
|
|
97
|
+
"concurrently": "^8.2.0",
|
|
98
98
|
"cross-env": "^7.0.3",
|
|
99
|
-
"cspell": "^6.31.
|
|
100
|
-
"eslint": "^8.
|
|
99
|
+
"cspell": "^6.31.2",
|
|
100
|
+
"eslint": "^8.44.0",
|
|
101
101
|
"eslint-config-prettier": "^8.8.0",
|
|
102
102
|
"eslint-plugin-import": "^2.27.5",
|
|
103
103
|
"eslint-plugin-lodash": "^7.4.0",
|
|
104
|
-
"nock": "^13.3.
|
|
105
|
-
"oclif": "^3.9.
|
|
106
|
-
"patch-package": "^7.0.
|
|
107
|
-
"prettier": "^
|
|
108
|
-
"prettier-plugin-
|
|
104
|
+
"nock": "^13.3.2",
|
|
105
|
+
"oclif": "^3.9.1",
|
|
106
|
+
"patch-package": "^7.0.2",
|
|
107
|
+
"prettier": "^3.0.0",
|
|
108
|
+
"prettier-plugin-organize-imports": "^3.2.3",
|
|
109
|
+
"prettier-plugin-packagejson": "^2.4.5",
|
|
109
110
|
"rimraf": "^5.0.1",
|
|
110
111
|
"ts-node": "^10.9.1",
|
|
111
|
-
"type-fest": "^
|
|
112
|
-
"typescript": "^5.1.
|
|
113
|
-
"vitest": "^0.
|
|
112
|
+
"type-fest": "^4.0.0",
|
|
113
|
+
"typescript": "^5.1.6",
|
|
114
|
+
"vitest": "^0.33.0"
|
|
114
115
|
},
|
|
115
116
|
"engines": {
|
|
116
117
|
"node": ">=16.0.0"
|
|
@@ -119,7 +120,7 @@
|
|
|
119
120
|
"bin": "ggt",
|
|
120
121
|
"dirname": "gadget",
|
|
121
122
|
"commands": "./lib/commands",
|
|
122
|
-
"helpClass": "./lib/
|
|
123
|
+
"helpClass": "./lib/services/help",
|
|
123
124
|
"topicSeparator": " ",
|
|
124
125
|
"topics": {},
|
|
125
126
|
"plugins": [
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
package/lib/utils/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/client.ts"],"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 _ from \"lodash\";\nimport type { JsonObject, SetOptional } from \"type-fest\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport { context } from \"./context.js\";\nimport { ClientError } from \"./errors.js\";\n\nconst debug = Debug(\"ggt:client\");\n\nenum ConnectionStatus {\n CONNECTED,\n DISCONNECTED,\n RECONNECTING,\n}\n\n/**\n * Client is a GraphQL client connected to a Gadget application's /edit/api/graphql-ws endpoint.\n *\n * NOTE: In order to use the Client, the user must be logged in and an app must have been selected (`context.app` and\n * `context.session` must be set).\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?.(),\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"],"names":["assert","Debug","createClient","_","WebSocket","context","ClientError","debug","ConnectionStatus","CONNECTED","DISCONNECTED","RECONNECTING","Client","subscribe","payload","sink","subscribePayload","removeConnectedListener","isFunction","variables","_client","on","status","query","split","unsubscribe","next","result","error","complete","subscribeUnwrap","errors","data","Promise","resolve","reject","queryUnwrap","dispose","constructor","app","url","slug","domains","shouldRetry","webSocketImpl","address","protocols","wsOptions","session","headers","config","userAgent","cookie","encodeURIComponent","connecting","connected","setImmediate","closed","e","event","wasClean"],"mappings":"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"}
|
package/lib/utils/context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { Config } from \"@oclif/core\";\nimport assert from \"assert\";\nimport fs from \"fs-extra\";\nimport { HTTPError, got } from \"got\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { ignoreEnoent } from \"./fs-utils.js\";\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\n * able to access it from anywhere. To do this, we created this global variable that references the Config. It is set\n * 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 instanceof URL && 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(appOrSlug?: App | string): Promise<void> {\n if (_.isString(appOrSlug)) {\n const app = await this.getAvailableApps().then((apps) => apps.find((app) => app.slug == appOrSlug));\n assert(app, `attempted to set app to \"${appOrSlug}\" but no app with that name or slug was found`);\n this.app = app;\n } else {\n this.app = appOrSlug;\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 slug: string;\n primaryDomain: string;\n hasSplitEnvironments: boolean;\n}\n\nexport const context = new Context();\n"],"names":["assert","fs","HTTPError","got","_","path","ignoreEnoent","Context","session","_session","readFileSync","join","config","configDir","error","undefined","value","clear","outputFileSync","removeSync","getUser","_user","_request","domains","services","json","response","statusCode","getAvailableApps","_availableApps","length","setApp","appOrSlug","isString","app","then","apps","find","slug","constructor","env","Env","extend","hooks","beforeRequest","options","headers","userAgent","url","URL","host","encodeURIComponent","process","productionLike","startsWith","developmentLike","testLike","developmentOrTestLike","context"],"mappings":";AACA,OAAOA,YAAY,SAAS;AAC5B,OAAOC,QAAQ,WAAW;AAC1B,SAASC,SAAS,EAAEC,GAAG,QAAQ,MAAM;AACrC,OAAOC,OAAO,SAAS;AACvB,OAAOC,UAAU,OAAO;AACxB,SAASC,YAAY,QAAQ,gBAAgB;AAE7C,OAAO,MAAMC;IA6CX,IAAIC,UAA8B;QAChC,IAAI,IAAI,CAACC,UAAU,OAAO,IAAI,CAACA;QAE/B,IAAI;YACF,IAAI,CAACA,WAAWR,GAAGS,aAAaL,KAAKM,KAAK,IAAI,CAACC,OAAOC,WAAW,gBAAgB;YACjF,OAAO,IAAI,CAACJ;QACd,EAAE,OAAOK,OAAO;YACdR,aAAaQ;YACb,OAAOC;QACT;IACF;IAEA,IAAIP,QAAQQ,KAAyB,EAAE;QACrC,IAAI,CAACC;QACL,IAAI,CAACR,WAAWO;QAChB,IAAI,IAAI,CAACP,UAAU;YACjBR,GAAGiB,eAAeb,KAAKM,KAAK,IAAI,CAACC,OAAOC,WAAW,gBAAgB,IAAI,CAACJ;QAC1E,OAAO;YACLR,GAAGkB,WAAWd,KAAKM,KAAK,IAAI,CAACC,OAAOC,WAAW;QACjD;IACF;IAEA;;GAEC,GACD,MAAMO,UAAqC;QACzC,IAAI,CAAC,IAAI,CAACZ,SAAS,OAAOO;QAC1B,IAAI,IAAI,CAACM,OAAO,OAAO,IAAI,CAACA;QAE5B,IAAI;YACF,IAAI,CAACA,QAAQ,MAAM,IAAI,CAACC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAACC,QAAQC,SAAS,sBAAsB,CAAC,EAAEC;YAC3F,OAAO,IAAI,CAACJ;QACd,EAAE,OAAOP,OAAO;YACd,IAAIA,iBAAiBZ,aAAaY,MAAMY,SAASC,eAAe,KAAK;gBACnE,IAAI,CAACnB,UAAUO;gBACf,OAAOA;YACT;YACA,MAAMD;QACR;IACF;IAEA;;GAEC,GACD,MAAMc,mBAAmC;QACvC,IAAI,CAAC,IAAI,CAACpB,SAAS,OAAO,EAAE;QAC5B,IAAI,IAAI,CAACqB,eAAeC,SAAS,GAAG,OAAO,IAAI,CAACD;QAEhD,IAAI,CAACA,iBAAiB,MAAM,IAAI,CAACP,SAAS,CAAC,QAAQ,EAAE,IAAI,CAACC,QAAQC,SAAS,cAAc,CAAC,EAAEC;QAC5F,OAAO,IAAI,CAACI;IACd;IAEA,MAAME,OAAOC,SAAwB,EAAiB;QACpD,IAAI5B,EAAE6B,SAASD,YAAY;YACzB,MAAME,MAAM,MAAM,IAAI,CAACN,mBAAmBO,KAAK,CAACC,OAASA,KAAKC,KAAK,CAACH,MAAQA,IAAII,QAAQN;YACxFhC,OAAOkC,KAAK,CAAC,yBAAyB,EAAEF,UAAU,6CAA6C,CAAC;YAChG,IAAI,CAACE,MAAMA;QACb,OAAO;YACL,IAAI,CAACA,MAAMF;QACb;IACF;IAEAf,QAAc;QACZ,IAAI,CAACR,WAAWM;QAChB,IAAI,CAACM,QAAQN;QACb,IAAI,CAACmB,MAAMnB;QACX,IAAI,CAACc,iBAAiB,EAAE;IAC1B;IA1EAU,aAAc;QArCd;;;;;;GAMC,GACD3B,uBAAAA,UAAAA,KAAAA;QAEA4B,uBAAAA,OAAM,IAAIC;QAEVP,uBAAAA,OAAAA,KAAAA;QAEAX,uBAAAA,WAAAA,KAAAA;QAKA,uBAAQd,YAAR,KAAA;QAEA,uBAAQY,SAAR,KAAA;QAEA,uBAAQQ,kBAAwB,EAAE;QAElC,uBAAQP,YAAWnB,IAAIuC,OAAO;YAC5BC,OAAO;gBACLC,eAAe;oBACb,CAACC;wBACCA,QAAQC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAClC,OAAOmC;wBAC5C,IAAIF,QAAQG,eAAeC,OAAOJ,QAAQG,IAAIE,SAAS,IAAI,CAAC3B,QAAQC,YAAY,IAAI,CAAChB,SAAS;4BAC5FqC,QAAQC,OAAO,CAAC,SAAS,GAAG,CAAC,QAAQ,EAAEK,mBAAmB,IAAI,CAAC3C,SAAS,CAAC,CAAC;wBAC5E;oBACF;iBACD;YACH;QACF;QAGE,IAAI,CAACe,UAAU;YACbW,KAAKkB,QAAQZ,GAAG,CAAC,wBAAwB,IAAK,CAAA,IAAI,CAACA,IAAIa,iBAAiB,eAAe,SAAQ;YAC/F7B,UAAU4B,QAAQZ,GAAG,CAAC,6BAA6B,IAAK,CAAA,IAAI,CAACA,IAAIa,iBAAiB,mBAAmB,aAAY;QACnH;IACF;AAsEF;AAEA;;CAEC,GACD,MAAMZ;IACJ,IAAIzB,QAAgB;QAClB,OAAOoC,QAAQZ,GAAG,CAAC,UAAU,IAAI;IACnC;IAEA,IAAIa,iBAA0B;QAC5B,OAAO,IAAI,CAACrC,MAAMsC,WAAW;IAC/B;IAEA,IAAIC,kBAA2B;QAC7B,OAAO,IAAI,CAACvC,MAAMsC,WAAW;IAC/B;IAEA,IAAIE,WAAoB;QACtB,OAAO,IAAI,CAACxC,MAAMsC,WAAW;IAC/B;IAEA,IAAIG,wBAAiC;QACnC,OAAO,IAAI,CAACF,mBAAmB,IAAI,CAACC;IACtC;AACF;AAeA,OAAO,MAAME,UAAU,IAAInD,UAAU"}
|
package/lib/utils/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/errors.ts"],"sourcesContent":["import cleanStack from \"clean-stack\";\nimport { HTTPError } from \"got\";\nimport type { GraphQLError } from \"graphql\";\nimport _ 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.js\";\nimport type { Payload } from \"./client.js\";\nimport { context } from \"./context.js\";\nimport os from \"os\";\nimport * as Sentry from \"@sentry/node\";\nimport { randomUUID } from \"crypto\";\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 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.bind(_));\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\"] = {\n method: error.options.method,\n url: error.options.url instanceof URL ? error.options.url.toJSON() : error.options.url,\n };\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 #message: string;\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\", \"\");\n\n // oclif overwrites the message property, so we have to use different one...\n // https://github.com/oclif/core/blob/413592abca47ebedb2c006634a326bab325c26bd/src/parser/parse.ts#L317\n this.#message = `Invalid value provided for the ${name} flag`;\n }\n\n protected override header(): string {\n return `${this.code}: ${this.#message}`;\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.state.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"],"names":["cleanStack","HTTPError","_","serializeError","baseSerializeError","dedent","inspect","context","os","Sentry","randomUUID","BaseError","Error","capture","isBug","IsBug","NO","user","getUser","catch","noop","bind","getCurrentHub","captureException","event_id","sentryEventId","captureContext","id","String","email","username","name","undefined","tags","applicationId","app","arch","config","code","environment","env","value","platform","shell","version","contexts","cause","command","bin","process","argv","slice","join","device","hostname","family","type","runtime","release","flush","render","rendered","header","body","footer","message","YES","constructor","testLike","stack","captureStackTrace","error","serialized","isArray","AggregateError","method","options","url","URL","toJSON","response","MAYBE","UnexpectedError","ClientError","isGraphQLErrors","length","errors","uniqBy","output","i","isCloseEvent","isErrorEvent","isError","payload","reason","wasClean","YarnNotFoundError","FlagError","description","flag","char","InvalidSyncFileError","sync","dir","InvalidSyncAppFlagError","flags","state","e","isNil","isString","isNumber","isBoolean","every","locations","path"],"mappings":"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"}
|
package/lib/utils/flags.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/flags.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport levenshtein from \"fast-levenshtein\";\nimport _ from \"lodash\";\nimport { dedent } from \"ts-dedent\";\nimport { context } from \"./context.js\";\nimport { FlagError } from \"./errors.js\";\n\nexport const app = Flags.custom({\n char: \"a\",\n name: \"app\",\n summary: \"The Gadget application this command applies to.\",\n helpValue: \"<name>\",\n parse: async (value: string) => {\n const parsed = /^(https:\\/\\/)?(?<name>[\\w-]+)/.exec(value)?.groups?.[\"name\"];\n if (!parsed)\n throw new FlagError(\n { char: \"a\", name: \"app\" },\n dedent`\n The -a, --app flag must be the application's slug or URL\n\n Examples:\n\n --app my-app\n --app my-app.gadget.app\n --app https://my-app.gadget.app\n --app https://my-app.gadget.app/edit\n `\n );\n\n const slug = parsed.endsWith(\"--development\") ? parsed.slice(0, -\"--development\".length) : parsed;\n\n const availableApps = await context.getAvailableApps();\n const foundApp = availableApps.find((a) => a.slug == slug);\n if (foundApp) {\n return foundApp.slug;\n }\n\n throw new FlagError(\n { char: \"a\", name: \"app\" },\n availableApps.length > 0\n ? dedent`\n Unknown application:\n\n ${value}\n\n Did you mean one of these?\n\n ${_.sortBy(availableApps, (app) => levenshtein.get(app.slug, slug))\n .slice(0, 10)\n .map((app) => `* ${app.slug}`)\n .join(\"\\n\")}\n `\n : dedent`\n Unknown application:\n\n ${value}\n\n It doesn't look like you have any applications.\n\n Visit https://gadget.new to create one!\n `\n );\n },\n});\n"],"names":["Flags","levenshtein","_","dedent","context","FlagError","app","custom","char","name","summary","helpValue","parse","value","parsed","exec","groups","slug","endsWith","slice","length","availableApps","getAvailableApps","foundApp","find","a","sortBy","get","map","join"],"mappings":"AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,OAAOC,iBAAiB,mBAAmB;AAC3C,OAAOC,OAAO,SAAS;AACvB,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,OAAO,QAAQ,eAAe;AACvC,SAASC,SAAS,QAAQ,cAAc;AAExC,OAAO,MAAMC,MAAMN,MAAMO,OAAO;IAC9BC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,OAAO,OAAOC;QACZ,MAAMC,SAAS,2CAAgCC,KAAKF,QAAQG,QAAQ,CAAC,OAAO;QAC5E,IAAI,CAACF,QACH,MAAM,IAAIT,UACR;YAAEG,MAAM;YAAKC,MAAM;QAAM,GACzBN,MAAM,CAAC;;;;;;;;;QASP,CAAC;QAGL,MAAMc,OAAOH,OAAOI,SAAS,mBAAmBJ,OAAOK,MAAM,GAAG,CAAC,gBAAgBC,UAAUN;QAE3F,MAAMO,gBAAgB,MAAMjB,QAAQkB;QACpC,MAAMC,WAAWF,cAAcG,KAAK,CAACC,IAAMA,EAAER,QAAQA;QACrD,IAAIM,UAAU;YACZ,OAAOA,SAASN;QAClB;QAEA,MAAM,IAAIZ,UACR;YAAEG,MAAM;YAAKC,MAAM;QAAM,GACzBY,cAAcD,SAAS,IACnBjB,MAAM,CAAC;;;gBAGD,EAAEU,MAAM;;;;gBAIR,EAAEX,EAAEwB,OAAOL,eAAe,CAACf,MAAQL,YAAY0B,IAAIrB,IAAIW,MAAMA,OAC1DE,MAAM,GAAG,IACTS,IAAI,CAACtB,MAAQ,CAAC,EAAE,EAAEA,IAAIW,KAAK,CAAC,EAC5BY,KAAK,MAAM;YAClB,CAAC,GACH1B,MAAM,CAAC;;;gBAGD,EAAEU,MAAM;;;;;YAKZ,CAAC;IAEX;AACF,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/fs-utils.ts"],"sourcesContent":["import Debug from \"debug\";\nimport fs from \"fs-extra\";\nimport type { Ignore } from \"ignore\";\nimport ignore from \"ignore\";\nimport path from \"path\";\n\nconst debug = Debug(\"ggt:fs-utils\");\n\nexport class FSIgnorer {\n readonly filepath;\n\n private _ignorer!: Ignore;\n\n constructor(private readonly _rootDir: string, private readonly _alwaysIgnore: string[]) {\n this.filepath = path.join(this._rootDir, \".ignore\");\n this.reload();\n }\n\n ignores(filepath: string): boolean {\n const relative = path.isAbsolute(filepath) ? path.relative(this._rootDir, filepath) : filepath;\n if (relative == \"\") return false;\n return this._ignorer.ignores(relative);\n }\n\n reload(): void {\n this._ignorer = ignore.default();\n this._ignorer.add(this._alwaysIgnore);\n\n try {\n this._ignorer.add(fs.readFileSync(this.filepath, \"utf-8\"));\n debug(\"reloaded ignore rules from %s\", this.filepath);\n } catch (error) {\n ignoreEnoent(error);\n }\n }\n}\n\nexport interface WalkDirOptions {\n ignorer?: FSIgnorer;\n}\n\nexport async function* walkDir(dir: string, options: WalkDirOptions = {}): AsyncGenerator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (await isEmptyDir(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for await (const entry of await fs.opendir(dir)) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function* walkDirSync(dir: string, options: WalkDirOptions = {}): Generator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (isEmptyDirSync(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDirSync(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function isEmptyDirSync(dir: string, opts = { ignoreEnoent: true }): boolean {\n try {\n const files = fs.readdirSync(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport async function isEmptyDir(dir: string, opts = { ignoreEnoent: true }): Promise<boolean> {\n try {\n const files = await fs.readdir(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport function ignoreEnoent(error: any): void {\n if (error.code === \"ENOENT\") {\n debug(\"ignoring ENOENT error %s\", error.path);\n return;\n }\n throw error;\n}\n"],"names":["Debug","fs","ignore","path","debug","FSIgnorer","ignores","filepath","relative","isAbsolute","_rootDir","_ignorer","reload","default","add","_alwaysIgnore","readFileSync","error","ignoreEnoent","constructor","join","walkDir","dir","options","ignorer","isEmptyDir","entry","opendir","name","isDirectory","isFile","walkDirSync","isEmptyDirSync","readdirSync","withFileTypes","opts","files","length","readdir","code"],"mappings":"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"}
|
package/lib/utils/help.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/help.ts"],"sourcesContent":["import type { Command } from \"@oclif/core\";\nimport { CommandHelp as OclifCommandHelp, Help as OclifHelp } from \"@oclif/core\";\nimport _ 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((e) => _.isString(e))) {\n return examples.join(\"\\n\\n\");\n }\n return super.examples(examples);\n }\n}\n"],"names":["CommandHelp","OclifCommandHelp","Help","OclifHelp","_","CommandHelpClass","description","command","examples","isString","Array","isArray","every","e","join"],"mappings":";AACA,SAASA,eAAeC,gBAAgB,EAAEC,QAAQC,SAAS,QAAQ,cAAc;AACjF,OAAOC,OAAO,SAAS;AAER,MAAMF,aAAaC;;;QAChC,uBAASE,oBAAmBL;;AAC9B;AAFA,SAAqBE,kBAEpB;AAED,MAAMF,oBAAoBC;IACxB;;;;;GAKC,GACD,AAAmBK,cAAkC;QACnD,IAAI,IAAI,CAACC,QAAQD,aAAa;YAC5B,OAAO,IAAI,CAACC,QAAQD;QACtB;QACA,OAAO,KAAK,CAACA;IACf;IAEA;;GAEC,GACD,AAAmBE,SAASA,QAA2D,EAAsB;QAC3G,IAAIJ,EAAEK,SAASD,WAAW;YACxB,OAAOA;QACT;QACA,IAAIE,MAAMC,QAAQH,aAAaA,SAASI,MAAM,CAACC,IAAMT,EAAEK,SAASI,KAAK;YACnE,OAAOL,SAASM,KAAK;QACvB;QACA,OAAO,KAAK,CAACN,SAASA;IACxB;AACF"}
|
package/lib/utils/promise.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/promise.ts"],"sourcesContent":["/**\n * Long lived references to Promises stress the garbage collector in JS. Instead of caching resolved Promises, we cache\n * these little data objects instead which reference the resolution or rejection of the Promise, allowing the Promise\n * object to be free'd.\n */\nexport class PromiseWrapper<T> {\n resolution?: T;\n rejection?: any;\n pendingPromise?: Promise<T>;\n\n constructor(promise: Promise<T>) {\n this.pendingPromise = promise;\n\n promise\n .then((res) => {\n this.resolution = res;\n return res;\n })\n .catch((err) => {\n this.rejection = err;\n })\n .finally(() => {\n delete this.pendingPromise;\n });\n }\n\n async unwrap(): Promise<T> {\n if (this.resolution) {\n return this.resolution;\n } else if (this.rejection) {\n throw this.rejection;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return await this.pendingPromise!;\n }\n }\n}\n\n/**\n * A promise that can be resolved or rejected from outside its callback.\n *\n * This is typically used when you want to await a promise that is resolved or rejected from outside the current scope,\n * such as from an event handler.\n *\n * @example\n * const signal = new PromiseSignal();\n * process.on(\"SIGINT\", () => {\n * signal.resolve();\n * });\n * await signal;\n */\nexport class PromiseSignal<T = void> implements Promise<T> {\n readonly [Symbol.toStringTag]!: string;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n reject!: (reason?: any) => void;\n\n private _promise: PromiseWrapper<T>;\n\n constructor() {\n this._promise = new PromiseWrapper<T>(\n new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n })\n );\n\n this[Symbol.toStringTag] = String(this._promise.pendingPromise);\n }\n\n then<R = T, E = never>(onfulfilled?: (value: T) => R | PromiseLike<R>, onrejected?: (reason: any) => E | PromiseLike<E>): Promise<R | E> {\n return this._promise.unwrap().then(onfulfilled, onrejected);\n }\n\n catch<E = never>(onrejected?: (reason: any) => E | PromiseLike<E>): Promise<T | E> {\n return this._promise.unwrap().catch(onrejected);\n }\n\n finally(onfinally?: () => void): Promise<T> {\n return this._promise.unwrap().finally(onfinally);\n }\n}\n"],"names":["PromiseWrapper","unwrap","resolution","rejection","pendingPromise","constructor","promise","then","res","catch","err","finally","Symbol","toStringTag","PromiseSignal","onfulfilled","onrejected","_promise","onfinally","resolve","reject","Promise","String"],"mappings":"AAAA;;;;CAIC;AACD,OAAO,MAAMA;IAqBX,MAAMC,SAAqB;QACzB,IAAI,IAAI,CAACC,YAAY;YACnB,OAAO,IAAI,CAACA;QACd,OAAO,IAAI,IAAI,CAACC,WAAW;YACzB,MAAM,IAAI,CAACA;QACb,OAAO;YACL,oEAAoE;YACpE,OAAO,MAAM,IAAI,CAACC;QACpB;IACF;IAzBAC,YAAYC,OAAmB,CAAE;QAJjCJ,uBAAAA,cAAAA,KAAAA;QACAC,uBAAAA,aAAAA,KAAAA;QACAC,uBAAAA,kBAAAA,KAAAA;QAGE,IAAI,CAACA,iBAAiBE;QAEtBA,QACGC,KAAK,CAACC;YACL,IAAI,CAACN,aAAaM;YAClB,OAAOA;QACT,GACCC,MAAM,CAACC;YACN,IAAI,CAACP,YAAYO;QACnB,GACCC,QAAQ;YACP,OAAO,IAAI,CAACP;QACd;IACJ;AAYF;IAgBYQ,sBAAAA,OAAOC;AAdnB;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC;IAmBXP,KAAuBQ,WAA8C,EAAEC,UAAgD,EAAkB;QACvI,OAAO,IAAI,CAACC,SAAShB,SAASM,KAAKQ,aAAaC;IAClD;IAEAP,MAAiBO,UAAgD,EAAkB;QACjF,OAAO,IAAI,CAACC,SAAShB,SAASQ,MAAMO;IACtC;IAEAL,QAAQO,SAAsB,EAAc;QAC1C,OAAO,IAAI,CAACD,SAAShB,SAASU,QAAQO;IACxC;IArBAb,aAAc;QAPd,uBAAUO,qBAAV,KAAA;QAEAO,uBAAAA,WAAAA,KAAAA;QACAC,uBAAAA,UAAAA,KAAAA;QAEA,uBAAQH,YAAR,KAAA;QAGE,IAAI,CAACA,WAAW,IAAIjB,eAClB,IAAIqB,QAAQ,CAACF,SAASC;YACpB,IAAI,CAACD,UAAUA;YACf,IAAI,CAACC,SAASA;QAChB;QAGF,IAAI,CAACR,OAAOC,YAAY,GAAGS,OAAO,IAAI,CAACL,SAASb;IAClD;AAaF"}
|
package/lib/utils/sleep.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/sleep.ts"],"sourcesContent":["export function sleep(ms = 0): Promise<void> {\n return new Promise((resolve) => (ms == 0 ? setImmediate(resolve) : setTimeout(resolve, ms)));\n}\n\nexport async function sleepUntil(fn: () => boolean, { interval = 0, timeout = process.env[\"CI\"] ? 5000 : 500 } = {}): Promise<void> {\n const start = isFinite(timeout) && Date.now();\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (fn()) return;\n await sleep(interval);\n\n if (start && Date.now() - start > timeout) {\n const error = new Error(`Timed out after ${timeout} milliseconds`);\n Error.captureStackTrace(error, sleepUntil);\n throw error;\n }\n }\n}\n"],"names":["sleep","ms","Promise","resolve","setImmediate","setTimeout","sleepUntil","fn","interval","timeout","process","env","start","isFinite","Date","now","error","Error","captureStackTrace"],"mappings":"AAAA,OAAO,SAASA,MAAMC,KAAK,CAAC;IAC1B,OAAO,IAAIC,QAAQ,CAACC,UAAaF,MAAM,IAAIG,aAAaD,WAAWE,WAAWF,SAASF;AACzF;AAEA,OAAO,eAAeK,WAAWC,EAAiB,EAAE,EAAEC,UAAW,EAAC,EAAEC,SAAUC,QAAQC,GAAG,CAAC,KAAK,GAAG,OAAO,IAAG,EAAE,GAAG,CAAC,CAAC;IACjH,MAAMC,QAAQC,SAASJ,YAAYK,KAAKC;IAExC,iDAAiD;IACjD,MAAO,KAAM;QACX,IAAIR,MAAM;QACV,MAAMP,MAAMQ;QAEZ,IAAII,SAASE,KAAKC,QAAQH,QAAQH,SAAS;YACzC,MAAMO,QAAQ,IAAIC,MAAM,CAAC,gBAAgB,EAAER,QAAQ,aAAa,CAAC;YACjEQ,MAAMC,kBAAkBF,OAAOV;YAC/B,MAAMU;QACR;IACF;AACF"}
|
|
File without changes
|