@gadgetinc/ggt 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +192 -128
  2. package/lib/__generated__/graphql.js.map +1 -1
  3. package/lib/commands/add.js +385 -0
  4. package/lib/commands/add.js.map +1 -0
  5. package/lib/commands/deploy.js +20 -102
  6. package/lib/commands/deploy.js.map +1 -1
  7. package/lib/commands/dev.js +43 -114
  8. package/lib/commands/dev.js.map +1 -1
  9. package/lib/commands/list.js +3 -6
  10. package/lib/commands/list.js.map +1 -1
  11. package/lib/commands/login.js +2 -5
  12. package/lib/commands/login.js.map +1 -1
  13. package/lib/commands/logout.js +2 -5
  14. package/lib/commands/logout.js.map +1 -1
  15. package/lib/commands/open.js +45 -86
  16. package/lib/commands/open.js.map +1 -1
  17. package/lib/commands/pull.js +19 -76
  18. package/lib/commands/pull.js.map +1 -1
  19. package/lib/commands/push.js +19 -76
  20. package/lib/commands/push.js.map +1 -1
  21. package/lib/commands/root.js +4 -3
  22. package/lib/commands/root.js.map +1 -1
  23. package/lib/commands/status.js +3 -8
  24. package/lib/commands/status.js.map +1 -1
  25. package/lib/commands/version.js +6 -5
  26. package/lib/commands/version.js.map +1 -1
  27. package/lib/commands/whoami.js +2 -5
  28. package/lib/commands/whoami.js.map +1 -1
  29. package/lib/ggt.js.map +1 -1
  30. package/lib/main.js.map +1 -1
  31. package/lib/services/app/api/api.js.map +1 -1
  32. package/lib/services/app/api/operation.js +11 -0
  33. package/lib/services/app/api/operation.js.map +1 -1
  34. package/lib/services/app/app.js +21 -2
  35. package/lib/services/app/app.js.map +1 -1
  36. package/lib/services/app/arg.js.map +1 -1
  37. package/lib/services/app/client.js +1 -5
  38. package/lib/services/app/client.js.map +1 -1
  39. package/lib/services/app/edit/edit.js.map +1 -1
  40. package/lib/services/app/edit/operation.js +52 -0
  41. package/lib/services/app/edit/operation.js.map +1 -1
  42. package/lib/services/app/error.js.map +1 -1
  43. package/lib/services/command/arg.js +3 -1
  44. package/lib/services/command/arg.js.map +1 -1
  45. package/lib/services/command/command.js +1 -0
  46. package/lib/services/command/command.js.map +1 -1
  47. package/lib/services/command/context.js.map +1 -1
  48. package/lib/services/config/config.js.map +1 -1
  49. package/lib/services/config/env.js.map +1 -1
  50. package/lib/services/config/package-json.js.map +1 -1
  51. package/lib/services/filesync/changes.js.map +1 -1
  52. package/lib/services/filesync/conflicts.js.map +1 -1
  53. package/lib/services/filesync/directory.js.map +1 -1
  54. package/lib/services/filesync/error.js +1 -0
  55. package/lib/services/filesync/error.js.map +1 -1
  56. package/lib/services/filesync/file.js.map +1 -1
  57. package/lib/services/filesync/filesync.js +179 -174
  58. package/lib/services/filesync/filesync.js.map +1 -1
  59. package/lib/services/filesync/hashes.js.map +1 -1
  60. package/lib/services/filesync/strategy.js.map +1 -1
  61. package/lib/services/filesync/sync-json.js.map +1 -1
  62. package/lib/services/http/auth.js.map +1 -1
  63. package/lib/services/http/http.js.map +1 -1
  64. package/lib/services/output/confirm.js.map +1 -1
  65. package/lib/services/output/footer.js.map +1 -1
  66. package/lib/services/output/log/field.js.map +1 -1
  67. package/lib/services/output/log/format/format.js.map +1 -1
  68. package/lib/services/output/log/format/json.js.map +1 -1
  69. package/lib/services/output/log/format/pretty.js.map +1 -1
  70. package/lib/services/output/log/level.js.map +1 -1
  71. package/lib/services/output/log/logger.js.map +1 -1
  72. package/lib/services/output/log/structured.js.map +1 -1
  73. package/lib/services/output/notify.js.map +1 -1
  74. package/lib/services/output/output.js.map +1 -1
  75. package/lib/services/output/print.js.map +1 -1
  76. package/lib/services/output/problems.js.map +1 -1
  77. package/lib/services/output/prompt.js.map +1 -1
  78. package/lib/services/output/report.js.map +1 -1
  79. package/lib/services/output/select.js.map +1 -1
  80. package/lib/services/output/spinner.js.map +1 -1
  81. package/lib/services/output/sprint.js.map +1 -1
  82. package/lib/services/output/symbols.js.map +1 -1
  83. package/lib/services/output/table.js.map +1 -1
  84. package/lib/services/output/timestamp.js.map +1 -1
  85. package/lib/services/output/update.js.map +1 -1
  86. package/lib/services/user/session.js.map +1 -1
  87. package/lib/services/user/user.js.map +1 -1
  88. package/lib/services/util/assert.js.map +1 -1
  89. package/lib/services/util/boolean.js.map +1 -1
  90. package/lib/services/util/collection.js.map +1 -1
  91. package/lib/services/util/function.js.map +1 -1
  92. package/lib/services/util/is.js.map +1 -1
  93. package/lib/services/util/json.js.map +1 -1
  94. package/lib/services/util/number.js.map +1 -1
  95. package/lib/services/util/object.js.map +1 -1
  96. package/lib/services/util/paths.js.map +1 -1
  97. package/lib/services/util/promise.js.map +1 -1
  98. package/lib/services/util/types.js.map +1 -1
  99. package/npm-shrinkwrap.json +2071 -1684
  100. package/package.json +30 -30
@@ -14,92 +14,51 @@ export const args = {
14
14
  type: Boolean
15
15
  }
16
16
  };
