@gadgetinc/ggt 0.4.10 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -93
- package/lib/__generated__/graphql.js +66 -1
- package/lib/__generated__/graphql.js.map +1 -1
- package/lib/commands/deploy.js +328 -230
- package/lib/commands/deploy.js.map +1 -1
- package/lib/commands/dev.js +445 -0
- package/lib/commands/dev.js.map +1 -0
- package/lib/commands/list.js +27 -19
- package/lib/commands/list.js.map +1 -1
- package/lib/commands/login.js +15 -11
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/logout.js +5 -5
- package/lib/commands/logout.js.map +1 -1
- package/lib/commands/open.js +200 -0
- package/lib/commands/open.js.map +1 -0
- package/lib/commands/pull.js +128 -0
- package/lib/commands/pull.js.map +1 -0
- package/lib/commands/push.js +126 -0
- package/lib/commands/push.js.map +1 -0
- package/lib/commands/root.js +46 -28
- package/lib/commands/root.js.map +1 -1
- package/lib/commands/status.js +61 -0
- package/lib/commands/status.js.map +1 -0
- package/lib/commands/version.js +6 -6
- package/lib/commands/version.js.map +1 -1
- package/lib/commands/whoami.js +6 -6
- package/lib/commands/whoami.js.map +1 -1
- package/lib/ggt.js +33 -8
- package/lib/ggt.js.map +1 -1
- package/lib/main.js +5 -0
- package/lib/main.js.map +1 -0
- package/lib/services/app/api/api.js +191 -0
- package/lib/services/app/api/api.js.map +1 -0
- package/lib/services/app/api/operation.js +12 -0
- package/lib/services/app/api/operation.js.map +1 -0
- package/lib/services/app/app.js +44 -10
- package/lib/services/app/app.js.map +1 -1
- package/lib/services/app/{edit/client.js → client.js} +29 -19
- package/lib/services/app/client.js.map +1 -0
- package/lib/services/app/edit/edit.js +67 -31
- package/lib/services/app/edit/edit.js.map +1 -1
- package/lib/services/app/edit/operation.js +4 -3
- package/lib/services/app/edit/operation.js.map +1 -1
- package/lib/services/app/{edit/error.js → error.js} +6 -6
- package/lib/services/app/error.js.map +1 -0
- package/lib/services/command/arg.js +4 -4
- package/lib/services/command/arg.js.map +1 -1
- package/lib/services/command/command.js +9 -7
- package/lib/services/command/command.js.map +1 -1
- package/lib/services/command/context.js +82 -20
- package/lib/services/command/context.js.map +1 -1
- package/lib/services/config/config.js +4 -7
- package/lib/services/config/config.js.map +1 -1
- package/lib/services/config/env.js +1 -1
- package/lib/services/config/env.js.map +1 -1
- package/lib/services/filesync/changes.js +76 -37
- package/lib/services/filesync/changes.js.map +1 -1
- package/lib/services/filesync/conflicts.js +10 -9
- package/lib/services/filesync/conflicts.js.map +1 -1
- package/lib/services/filesync/directory.js +16 -1
- package/lib/services/filesync/directory.js.map +1 -1
- package/lib/services/filesync/error.js +96 -27
- package/lib/services/filesync/error.js.map +1 -1
- package/lib/services/filesync/filesync.js +448 -490
- package/lib/services/filesync/filesync.js.map +1 -1
- package/lib/services/filesync/hashes.js +8 -5
- package/lib/services/filesync/hashes.js.map +1 -1
- package/lib/services/filesync/strategy.js +59 -0
- package/lib/services/filesync/strategy.js.map +1 -0
- package/lib/services/filesync/sync-json.js +475 -0
- package/lib/services/filesync/sync-json.js.map +1 -0
- package/lib/services/http/auth.js +30 -1
- package/lib/services/http/auth.js.map +1 -1
- package/lib/services/http/http.js +5 -0
- package/lib/services/http/http.js.map +1 -1
- package/lib/services/output/confirm.js +149 -0
- package/lib/services/output/confirm.js.map +1 -0
- package/lib/services/output/footer.js +22 -0
- package/lib/services/output/footer.js.map +1 -0
- package/lib/services/output/log/format/pretty.js +2 -1
- package/lib/services/output/log/format/pretty.js.map +1 -1
- package/lib/services/output/log/logger.js +13 -5
- package/lib/services/output/log/logger.js.map +1 -1
- package/lib/services/output/log/structured.js +2 -2
- package/lib/services/output/log/structured.js.map +1 -1
- package/lib/services/output/output.js +197 -0
- package/lib/services/output/output.js.map +1 -0
- package/lib/services/output/print.js +31 -0
- package/lib/services/output/print.js.map +1 -0
- package/lib/services/output/problems.js +84 -0
- package/lib/services/output/problems.js.map +1 -0
- package/lib/services/output/prompt.js +173 -40
- package/lib/services/output/prompt.js.map +1 -1
- package/lib/services/output/report.js +63 -19
- package/lib/services/output/report.js.map +1 -1
- package/lib/services/output/select.js +198 -0
- package/lib/services/output/select.js.map +1 -0
- package/lib/services/output/spinner.js +141 -0
- package/lib/services/output/spinner.js.map +1 -0
- package/lib/services/output/sprint.js +38 -15
- package/lib/services/output/sprint.js.map +1 -1
- package/lib/services/output/symbols.js +23 -0
- package/lib/services/output/symbols.js.map +1 -0
- package/lib/services/output/table.js +98 -0
- package/lib/services/output/table.js.map +1 -0
- package/lib/services/output/timestamp.js +12 -0
- package/lib/services/output/timestamp.js.map +1 -0
- package/lib/services/output/update.js +29 -9
- package/lib/services/output/update.js.map +1 -1
- package/lib/services/user/session.js +4 -0
- package/lib/services/user/session.js.map +1 -1
- package/lib/services/user/user.js +15 -10
- package/lib/services/user/user.js.map +1 -1
- package/lib/services/util/assert.js +11 -0
- package/lib/services/util/assert.js.map +1 -0
- package/lib/services/util/boolean.js +2 -2
- package/lib/services/util/boolean.js.map +1 -1
- package/lib/services/util/function.js +45 -7
- package/lib/services/util/function.js.map +1 -1
- package/lib/services/util/is.js +23 -2
- package/lib/services/util/is.js.map +1 -1
- package/lib/services/util/json.js +16 -13
- package/lib/services/util/json.js.map +1 -1
- package/lib/services/util/object.js +2 -2
- package/lib/services/util/object.js.map +1 -1
- package/lib/services/util/promise.js +5 -2
- package/lib/services/util/promise.js.map +1 -1
- package/lib/services/util/types.js.map +1 -1
- package/npm-shrinkwrap.json +3415 -2973
- package/package.json +47 -40
- package/bin/dev.cmd +0 -3
- package/bin/dev.js +0 -14
- package/bin/run.cmd +0 -3
- package/bin/run.js +0 -5
- package/lib/commands/sync.js +0 -284
- package/lib/commands/sync.js.map +0 -1
- package/lib/services/app/edit/client.js.map +0 -1
- package/lib/services/app/edit/error.js.map +0 -1
- package/lib/services/output/log/printer.js +0 -120
- package/lib/services/output/log/printer.js.map +0 -1
- package/lib/services/output/stream.js +0 -54
- package/lib/services/output/stream.js.map +0 -1
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { ClientError } from "../app/error.js";
|
|
3
|
+
import { sprintProblems } from "../output/problems.js";
|
|
4
|
+
import { GGTError, IsBug } from "../output/report.js";
|
|
5
|
+
import { sprint, sprintln } from "../output/sprint.js";
|
|
6
|
+
import { isGraphQLErrors, isGraphQLResult, isObject, isString } from "../util/is.js";
|
|
7
|
+
export class YarnNotFoundError extends GGTError {
|
|
5
8
|
render() {
|
|
6
9
|
return sprint`
|
|
7
10
|
Yarn must be installed to sync your application. You can install it by running:
|
|
@@ -16,52 +19,118 @@ export class YarnNotFoundError extends CLIError {
|
|
|
16
19
|
_define_property(this, "isBug", IsBug.NO);
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
|
-
export class
|
|
22
|
+
export class UnknownDirectoryError extends GGTError {
|
|
20
23
|
render() {
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
const cmd = this.ctx.command;
|
|
25
|
+
const dir = this.opts.directory.path;
|
|
26
|
+
switch(cmd){
|
|
27
|
+
case "open":
|
|
28
|
+
case "status":
|
|
29
|
+
return sprint`
|
|
30
|
+
A ".gadget/sync.json" file is missing in this directory:
|
|
23
31
|
|
|
24
|
-
|
|
32
|
+
${dir}
|
|
25
33
|
|
|
26
|
-
|
|
27
|
-
|
|
34
|
+
In order to use "ggt ${cmd}", you must run it within a directory
|
|
35
|
+
that has already been initialized with "ggt dev".
|
|
36
|
+
`;
|
|
37
|
+
case "dev":
|
|
38
|
+
return sprint`
|
|
39
|
+
A ".gadget/sync.json" file is missing in this directory:
|
|
28
40
|
|
|
29
|
-
|
|
41
|
+
${dir}
|
|
30
42
|
|
|
31
|
-
|
|
32
|
-
|
|
43
|
+
If you're running "ggt dev" for the first time, we recommend
|
|
44
|
+
using a gadget specific directory like this:
|
|
33
45
|
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
ggt dev ~/gadget/${this.ctx.args["--app"] ?? "<name>"}
|
|
47
|
+
|
|
48
|
+
To use a non-empty directory without a ".gadget/sync.json" file,
|
|
49
|
+
run "ggt dev" again with the "--allow-unknown-directory" flag:
|
|
50
|
+
|
|
51
|
+
ggt dev ${dir} --allow-unknown-directory
|
|
52
|
+
`;
|
|
53
|
+
default:
|
|
54
|
+
return sprint`
|
|
55
|
+
A ".gadget/sync.json" file is missing in this directory:
|
|
56
|
+
|
|
57
|
+
${dir}
|
|
58
|
+
|
|
59
|
+
If you're certain you want to use this directory, you can run
|
|
60
|
+
"ggt ${cmd}" again with the "--allow-unknown-directory" flag:
|
|
61
|
+
|
|
62
|
+
ggt ${cmd} --allow-unknown-directory
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
36
65
|
}
|
|
37
|
-
constructor(
|
|
38
|
-
super(
|
|
39
|
-
_define_property(this, "
|
|
40
|
-
_define_property(this, "
|
|
66
|
+
constructor(ctx, opts){
|
|
67
|
+
super('The ".gadget/sync.json" file was invalid or not found');
|
|
68
|
+
_define_property(this, "ctx", void 0);
|
|
69
|
+
_define_property(this, "opts", void 0);
|
|
41
70
|
_define_property(this, "isBug", void 0);
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
71
|
+
this.ctx = ctx;
|
|
72
|
+
this.opts = opts;
|
|
44
73
|
this.isBug = IsBug.NO;
|
|
45
|
-
this.app ??= "<name of app>";
|
|
46
74
|
}
|
|
47
75
|
}
|
|
48
|
-
export class
|
|
76
|
+
export class TooManyMergeAttemptsError extends GGTError {
|
|
49
77
|
render() {
|
|
50
78
|
return sprint`
|
|
51
|
-
|
|
52
|
-
|
|
79
|
+
We merged your local files with your environment's files ${this.attempts} times,
|
|
80
|
+
but your local and environment's files still don't match.
|
|
53
81
|
|
|
54
|
-
|
|
55
|
-
and try again.
|
|
82
|
+
Make sure no one else is editing files on your environment, and try again.
|
|
56
83
|
`;
|
|
57
84
|
}
|
|
58
85
|
constructor(attempts){
|
|
59
|
-
super(`Failed to
|
|
86
|
+
super(`Failed to synchronize files after ${attempts} attempts.`);
|
|
60
87
|
_define_property(this, "attempts", void 0);
|
|
61
88
|
_define_property(this, "isBug", void 0);
|
|
62
89
|
this.attempts = attempts;
|
|
63
90
|
this.isBug = IsBug.MAYBE;
|
|
64
91
|
}
|
|
65
92
|
}
|
|
93
|
+
export class DeployDisallowedError extends GGTError {
|
|
94
|
+
render() {
|
|
95
|
+
let output = sprintln`{red Gadget has detected the following fatal errors with your files:}`;
|
|
96
|
+
output += sprintProblems({
|
|
97
|
+
ensureEmptyLineAbove: true,
|
|
98
|
+
problems: this.fatalErrors,
|
|
99
|
+
showFileTypes: false
|
|
100
|
+
});
|
|
101
|
+
output += sprintln({
|
|
102
|
+
ensureEmptyLineAbove: true
|
|
103
|
+
})`{red Please fix these errors and try again.}`;
|
|
104
|
+
return output;
|
|
105
|
+
}
|
|
106
|
+
constructor(fatalErrors){
|
|
107
|
+
super("This application is not allowed to be deployed due to fatal errors.");
|
|
108
|
+
_define_property(this, "fatalErrors", void 0);
|
|
109
|
+
_define_property(this, "isBug", void 0);
|
|
110
|
+
this.fatalErrors = fatalErrors;
|
|
111
|
+
this.isBug = IsBug.MAYBE;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export const isFilesVersionMismatchError = (error)=>{
|
|
115
|
+
if (error instanceof ClientError) {
|
|
116
|
+
error = error.cause;
|
|
117
|
+
}
|
|
118
|
+
if (isGraphQLResult(error)) {
|
|
119
|
+
error = error.errors;
|
|
120
|
+
}
|
|
121
|
+
if (isGraphQLErrors(error)) {
|
|
122
|
+
error = error[0];
|
|
123
|
+
}
|
|
124
|
+
return isObject(error) && "message" in error && isString(error.message) && error.message.includes("Files version mismatch");
|
|
125
|
+
};
|
|
126
|
+
export const swallowFilesVersionMismatch = (ctx, error)=>{
|
|
127
|
+
if (isFilesVersionMismatchError(error)) {
|
|
128
|
+
ctx.log.debug("swallowing files version mismatch", {
|
|
129
|
+
error
|
|
130
|
+
});
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
134
|
+
};
|
|
66
135
|
|
|
67
136
|
//# sourceMappingURL=error.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/filesync/error.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/services/filesync/error.ts"],"sourcesContent":["import { ClientError } from \"../app/error.js\";\nimport type { Context } from \"../command/context.js\";\nimport { sprintProblems, type Problems } from \"../output/problems.js\";\nimport { GGTError, IsBug } from \"../output/report.js\";\nimport { sprint, sprintln } from \"../output/sprint.js\";\nimport { isGraphQLErrors, isGraphQLResult, isObject, isString } from \"../util/is.js\";\nimport type { Directory } from \"./directory.js\";\nimport type { SyncJsonArgs } from \"./sync-json.js\";\n\nexport class YarnNotFoundError extends GGTError {\n isBug = IsBug.NO;\n\n constructor() {\n super(\"Yarn not found\");\n }\n\n protected render(): string {\n return sprint`\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 UnknownDirectoryError extends GGTError {\n isBug = IsBug.NO;\n\n constructor(\n readonly ctx: Context<SyncJsonArgs>,\n readonly opts: { directory: Directory },\n ) {\n super('The \".gadget/sync.json\" file was invalid or not found');\n }\n\n protected render(): string {\n const cmd = this.ctx.command;\n const dir = this.opts.directory.path;\n\n switch (cmd) {\n case \"open\":\n case \"status\":\n return sprint`\n A \".gadget/sync.json\" file is missing in this directory:\n\n ${dir}\n\n In order to use \"ggt ${cmd}\", you must run it within a directory\n that has already been initialized with \"ggt dev\".\n `;\n case \"dev\":\n return sprint`\n A \".gadget/sync.json\" file is missing in this directory:\n\n ${dir}\n\n If you're running \"ggt dev\" for the first time, we recommend\n using a gadget specific directory like this:\n\n ggt dev ~/gadget/${this.ctx.args[\"--app\"] ?? \"<name>\"}\n\n To use a non-empty directory without a \".gadget/sync.json\" file,\n run \"ggt dev\" again with the \"--allow-unknown-directory\" flag:\n\n ggt dev ${dir} --allow-unknown-directory\n `;\n default:\n return sprint`\n A \".gadget/sync.json\" file is missing in this directory:\n\n ${dir}\n\n If you're certain you want to use this directory, you can run\n \"ggt ${cmd}\" again with the \"--allow-unknown-directory\" flag:\n\n ggt ${cmd} --allow-unknown-directory\n `;\n }\n }\n}\n\nexport class TooManyMergeAttemptsError extends GGTError {\n isBug = IsBug.MAYBE;\n\n constructor(readonly attempts: number) {\n super(`Failed to synchronize files after ${attempts} attempts.`);\n }\n\n protected render(): string {\n return sprint`\n We merged your local files with your environment's files ${this.attempts} times,\n but your local and environment's files still don't match.\n\n Make sure no one else is editing files on your environment, and try again.\n `;\n }\n}\n\nexport class DeployDisallowedError extends GGTError {\n isBug = IsBug.MAYBE;\n\n constructor(readonly fatalErrors: Problems) {\n super(\"This application is not allowed to be deployed due to fatal errors.\");\n }\n\n protected render(): string {\n let output = sprintln`{red Gadget has detected the following fatal errors with your files:}`;\n output += sprintProblems({ ensureEmptyLineAbove: true, problems: this.fatalErrors, showFileTypes: false });\n output += sprintln({ ensureEmptyLineAbove: true })`{red Please fix these errors and try again.}`;\n return output;\n }\n}\n\nexport const isFilesVersionMismatchError = (error: unknown): boolean => {\n if (error instanceof ClientError) {\n error = error.cause;\n }\n if (isGraphQLResult(error)) {\n error = error.errors;\n }\n if (isGraphQLErrors(error)) {\n error = error[0];\n }\n return isObject(error) && \"message\" in error && isString(error.message) && error.message.includes(\"Files version mismatch\");\n};\n\nexport const swallowFilesVersionMismatch = (ctx: Context, error: unknown): void => {\n if (isFilesVersionMismatchError(error)) {\n ctx.log.debug(\"swallowing files version mismatch\", { error });\n return;\n }\n throw error;\n};\n"],"names":["ClientError","sprintProblems","GGTError","IsBug","sprint","sprintln","isGraphQLErrors","isGraphQLResult","isObject","isString","YarnNotFoundError","render","constructor","isBug","NO","UnknownDirectoryError","cmd","ctx","command","dir","opts","directory","path","args","TooManyMergeAttemptsError","attempts","MAYBE","DeployDisallowedError","output","ensureEmptyLineAbove","problems","fatalErrors","showFileTypes","isFilesVersionMismatchError","error","cause","errors","message","includes","swallowFilesVersionMismatch","log","debug"],"mappings":"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"}
|