@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.
- package/README.md +5 -5
- package/lib/commands/help.d.ts +2 -4
- package/lib/commands/help.js +6 -1
- package/lib/commands/help.js.map +1 -1
- package/lib/commands/login.d.ts +1 -1
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/logout.d.ts +1 -1
- package/lib/commands/logout.js.map +1 -1
- package/lib/commands/sync.d.ts +7 -10
- package/lib/commands/sync.js +16 -25
- package/lib/commands/sync.js.map +1 -1
- package/lib/commands/whoami.d.ts +1 -1
- package/lib/commands/whoami.js.map +1 -1
- package/lib/utils/base-command.d.ts +14 -4
- package/lib/utils/base-command.js +33 -10
- package/lib/utils/base-command.js.map +1 -1
- package/lib/utils/client.js +1 -2
- package/lib/utils/client.js.map +1 -1
- package/lib/utils/context.d.ts +6 -2
- package/lib/utils/context.js +15 -5
- package/lib/utils/context.js.map +1 -1
- package/lib/utils/errors.d.ts +1 -1
- package/lib/utils/errors.js +3 -3
- package/lib/utils/errors.js.map +1 -1
- package/lib/utils/flags.d.ts +1 -1
- package/lib/utils/help.d.ts +2 -2
- package/lib/utils/help.js.map +1 -1
- package/npm-shrinkwrap.json +3407 -2682
- package/oclif.manifest.json +135 -1
- package/package.json +34 -34
package/README.md
CHANGED
|
@@ -128,7 +128,7 @@ EXAMPLES
|
|
|
128
128
|
Goodbye!
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
_See code: [src/commands/sync.ts](https://github.com/gadget-inc/ggt/blob/v0.1.
|
|
131
|
+
_See code: [src/commands/sync.ts](https://github.com/gadget-inc/ggt/blob/v0.1.12/src/commands/sync.ts)_
|
|
132
132
|
|
|
133
133
|
### `ggt help [COMMAND]`
|
|
134
134
|
|
|
@@ -142,7 +142,7 @@ ARGUMENTS
|
|
|
142
142
|
COMMAND The command to show help for.
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
_See code: [src/commands/help.ts](https://github.com/gadget-inc/ggt/blob/v0.1.
|
|
145
|
+
_See code: [src/commands/help.ts](https://github.com/gadget-inc/ggt/blob/v0.1.12/src/commands/help.ts)_
|
|
146
146
|
|
|
147
147
|
### `ggt login`
|
|
148
148
|
|
|
@@ -161,7 +161,7 @@ EXAMPLES
|
|
|
161
161
|
Hello, Jane Doe (jane@example.com)
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
-
_See code: [src/commands/login.ts](https://github.com/gadget-inc/ggt/blob/v0.1.
|
|
164
|
+
_See code: [src/commands/login.ts](https://github.com/gadget-inc/ggt/blob/v0.1.12/src/commands/login.ts)_
|
|
165
165
|
|
|
166
166
|
### `ggt logout`
|
|
167
167
|
|
|
@@ -176,7 +176,7 @@ EXAMPLES
|
|
|
176
176
|
Goodbye
|
|
177
177
|
```
|
|
178
178
|
|
|
179
|
-
_See code: [src/commands/logout.ts](https://github.com/gadget-inc/ggt/blob/v0.1.
|
|
179
|
+
_See code: [src/commands/logout.ts](https://github.com/gadget-inc/ggt/blob/v0.1.12/src/commands/logout.ts)_
|
|
180
180
|
|
|
181
181
|
### `ggt whoami`
|
|
182
182
|
|
|
@@ -191,7 +191,7 @@ EXAMPLES
|
|
|
191
191
|
You are logged in as Jane Doe (jane@example.com)
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
_See code: [src/commands/whoami.ts](https://github.com/gadget-inc/ggt/blob/v0.1.
|
|
194
|
+
_See code: [src/commands/whoami.ts](https://github.com/gadget-inc/ggt/blob/v0.1.12/src/commands/whoami.ts)_
|
|
195
195
|
|
|
196
196
|
<!-- commandsstop -->
|
|
197
197
|
|
package/lib/commands/help.d.ts
CHANGED
|
@@ -8,9 +8,7 @@ export default class HelpCommand extends Command {
|
|
|
8
8
|
static strict: boolean;
|
|
9
9
|
static summary: string;
|
|
10
10
|
static args: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
description: string;
|
|
14
|
-
}[];
|
|
11
|
+
command: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
12
|
+
};
|
|
15
13
|
run(): Promise<void>;
|
|
16
14
|
}
|
package/lib/commands/help.js
CHANGED
|
@@ -32,6 +32,11 @@ Object.defineProperty(HelpCommand, "args", {
|
|
|
32
32
|
enumerable: true,
|
|
33
33
|
configurable: true,
|
|
34
34
|
writable: true,
|
|
35
|
-
value:
|
|
35
|
+
value: {
|
|
36
|
+
command: core_1.Args.string({
|
|
37
|
+
required: false,
|
|
38
|
+
description: "The command to show help for.",
|
|
39
|
+
}),
|
|
40
|
+
}
|
|
36
41
|
});
|
|
37
42
|
//# sourceMappingURL=help.js.map
|
package/lib/commands/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":";;;AAAA,sCAA4C;AAC5C,iEAAiC;AAEjC;;;;GAIG;AACH,MAAqB,WAAY,SAAQ,cAAO;IAY9C,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAgB,CAAC,CAAC;IACxC,CAAC;;AAhBH,8BAiBC;AAhBQ;;;;WAAkB,KAAK;GAAC;AAExB;;;;WAAmB,uBAAuB;GAAC;AAE3C;;;;WAAgB;QACrB,OAAO,EAAE,WAAI,CAAC,MAAM,CAAC;YACnB,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,+BAA+B;SAC7C,CAAC;KACH;GAAC","sourcesContent":["import { Args, Command } from \"@oclif/core\";\nimport Help from \"../utils/help\";\n\n/**\n * Copied from @oclif/plugin-help. Uses our own {@link Help} template class instead of the one from @oclif/core.\n *\n * @see https://github.com/oclif/plugin-help/blob/67b580570257b45e92d3a04d50bf2a432c59afe3/src/commands/help.ts\n */\nexport default class HelpCommand extends Command {\n static override strict = false;\n\n static override summary = \"Display help for ggt.\";\n\n static override args = {\n command: Args.string({\n required: false,\n description: \"The command to show help for.\",\n }),\n };\n\n async run(): Promise<void> {\n const { argv } = await this.parse();\n const help = new Help(this.config, { all: true });\n await help.showHelp(argv as string[]);\n }\n}\n"]}
|
package/lib/commands/login.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;AAAA,kEAA+B;AAC/B,wDAAoD;AACpD,0DAA0B;AAE1B,MAAqB,KAAM,SAAQ,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;AAAA,kEAA+B;AAC/B,wDAAoD;AACpD,0DAA0B;AAE1B,MAAqB,KAAM,SAAQ,0BAAyB;IAgB1D,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;;AAlBH,wBAmBC;AAlBQ;;;;WAAmB,yBAAyB;GAAC;AAE7C;;;;WAAiB,OAAO;GAAC;AAEzB;;;;WAAoB;QACzB,IAAA,mBAAM,EAAC,IAAA,eAAK,EAAA;;;;;;;KAOX,CAAC;KACH;GAAC","sourcesContent":["import dedent from \"ts-dedent\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport chalk from \"chalk\";\n\nexport default class Login extends BaseCommand<typeof Login> {\n static override summary = \"Log in to your account.\";\n\n static override usage = \"login\";\n\n static override examples = [\n dedent(chalk`\n {gray $ ggt login}\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 Hello, Jane Doe {gray (jane@example.com)}\n `),\n ];\n\n async run(): Promise<void> {\n await this.login();\n }\n}\n"]}
|
package/lib/commands/logout.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;;AAAA,0DAA0B;AAC1B,kEAA+B;AAC/B,wDAAoD;AACpD,8CAA2C;AAE3C,MAAqB,MAAO,SAAQ,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;;AAAA,0DAA0B;AAC1B,kEAA+B;AAC/B,wDAAoD;AACpD,8CAA2C;AAE3C,MAAqB,MAAO,SAAQ,0BAA0B;IAY5D,4DAA4D;IAC5D,KAAK,CAAC,GAAG;QACP,IAAI,iBAAO,CAAC,OAAO,EAAE;YACnB,iBAAO,CAAC,OAAO,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SACrB;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;SACnC;IACH,CAAC;;AApBH,yBAqBC;AApBQ;;;;WAAmB,0BAA0B;GAAC;AAE9C;;;;WAAiB,QAAQ;GAAC;AAE1B;;;;WAAoB;QACzB,IAAA,mBAAM,EAAC,IAAA,eAAK,EAAA;;;KAGX,CAAC;KACH;GAAC","sourcesContent":["import chalk from \"chalk\";\nimport dedent from \"ts-dedent\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport { context } from \"../utils/context\";\n\nexport default class Logout extends BaseCommand<typeof Logout> {\n static override summary = \"Log out of your account.\";\n\n static override usage = \"logout\";\n\n static override examples = [\n dedent(chalk`\n {gray $ ggt logout}\n Goodbye\n `),\n ];\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async run(): Promise<void> {\n if (context.session) {\n context.session = undefined;\n this.log(\"Goodbye\");\n } else {\n this.log(\"You are not logged in\");\n }\n }\n}\n"]}
|
package/lib/commands/sync.d.ts
CHANGED
|
@@ -6,29 +6,26 @@ import type { Query } from "../utils/client";
|
|
|
6
6
|
import { Client } from "../utils/client";
|
|
7
7
|
import { Ignorer } from "../utils/fs-utils";
|
|
8
8
|
import type { PublishFileSyncEventsMutation, PublishFileSyncEventsMutationVariables, RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables, RemoteFileSyncEventsSubscription, RemoteFileSyncEventsSubscriptionVariables } from "../__generated__/graphql";
|
|
9
|
-
export default class Sync extends BaseCommand {
|
|
9
|
+
export default class Sync extends BaseCommand<typeof Sync> {
|
|
10
10
|
static priority: number;
|
|
11
11
|
static summary: string;
|
|
12
12
|
static usage: string;
|
|
13
13
|
static description: string;
|
|
14
14
|
static args: {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
default: string;
|
|
18
|
-
}[];
|
|
15
|
+
directory: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
16
|
+
};
|
|
19
17
|
static flags: {
|
|
20
|
-
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
|
|
18
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
21
19
|
force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
22
|
-
"file-push-delay": import("@oclif/core/lib/interfaces").OptionFlag<number>;
|
|
23
|
-
"file-stability-threshold": import("@oclif/core/lib/interfaces").OptionFlag<number>;
|
|
24
|
-
"file-poll-interval": import("@oclif/core/lib/interfaces").OptionFlag<number>;
|
|
20
|
+
"file-push-delay": import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
21
|
+
"file-stability-threshold": import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
22
|
+
"file-poll-interval": import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
25
23
|
};
|
|
26
24
|
static examples: string[];
|
|
27
25
|
requireUser: boolean;
|
|
28
26
|
status: SyncStatus;
|
|
29
27
|
dir: string;
|
|
30
28
|
recentWrites: Set<unknown>;
|
|
31
|
-
filePushDelay: number;
|
|
32
29
|
queue: PQueue<import("p-queue/dist/priority-queue").default, import("p-queue").DefaultAddOptions>;
|
|
33
30
|
client: Client;
|
|
34
31
|
ignorer: Ignorer;
|
package/lib/commands/sync.js
CHANGED
|
@@ -55,12 +55,6 @@ class Sync extends base_command_1.BaseCommand {
|
|
|
55
55
|
writable: true,
|
|
56
56
|
value: new Set()
|
|
57
57
|
});
|
|
58
|
-
Object.defineProperty(this, "filePushDelay", {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
configurable: true,
|
|
61
|
-
writable: true,
|
|
62
|
-
value: void 0
|
|
63
|
-
});
|
|
64
58
|
Object.defineProperty(this, "queue", {
|
|
65
59
|
enumerable: true,
|
|
66
60
|
configurable: true,
|
|
@@ -136,15 +130,14 @@ class Sync extends base_command_1.BaseCommand {
|
|
|
136
130
|
}
|
|
137
131
|
async init() {
|
|
138
132
|
await super.init();
|
|
139
|
-
|
|
140
|
-
(0, assert_1.default)((0, lodash_2.isString)(args["directory"]));
|
|
133
|
+
(0, assert_1.default)((0, lodash_2.isString)(this.args["directory"]));
|
|
141
134
|
this.dir =
|
|
142
|
-
this.config.windows && args["directory"].startsWith("~/")
|
|
143
|
-
? path_1.default.join(this.config.home, args["directory"].slice(2))
|
|
144
|
-
: path_1.default.resolve(args["directory"]);
|
|
135
|
+
this.config.windows && this.args["directory"].startsWith("~/")
|
|
136
|
+
? path_1.default.join(this.config.home, this.args["directory"].slice(2))
|
|
137
|
+
: path_1.default.resolve(this.args["directory"]);
|
|
145
138
|
const getApp = async () => {
|
|
146
|
-
if (flags.app)
|
|
147
|
-
return flags.app;
|
|
139
|
+
if (this.flags.app)
|
|
140
|
+
return this.flags.app;
|
|
148
141
|
if (this.metadata.app)
|
|
149
142
|
return this.metadata.app;
|
|
150
143
|
const selected = await (0, inquirer_1.prompt)({
|
|
@@ -166,18 +159,17 @@ class Sync extends base_command_1.BaseCommand {
|
|
|
166
159
|
}
|
|
167
160
|
}
|
|
168
161
|
catch (error) {
|
|
169
|
-
if (!flags.force) {
|
|
170
|
-
throw new errors_1.InvalidSyncFileError(error, this, flags.app);
|
|
162
|
+
if (!this.flags.force) {
|
|
163
|
+
throw new errors_1.InvalidSyncFileError(error, this, this.flags.app);
|
|
171
164
|
}
|
|
172
165
|
this.metadata.app = await getApp();
|
|
173
166
|
}
|
|
174
167
|
}
|
|
175
|
-
if (flags.app && flags.app !== this.metadata.app && !flags.force) {
|
|
176
|
-
throw new errors_1.InvalidSyncAppFlagError(this
|
|
168
|
+
if (this.flags.app && this.flags.app !== this.metadata.app && !this.flags.force) {
|
|
169
|
+
throw new errors_1.InvalidSyncAppFlagError(this);
|
|
177
170
|
}
|
|
178
171
|
await context_1.context.setApp(this.metadata.app);
|
|
179
172
|
this.client = new client_1.Client();
|
|
180
|
-
this.filePushDelay = flags["file-push-delay"];
|
|
181
173
|
// local files/folders that should never be published
|
|
182
174
|
this.ignorer = new fs_utils_1.Ignorer(this.dir, ["node_modules", ".gadget", ".git"]);
|
|
183
175
|
this.watcher = new chokidar_1.FSWatcher({
|
|
@@ -187,7 +179,7 @@ class Sync extends base_command_1.BaseCommand {
|
|
|
187
179
|
// make sure stats are always present on add/change events
|
|
188
180
|
alwaysStat: true,
|
|
189
181
|
// wait for the entire file to be written before emitting add/change events
|
|
190
|
-
awaitWriteFinish: { pollInterval: flags["file-poll-interval"], stabilityThreshold: flags["file-stability-threshold"] },
|
|
182
|
+
awaitWriteFinish: { pollInterval: this.flags["file-poll-interval"], stabilityThreshold: this.flags["file-stability-threshold"] },
|
|
191
183
|
});
|
|
192
184
|
this.debug("starting");
|
|
193
185
|
if (!which_1.default.sync("yarn", { nothrow: true })) {
|
|
@@ -391,7 +383,7 @@ class Sync extends base_command_1.BaseCommand {
|
|
|
391
383
|
}
|
|
392
384
|
})
|
|
393
385
|
.catch(this.stop);
|
|
394
|
-
}, this.
|
|
386
|
+
}, this.flags["file-push-delay"]);
|
|
395
387
|
this.watcher
|
|
396
388
|
.add(`${this.dir}/**/*`)
|
|
397
389
|
.on("error", (error) => void this.stop(error))
|
|
@@ -519,13 +511,12 @@ Object.defineProperty(Sync, "args", {
|
|
|
519
511
|
enumerable: true,
|
|
520
512
|
configurable: true,
|
|
521
513
|
writable: true,
|
|
522
|
-
value:
|
|
523
|
-
{
|
|
524
|
-
name: "directory",
|
|
514
|
+
value: {
|
|
515
|
+
directory: core_1.Args.string({
|
|
525
516
|
description: "The directory to sync files to. If the directory doesn't exist, it will be created.",
|
|
526
517
|
default: ".",
|
|
527
|
-
},
|
|
528
|
-
|
|
518
|
+
}),
|
|
519
|
+
}
|
|
529
520
|
});
|
|
530
521
|
Object.defineProperty(Sync, "flags", {
|
|
531
522
|
enumerable: true,
|
package/lib/commands/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { Flags } from \"@oclif/core\";\nimport chalk from \"chalk\";\nimport assert from \"assert\";\nimport { FSWatcher } from \"chokidar\";\nimport format from \"date-fns/format\";\nimport execa from \"execa\";\nimport type { Stats } from \"fs-extra\";\nimport fs from \"fs-extra\";\nimport { prompt } from \"inquirer\";\nimport type { DebouncedFunc } from \"lodash\";\nimport { sortBy } from \"lodash\";\nimport { isString } from \"lodash\";\nimport { debounce } from \"lodash\";\nimport normalizePath from \"normalize-path\";\nimport pMap from \"p-map\";\nimport PQueue from \"p-queue\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\nimport dedent from \"ts-dedent\";\nimport which from \"which\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport type { Query } from \"../utils/client\";\nimport { Client } from \"../utils/client\";\nimport { context } from \"../utils/context\";\nimport { InvalidSyncAppFlagError, InvalidSyncFileError, YarnNotFoundError } from \"../utils/errors\";\nimport { app } from \"../utils/flags\";\nimport { ignoreEnoent, Ignorer, isEmptyDir, walkDir } from \"../utils/fs-utils\";\nimport { sleepUntil } from \"../utils/sleep\";\nimport type {\n FileSyncChangedEventInput,\n FileSyncDeletedEventInput,\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables,\n RemoteFilesVersionQuery,\n RemoteFilesVersionQueryVariables,\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables,\n} from \"../__generated__/graphql\";\nimport { FileSyncEncoding } from \"../__generated__/graphql\";\n\nexport default class Sync extends BaseCommand {\n static override priority = 1;\n\n static override summary = \"Sync your Gadget application's source code to and from your local filesystem.\";\n\n static override usage = \"sync [DIRECTORY] [--app <name>]\";\n\n static override description = dedent(chalk`\n Sync provides the ability to sync your Gadget application's source code to and from your local\n filesystem. While {gray ggt sync} is running, local file changes are immediately reflected within\n Gadget, while files that are changed remotely are immediately saved to your local filesystem.\n\n Use cases for this include:\n - Developing locally with your own editor like VSCode {gray (https://code.visualstudio.com/)}\n - Storing your source code in a Git repository like GitHub {gray (https://github.com/)}\n\n Sync includes the concept of a {gray .ignore} file. This file may contain a list of files and\n directories that won't be received or sent to Gadget when syncing. The format of this file is\n identical to the one used by Git {gray (https://git-scm.com/docs/gitignore)}.\n\n The following files and directories are always ignored:\n - .gadget\n - .git\n - node_modules\n\n Note:\n - If you have separate development and production environments, {gray ggt sync} will only sync with your development environment\n - Gadget applications only support installing dependencies with Yarn 1 {gray (https://classic.yarnpkg.com/lang/en/)}\n - Since file changes are immediately reflected in Gadget, avoid the following while {gray ggt sync} is running:\n - Deleting all your files\n - Moving all your files to a different directory\n `);\n\n static override args = [\n {\n name: \"directory\",\n description: \"The directory to sync files to. If the directory doesn't exist, it will be created.\",\n default: \".\",\n },\n ];\n\n static override flags = {\n app: app({\n summary: \"The Gadget application to sync files to.\",\n }),\n force: Flags.boolean({\n summary: \"Whether to sync even if we can't determine the state of your local files relative to your remote ones.\",\n default: false,\n }),\n \"file-push-delay\": Flags.integer({\n summary: \"Delay in milliseconds before pushing files to your app.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n \"file-stability-threshold\": Flags.integer({\n name: \"file-stability-threshold\",\n summary: \"Time in milliseconds a file's size must remain the same.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 500,\n hidden: true,\n }),\n \"file-poll-interval\": Flags.integer({\n name: \"file-poll-interval\",\n description: \"Interval in milliseconds between polling a file's size.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n };\n\n static override examples = [\n dedent(chalk`\n {gray $ ggt sync --app my-app ~/gadget/my-app}\n\n App my-app\n Editor https://my-app.gadget.app/edit\n Playground https://my-app.gadget.app/api/graphql/playground\n Docs https://docs.gadget.dev/api/my-app\n\n {underline Endpoints}\n - https://my-app.gadget.app\n - https://my-app--development.gadget.app\n\n Watching for file changes... {gray Press Ctrl+C to stop}\n\n Received {gray 12:00:00 PM}\n {green ←} routes/GET.js {gray (changed)}\n {green ←} user/signUp/signIn.js {gray (changed)}\n {gray 2 files in total. 2 changed, 0 deleted.}\n\n Sent {gray 12:00:03 PM}\n {green →} routes/GET.ts {gray (changed)}\n {gray 1 file in total. 1 changed, 0 deleted.}\n\n ^C Stopping... {gray (press Ctrl+C again to force)}\n Goodbye!\n `),\n ];\n\n override requireUser = true;\n\n status = SyncStatus.STARTING;\n\n dir!: string;\n\n recentWrites = new Set();\n\n filePushDelay!: number;\n\n queue = new PQueue({ concurrency: 1 });\n\n client!: Client;\n\n ignorer!: Ignorer;\n\n watcher!: FSWatcher;\n\n metadata = {\n app: \"\",\n filesVersion: \"0\",\n mtime: 0,\n };\n\n publish!: DebouncedFunc<() => void>;\n\n stop!: (error?: unknown) => Promise<void>;\n\n relative(to: string): string {\n return path.relative(this.dir, to);\n }\n\n absolute(...pathSegments: string[]): string {\n return path.resolve(this.dir, ...pathSegments);\n }\n\n normalize(filepath: string): string {\n return normalizePath(path.isAbsolute(filepath) ? this.relative(filepath) : filepath);\n }\n\n logPaths(prefix: string, changed: string[], deleted: string[], { limit = 10 } = {}): void {\n const lines = sortBy(\n [\n ...changed.map((filepath) => chalk`{green ${prefix}} ${this.normalize(filepath)} {gray (changed)}`),\n ...deleted.map((filepath) => chalk`{red ${prefix}} ${this.normalize(filepath)} {gray (deleted)}`),\n ],\n (line) => line.slice(line.indexOf(\" \") + 1)\n );\n\n let logged = 0;\n for (const line of lines) {\n this.log(line);\n if (++logged == limit && !this.debugEnabled) break;\n }\n\n if (lines.length > logged) {\n this.log(chalk`{gray … ${lines.length - logged} more}`);\n }\n\n this.log(chalk`{gray ${pluralize(\"file\", lines.length, true)} in total. ${changed.length} changed, ${deleted.length} deleted.}`);\n this.log();\n }\n\n override async init(): Promise<void> {\n await super.init();\n const { args, flags } = await this.parse(Sync);\n\n assert(isString(args[\"directory\"]));\n\n this.dir =\n this.config.windows && args[\"directory\"].startsWith(\"~/\")\n ? path.join(this.config.home, args[\"directory\"].slice(2))\n : path.resolve(args[\"directory\"]);\n\n const getApp = async (): Promise<string> => {\n if (flags.app) return flags.app;\n if (this.metadata.app) return this.metadata.app;\n const selected = await prompt<{ app: string }>({\n type: \"list\",\n name: \"app\",\n message: \"Please select the app to sync to.\",\n choices: await context.getAvailableApps().then((apps) => apps.map((app) => app.slug)),\n });\n return selected.app;\n };\n\n if (await isEmptyDir(this.dir)) {\n this.metadata.app = await getApp();\n } else {\n try {\n this.metadata = await fs.readJson(this.absolute(\".gadget\", \"sync.json\"));\n if (!this.metadata.app) {\n this.metadata.app = await getApp();\n }\n } catch (error) {\n if (!flags.force) {\n throw new InvalidSyncFileError(error, this, flags.app);\n }\n this.metadata.app = await getApp();\n }\n }\n\n if (flags.app && flags.app !== this.metadata.app && !flags.force) {\n throw new InvalidSyncAppFlagError(this, flags.app);\n }\n\n await context.setApp(this.metadata.app);\n\n this.client = new Client();\n\n this.filePushDelay = flags[\"file-push-delay\"];\n\n // local files/folders that should never be published\n this.ignorer = new Ignorer(this.dir, [\"node_modules\", \".gadget\", \".git\"]);\n\n this.watcher = new FSWatcher({\n ignored: (filepath) => this.ignorer.ignores(filepath),\n // don't emit an event for every watched file on boot\n ignoreInitial: true,\n // make sure stats are always present on add/change events\n alwaysStat: true,\n // wait for the entire file to be written before emitting add/change events\n awaitWriteFinish: { pollInterval: flags[\"file-poll-interval\"], stabilityThreshold: flags[\"file-stability-threshold\"] },\n });\n\n this.debug(\"starting\");\n\n if (!which.sync(\"yarn\", { nothrow: true })) {\n throw new YarnNotFoundError();\n }\n\n await fs.ensureDir(this.dir);\n\n const { remoteFilesVersion } = await this.client.queryUnwrap({ query: REMOTE_FILES_VERSION_QUERY });\n const hasRemoteChanges = BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion);\n\n const getChangedFiles = async (): Promise<Map<string, Stats>> => {\n const files = new Map();\n for await (const filepath of walkDir(this.dir, { ignorer: this.ignorer })) {\n const stats = await fs.stat(filepath);\n if (stats.mtime.getTime() > this.metadata.mtime) {\n files.set(this.absolute(filepath), stats);\n }\n }\n return files;\n };\n\n const changedFiles = await getChangedFiles();\n const hasLocalChanges = changedFiles.size > 0;\n if (hasLocalChanges) {\n this.log(\"Local files have changed since you last synced\");\n this.logPaths(\"-\", Array.from(changedFiles.keys()), [], { limit: changedFiles.size });\n this.log();\n }\n\n this.debug(\"init %O\", { metadata: this.metadata, remoteFilesVersion, hasRemoteChanges, hasLocalChanges });\n\n let action: Action | undefined;\n if (hasLocalChanges) {\n ({ action } = await prompt({\n type: \"list\",\n name: \"action\",\n choices: [Action.CANCEL, Action.MERGE, Action.RESET],\n message: hasRemoteChanges ? \"Remote files have also changed. How would you like to proceed?\" : \"How would you like to proceed?\",\n }));\n }\n\n switch (action) {\n case Action.MERGE: {\n // get all the changed files again in case more changed\n const files = await getChangedFiles();\n\n // we purposefully don't set the returned remoteFilesVersion here because we haven't processed the in-between versions yet\n await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: {\n input: {\n expectedRemoteFilesVersion: remoteFilesVersion,\n changed: await pMap(files, async ([filepath, stats]) => {\n if (stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n return {\n path: this.normalize(filepath),\n mode: stats.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n };\n }),\n deleted: [],\n },\n },\n });\n break;\n }\n case Action.RESET: {\n await pMap(changedFiles, ([filepath]) => fs.remove(filepath));\n this.metadata.filesVersion = \"0\";\n break;\n }\n case Action.CANCEL: {\n process.exit(0);\n }\n }\n\n this.debug(\"started\");\n }\n\n async run(): Promise<void> {\n let error: unknown;\n\n this.stop = async (e?: unknown) => {\n if (this.status != SyncStatus.RUNNING) return;\n\n error = e;\n this.debug(\"stopping\");\n this.status = SyncStatus.STOPPING;\n\n try {\n unsubscribe();\n this.watcher.removeAllListeners();\n this.publish.flush();\n await this.queue.onIdle();\n } finally {\n await fs.outputJSON(this.absolute(\".gadget\", \"sync.json\"), this.metadata, { spaces: 2 });\n await Promise.allSettled([this.watcher.close(), this.client.dispose()]);\n\n this.debug(\"stopped\");\n this.status = SyncStatus.STOPPED;\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (this.status != SyncStatus.RUNNING) return;\n\n this.log(chalk` Stopping... {gray (press Ctrl+C again to force)}`);\n void this.stop();\n\n // When ggt is run via npx, and the user presses Ctrl+C, npx sends SIGINT twice in quick succession. In order to prevent the second\n // SIGINT from triggering the force exit listener, we wait a bit before registering it. This is a bit of a hack, but it works.\n setTimeout(() => {\n process.once(signal, () => {\n this.log(\" Exiting immediately. Note that files may not have finished syncing.\");\n process.exit(1);\n });\n }, 100).unref();\n });\n }\n\n const unsubscribe = this.client.subscribeUnwrap(\n {\n query: REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION,\n variables: () => ({ localFilesVersion: this.metadata.filesVersion }),\n },\n {\n error: (error) => void this.stop(error),\n next: ({ remoteFileSyncEvents: { remoteFilesVersion, changed, deleted } }) => {\n const remoteFiles = new Map(\n [...deleted, ...changed]\n .filter((event) => event.path.startsWith(\".gadget/\") || !this.ignorer.ignores(event.path))\n .map((e) => [e.path, e])\n );\n\n void this.queue\n .add(async () => {\n if (!remoteFiles.size) {\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n // we still need to update filesVersion, otherwise our expectedFilesVersion will be behind the next time we publish\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n }\n return;\n }\n\n this.log(chalk`Received {gray ${format(new Date(), \"pp\")}}`);\n this.logPaths(\n \"←\",\n changed.map((x) => x.path).filter((x) => remoteFiles.has(x)),\n deleted.map((x) => x.path).filter((x) => remoteFiles.has(x))\n );\n\n await pMap(\n remoteFiles,\n async ([relativePath, file]) => {\n const filepath = this.absolute(relativePath);\n this.recentWrites.add(filepath);\n\n if (\"content\" in file) {\n await fs.ensureDir(path.dirname(filepath), { mode: 0o755 });\n if (!file.path.endsWith(\"/\")) {\n await fs.writeFile(filepath, Buffer.from(file.content, file.encoding ?? FileSyncEncoding.Utf8), { mode: file.mode });\n }\n if (filepath == this.absolute(\"yarn.lock\")) {\n await execa(\"yarn\", [\"install\"], { cwd: this.dir }).catch((err) => {\n this.debug(\"yarn install failed\");\n this.debug(err.message);\n });\n }\n } else {\n await fs.remove(filepath);\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n }\n },\n { stopOnError: false }\n );\n\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n })\n .catch(this.stop);\n },\n }\n );\n\n const localFilesBuffer = new Map<string, { mode: number; mtime: number } | false>();\n\n this.publish = debounce(() => {\n const localFiles = new Map(localFilesBuffer.entries());\n localFilesBuffer.clear();\n\n void this.queue\n .add(async () => {\n const changed: FileSyncChangedEventInput[] = [];\n const deleted: FileSyncDeletedEventInput[] = [];\n\n await pMap(\n localFiles,\n async ([filepath, file]) => {\n if (file) {\n try {\n changed.push({\n path: this.normalize(filepath),\n mode: file.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n });\n } catch (error) {\n // A file could have been changed and then deleted before we process the change event, so the readFile above will raise\n // an ENOENT. This is normal operation, so just ignore this event.\n ignoreEnoent(error);\n }\n } else {\n deleted.push({ path: this.normalize(filepath) });\n }\n },\n { stopOnError: false }\n );\n\n if (changed.length > 0 || deleted.length > 0) {\n const data = await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: { input: { expectedRemoteFilesVersion: this.metadata.filesVersion, changed, deleted } },\n });\n\n this.log(chalk`Sent {gray ${format(new Date(), \"pp\")}}`);\n this.logPaths(\n \"→\",\n changed.map((x) => x.path),\n deleted.map((x) => x.path)\n );\n\n const { remoteFilesVersion } = data.publishFileSyncEvents;\n this.debug(\"remote files version after publishing %s\", remoteFilesVersion);\n\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n }\n }\n })\n .catch(this.stop);\n }, this.filePushDelay);\n\n this.watcher\n .add(`${this.dir}/**/*`)\n .on(\"error\", (error) => void this.stop(error))\n .on(\"all\", (event, filepath, stats) => {\n const relativePath = this.relative(filepath);\n\n if (event === \"addDir\" || event === \"unlinkDir\") {\n this.debug(\"skipping event caused by directory %s\", relativePath);\n return;\n }\n\n if (stats?.isSymbolicLink?.()) {\n this.debug(\"skipping event caused by symlink %s\", relativePath);\n return;\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n } else if (this.ignorer.ignores(filepath)) {\n this.debug(\"skipping event caused by ignored file %s\", relativePath);\n return;\n }\n\n // we only update the mtime if the file is not ignored, because if we restart and the mtime is set to an ignored file, then it could\n // be greater than the mtime of all non ignored files and we'll think that local files have changed when only an ignored one has\n if (stats && stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n if (this.recentWrites.delete(filepath)) {\n this.debug(\"skipping event caused by recent write %s\", relativePath);\n return;\n }\n\n this.debug(\"file changed %s\", relativePath);\n\n switch (event) {\n case \"add\":\n case \"change\":\n assert(stats, \"missing stats on add/change event\");\n localFilesBuffer.set(filepath, { mode: stats.mode, mtime: stats.mtime.getTime() });\n break;\n case \"unlink\":\n localFilesBuffer.set(filepath, false);\n break;\n }\n\n this.publish();\n });\n\n this.status = SyncStatus.RUNNING;\n\n // app should be defined at this point\n assert(context.app);\n\n this.log();\n this.log(\n dedent(chalk`\n {bold ggt v${this.config.version}}\n\n App ${context.app.name}\n Editor https://${context.app.slug}.gadget.app/edit\n Playground https://${context.app.slug}.gadget.app/api/graphql/playground\n Docs https://docs.gadget.dev/api/${context.app.slug}\n\n {underline Endpoints} ${\n context.app.hasSplitEnvironments\n ? `\n - https://${context.app.slug}.gadget.app\n - https://${context.app.slug}--development.gadget.app`\n : `\n - https://${context.app.slug}.gadget.app`\n }\n\n Watching for file changes... {gray Press Ctrl+C to stop}\n `)\n );\n this.log();\n\n await sleepUntil(() => this.status == SyncStatus.STOPPED, { timeout: Infinity });\n\n if (error) {\n this.notify({ subtitle: \"Uh oh!\", message: \"An error occurred while syncing files\" });\n throw error;\n } else {\n this.log(\"Goodbye!\");\n }\n }\n}\n\nexport enum SyncStatus {\n STARTING,\n RUNNING,\n STOPPING,\n STOPPED,\n}\n\nexport enum Action {\n CANCEL = \"Cancel (Ctrl+C)\",\n MERGE = \"Merge local files with remote ones\",\n RESET = \"Reset local files to remote ones\",\n}\n\nexport const REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION: Query<\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables\n> = /* GraphQL */ `\n subscription RemoteFileSyncEvents($localFilesVersion: String!) {\n remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n deleted {\n path\n }\n }\n }\n`;\n\nexport const REMOTE_FILES_VERSION_QUERY: Query<RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables> = /* GraphQL */ `\n query RemoteFilesVersion {\n remoteFilesVersion\n }\n`;\n\nexport const PUBLISH_FILE_SYNC_EVENTS_MUTATION: Query<\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables\n> = /* GraphQL */ `\n mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {\n publishFileSyncEvents(input: $input) {\n remoteFilesVersion\n }\n }\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport chalk from \"chalk\";\nimport assert from \"assert\";\nimport { FSWatcher } from \"chokidar\";\nimport format from \"date-fns/format\";\nimport execa from \"execa\";\nimport type { Stats } from \"fs-extra\";\nimport fs from \"fs-extra\";\nimport { prompt } from \"inquirer\";\nimport type { DebouncedFunc } from \"lodash\";\nimport { sortBy } from \"lodash\";\nimport { isString } from \"lodash\";\nimport { debounce } from \"lodash\";\nimport normalizePath from \"normalize-path\";\nimport pMap from \"p-map\";\nimport PQueue from \"p-queue\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\nimport dedent from \"ts-dedent\";\nimport which from \"which\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport type { Query } from \"../utils/client\";\nimport { Client } from \"../utils/client\";\nimport { context } from \"../utils/context\";\nimport { InvalidSyncAppFlagError, InvalidSyncFileError, YarnNotFoundError } from \"../utils/errors\";\nimport { app } from \"../utils/flags\";\nimport { ignoreEnoent, Ignorer, isEmptyDir, walkDir } from \"../utils/fs-utils\";\nimport { sleepUntil } from \"../utils/sleep\";\nimport type {\n FileSyncChangedEventInput,\n FileSyncDeletedEventInput,\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables,\n RemoteFilesVersionQuery,\n RemoteFilesVersionQueryVariables,\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables,\n} from \"../__generated__/graphql\";\nimport { FileSyncEncoding } from \"../__generated__/graphql\";\n\nexport default class Sync extends BaseCommand<typeof Sync> {\n static override priority = 1;\n\n static override summary = \"Sync your Gadget application's source code to and from your local filesystem.\";\n\n static override usage = \"sync [DIRECTORY] [--app <name>]\";\n\n static override description = dedent(chalk`\n Sync provides the ability to sync your Gadget application's source code to and from your local\n filesystem. While {gray ggt sync} is running, local file changes are immediately reflected within\n Gadget, while files that are changed remotely are immediately saved to your local filesystem.\n\n Use cases for this include:\n - Developing locally with your own editor like VSCode {gray (https://code.visualstudio.com/)}\n - Storing your source code in a Git repository like GitHub {gray (https://github.com/)}\n\n Sync includes the concept of a {gray .ignore} file. This file may contain a list of files and\n directories that won't be received or sent to Gadget when syncing. The format of this file is\n identical to the one used by Git {gray (https://git-scm.com/docs/gitignore)}.\n\n The following files and directories are always ignored:\n - .gadget\n - .git\n - node_modules\n\n Note:\n - If you have separate development and production environments, {gray ggt sync} will only sync with your development environment\n - Gadget applications only support installing dependencies with Yarn 1 {gray (https://classic.yarnpkg.com/lang/en/)}\n - Since file changes are immediately reflected in Gadget, avoid the following while {gray ggt sync} is running:\n - Deleting all your files\n - Moving all your files to a different directory\n `);\n\n static override args = {\n directory: Args.string({\n description: \"The directory to sync files to. If the directory doesn't exist, it will be created.\",\n default: \".\",\n }),\n };\n\n static override flags = {\n app: app({\n summary: \"The Gadget application to sync files to.\",\n }),\n force: Flags.boolean({\n summary: \"Whether to sync even if we can't determine the state of your local files relative to your remote ones.\",\n default: false,\n }),\n \"file-push-delay\": Flags.integer({\n summary: \"Delay in milliseconds before pushing files to your app.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n \"file-stability-threshold\": Flags.integer({\n name: \"file-stability-threshold\",\n summary: \"Time in milliseconds a file's size must remain the same.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 500,\n hidden: true,\n }),\n \"file-poll-interval\": Flags.integer({\n name: \"file-poll-interval\",\n description: \"Interval in milliseconds between polling a file's size.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n };\n\n static override examples = [\n dedent(chalk`\n {gray $ ggt sync --app my-app ~/gadget/my-app}\n\n App my-app\n Editor https://my-app.gadget.app/edit\n Playground https://my-app.gadget.app/api/graphql/playground\n Docs https://docs.gadget.dev/api/my-app\n\n {underline Endpoints}\n - https://my-app.gadget.app\n - https://my-app--development.gadget.app\n\n Watching for file changes... {gray Press Ctrl+C to stop}\n\n Received {gray 12:00:00 PM}\n {green ←} routes/GET.js {gray (changed)}\n {green ←} user/signUp/signIn.js {gray (changed)}\n {gray 2 files in total. 2 changed, 0 deleted.}\n\n Sent {gray 12:00:03 PM}\n {green →} routes/GET.ts {gray (changed)}\n {gray 1 file in total. 1 changed, 0 deleted.}\n\n ^C Stopping... {gray (press Ctrl+C again to force)}\n Goodbye!\n `),\n ];\n\n override requireUser = true;\n\n status = SyncStatus.STARTING;\n\n dir!: string;\n\n recentWrites = new Set();\n\n queue = new PQueue({ concurrency: 1 });\n\n client!: Client;\n\n ignorer!: Ignorer;\n\n watcher!: FSWatcher;\n\n metadata = {\n app: \"\",\n filesVersion: \"0\",\n mtime: 0,\n };\n\n publish!: DebouncedFunc<() => void>;\n\n stop!: (error?: unknown) => Promise<void>;\n\n relative(to: string): string {\n return path.relative(this.dir, to);\n }\n\n absolute(...pathSegments: string[]): string {\n return path.resolve(this.dir, ...pathSegments);\n }\n\n normalize(filepath: string): string {\n return normalizePath(path.isAbsolute(filepath) ? this.relative(filepath) : filepath);\n }\n\n logPaths(prefix: string, changed: string[], deleted: string[], { limit = 10 } = {}): void {\n const lines = sortBy(\n [\n ...changed.map((filepath) => chalk`{green ${prefix}} ${this.normalize(filepath)} {gray (changed)}`),\n ...deleted.map((filepath) => chalk`{red ${prefix}} ${this.normalize(filepath)} {gray (deleted)}`),\n ],\n (line) => line.slice(line.indexOf(\" \") + 1)\n );\n\n let logged = 0;\n for (const line of lines) {\n this.log(line);\n if (++logged == limit && !this.debugEnabled) break;\n }\n\n if (lines.length > logged) {\n this.log(chalk`{gray … ${lines.length - logged} more}`);\n }\n\n this.log(chalk`{gray ${pluralize(\"file\", lines.length, true)} in total. ${changed.length} changed, ${deleted.length} deleted.}`);\n this.log();\n }\n\n override async init(): Promise<void> {\n await super.init();\n\n assert(isString(this.args[\"directory\"]));\n\n this.dir =\n this.config.windows && this.args[\"directory\"].startsWith(\"~/\")\n ? path.join(this.config.home, this.args[\"directory\"].slice(2))\n : path.resolve(this.args[\"directory\"]);\n\n const getApp = async (): Promise<string> => {\n if (this.flags.app) return this.flags.app;\n if (this.metadata.app) return this.metadata.app;\n const selected = await prompt<{ app: string }>({\n type: \"list\",\n name: \"app\",\n message: \"Please select the app to sync to.\",\n choices: await context.getAvailableApps().then((apps) => apps.map((app) => app.slug)),\n });\n return selected.app;\n };\n\n if (await isEmptyDir(this.dir)) {\n this.metadata.app = await getApp();\n } else {\n try {\n this.metadata = await fs.readJson(this.absolute(\".gadget\", \"sync.json\"));\n if (!this.metadata.app) {\n this.metadata.app = await getApp();\n }\n } catch (error) {\n if (!this.flags.force) {\n throw new InvalidSyncFileError(error, this, this.flags.app);\n }\n this.metadata.app = await getApp();\n }\n }\n\n if (this.flags.app && this.flags.app !== this.metadata.app && !this.flags.force) {\n throw new InvalidSyncAppFlagError(this);\n }\n\n await context.setApp(this.metadata.app);\n\n this.client = new Client();\n\n // local files/folders that should never be published\n this.ignorer = new Ignorer(this.dir, [\"node_modules\", \".gadget\", \".git\"]);\n\n this.watcher = new FSWatcher({\n ignored: (filepath) => this.ignorer.ignores(filepath),\n // don't emit an event for every watched file on boot\n ignoreInitial: true,\n // make sure stats are always present on add/change events\n alwaysStat: true,\n // wait for the entire file to be written before emitting add/change events\n awaitWriteFinish: { pollInterval: this.flags[\"file-poll-interval\"], stabilityThreshold: this.flags[\"file-stability-threshold\"] },\n });\n\n this.debug(\"starting\");\n\n if (!which.sync(\"yarn\", { nothrow: true })) {\n throw new YarnNotFoundError();\n }\n\n await fs.ensureDir(this.dir);\n\n const { remoteFilesVersion } = await this.client.queryUnwrap({ query: REMOTE_FILES_VERSION_QUERY });\n const hasRemoteChanges = BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion);\n\n const getChangedFiles = async (): Promise<Map<string, Stats>> => {\n const files = new Map();\n for await (const filepath of walkDir(this.dir, { ignorer: this.ignorer })) {\n const stats = await fs.stat(filepath);\n if (stats.mtime.getTime() > this.metadata.mtime) {\n files.set(this.absolute(filepath), stats);\n }\n }\n return files;\n };\n\n const changedFiles = await getChangedFiles();\n const hasLocalChanges = changedFiles.size > 0;\n if (hasLocalChanges) {\n this.log(\"Local files have changed since you last synced\");\n this.logPaths(\"-\", Array.from(changedFiles.keys()), [], { limit: changedFiles.size });\n this.log();\n }\n\n this.debug(\"init %O\", { metadata: this.metadata, remoteFilesVersion, hasRemoteChanges, hasLocalChanges });\n\n let action: Action | undefined;\n if (hasLocalChanges) {\n ({ action } = await prompt({\n type: \"list\",\n name: \"action\",\n choices: [Action.CANCEL, Action.MERGE, Action.RESET],\n message: hasRemoteChanges ? \"Remote files have also changed. How would you like to proceed?\" : \"How would you like to proceed?\",\n }));\n }\n\n switch (action) {\n case Action.MERGE: {\n // get all the changed files again in case more changed\n const files = await getChangedFiles();\n\n // we purposefully don't set the returned remoteFilesVersion here because we haven't processed the in-between versions yet\n await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: {\n input: {\n expectedRemoteFilesVersion: remoteFilesVersion,\n changed: await pMap(files, async ([filepath, stats]) => {\n if (stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n return {\n path: this.normalize(filepath),\n mode: stats.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n };\n }),\n deleted: [],\n },\n },\n });\n break;\n }\n case Action.RESET: {\n await pMap(changedFiles, ([filepath]) => fs.remove(filepath));\n this.metadata.filesVersion = \"0\";\n break;\n }\n case Action.CANCEL: {\n process.exit(0);\n }\n }\n\n this.debug(\"started\");\n }\n\n async run(): Promise<void> {\n let error: unknown;\n\n this.stop = async (e?: unknown) => {\n if (this.status != SyncStatus.RUNNING) return;\n\n error = e;\n this.debug(\"stopping\");\n this.status = SyncStatus.STOPPING;\n\n try {\n unsubscribe();\n this.watcher.removeAllListeners();\n this.publish.flush();\n await this.queue.onIdle();\n } finally {\n await fs.outputJSON(this.absolute(\".gadget\", \"sync.json\"), this.metadata, { spaces: 2 });\n await Promise.allSettled([this.watcher.close(), this.client.dispose()]);\n\n this.debug(\"stopped\");\n this.status = SyncStatus.STOPPED;\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (this.status != SyncStatus.RUNNING) return;\n\n this.log(chalk` Stopping... {gray (press Ctrl+C again to force)}`);\n void this.stop();\n\n // When ggt is run via npx, and the user presses Ctrl+C, npx sends SIGINT twice in quick succession. In order to prevent the second\n // SIGINT from triggering the force exit listener, we wait a bit before registering it. This is a bit of a hack, but it works.\n setTimeout(() => {\n process.once(signal, () => {\n this.log(\" Exiting immediately. Note that files may not have finished syncing.\");\n process.exit(1);\n });\n }, 100).unref();\n });\n }\n\n const unsubscribe = this.client.subscribeUnwrap(\n {\n query: REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION,\n variables: () => ({ localFilesVersion: this.metadata.filesVersion }),\n },\n {\n error: (error) => void this.stop(error),\n next: ({ remoteFileSyncEvents: { remoteFilesVersion, changed, deleted } }) => {\n const remoteFiles = new Map(\n [...deleted, ...changed]\n .filter((event) => event.path.startsWith(\".gadget/\") || !this.ignorer.ignores(event.path))\n .map((e) => [e.path, e])\n );\n\n void this.queue\n .add(async () => {\n if (!remoteFiles.size) {\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n // we still need to update filesVersion, otherwise our expectedFilesVersion will be behind the next time we publish\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n }\n return;\n }\n\n this.log(chalk`Received {gray ${format(new Date(), \"pp\")}}`);\n this.logPaths(\n \"←\",\n changed.map((x) => x.path).filter((x) => remoteFiles.has(x)),\n deleted.map((x) => x.path).filter((x) => remoteFiles.has(x))\n );\n\n await pMap(\n remoteFiles,\n async ([relativePath, file]) => {\n const filepath = this.absolute(relativePath);\n this.recentWrites.add(filepath);\n\n if (\"content\" in file) {\n await fs.ensureDir(path.dirname(filepath), { mode: 0o755 });\n if (!file.path.endsWith(\"/\")) {\n await fs.writeFile(filepath, Buffer.from(file.content, file.encoding ?? FileSyncEncoding.Utf8), { mode: file.mode });\n }\n if (filepath == this.absolute(\"yarn.lock\")) {\n await execa(\"yarn\", [\"install\"], { cwd: this.dir }).catch((err) => {\n this.debug(\"yarn install failed\");\n this.debug(err.message);\n });\n }\n } else {\n await fs.remove(filepath);\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n }\n },\n { stopOnError: false }\n );\n\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n })\n .catch(this.stop);\n },\n }\n );\n\n const localFilesBuffer = new Map<string, { mode: number; mtime: number } | false>();\n\n this.publish = debounce(() => {\n const localFiles = new Map(localFilesBuffer.entries());\n localFilesBuffer.clear();\n\n void this.queue\n .add(async () => {\n const changed: FileSyncChangedEventInput[] = [];\n const deleted: FileSyncDeletedEventInput[] = [];\n\n await pMap(\n localFiles,\n async ([filepath, file]) => {\n if (file) {\n try {\n changed.push({\n path: this.normalize(filepath),\n mode: file.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n });\n } catch (error) {\n // A file could have been changed and then deleted before we process the change event, so the readFile above will raise\n // an ENOENT. This is normal operation, so just ignore this event.\n ignoreEnoent(error);\n }\n } else {\n deleted.push({ path: this.normalize(filepath) });\n }\n },\n { stopOnError: false }\n );\n\n if (changed.length > 0 || deleted.length > 0) {\n const data = await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: { input: { expectedRemoteFilesVersion: this.metadata.filesVersion, changed, deleted } },\n });\n\n this.log(chalk`Sent {gray ${format(new Date(), \"pp\")}}`);\n this.logPaths(\n \"→\",\n changed.map((x) => x.path),\n deleted.map((x) => x.path)\n );\n\n const { remoteFilesVersion } = data.publishFileSyncEvents;\n this.debug(\"remote files version after publishing %s\", remoteFilesVersion);\n\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n this.debug(\"updated local files version from %s to %s\", this.metadata.filesVersion, remoteFilesVersion);\n this.metadata.filesVersion = remoteFilesVersion;\n }\n }\n })\n .catch(this.stop);\n }, this.flags[\"file-push-delay\"]);\n\n this.watcher\n .add(`${this.dir}/**/*`)\n .on(\"error\", (error) => void this.stop(error))\n .on(\"all\", (event, filepath, stats) => {\n const relativePath = this.relative(filepath);\n\n if (event === \"addDir\" || event === \"unlinkDir\") {\n this.debug(\"skipping event caused by directory %s\", relativePath);\n return;\n }\n\n if (stats?.isSymbolicLink?.()) {\n this.debug(\"skipping event caused by symlink %s\", relativePath);\n return;\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n } else if (this.ignorer.ignores(filepath)) {\n this.debug(\"skipping event caused by ignored file %s\", relativePath);\n return;\n }\n\n // we only update the mtime if the file is not ignored, because if we restart and the mtime is set to an ignored file, then it could\n // be greater than the mtime of all non ignored files and we'll think that local files have changed when only an ignored one has\n if (stats && stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n if (this.recentWrites.delete(filepath)) {\n this.debug(\"skipping event caused by recent write %s\", relativePath);\n return;\n }\n\n this.debug(\"file changed %s\", relativePath);\n\n switch (event) {\n case \"add\":\n case \"change\":\n assert(stats, \"missing stats on add/change event\");\n localFilesBuffer.set(filepath, { mode: stats.mode, mtime: stats.mtime.getTime() });\n break;\n case \"unlink\":\n localFilesBuffer.set(filepath, false);\n break;\n }\n\n this.publish();\n });\n\n this.status = SyncStatus.RUNNING;\n\n // app should be defined at this point\n assert(context.app);\n\n this.log();\n this.log(\n dedent(chalk`\n {bold ggt v${this.config.version}}\n\n App ${context.app.name}\n Editor https://${context.app.slug}.gadget.app/edit\n Playground https://${context.app.slug}.gadget.app/api/graphql/playground\n Docs https://docs.gadget.dev/api/${context.app.slug}\n\n {underline Endpoints} ${\n context.app.hasSplitEnvironments\n ? `\n - https://${context.app.slug}.gadget.app\n - https://${context.app.slug}--development.gadget.app`\n : `\n - https://${context.app.slug}.gadget.app`\n }\n\n Watching for file changes... {gray Press Ctrl+C to stop}\n `)\n );\n this.log();\n\n await sleepUntil(() => this.status == SyncStatus.STOPPED, { timeout: Infinity });\n\n if (error) {\n this.notify({ subtitle: \"Uh oh!\", message: \"An error occurred while syncing files\" });\n throw error;\n } else {\n this.log(\"Goodbye!\");\n }\n }\n}\n\nexport enum SyncStatus {\n STARTING,\n RUNNING,\n STOPPING,\n STOPPED,\n}\n\nexport enum Action {\n CANCEL = \"Cancel (Ctrl+C)\",\n MERGE = \"Merge local files with remote ones\",\n RESET = \"Reset local files to remote ones\",\n}\n\nexport const REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION: Query<\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables\n> = /* GraphQL */ `\n subscription RemoteFileSyncEvents($localFilesVersion: String!) {\n remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n deleted {\n path\n }\n }\n }\n`;\n\nexport const REMOTE_FILES_VERSION_QUERY: Query<RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables> = /* GraphQL */ `\n query RemoteFilesVersion {\n remoteFilesVersion\n }\n`;\n\nexport const PUBLISH_FILE_SYNC_EVENTS_MUTATION: Query<\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables\n> = /* GraphQL */ `\n mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {\n publishFileSyncEvents(input: $input) {\n remoteFilesVersion\n }\n }\n`;\n"]}
|
package/lib/commands/whoami.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,0DAA0B;AAC1B,kEAA+B;AAC/B,wDAAoD;AACpD,8CAA2C;AAE3C,MAAqB,MAAO,SAAQ,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,0DAA0B;AAC1B,kEAA+B;AAC/B,wDAAoD;AACpD,8CAA2C;AAE3C,MAAqB,MAAO,SAAQ,0BAA0B;IAY5D,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAClC,OAAO;SACR;QAED,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,IAAA,eAAK,EAAA,wBAAwB,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;SAC3E;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAChD;IACH,CAAC;;AAxBH,yBAyBC;AAxBQ;;;;WAAmB,kEAAkE;GAAC;AAEtF;;;;WAAiB,QAAQ;GAAC;AAE1B;;;;WAAoB;QACzB,IAAA,mBAAM,EAAC,IAAA,eAAK,EAAA;;;KAGX,CAAC;KACH;GAAC","sourcesContent":["import chalk from \"chalk\";\nimport dedent from \"ts-dedent\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport { context } from \"../utils/context\";\n\nexport default class Whoami extends BaseCommand<typeof Whoami> {\n static override summary = \"Show the name and email address of the currently logged in user.\";\n\n static override usage = \"whoami\";\n\n static override examples = [\n dedent(chalk`\n {gray $ ggt whoami}\n You are logged in as Jane Doe {gray (jane@example.com)}\n `),\n ];\n\n async run(): Promise<void> {\n const user = await context.getUser();\n if (!user) {\n this.log(\"You are not logged in\");\n return;\n }\n\n if (user.name) {\n this.log(chalk`You are logged in as ${user.name} {gray (${user.email})}`);\n } else {\n this.log(`You are logged in as ${user.email}`);\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Config } from "@oclif/core";
|
|
1
|
+
import type { Config, Interfaces } from "@oclif/core";
|
|
2
2
|
import { Command } from "@oclif/core";
|
|
3
3
|
import type { Notification } from "node-notifier";
|
|
4
4
|
import type WindowsBalloon from "node-notifier/notifiers/balloon";
|
|
@@ -6,20 +6,30 @@ import type Growl from "node-notifier/notifiers/growl";
|
|
|
6
6
|
import type NotificationCenter from "node-notifier/notifiers/notificationcenter";
|
|
7
7
|
import type NotifySend from "node-notifier/notifiers/notifysend";
|
|
8
8
|
import type WindowsToaster from "node-notifier/notifiers/toaster";
|
|
9
|
-
export
|
|
9
|
+
export type Flags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)["baseFlags"] & T["flags"]>;
|
|
10
|
+
export type Args<T extends typeof Command> = Interfaces.InferredArgs<T["args"]>;
|
|
11
|
+
export declare abstract class BaseCommand<T extends typeof Command> extends Command {
|
|
10
12
|
/**
|
|
11
13
|
* Determines how high the command is listed in the README. The lower the number, the higher the command is listed. Equal numbers are
|
|
12
14
|
* sorted alphabetically.
|
|
13
15
|
*/
|
|
14
16
|
static priority: number;
|
|
15
|
-
static
|
|
16
|
-
debug:
|
|
17
|
+
static baseFlags: {
|
|
18
|
+
debug: Interfaces.BooleanFlag<boolean>;
|
|
17
19
|
};
|
|
18
20
|
/**
|
|
19
21
|
* Determines whether the command requires the user to be logged in or not.
|
|
20
22
|
* If true and the user is not logged in, the user will be prompted to login before the command is run.
|
|
21
23
|
*/
|
|
22
24
|
readonly requireUser: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* The parsed flags for the command.
|
|
27
|
+
*/
|
|
28
|
+
flags: Flags<T>;
|
|
29
|
+
/**
|
|
30
|
+
* The parsed arguments for the command.
|
|
31
|
+
*/
|
|
32
|
+
args: Args<T>;
|
|
23
33
|
constructor(argv: string[], config: Config);
|
|
24
34
|
/**
|
|
25
35
|
* Indicates whether the command is being run with the `-D/--debug` flag.
|
|
@@ -28,10 +28,28 @@ class BaseCommand extends core_1.Command {
|
|
|
28
28
|
writable: true,
|
|
29
29
|
value: false
|
|
30
30
|
});
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* The parsed flags for the command.
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(this, "flags", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: void 0
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* The parsed arguments for the command.
|
|
42
|
+
*/
|
|
43
|
+
Object.defineProperty(this, "args", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: void 0
|
|
48
|
+
});
|
|
49
|
+
// TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks base flags as well.
|
|
32
50
|
// warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).
|
|
33
51
|
// https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259
|
|
34
|
-
this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.
|
|
52
|
+
this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.baseFlags };
|
|
35
53
|
}
|
|
36
54
|
/**
|
|
37
55
|
* Indicates whether the command is being run with the `-D/--debug` flag.
|
|
@@ -41,14 +59,19 @@ class BaseCommand extends core_1.Command {
|
|
|
41
59
|
}
|
|
42
60
|
async init() {
|
|
43
61
|
await super.init();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
62
|
+
context_1.context.config = this.config;
|
|
63
|
+
const { flags, args } = await this.parse({
|
|
64
|
+
flags: this.ctor.flags,
|
|
65
|
+
baseFlags: super.ctor.baseFlags,
|
|
66
|
+
args: this.ctor.args,
|
|
67
|
+
strict: this.ctor.strict,
|
|
68
|
+
});
|
|
69
|
+
this.flags = flags;
|
|
70
|
+
this.args = args;
|
|
47
71
|
if (flags.debug) {
|
|
48
72
|
core_1.settings.debug = true;
|
|
49
73
|
debug_1.default.enable(`${this.config.bin}:*`);
|
|
50
74
|
}
|
|
51
|
-
context_1.context.config = this.config;
|
|
52
75
|
if (this.requireUser && !(await context_1.context.getUser())) {
|
|
53
76
|
const { login } = await (0, inquirer_1.prompt)({
|
|
54
77
|
type: "confirm",
|
|
@@ -89,7 +112,7 @@ class BaseCommand extends core_1.Command {
|
|
|
89
112
|
const receiveSession = new Promise((resolve, reject) => {
|
|
90
113
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
91
114
|
server = (0, http_1.createServer)(async (req, res) => {
|
|
92
|
-
const redirectTo = new URL(
|
|
115
|
+
const redirectTo = new URL(`https://${context_1.context.domains.services}/auth/cli`);
|
|
93
116
|
try {
|
|
94
117
|
if (!req.url)
|
|
95
118
|
throw new Error("missing url");
|
|
@@ -122,8 +145,8 @@ class BaseCommand extends core_1.Command {
|
|
|
122
145
|
});
|
|
123
146
|
server.listen(port);
|
|
124
147
|
});
|
|
125
|
-
const url = new URL(
|
|
126
|
-
url.searchParams.set("returnTo",
|
|
148
|
+
const url = new URL(`https://${context_1.context.domains.services}/auth/login`);
|
|
149
|
+
url.searchParams.set("returnTo", `https://${context_1.context.domains.services}/auth/cli/callback?port=${port}`);
|
|
127
150
|
await (0, open_1.default)(url.toString());
|
|
128
151
|
this.log((0, ts_dedent_1.default) `
|
|
129
152
|
We've opened Gadget's login page using your default browser.
|
|
@@ -164,7 +187,7 @@ Object.defineProperty(BaseCommand, "priority", {
|
|
|
164
187
|
writable: true,
|
|
165
188
|
value: Infinity
|
|
166
189
|
});
|
|
167
|
-
Object.defineProperty(BaseCommand, "
|
|
190
|
+
Object.defineProperty(BaseCommand, "baseFlags", {
|
|
168
191
|
enumerable: true,
|
|
169
192
|
configurable: true,
|
|
170
193
|
writable: true,
|