17
- export const usage = (ctx)=>{
18
- if (ctx.args["-h"]) {
19
- return sprint`
20
- Open a Gadget location in your browser.
21
-
22
- {bold USAGE}
23
- ggt open [LOCATION] [MODEL]
24
-
25
- {bold EXAMPLES}
26
- $ ggt open
27
- $ ggt open logs
28
- $ ggt open permissions
29
- $ ggt open data modelA
30
- $ ggt open schema modelA
31
- $ ggt open data --show-all
32
- $ ggt open schema --show-all
33
-
34
- {bold ARGUMENTS}
35
- LOCATION The location to open
36
- MODEL The model to open
37
-
38
- {bold FLAGS}
39
- -a, --app=<name> The application to open
40
- -e, --env=<env> The environment to open
41
- --show-all Show all available models to open
42
-
43
- Run "ggt open --help" for more information.
44
- `;
45
- }
17
+ export const usage = (_ctx)=>{
46
18
  return sprint`
47
- Open a Gadget location in your browser.
48
-
49
- {bold USAGE}
50
-
51
- ggt open [LOCATION] [MODEL] [--show-all]
52
- [--app=<name>] [--env=<name>]
53
-
54
- {bold EXAMPLES}
55
-
56
- $ ggt open
57
- $ ggt open logs
58
- $ ggt open permissions
59
- $ ggt open data modelA
60
- $ ggt open schema modelA
61
- $ ggt open data --show-all
62
- $ ggt open schema --show-all
63
-
64
- {bold ARGUMENTS}
65
-
66
- LOCATION
67
- The location to open in the browser.
68
-
69
- Can be one of the following:
70
- logs The log viewer
71
- permissions The permissions settings
72
- data The data viewer for the chosen model
73
- schema The schema viewer for the chosen model
74
-
75
- Defaults to opening the editor.
76
-
77
- MODEL
78
- The model to open in the browser.
79
-
80
- Only required for the "data" and "schema" locations.
81
-
82
- {bold FLAGS}
83
-
84
- -a, --app, --application=<name>
85
- The application to open.
86
-
87
- Defaults to the application within the ".gadget/sync.json"
88
- file in the current directory or any parent directories.
89
-
90
- -e, --env, --environment=<name>
91
- The environment to open.
92
-
93
- Defaults to the environment within the ".gadget/sync.json"
94
- file in the current directory or any parent directories.
95
-
96
- --show-all
97
- Makes "ggt open" display available models to open rather than
98
- exiting with an error if a model is not specified.
99
-
100
- Defaults to false.
101
-
102
- Run "ggt open -h" for less information.
19
+ This command opens a specific Gadget page in your browser, allowing you to directly access
20
+ various parts of your application's interface such as logs, permissions, data views, or
21
+ schemas.
22
+
23
+ {gray Usage}
24
+ ggt open [LOCATION] [model_name] [--show-all] [options]
25
+
26
+ LOCATION: specifies the part of Gadget to open, by default it'll open the apps home page:
27
+
28
+ + logs Opens logs
29
+ + permissions Opens permissions
30
+ + data Opens data editor for a specific model
31
+ + schema Opens schema editor for a specific model
32
+
33
+ {gray Options}
34
+ -a, --app <app_name> Selects the application to open in your browser. Default set on ".gadget/sync.json"
35
+ -e, --env <env_name> Selects the environment to open in your browser. Default set on ".gadget/sync.json"
36
+ --show-all Shows all schema, or data options by listing your available models
37
+
38
+ {gray Examples}
39
+ Opens editor home
40
+ {cyanBright $ ggt open}
41
+
42
+ Opens logs
43
+ {cyanBright $ ggt open logs}
44
+
45
+ Opens permissions
46
+ {cyanBright $ ggt open permissions}
47
+
48
+ Opens data editor for the 'post' model
49
+ {cyanBright $ ggt open data post}
50
+
51
+ Opens schema for 'post' model
52
+ {cyanBright $ ggt open schema post}
53
+
54
+ Shows all models available in the data editor
55
+ {cyanBright $ ggt open data -show-all}
56
+
57
+ Shows all models available in the schema viewer
58
+ {cyanBright $ ggt open schema --show-all}
59
+
60
+ Opens data editor for 'post' model of app 'myBlog' in the 'staging' environment
61
+ {cyanBright $ ggt open data post --app myBlog --env staging}
103
62
  `;
104
63
  };
105
64
  export const command = async (ctx)=>{
@@ -127,7 +86,7 @@ export const command = async (ctx)=>{
127
86
 
128
87
  Did you mean {blueBright ${closest}}?
129
88
 
130
- Run "ggt open -h" for usage.
89
+ Run "ggt open --help" for usage
131
90
  `);
132
91
  }
133
92
  switch(location){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/open.ts"],"sourcesContent":["import open from \"open\";\nimport { getModels } from \"../services/app/app.js\";\nimport { ArgError } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { UnknownDirectoryError } from \"../services/filesync/error.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { select } from \"../services/output/select.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { sortBySimilar } from \"../services/util/collection.js\";\nimport { isNever } from \"../services/util/is.js\";\n\nexport type OpenArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--show-all\": { type: Boolean },\n};\n\nexport const usage: Usage = (ctx) => {\n if (ctx.args[\"-h\"]) {\n return sprint`\n Open a Gadget location in your browser.\n\n {bold USAGE}\n ggt open [LOCATION] [MODEL]\n\n {bold EXAMPLES}\n $ ggt open\n $ ggt open logs\n $ ggt open permissions\n $ ggt open data modelA\n $ ggt open schema modelA\n $ ggt open data --show-all\n $ ggt open schema --show-all\n\n {bold ARGUMENTS}\n LOCATION The location to open\n MODEL The model to open\n\n {bold FLAGS}\n -a, --app=<name> The application to open\n -e, --env=<env> The environment to open\n --show-all Show all available models to open\n\n Run \"ggt open --help\" for more information.\n `;\n }\n\n return sprint`\n Open a Gadget location in your browser.\n\n {bold USAGE}\n\n ggt open [LOCATION] [MODEL] [--show-all]\n [--app=<name>] [--env=<name>]\n\n {bold EXAMPLES}\n\n $ ggt open\n $ ggt open logs\n $ ggt open permissions\n $ ggt open data modelA\n $ ggt open schema modelA\n $ ggt open data --show-all\n $ ggt open schema --show-all\n\n {bold ARGUMENTS}\n\n LOCATION\n The location to open in the browser.\n\n Can be one of the following:\n logs The log viewer\n permissions The permissions settings\n data The data viewer for the chosen model\n schema The schema viewer for the chosen model\n\n Defaults to opening the editor.\n\n MODEL\n The model to open in the browser.\n\n Only required for the \"data\" and \"schema\" locations.\n\n {bold FLAGS}\n\n -a, --app, --application=<name>\n The application to open.\n\n Defaults to the application within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n -e, --env, --environment=<name>\n The environment to open.\n\n Defaults to the environment within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n --show-all\n Makes \"ggt open\" display available models to open rather than\n exiting with an error if a model is not specified.\n\n Defaults to false.\n\n Run \"ggt open -h\" for less information.\n `;\n};\n\nexport const command: Command<OpenArgs> = async (ctx) => {\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.load(ctx, { directory });\n if (!syncJson) {\n throw new UnknownDirectoryError(ctx, { directory });\n }\n\n const location = ctx.args._[0] as Location | undefined;\n if (!location) {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}`);\n println`\n Opened editor for environment {cyanBright ${syncJson.env.name}}.\n `;\n return;\n }\n\n if (!Locations.includes(location)) {\n const [closest] = sortBySimilar(location, Locations);\n throw new ArgError(sprint`\n Unknown location {yellow ${location}}\n\n Did you mean {blueBright ${closest}}?\n\n Run \"ggt open -h\" for usage.\n `);\n }\n\n switch (location) {\n case \"logs\": {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/logs`);\n println`\n Opened log viewer for environment {cyanBright ${syncJson.env.name}}.\n `;\n break;\n }\n case \"permissions\": {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/settings/permissions`);\n println`\n Opened permissions settings for environment {cyanBright ${syncJson.env.name}}.\n `;\n break;\n }\n case \"data\":\n case \"schema\": {\n const view = ctx.args._[0];\n const remoteModelApiIdentifiers = (await getModels(ctx)).map((e) => e.apiIdentifier);\n\n let modelApiIdentifier = ctx.args._[1];\n if (!modelApiIdentifier) {\n if (ctx.args[\"--show-all\"]) {\n modelApiIdentifier = await select({ choices: remoteModelApiIdentifiers })(\"Which model do you wish to open?\");\n } else {\n throw new ArgError(sprint`\n \"ggt open ${view}\" requires a model to be specified.\n\n Run with \"--show-all\" to choose from available models.\n\n ggt open ${view} --show-all\n `);\n }\n }\n\n if (!remoteModelApiIdentifiers.includes(modelApiIdentifier)) {\n const [closest] = sortBySimilar(modelApiIdentifier, remoteModelApiIdentifiers);\n throw new ArgError(sprint`\n Unknown model {yellow ${modelApiIdentifier}}\n\n Did you mean {blueBright ${closest}}?\n\n Run with \"--show-all\" to choose from available models.\n\n ggt open ${view} --show-all\n `);\n }\n\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/model/${modelApiIdentifier}/${view}`);\n println`\n Opened ${view} viewer for environment {cyanBright ${syncJson.env.name}} for model {cyanBright ${modelApiIdentifier}}.\n `;\n break;\n }\n default:\n isNever(location);\n }\n};\n\nconst Locations = [\"logs\", \"permissions\", \"data\", \"schema\"] as const;\n\ntype Location = (typeof Locations)[number];\n"],"names":["open","getModels","ArgError","UnknownDirectoryError","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","select","sprint","sortBySimilar","isNever","args","type","Boolean","usage","ctx","command","directory","process","cwd","syncJson","load","location","_","app","primaryDomain","env","name","Locations","includes","closest","view","remoteModelApiIdentifiers","map","e","apiIdentifier","modelApiIdentifier","choices"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/open.ts"],"sourcesContent":["import open from \"open\";\nimport { getModels } from \"../services/app/app.js\";\nimport { ArgError } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { UnknownDirectoryError } from \"../services/filesync/error.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { select } from \"../services/output/select.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { sortBySimilar } from \"../services/util/collection.js\";\nimport { isNever } from \"../services/util/is.js\";\n\nexport type OpenArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--show-all\": { type: Boolean },\n};\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n This command opens a specific Gadget page in your browser, allowing you to directly access\n various parts of your application's interface such as logs, permissions, data views, or\n schemas.\n\n {gray Usage}\n ggt open [LOCATION] [model_name] [--show-all] [options]\n \n LOCATION: specifies the part of Gadget to open, by default it'll open the apps home page:\n\n + logs Opens logs\n + permissions Opens permissions\n + data Opens data editor for a specific model\n + schema Opens schema editor for a specific model\n\n {gray Options}\n -a, --app <app_name> Selects the application to open in your browser. Default set on \".gadget/sync.json\"\n -e, --env <env_name> Selects the environment to open in your browser. Default set on \".gadget/sync.json\"\n --show-all Shows all schema, or data options by listing your available models\n \n {gray Examples}\n Opens editor home\n {cyanBright $ ggt open}\n\n Opens logs \n {cyanBright $ ggt open logs} \n \n Opens permissions\n {cyanBright $ ggt open permissions}\n \n Opens data editor for the 'post' model\n {cyanBright $ ggt open data post}\n \n Opens schema for 'post' model\n {cyanBright $ ggt open schema post}\n \n Shows all models available in the data editor\n {cyanBright $ ggt open data -show-all}\n \n Shows all models available in the schema viewer\n {cyanBright $ ggt open schema --show-all}\n \n Opens data editor for 'post' model of app 'myBlog' in the 'staging' environment \n {cyanBright $ ggt open data post --app myBlog --env staging}\n `;\n};\n\nexport const command: Command<OpenArgs> = async (ctx) => {\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.load(ctx, { directory });\n if (!syncJson) {\n throw new UnknownDirectoryError(ctx, { directory });\n }\n\n const location = ctx.args._[0] as Location | undefined;\n if (!location) {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}`);\n println`\n Opened editor for environment {cyanBright ${syncJson.env.name}}.\n `;\n return;\n }\n\n if (!Locations.includes(location)) {\n const [closest] = sortBySimilar(location, Locations);\n throw new ArgError(sprint`\n Unknown location {yellow ${location}}\n\n Did you mean {blueBright ${closest}}?\n\n Run \"ggt open --help\" for usage\n `);\n }\n\n switch (location) {\n case \"logs\": {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/logs`);\n println`\n Opened log viewer for environment {cyanBright ${syncJson.env.name}}.\n `;\n break;\n }\n case \"permissions\": {\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/settings/permissions`);\n println`\n Opened permissions settings for environment {cyanBright ${syncJson.env.name}}.\n `;\n break;\n }\n case \"data\":\n case \"schema\": {\n const view = ctx.args._[0];\n const remoteModelApiIdentifiers = (await getModels(ctx)).map((e) => e.apiIdentifier);\n\n let modelApiIdentifier = ctx.args._[1];\n if (!modelApiIdentifier) {\n if (ctx.args[\"--show-all\"]) {\n modelApiIdentifier = await select({ choices: remoteModelApiIdentifiers })(\"Which model do you wish to open?\");\n } else {\n throw new ArgError(sprint`\n \"ggt open ${view}\" requires a model to be specified.\n\n Run with \"--show-all\" to choose from available models.\n\n ggt open ${view} --show-all\n `);\n }\n }\n\n if (!remoteModelApiIdentifiers.includes(modelApiIdentifier)) {\n const [closest] = sortBySimilar(modelApiIdentifier, remoteModelApiIdentifiers);\n throw new ArgError(sprint`\n Unknown model {yellow ${modelApiIdentifier}}\n\n Did you mean {blueBright ${closest}}?\n\n Run with \"--show-all\" to choose from available models.\n\n ggt open ${view} --show-all\n `);\n }\n\n await open(`https://${syncJson.app.primaryDomain}/edit/${syncJson.env.name}/model/${modelApiIdentifier}/${view}`);\n println`\n Opened ${view} viewer for environment {cyanBright ${syncJson.env.name}} for model {cyanBright ${modelApiIdentifier}}.\n `;\n break;\n }\n default:\n isNever(location);\n }\n};\n\nconst Locations = [\"logs\", \"permissions\", \"data\", \"schema\"] as const;\n\ntype Location = (typeof Locations)[number];\n"],"names":["open","getModels","ArgError","UnknownDirectoryError","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","select","sprint","sortBySimilar","isNever","args","type","Boolean","usage","_ctx","command","ctx","directory","process","cwd","syncJson","load","location","_","app","primaryDomain","env","name","Locations","includes","closest","view","remoteModelApiIdentifiers","map","e","apiIdentifier","modelApiIdentifier","choices"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -10,83 +10,26 @@ export const args = {
10
10
  alias: "-f"
11
11
  }
12
12
  };
13
- export const usage = (ctx)=>{
14
- if (ctx.args["-h"]) {
15
- return sprint`
16
- Pull your environment's files to your local filesystem.
17
- Changes are tracked from the last "ggt dev", "ggt push", or
18
- "ggt pull" run locally.
19
-
20
- {bold USAGE}
21
- ggt pull
22
-
23
- {bold EXAMPLES}
24
- $ ggt pull
25
- $ ggt pull --env=staging
26
- $ ggt pull --env=staging --force
27
-
28
- {bold FLAGS}
29
- -a, --app=<name> The application to pull files from
30
- -e, --env=<name> The environment to pull files from
31
- --force Discard changes to your local filesystem
32
-
33
- Run "ggt pull --help" for more information.
34
- `;
35
- }
13
+ export const usage = (_ctx)=>{
36
14
  return sprint`
37
- Pull your environment's files to your local filesystem.
38
- Changes are tracked from the last "ggt dev", "ggt push", or
39
- "ggt pull" run locally.
40
-
41
- If you have un-pushed changes, and "--force" is not passed,
42
- you will be prompted to {underline discard them} or abort the pull.
43
-
44
- {bold USAGE}
45
-
46
- ggt pull [--app=<name>] [--env=<name>] [--force]
47
- [--allow-unknown-directory] [--allow-different-app]
48
-
49
- {bold EXAMPLES}
50
-
51
- $ ggt pull
52
- $ ggt pull --env=staging
53
- $ ggt pull --env=staging --force
54
- $ ggt pull --env=staging --force --allow-unknown-directory
55
-
56
- {bold FLAGS}
57
-
58
- -a, --app, --application=<name>
59
- The application to pull files from.
60
-
61
- Defaults to the application within the ".gadget/sync.json"
62
- file in the current directory or any parent directories.
63
-
64
- -e, --env, --environment=<name>
65
- The environment to pull files from.
66
-
67
- Defaults to the environment within the ".gadget/sync.json"
68
- file in the current directory or any parent directories.
69
-
70
- -f, --force
71
- Discard any changes made to your local filesystem
72
- since the last "ggt dev", "ggt push", or "ggt pull".
73
-
74
- Defaults to false.
75
-
76
- --allow-unknown-directory
77
- Allows "ggt pull" to continue when the current directory, nor
78
- any parent directories, contain a ".gadget/sync.json" file
79
- within it.
80
-
81
- Defaults to false.
82
-
83
- --allow-different-app
84
- Allows "ggt pull" to continue with a different "--app" than the
85
- one found within the ".gadget/sync.json" file.
86
-
87
- Defaults to false.
88
-
89
- Run "ggt pull -h" for less information.
15
+ Pulls your environment files to your local directory.
16
+
17
+ This command first tracks changes in your local directory since the last sync. If changes are
18
+ detected, you will be prompted to discard them or abort the pull.
19
+
20
+ {gray Usage}
21
+ ggt pull [options]
22
+
23
+ {gray Options}
24
+ -a, --app <app_name> Selects the app to pull your environment changes from. Default set on ".gadget/sync.json"
25
+ --from, -e, --env <env_name> Selects the environment to pull changes from. Default set on ".gadget/sync.json"
26
+ --force Forces a pull by discarding any changes made on your local directory since last sync
27
+ --allow-different-directory Pulls changes from any environment directory, even if the ".gadget/sync.json" file is missing
28
+ --allow-different-app Pulls changes to a different app using --app command, instead of the one in the “.gadget/sync.json” file
29
+
30
+ {gray Examples}
31
+ Pull all development environment changes by discarding any changes made locally
32
+ {cyanBright $ ggt pull --env development --force}
90
33
  `;
91
34
  };
92
35
  export const command = async (ctx)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/pull.ts"],"sourcesContent":["import { ArgError, type ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type PullArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--force\": { type: Boolean, alias: \"-f\" },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = (ctx) => {\n if (ctx.args[\"-h\"]) {\n return sprint`\n Pull your environment's files to your local filesystem.\n Changes are tracked from the last \"ggt dev\", \"ggt push\", or\n \"ggt pull\" run locally.\n\n {bold USAGE}\n ggt pull\n\n {bold EXAMPLES}\n $ ggt pull\n $ ggt pull --env=staging\n $ ggt pull --env=staging --force\n\n {bold FLAGS}\n -a, --app=<name> The application to pull files from\n -e, --env=<name> The environment to pull files from\n --force Discard changes to your local filesystem\n\n Run \"ggt pull --help\" for more information.\n `;\n }\n\n return sprint`\n Pull your environment's files to your local filesystem.\n Changes are tracked from the last \"ggt dev\", \"ggt push\", or\n \"ggt pull\" run locally.\n\n If you have un-pushed changes, and \"--force\" is not passed,\n you will be prompted to {underline discard them} or abort the pull.\n\n {bold USAGE}\n\n ggt pull [--app=<name>] [--env=<name>] [--force]\n [--allow-unknown-directory] [--allow-different-app]\n\n {bold EXAMPLES}\n\n $ ggt pull\n $ ggt pull --env=staging\n $ ggt pull --env=staging --force\n $ ggt pull --env=staging --force --allow-unknown-directory\n\n {bold FLAGS}\n\n -a, --app, --application=<name>\n The application to pull files from.\n\n Defaults to the application within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n -e, --env, --environment=<name>\n The environment to pull files from.\n\n Defaults to the environment within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n -f, --force\n Discard any changes made to your local filesystem\n since the last \"ggt dev\", \"ggt push\", or \"ggt pull\".\n\n Defaults to false.\n\n --allow-unknown-directory\n Allows \"ggt pull\" to continue when the current directory, nor\n any parent directories, contain a \".gadget/sync.json\" file\n within it.\n\n Defaults to false.\n\n --allow-different-app\n Allows \"ggt pull\" to continue with a different \"--app\" than the\n one found within the \".gadget/sync.json\" file.\n\n Defaults to false.\n\n Run \"ggt pull -h\" for less information.\n `;\n};\n\nexport const command: Command<PullArgs> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt pull\" does not take any positional arguments.\n\n If you are trying to pull changes to a specific directory,\n you must \"cd\" to that directory and then run \"ggt push\".\n\n Run \"ggt pull -h\" for more information.\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.loadOrInit(ctx, { directory });\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n\n if (hashes.environmentChangesToPull.size === 0) {\n println({ ensureEmptyLineAbove: true })`\n Nothing to pull.\n `;\n return;\n }\n\n if (hashes.localChangesToPush.size > 0) {\n // show them the local changes they will discard\n await filesync.print(ctx, { hashes });\n }\n\n await filesync.pull(ctx, { hashes });\n};\n"],"names":["ArgError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","sprint","args","type","Boolean","alias","usage","ctx","command","_","length","directory","process","cwd","syncJson","loadOrInit","filesync","hashes","environmentChangesToPull","size","ensureEmptyLineAbove","localChangesToPush","print","pull"],"mappings":"AAAA,SAASA,QAAQ,QAA6B,6BAA6B;AAE3E,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAO;IAClB,GAAGJ,YAAY;IACf,WAAW;QAAEK,MAAMC;QAASC,OAAO;IAAK;AAC1C,EAA2B;AAE3B,OAAO,MAAMC,QAAe,CAACC;IAC3B,IAAIA,IAAIL,IAAI,CAAC,KAAK,EAAE;QAClB,OAAOD,MAAM,CAAC;;;;;;;;;;;;;;;;;;;IAmBd,CAAC;IACH;IAEA,OAAOA,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMO,UAA6B,OAAOD;IAC/C,IAAIA,IAAIL,IAAI,CAACO,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAIf,SAASM,MAAM,CAAC;;;;;;;IAO1B,CAAC;IACH;IAEA,MAAMU,YAAY,MAAMZ,sBAAsBa,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMjB,SAASkB,UAAU,CAACR,KAAK;QAAEI;IAAU;IAC5D,MAAMK,WAAW,IAAIpB,SAASkB;IAC9B,MAAMG,SAAS,MAAMD,SAASC,MAAM,CAACV;IAErC,IAAIU,OAAOC,wBAAwB,CAACC,IAAI,KAAK,GAAG;QAC9CnB,QAAQ;YAAEoB,sBAAsB;QAAK,EAAE,CAAC;;IAExC,CAAC;QACD;IACF;IAEA,IAAIH,OAAOI,kBAAkB,CAACF,IAAI,GAAG,GAAG;QACtC,gDAAgD;QAChD,MAAMH,SAASM,KAAK,CAACf,KAAK;YAAEU;QAAO;IACrC;IAEA,MAAMD,SAASO,IAAI,CAAChB,KAAK;QAAEU;IAAO;AACpC,EAAE"}
1
+ {"version":3,"sources":["../../src/commands/pull.ts"],"sourcesContent":["import { ArgError, type ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type PullArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--force\": { type: Boolean, alias: \"-f\" },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n Pulls your environment files to your local directory.\n\n This command first tracks changes in your local directory since the last sync. If changes are\n detected, you will be prompted to discard them or abort the pull.\n\n {gray Usage}\n ggt pull [options]\n \n {gray Options}\n -a, --app <app_name> Selects the app to pull your environment changes from. Default set on \".gadget/sync.json\"\n --from, -e, --env <env_name> Selects the environment to pull changes from. Default set on \".gadget/sync.json\"\n --force Forces a pull by discarding any changes made on your local directory since last sync\n --allow-different-directory Pulls changes from any environment directory, even if the \".gadget/sync.json\" file is missing\n --allow-different-app Pulls changes to a different app using --app command, instead of the one in the “.gadget/sync.json file\n \n {gray Examples}\n Pull all development environment changes by discarding any changes made locally\n {cyanBright $ ggt pull --env development --force}\n `;\n};\n\nexport const command: Command<PullArgs> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt pull\" does not take any positional arguments.\n\n If you are trying to pull changes to a specific directory,\n you must \"cd\" to that directory and then run \"ggt push\".\n\n Run \"ggt pull -h\" for more information.\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.loadOrInit(ctx, { directory });\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n\n if (hashes.environmentChangesToPull.size === 0) {\n println({ ensureEmptyLineAbove: true })`\n Nothing to pull.\n `;\n return;\n }\n\n if (hashes.localChangesToPush.size > 0) {\n // show them the local changes they will discard\n await filesync.print(ctx, { hashes });\n }\n\n await filesync.pull(ctx, { hashes });\n};\n"],"names":["ArgError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","sprint","args","type","Boolean","alias","usage","_ctx","command","ctx","_","length","directory","process","cwd","syncJson","loadOrInit","filesync","hashes","environmentChangesToPull","size","ensureEmptyLineAbove","localChangesToPush","print","pull"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAA6B,6BAA6B;AAE3E,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAO;IAClB,GAAGJ,YAAY;IACf,WAAW;QAAEK,MAAMC;QAASC,OAAO;IAAK;AAC1C,EAA2B;AAE3B,OAAO,MAAMC,QAAe,CAACC;IAC3B,OAAON,MAAM,CAAC;;;;;;;;;;;;;;;;;;;EAmBd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMO,UAA6B,OAAOC;IAC/C,IAAIA,IAAIP,IAAI,CAACQ,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAIhB,SAASM,MAAM,CAAC;;;;;;;IAO1B,CAAC;IACH;IAEA,MAAMW,YAAY,MAAMb,sBAAsBc,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMlB,SAASmB,UAAU,CAACP,KAAK;QAAEG;IAAU;IAC5D,MAAMK,WAAW,IAAIrB,SAASmB;IAC9B,MAAMG,SAAS,MAAMD,SAASC,MAAM,CAACT;IAErC,IAAIS,OAAOC,wBAAwB,CAACC,IAAI,KAAK,GAAG;QAC9CpB,QAAQ;YAAEqB,sBAAsB;QAAK,EAAE,CAAC;;IAExC,CAAC;QACD;IACF;IAEA,IAAIH,OAAOI,kBAAkB,CAACF,IAAI,GAAG,GAAG;QACtC,gDAAgD;QAChD,MAAMH,SAASM,KAAK,CAACd,KAAK;YAAES;QAAO;IACrC;IAEA,MAAMD,SAASO,IAAI,CAACf,KAAK;QAAES;IAAO;AACpC,EAAE"}
@@ -10,83 +10,26 @@ export const args = {
10
10
  alias: "-f"
11
11
  }
12
12
  };
13
- export const usage = (ctx)=>{
14
- if (ctx.args["-h"]) {
15
- return sprint`
16
- Push your local files to your environment's filesystem.
17
- Changes are tracked from the last "ggt dev", "ggt push", or
18
- "ggt pull" run locally.
19
-
20
- {bold USAGE}
21
- ggt push
22
-
23
- {bold EXAMPLES}
24
- $ ggt push
25
- $ ggt push --env=staging
26
- $ ggt push --env=staging --force
27
-
28
- {bold FLAGS}
29
- -a, --app=<name> The application to push files to
30
- -e, --env=<name> The environment to push files to
31
- --force Discard changes to your environment's filesystem
32
-
33
- Run "ggt push --help" for more information.
34
- `;
35
- }
13
+ export const usage = (_ctx)=>{
36
14
  return sprint`
37
- Push your local files to your environment's filesystem.
38
- Changes are tracked from the last "ggt dev", "ggt push", or
39
- "ggt pull" run locally.
40
-
41
- If your environment has un-pulled changes, and "--force" is not passed,
42
- you will be prompted to {underline discard them} or abort the push.
43
-
44
- {bold USAGE}
45
-
46
- ggt push [--app=<name>] [--env=<name>] [--force]
47
- [--allow-unknown-directory] [--allow-different-app]
48
-
49
- {bold EXAMPLES}
50
-
51
- $ ggt push
52
- $ ggt push --env=staging
53
- $ ggt push --env=staging --force
54
- $ ggt push --env=staging --force --allow-unknown-directory
55
-
56
- {bold FLAGS}
57
-
58
- -a, --app, --application=<name>
59
- The application to push files to.
60
-
61
- Defaults to the application within the ".gadget/sync.json"
62
- file in the current directory or any parent directories.
63
-
64
- -e, --env, --environment=<name>
65
- The environment to push files to.
66
-
67
- Defaults to the environment within the ".gadget/sync.json"
68
- file in the current directory or any parent directories.
69
-
70
- -f, --force
71
- Discard any changes made to your environment's filesystem
72
- since the last "ggt dev", "ggt push", or "ggt pull".
73
-
74
- Defaults to false.
75
-
76
- --allow-unknown-directory
77
- Allows "ggt push" to continue when the current directory, nor
78
- any parent directories, contain a ".gadget/sync.json" file
79
- within it.
80
-
81
- Defaults to false.
82
-
83
- --allow-different-app
84
- Allows "ggt push" to continue with a different "--app" than the
85
- one found within the ".gadget/sync.json" file.
86
-
87
- Defaults to false.
88
-
89
- Run "ggt push -h" for less information.
15
+ Pushes your local files to your environment directory.
16
+
17
+ This command first tracks changes in your environment directory since the last sync.
18
+ If changes are detected, you will be prompted to discard them or abort the push.
19
+
20
+ {gray Usage}
21
+ ggt push [options]
22
+
23
+ {gray Options}
24
+ -a, --app <app_name> Selects the app to push local changes to. Default set on ".gadget/sync.json"
25
+ --from, -e, --env <env_name> Selects the environment to push local changes to. Default set on ".gadget/sync.json"
26
+ --force Forces a push by discarding any changes made on your environment directory since last sync
27
+ --allow-different-directory Pushes changes from any local directory with existing files, even if the ".gadget/sync.json" file is missing
28
+ --allow-different-app Pushes changes to an app using --app command, instead of the one in the “.gadget/sync.json” file
29
+
30
+ {gray Examples}
31
+ Push all local changes to the main environment by discarding any changes made on main
32
+ {cyanBright $ ggt push --env main --force}
90
33
  `;
91
34
  };
92
35
  export const command = async (ctx)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/push.ts"],"sourcesContent":["import { ArgError, type ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type PushArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--force\": { type: Boolean, alias: \"-f\" },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = (ctx) => {\n if (ctx.args[\"-h\"]) {\n return sprint`\n Push your local files to your environment's filesystem.\n Changes are tracked from the last \"ggt dev\", \"ggt push\", or\n \"ggt pull\" run locally.\n\n {bold USAGE}\n ggt push\n\n {bold EXAMPLES}\n $ ggt push\n $ ggt push --env=staging\n $ ggt push --env=staging --force\n\n {bold FLAGS}\n -a, --app=<name> The application to push files to\n -e, --env=<name> The environment to push files to\n --force Discard changes to your environment's filesystem\n\n Run \"ggt push --help\" for more information.\n `;\n }\n\n return sprint`\n Push your local files to your environment's filesystem.\n Changes are tracked from the last \"ggt dev\", \"ggt push\", or\n \"ggt pull\" run locally.\n\n If your environment has un-pulled changes, and \"--force\" is not passed,\n you will be prompted to {underline discard them} or abort the push.\n\n {bold USAGE}\n\n ggt push [--app=<name>] [--env=<name>] [--force]\n [--allow-unknown-directory] [--allow-different-app]\n\n {bold EXAMPLES}\n\n $ ggt push\n $ ggt push --env=staging\n $ ggt push --env=staging --force\n $ ggt push --env=staging --force --allow-unknown-directory\n\n {bold FLAGS}\n\n -a, --app, --application=<name>\n The application to push files to.\n\n Defaults to the application within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n -e, --env, --environment=<name>\n The environment to push files to.\n\n Defaults to the environment within the \".gadget/sync.json\"\n file in the current directory or any parent directories.\n\n -f, --force\n Discard any changes made to your environment's filesystem\n since the last \"ggt dev\", \"ggt push\", or \"ggt pull\".\n\n Defaults to false.\n\n --allow-unknown-directory\n Allows \"ggt push\" to continue when the current directory, nor\n any parent directories, contain a \".gadget/sync.json\" file\n within it.\n\n Defaults to false.\n\n --allow-different-app\n Allows \"ggt push\" to continue with a different \"--app\" than the\n one found within the \".gadget/sync.json\" file.\n\n Defaults to false.\n\n Run \"ggt push -h\" for less information.\n `;\n};\n\nexport const command: Command<typeof args> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt push\" does not take any positional arguments.\n\n If you are trying to push changes from a specific directory,\n you must \"cd\" to that directory and then run \"ggt push\".\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.loadOrInit(ctx, { directory });\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n\n if (hashes.localChangesToPush.size === 0) {\n println({ ensureEmptyLineAbove: true })`\n Nothing to push.\n `;\n return;\n }\n\n if (hashes.environmentChangesToPull.size > 0 && !hashes.onlyDotGadgetFilesChanged) {\n // show them the environment changes they will discard\n await filesync.print(ctx, { hashes });\n }\n\n await filesync.push(ctx, { hashes });\n};\n"],"names":["ArgError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","sprint","args","type","Boolean","alias","usage","ctx","command","_","length","directory","process","cwd","syncJson","loadOrInit","filesync","hashes","localChangesToPush","size","ensureEmptyLineAbove","environmentChangesToPull","onlyDotGadgetFilesChanged","print","push"],"mappings":"AAAA,SAASA,QAAQ,QAA6B,6BAA6B;AAE3E,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAO;IAClB,GAAGJ,YAAY;IACf,WAAW;QAAEK,MAAMC;QAASC,OAAO;IAAK;AAC1C,EAA2B;AAE3B,OAAO,MAAMC,QAAe,CAACC;IAC3B,IAAIA,IAAIL,IAAI,CAAC,KAAK,EAAE;QAClB,OAAOD,MAAM,CAAC;;;;;;;;;;;;;;;;;;;IAmBd,CAAC;IACH;IAEA,OAAOA,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMO,UAAgC,OAAOD;IAClD,IAAIA,IAAIL,IAAI,CAACO,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAIf,SAASM,MAAM,CAAC;;;;;IAK1B,CAAC;IACH;IAEA,MAAMU,YAAY,MAAMZ,sBAAsBa,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMjB,SAASkB,UAAU,CAACR,KAAK;QAAEI;IAAU;IAC5D,MAAMK,WAAW,IAAIpB,SAASkB;IAC9B,MAAMG,SAAS,MAAMD,SAASC,MAAM,CAACV;IAErC,IAAIU,OAAOC,kBAAkB,CAACC,IAAI,KAAK,GAAG;QACxCnB,QAAQ;YAAEoB,sBAAsB;QAAK,EAAE,CAAC;;IAExC,CAAC;QACD;IACF;IAEA,IAAIH,OAAOI,wBAAwB,CAACF,IAAI,GAAG,KAAK,CAACF,OAAOK,yBAAyB,EAAE;QACjF,sDAAsD;QACtD,MAAMN,SAASO,KAAK,CAAChB,KAAK;YAAEU;QAAO;IACrC;IAEA,MAAMD,SAASQ,IAAI,CAACjB,KAAK;QAAEU;IAAO;AACpC,EAAE"}
1
+ {"version":3,"sources":["../../src/commands/push.ts"],"sourcesContent":["import { ArgError, type ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type PushArgs = typeof args;\n\nexport const args = {\n ...SyncJsonArgs,\n \"--force\": { type: Boolean, alias: \"-f\" },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n Pushes your local files to your environment directory.\n\n This command first tracks changes in your environment directory since the last sync.\n If changes are detected, you will be prompted to discard them or abort the push.\n\n {gray Usage}\n ggt push [options]\n \n {gray Options}\n -a, --app <app_name> Selects the app to push local changes to. Default set on \".gadget/sync.json\"\n --from, -e, --env <env_name> Selects the environment to push local changes to. Default set on \".gadget/sync.json\"\n --force Forces a push by discarding any changes made on your environment directory since last sync\n --allow-different-directory Pushes changes from any local directory with existing files, even if the \".gadget/sync.json\" file is missing\n --allow-different-app Pushes changes to an app using --app command, instead of the one in the “.gadget/sync.json file\n \n {gray Examples}\n Push all local changes to the main environment by discarding any changes made on main\n {cyanBright $ ggt push --env main --force}\n `;\n};\n\nexport const command: Command<typeof args> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt push\" does not take any positional arguments.\n\n If you are trying to push changes from a specific directory,\n you must \"cd\" to that directory and then run \"ggt push\".\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.loadOrInit(ctx, { directory });\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n\n if (hashes.localChangesToPush.size === 0) {\n println({ ensureEmptyLineAbove: true })`\n Nothing to push.\n `;\n return;\n }\n\n if (hashes.environmentChangesToPull.size > 0 && !hashes.onlyDotGadgetFilesChanged) {\n // show them the environment changes they will discard\n await filesync.print(ctx, { hashes });\n }\n\n await filesync.push(ctx, { hashes });\n};\n"],"names":["ArgError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","println","sprint","args","type","Boolean","alias","usage","_ctx","command","ctx","_","length","directory","process","cwd","syncJson","loadOrInit","filesync","hashes","localChangesToPush","size","ensureEmptyLineAbove","environmentChangesToPull","onlyDotGadgetFilesChanged","print","push"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAA6B,6BAA6B;AAE3E,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAO;IAClB,GAAGJ,YAAY;IACf,WAAW;QAAEK,MAAMC;QAASC,OAAO;IAAK;AAC1C,EAA2B;AAE3B,OAAO,MAAMC,QAAe,CAACC;IAC3B,OAAON,MAAM,CAAC;;;;;;;;;;;;;;;;;;;EAmBd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMO,UAAgC,OAAOC;IAClD,IAAIA,IAAIP,IAAI,CAACQ,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAIhB,SAASM,MAAM,CAAC;;;;;IAK1B,CAAC;IACH;IAEA,MAAMW,YAAY,MAAMb,sBAAsBc,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMlB,SAASmB,UAAU,CAACP,KAAK;QAAEG;IAAU;IAC5D,MAAMK,WAAW,IAAIrB,SAASmB;IAC9B,MAAMG,SAAS,MAAMD,SAASC,MAAM,CAACT;IAErC,IAAIS,OAAOC,kBAAkB,CAACC,IAAI,KAAK,GAAG;QACxCpB,QAAQ;YAAEqB,sBAAsB;QAAK,EAAE,CAAC;;IAExC,CAAC;QACD;IACF;IAEA,IAAIH,OAAOI,wBAAwB,CAACF,IAAI,GAAG,KAAK,CAACF,OAAOK,yBAAyB,EAAE;QACjF,sDAAsD;QACtD,MAAMN,SAASO,KAAK,CAACf,KAAK;YAAES;QAAO;IACrC;IAEA,MAAMD,SAASQ,IAAI,CAAChB,KAAK;QAAES;IAAO;AACpC,EAAE"}
@@ -32,15 +32,16 @@ export const usage = ()=>{
32
32
  return sprint`
33
33
  The command-line interface for Gadget.
34
34
 
35
- {bold USAGE}
35
+ {gray Usage}
36
36
  ggt [COMMAND]
37
37
 
38
- {bold COMMANDS}
38
+ {gray Commands}
39
39
  dev Start developing your application
40
40
  deploy Deploy your environment to production
41
41
  status Show your local and environment's file changes
42
42
  push Push your local files to your environment
43
43
  pull Pull your environment's files to your local computer
44
+ add Add models, fields, actions and routes to your app
44
45
  open Open a Gadget location in your browser
45
46
  list List your available applications
46
47
  login Log in to your account
@@ -48,7 +49,7 @@ export const usage = ()=>{
48
49
  whoami Print the currently logged in account
49
50
  version Print this version of ggt
50
51
 
51
- {bold FLAGS}
52
+ {gray Flags}
52
53
  -h, --help Print how to use a command
53
54
  -v, --verbose Print more verbose output
54
55
  --telemetry Enable telemetry
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/root.ts"],"sourcesContent":["import arg from \"arg\";\nimport type { EmptyObject } from \"type-fest\";\nimport type { ArgsDefinition } from \"../services/command/arg.js\";\nimport { Commands, importCommand, isAvailableCommand, type Command, type Usage } from \"../services/command/command.js\";\nimport { verbosityToLevel } from \"../services/output/log/level.js\";\nimport { println } from \"../services/output/print.js\";\nimport { reportErrorAndExit } from \"../services/output/report.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { warnIfUpdateAvailable } from \"../services/output/update.js\";\nimport { sortBySimilar } from \"../services/util/collection.js\";\nimport { isNil } from \"../services/util/is.js\";\n\nexport type RootArgs = typeof args;\n\nexport const args = {\n \"-h\": { type: Boolean },\n \"--help\": { type: Boolean },\n \"--verbose\": { type: arg.COUNT, alias: [\"-v\", \"--debug\"] },\n \"--telemetry\": { type: Boolean },\n \"--json\": { type: Boolean },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = () => {\n return sprint`\n The command-line interface for Gadget.\n\n {bold USAGE}\n ggt [COMMAND]\n\n {bold COMMANDS}\n dev Start developing your application\n deploy Deploy your environment to production\n status Show your local and environment's file changes\n push Push your local files to your environment\n pull Pull your environment's files to your local computer\n open Open a Gadget location in your browser\n list List your available applications\n login Log in to your account\n logout Log out of your account\n whoami Print the currently logged in account\n version Print this version of ggt\n\n {bold FLAGS}\n -h, --help Print how to use a command\n -v, --verbose Print more verbose output\n --telemetry Enable telemetry\n\n Run \"ggt [COMMAND] -h\" for more information about a specific command.\n `;\n};\n\nexport const command: Command<EmptyObject, EmptyObject> = async (parent): Promise<void> => {\n const ctx = parent.child({\n name: \"root\",\n parse: args,\n argv: process.argv.slice(2),\n permissive: true,\n });\n\n if (ctx.args[\"--json\"]) {\n process.env[\"GGT_LOG_FORMAT\"] = \"json\";\n }\n\n if (ctx.args[\"--verbose\"]) {\n process.env[\"GGT_LOG_LEVEL\"] = verbosityToLevel(ctx.args[\"--verbose\"]).toString();\n }\n\n await warnIfUpdateAvailable(ctx);\n\n let cmd = ctx.args._.shift();\n if (isNil(cmd)) {\n println(usage(ctx));\n process.exit(0);\n }\n\n if (cmd === \"sync\") {\n ctx.log.debug('renaming \"sync\" to \"dev\" for backwards compatibility');\n cmd = \"dev\";\n }\n\n if (!isAvailableCommand(cmd)) {\n const [closest] = sortBySimilar(cmd, Commands);\n println`\n Unknown command {yellow ${cmd}}\n\n Did you mean {blueBright ${closest}}?\n\n Run {gray ggt --help} for usage\n `;\n process.exit(1);\n }\n\n const subcommand = await importCommand(cmd);\n\n if (ctx.args[\"-h\"] ?? ctx.args[\"--help\"]) {\n println(subcommand.usage(ctx));\n process.exit(0);\n }\n\n try {\n await subcommand.command(ctx.child({ command: cmd, name: cmd, parse: subcommand.args }));\n } catch (error) {\n await reportErrorAndExit(ctx, error);\n }\n};\n"],"names":["arg","Commands","importCommand","isAvailableCommand","verbosityToLevel","println","reportErrorAndExit","sprint","warnIfUpdateAvailable","sortBySimilar","isNil","args","type","Boolean","COUNT","alias","usage","command","parent","ctx","child","name","parse","argv","process","slice","permissive","env","toString","cmd","_","shift","exit","log","debug","closest","subcommand","error"],"mappings":"AAAA,OAAOA,SAAS,MAAM;AAGtB,SAASC,QAAQ,EAAEC,aAAa,EAAEC,kBAAkB,QAAkC,iCAAiC;AACvH,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,MAAM,QAAQ,+BAA+B;AACtD,SAASC,qBAAqB,QAAQ,+BAA+B;AACrE,SAASC,aAAa,QAAQ,iCAAiC;AAC/D,SAASC,KAAK,QAAQ,yBAAyB;AAI/C,OAAO,MAAMC,OAAO;IAClB,MAAM;QAAEC,MAAMC;IAAQ;IACtB,UAAU;QAAED,MAAMC;IAAQ;IAC1B,aAAa;QAAED,MAAMZ,IAAIc,KAAK;QAAEC,OAAO;YAAC;YAAM;SAAU;IAAC;IACzD,eAAe;QAAEH,MAAMC;IAAQ;IAC/B,UAAU;QAAED,MAAMC;IAAQ;AAC5B,EAA2B;AAE3B,OAAO,MAAMG,QAAe;IAC1B,OAAOT,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMU,UAA6C,OAAOC;IAC/D,MAAMC,MAAMD,OAAOE,KAAK,CAAC;QACvBC,MAAM;QACNC,OAAOX;QACPY,MAAMC,QAAQD,IAAI,CAACE,KAAK,CAAC;QACzBC,YAAY;IACd;IAEA,IAAIP,IAAIR,IAAI,CAAC,SAAS,EAAE;QACtBa,QAAQG,GAAG,CAAC,iBAAiB,GAAG;IAClC;IAEA,IAAIR,IAAIR,IAAI,CAAC,YAAY,EAAE;QACzBa,QAAQG,GAAG,CAAC,gBAAgB,GAAGvB,iBAAiBe,IAAIR,IAAI,CAAC,YAAY,EAAEiB,QAAQ;IACjF;IAEA,MAAMpB,sBAAsBW;IAE5B,IAAIU,MAAMV,IAAIR,IAAI,CAACmB,CAAC,CAACC,KAAK;IAC1B,IAAIrB,MAAMmB,MAAM;QACdxB,QAAQW,MAAMG;QACdK,QAAQQ,IAAI,CAAC;IACf;IAEA,IAAIH,QAAQ,QAAQ;QAClBV,IAAIc,GAAG,CAACC,KAAK,CAAC;QACdL,MAAM;IACR;IAEA,IAAI,CAAC1B,mBAAmB0B,MAAM;QAC5B,MAAM,CAACM,QAAQ,GAAG1B,cAAcoB,KAAK5B;QACrCI,OAAO,CAAC;8BACkB,EAAEwB,IAAI;;+BAEL,EAAEM,QAAQ;;;IAGrC,CAAC;QACDX,QAAQQ,IAAI,CAAC;IACf;IAEA,MAAMI,aAAa,MAAMlC,cAAc2B;IAEvC,IAAIV,IAAIR,IAAI,CAAC,KAAK,IAAIQ,IAAIR,IAAI,CAAC,SAAS,EAAE;QACxCN,QAAQ+B,WAAWpB,KAAK,CAACG;QACzBK,QAAQQ,IAAI,CAAC;IACf;IAEA,IAAI;QACF,MAAMI,WAAWnB,OAAO,CAACE,IAAIC,KAAK,CAAC;YAAEH,SAASY;YAAKR,MAAMQ;YAAKP,OAAOc,WAAWzB,IAAI;QAAC;IACvF,EAAE,OAAO0B,OAAO;QACd,MAAM/B,mBAAmBa,KAAKkB;IAChC;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/commands/root.ts"],"sourcesContent":["import arg from \"arg\";\nimport type { EmptyObject } from \"type-fest\";\nimport type { ArgsDefinition } from \"../services/command/arg.js\";\nimport { Commands, importCommand, isAvailableCommand, type Command, type Usage } from \"../services/command/command.js\";\nimport { verbosityToLevel } from \"../services/output/log/level.js\";\nimport { println } from \"../services/output/print.js\";\nimport { reportErrorAndExit } from \"../services/output/report.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { warnIfUpdateAvailable } from \"../services/output/update.js\";\nimport { sortBySimilar } from \"../services/util/collection.js\";\nimport { isNil } from \"../services/util/is.js\";\n\nexport type RootArgs = typeof args;\n\nexport const args = {\n \"-h\": { type: Boolean },\n \"--help\": { type: Boolean },\n \"--verbose\": { type: arg.COUNT, alias: [\"-v\", \"--debug\"] },\n \"--telemetry\": { type: Boolean },\n \"--json\": { type: Boolean },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = () => {\n return sprint`\n The command-line interface for Gadget.\n\n {gray Usage}\n ggt [COMMAND]\n\n {gray Commands}\n dev Start developing your application\n deploy Deploy your environment to production\n status Show your local and environment's file changes\n push Push your local files to your environment\n pull Pull your environment's files to your local computer\n add Add models, fields, actions and routes to your app \n open Open a Gadget location in your browser\n list List your available applications\n login Log in to your account\n logout Log out of your account\n whoami Print the currently logged in account\n version Print this version of ggt\n\n {gray Flags}\n -h, --help Print how to use a command\n -v, --verbose Print more verbose output\n --telemetry Enable telemetry\n\n Run \"ggt [COMMAND] -h\" for more information about a specific command.\n `;\n};\n\nexport const command: Command<EmptyObject, EmptyObject> = async (parent): Promise<void> => {\n const ctx = parent.child({\n name: \"root\",\n parse: args,\n argv: process.argv.slice(2),\n permissive: true,\n });\n\n if (ctx.args[\"--json\"]) {\n process.env[\"GGT_LOG_FORMAT\"] = \"json\";\n }\n\n if (ctx.args[\"--verbose\"]) {\n process.env[\"GGT_LOG_LEVEL\"] = verbosityToLevel(ctx.args[\"--verbose\"]).toString();\n }\n\n await warnIfUpdateAvailable(ctx);\n\n let cmd = ctx.args._.shift();\n if (isNil(cmd)) {\n println(usage(ctx));\n process.exit(0);\n }\n\n if (cmd === \"sync\") {\n ctx.log.debug('renaming \"sync\" to \"dev\" for backwards compatibility');\n cmd = \"dev\";\n }\n\n if (!isAvailableCommand(cmd)) {\n const [closest] = sortBySimilar(cmd, Commands);\n println`\n Unknown command {yellow ${cmd}}\n\n Did you mean {blueBright ${closest}}?\n\n Run {gray ggt --help} for usage\n `;\n process.exit(1);\n }\n\n const subcommand = await importCommand(cmd);\n\n if (ctx.args[\"-h\"] ?? ctx.args[\"--help\"]) {\n println(subcommand.usage(ctx));\n process.exit(0);\n }\n\n try {\n await subcommand.command(ctx.child({ command: cmd, name: cmd, parse: subcommand.args }));\n } catch (error) {\n await reportErrorAndExit(ctx, error);\n }\n};\n"],"names":["arg","Commands","importCommand","isAvailableCommand","verbosityToLevel","println","reportErrorAndExit","sprint","warnIfUpdateAvailable","sortBySimilar","isNil","args","type","Boolean","COUNT","alias","usage","command","parent","ctx","child","name","parse","argv","process","slice","permissive","env","toString","cmd","_","shift","exit","log","debug","closest","subcommand","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,SAAS,MAAM;AAGtB,SAASC,QAAQ,EAAEC,aAAa,EAAEC,kBAAkB,QAAkC,iCAAiC;AACvH,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,MAAM,QAAQ,+BAA+B;AACtD,SAASC,qBAAqB,QAAQ,+BAA+B;AACrE,SAASC,aAAa,QAAQ,iCAAiC;AAC/D,SAASC,KAAK,QAAQ,yBAAyB;AAI/C,OAAO,MAAMC,OAAO;IAClB,MAAM;QAAEC,MAAMC;IAAQ;IACtB,UAAU;QAAED,MAAMC;IAAQ;IAC1B,aAAa;QAAED,MAAMZ,IAAIc,KAAK;QAAEC,OAAO;YAAC;YAAM;SAAU;IAAC;IACzD,eAAe;QAAEH,MAAMC;IAAQ;IAC/B,UAAU;QAAED,MAAMC;IAAQ;AAC5B,EAA2B;AAE3B,OAAO,MAAMG,QAAe;IAC1B,OAAOT,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;EA0Bd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMU,UAA6C,OAAOC;IAC/D,MAAMC,MAAMD,OAAOE,KAAK,CAAC;QACvBC,MAAM;QACNC,OAAOX;QACPY,MAAMC,QAAQD,IAAI,CAACE,KAAK,CAAC;QACzBC,YAAY;IACd;IAEA,IAAIP,IAAIR,IAAI,CAAC,SAAS,EAAE;QACtBa,QAAQG,GAAG,CAAC,iBAAiB,GAAG;IAClC;IAEA,IAAIR,IAAIR,IAAI,CAAC,YAAY,EAAE;QACzBa,QAAQG,GAAG,CAAC,gBAAgB,GAAGvB,iBAAiBe,IAAIR,IAAI,CAAC,YAAY,EAAEiB,QAAQ;IACjF;IAEA,MAAMpB,sBAAsBW;IAE5B,IAAIU,MAAMV,IAAIR,IAAI,CAACmB,CAAC,CAACC,KAAK;IAC1B,IAAIrB,MAAMmB,MAAM;QACdxB,QAAQW,MAAMG;QACdK,QAAQQ,IAAI,CAAC;IACf;IAEA,IAAIH,QAAQ,QAAQ;QAClBV,IAAIc,GAAG,CAACC,KAAK,CAAC;QACdL,MAAM;IACR;IAEA,IAAI,CAAC1B,mBAAmB0B,MAAM;QAC5B,MAAM,CAACM,QAAQ,GAAG1B,cAAcoB,KAAK5B;QACrCI,OAAO,CAAC;8BACkB,EAAEwB,IAAI;;+BAEL,EAAEM,QAAQ;;;IAGrC,CAAC;QACDX,QAAQQ,IAAI,CAAC;IACf;IAEA,MAAMI,aAAa,MAAMlC,cAAc2B;IAEvC,IAAIV,IAAIR,IAAI,CAAC,KAAK,IAAIQ,IAAIR,IAAI,CAAC,SAAS,EAAE;QACxCN,QAAQ+B,WAAWpB,KAAK,CAACG;QACzBK,QAAQQ,IAAI,CAAC;IACf;IAEA,IAAI;QACF,MAAMI,WAAWnB,OAAO,CAACE,IAAIC,KAAK,CAAC;YAAEH,SAASY;YAAKR,MAAMQ;YAAKP,OAAOc,WAAWzB,IAAI;QAAC;IACvF,EAAE,OAAO0B,OAAO;QACd,MAAM/B,mBAAmBa,KAAKkB;IAChC;AACF,EAAE"}
@@ -7,15 +7,10 @@ import { sprint } from "../services/output/sprint.js";
7
7
  export const args = SyncJsonArgs;
8
8
  export const usage = ()=>{
9
9
  return sprint`
10
- Show file changes since your last dev, push, or pull.
10
+ Shows file changes since last sync (e.g. $ggt dev, push, deploy etc.)
11
11
 
12
- {bold USAGE}
13
-
14
- ggt status
15
-
16
- {bold EXAMPLES}
17
-
18
- $ ggt status
12
+ {gray Usage}
13
+ ggt status
19
14
  `;
20
15
  };
21
16
  export const command = async (ctx)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/status.ts"],"sourcesContent":["import { ArgError } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { getConflicts, printConflicts } from \"../services/filesync/conflicts.js\";\nimport { UnknownDirectoryError } from \"../services/filesync/error.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type StatusArgs = typeof args;\n\nexport const args = SyncJsonArgs;\n\nexport const usage: Usage = () => {\n return sprint`\n Show file changes since your last dev, push, or pull.\n\n {bold USAGE}\n\n ggt status\n\n {bold EXAMPLES}\n\n $ ggt status\n `;\n};\n\nexport const command: Command<StatusArgs> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt status\" does not take any positional arguments.\n\n If you are trying to see the status of a specific directory,\n you must \"cd\" to that directory and then run \"ggt status\".\n\n Run \"ggt status -h\" for more information.\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.load(ctx, { directory });\n if (!syncJson) {\n throw new UnknownDirectoryError(ctx, { directory });\n }\n\n syncJson.print();\n\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n await filesync.print(ctx, { hashes });\n\n const conflicts = getConflicts({ localChanges: hashes.localChanges, environmentChanges: hashes.environmentChanges });\n if (conflicts.size > 0) {\n ctx.log.debug(\"conflicts detected\", { conflicts });\n printConflicts({ conflicts });\n }\n};\n"],"names":["ArgError","getConflicts","printConflicts","UnknownDirectoryError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","sprint","args","usage","command","ctx","_","length","directory","process","cwd","syncJson","load","print","filesync","hashes","conflicts","localChanges","environmentChanges","size","log","debug"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,6BAA6B;AAEtD,SAASC,YAAY,EAAEC,cAAc,QAAQ,oCAAoC;AACjF,SAASC,qBAAqB,QAAQ,gCAAgC;AACtE,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAOH,aAAa;AAEjC,OAAO,MAAMI,QAAe;IAC1B,OAAOF,MAAM,CAAC;;;;;;;;;;EAUd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMG,UAA+B,OAAOC;IACjD,IAAIA,IAAIH,IAAI,CAACI,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAId,SAASQ,MAAM,CAAC;;;;;;;IAO1B,CAAC;IACH;IAEA,MAAMO,YAAY,MAAMR,sBAAsBS,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMb,SAASc,IAAI,CAACP,KAAK;QAAEG;IAAU;IACtD,IAAI,CAACG,UAAU;QACb,MAAM,IAAIf,sBAAsBS,KAAK;YAAEG;QAAU;IACnD;IAEAG,SAASE,KAAK;IAEd,MAAMC,WAAW,IAAIjB,SAASc;IAC9B,MAAMI,SAAS,MAAMD,SAASC,MAAM,CAACV;IACrC,MAAMS,SAASD,KAAK,CAACR,KAAK;QAAEU;IAAO;IAEnC,MAAMC,YAAYtB,aAAa;QAAEuB,cAAcF,OAAOE,YAAY;QAAEC,oBAAoBH,OAAOG,kBAAkB;IAAC;IAClH,IAAIF,UAAUG,IAAI,GAAG,GAAG;QACtBd,IAAIe,GAAG,CAACC,KAAK,CAAC,sBAAsB;YAAEL;QAAU;QAChDrB,eAAe;YAAEqB;QAAU;IAC7B;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/commands/status.ts"],"sourcesContent":["import { ArgError } from \"../services/command/arg.js\";\nimport type { Command, Usage } from \"../services/command/command.js\";\nimport { getConflicts, printConflicts } from \"../services/filesync/conflicts.js\";\nimport { UnknownDirectoryError } from \"../services/filesync/error.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport type StatusArgs = typeof args;\n\nexport const args = SyncJsonArgs;\n\nexport const usage: Usage = () => {\n return sprint`\n Shows file changes since last sync (e.g. $ggt dev, push, deploy etc.)\n\n {gray Usage}\n ggt status\n `;\n};\n\nexport const command: Command<StatusArgs> = async (ctx) => {\n if (ctx.args._.length > 0) {\n throw new ArgError(sprint`\n \"ggt status\" does not take any positional arguments.\n\n If you are trying to see the status of a specific directory,\n you must \"cd\" to that directory and then run \"ggt status\".\n\n Run \"ggt status -h\" for more information.\n `);\n }\n\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.load(ctx, { directory });\n if (!syncJson) {\n throw new UnknownDirectoryError(ctx, { directory });\n }\n\n syncJson.print();\n\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n await filesync.print(ctx, { hashes });\n\n const conflicts = getConflicts({ localChanges: hashes.localChanges, environmentChanges: hashes.environmentChanges });\n if (conflicts.size > 0) {\n ctx.log.debug(\"conflicts detected\", { conflicts });\n printConflicts({ conflicts });\n }\n};\n"],"names":["ArgError","getConflicts","printConflicts","UnknownDirectoryError","FileSync","SyncJson","SyncJsonArgs","loadSyncJsonDirectory","sprint","args","usage","command","ctx","_","length","directory","process","cwd","syncJson","load","print","filesync","hashes","conflicts","localChanges","environmentChanges","size","log","debug"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAAQ,6BAA6B;AAEtD,SAASC,YAAY,EAAEC,cAAc,QAAQ,oCAAoC;AACjF,SAASC,qBAAqB,QAAQ,gCAAgC;AACtE,SAASC,QAAQ,QAAQ,mCAAmC;AAC5D,SAASC,QAAQ,EAAEC,YAAY,EAAEC,qBAAqB,QAAQ,oCAAoC;AAClG,SAASC,MAAM,QAAQ,+BAA+B;AAItD,OAAO,MAAMC,OAAOH,aAAa;AAEjC,OAAO,MAAMI,QAAe;IAC1B,OAAOF,MAAM,CAAC;;;;;EAKd,CAAC;AACH,EAAE;AAEF,OAAO,MAAMG,UAA+B,OAAOC;IACjD,IAAIA,IAAIH,IAAI,CAACI,CAAC,CAACC,MAAM,GAAG,GAAG;QACzB,MAAM,IAAId,SAASQ,MAAM,CAAC;;;;;;;IAO1B,CAAC;IACH;IAEA,MAAMO,YAAY,MAAMR,sBAAsBS,QAAQC,GAAG;IACzD,MAAMC,WAAW,MAAMb,SAASc,IAAI,CAACP,KAAK;QAAEG;IAAU;IACtD,IAAI,CAACG,UAAU;QACb,MAAM,IAAIf,sBAAsBS,KAAK;YAAEG;QAAU;IACnD;IAEAG,SAASE,KAAK;IAEd,MAAMC,WAAW,IAAIjB,SAASc;IAC9B,MAAMI,SAAS,MAAMD,SAASC,MAAM,CAACV;IACrC,MAAMS,SAASD,KAAK,CAACR,KAAK;QAAEU;IAAO;IAEnC,MAAMC,YAAYtB,aAAa;QAAEuB,cAAcF,OAAOE,YAAY;QAAEC,oBAAoBH,OAAOG,kBAAkB;IAAC;IAClH,IAAIF,UAAUG,IAAI,GAAG,GAAG;QACtBd,IAAIe,GAAG,CAACC,KAAK,CAAC,sBAAsB;YAAEL;QAAU;QAChDrB,eAAe;YAAEqB;QAAU;IAC7B;AACF,EAAE"}
@@ -4,11 +4,12 @@ import { sprint } from "../services/output/sprint.js";
4
4
  export const usage = ()=>sprint`
5
5
  Print this version of ggt.
6
6
 
7
- {bold USAGE}
8
- ggt version
9
-
10
- {bold EXAMPLES}
11
- $ ggt version
7
+ {gray Usage}
8
+ ggt version
9
+
10
+ {gray Updating ggt}
11
+ When there is a new release of ggt, running ggt will show you a message letting you
12
+ know that an update is available.
12
13
  `;
13
14
  export const command = (_ctx)=>{
14
15
  println(packageJson.version);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/version.ts"],"sourcesContent":["import type { Command, Usage } from \"../services/command/command.js\";\nimport { packageJson } from \"../services/config/package-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport const usage: Usage = () => sprint`\n Print this version of ggt.\n\n {bold USAGE}\n ggt version\n\n {bold EXAMPLES}\n $ ggt version\n`;\n\nexport const command: Command = (_ctx) => {\n println(packageJson.version);\n};\n"],"names":["packageJson","println","sprint","usage","command","_ctx","version"],"mappings":"AACA,SAASA,WAAW,QAAQ,qCAAqC;AACjE,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAEtD,OAAO,MAAMC,QAAe,IAAMD,MAAM,CAAC;;;;;;;;AAQzC,CAAC,CAAC;AAEF,OAAO,MAAME,UAAmB,CAACC;IAC/BJ,QAAQD,YAAYM,OAAO;AAC7B,EAAE"}
1
+ {"version":3,"sources":["../../src/commands/version.ts"],"sourcesContent":["import type { Command, Usage } from \"../services/command/command.js\";\nimport { packageJson } from \"../services/config/package-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport const usage: Usage = () => sprint`\n Print this version of ggt.\n\n {gray Usage}\n ggt version\n \n {gray Updating ggt}\n When there is a new release of ggt, running ggt will show you a message letting you\n know that an update is available.\n`;\n\nexport const command: Command = (_ctx) => {\n println(packageJson.version);\n};\n"],"names":["packageJson","println","sprint","usage","command","_ctx","version"],"rangeMappings":";;;;;;;;;;;;;;;","mappings":"AACA,SAASA,WAAW,QAAQ,qCAAqC;AACjE,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAASC,MAAM,QAAQ,+BAA+B;AAEtD,OAAO,MAAMC,QAAe,IAAMD,MAAM,CAAC;;;;;;;;;AASzC,CAAC,CAAC;AAEF,OAAO,MAAME,UAAmB,CAACC;IAC/BJ,QAAQD,YAAYM,OAAO;AAC7B,EAAE"}
@@ -4,11 +4,8 @@ import { getUser } from "../services/user/user.js";
4
4
  export const usage = ()=>sprint`
5
5
  Show the name and email address of the currently logged in user.
6
6
 
7
- {bold USAGE}
8
- ggt whoami
9
-
10
- {bold EXAMPLES}
11
- $ ggt whoami
7
+ {gray Usage}
8
+ ggt whoami
12
9
  `;
13
10
  export const command = async (ctx)=>{
14
11
  const user = await getUser(ctx);