@gadgetinc/ggt 0.3.3 → 0.4.1

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 (148) hide show
  1. package/README.md +139 -76
  2. package/bin/dev.js +4 -7
  3. package/lib/__generated__/graphql.js.map +1 -1
  4. package/lib/commands/deploy.js +232 -0
  5. package/lib/commands/deploy.js.map +1 -0
  6. package/lib/commands/list.js +20 -16
  7. package/lib/commands/list.js.map +1 -1
  8. package/lib/commands/login.js +22 -20
  9. package/lib/commands/login.js.map +1 -1
  10. package/lib/commands/logout.js +13 -9
  11. package/lib/commands/logout.js.map +1 -1
  12. package/lib/commands/root.js +89 -56
  13. package/lib/commands/root.js.map +1 -1
  14. package/lib/commands/sync.js +253 -496
  15. package/lib/commands/sync.js.map +1 -1
  16. package/lib/commands/version.js +21 -0
  17. package/lib/commands/version.js.map +1 -0
  18. package/lib/commands/whoami.js +15 -11
  19. package/lib/commands/whoami.js.map +1 -1
  20. package/lib/main.js +4 -10
  21. package/lib/main.js.map +1 -1
  22. package/lib/services/{app.js → app/app.js} +8 -3
  23. package/lib/services/app/app.js.map +1 -0
  24. package/lib/services/app/arg.js +28 -0
  25. package/lib/services/app/arg.js.map +1 -0
  26. package/lib/services/app/edit-graphql.js +389 -0
  27. package/lib/services/app/edit-graphql.js.map +1 -0
  28. package/lib/services/command/arg.js +53 -0
  29. package/lib/services/command/arg.js.map +1 -0
  30. package/lib/services/command/command.js +27 -0
  31. package/lib/services/command/command.js.map +1 -0
  32. package/lib/services/command/context.js +60 -0
  33. package/lib/services/command/context.js.map +1 -0
  34. package/lib/services/{config.js → config/config.js} +29 -31
  35. package/lib/services/config/config.js.map +1 -0
  36. package/lib/services/config/env.js +22 -0
  37. package/lib/services/config/env.js.map +1 -0
  38. package/lib/services/config/package-json.js +9 -0
  39. package/lib/services/config/package-json.js.map +1 -0
  40. package/lib/services/filesync/changes.js +97 -0
  41. package/lib/services/filesync/changes.js.map +1 -0
  42. package/lib/services/filesync/conflicts.js +137 -0
  43. package/lib/services/filesync/conflicts.js.map +1 -0
  44. package/lib/services/filesync/directory.js +253 -0
  45. package/lib/services/filesync/directory.js.map +1 -0
  46. package/lib/services/filesync/error.js +67 -0
  47. package/lib/services/filesync/error.js.map +1 -0
  48. package/lib/services/filesync/file.js +3 -0
  49. package/lib/services/filesync/file.js.map +1 -0
  50. package/lib/services/filesync/filesync.js +673 -0
  51. package/lib/services/filesync/filesync.js.map +1 -0
  52. package/lib/services/filesync/hashes.js +150 -0
  53. package/lib/services/filesync/hashes.js.map +1 -0
  54. package/lib/services/http/auth.js +41 -0
  55. package/lib/services/http/auth.js.map +1 -0
  56. package/lib/services/http/http.js +64 -0
  57. package/lib/services/http/http.js.map +1 -0
  58. package/lib/services/output/log/field.js +3 -0
  59. package/lib/services/output/log/field.js.map +1 -0
  60. package/lib/services/output/log/format/format.js +8 -0
  61. package/lib/services/output/log/format/format.js.map +1 -0
  62. package/lib/services/output/log/format/json.js +45 -0
  63. package/lib/services/output/log/format/json.js.map +1 -0
  64. package/lib/services/output/log/format/pretty.js +147 -0
  65. package/lib/services/output/log/format/pretty.js.map +1 -0
  66. package/lib/services/output/log/level.js +41 -0
  67. package/lib/services/output/log/level.js.map +1 -0
  68. package/lib/services/output/log/logger.js +40 -0
  69. package/lib/services/output/log/logger.js.map +1 -0
  70. package/lib/services/output/log/printer.js +120 -0
  71. package/lib/services/output/log/printer.js.map +1 -0
  72. package/lib/services/output/log/structured.js +52 -0
  73. package/lib/services/output/log/structured.js.map +1 -0
  74. package/lib/services/{notify.js → output/notify.js} +7 -6
  75. package/lib/services/output/notify.js.map +1 -0
  76. package/lib/services/output/prompt.js +52 -0
  77. package/lib/services/output/prompt.js.map +1 -0
  78. package/lib/services/output/report.js +162 -0
  79. package/lib/services/output/report.js.map +1 -0
  80. package/lib/services/output/sprint.js +21 -0
  81. package/lib/services/output/sprint.js.map +1 -0
  82. package/lib/services/output/stream.js +54 -0
  83. package/lib/services/output/stream.js.map +1 -0
  84. package/lib/services/{version.js → output/update.js} +24 -16
  85. package/lib/services/output/update.js.map +1 -0
  86. package/lib/services/user/session.js +50 -0
  87. package/lib/services/user/session.js.map +1 -0
  88. package/lib/services/{user.js → user/user.js} +23 -14
  89. package/lib/services/user/user.js.map +1 -0
  90. package/lib/services/util/boolean.js +15 -0
  91. package/lib/services/util/boolean.js.map +1 -0
  92. package/lib/services/util/collection.js +38 -0
  93. package/lib/services/util/collection.js.map +1 -0
  94. package/lib/services/util/function.js +97 -0
  95. package/lib/services/util/function.js.map +1 -0
  96. package/lib/services/{is.js → util/is.js} +7 -0
  97. package/lib/services/util/is.js.map +1 -0
  98. package/lib/services/util/number.js +27 -0
  99. package/lib/services/util/number.js.map +1 -0
  100. package/lib/services/util/object.js +101 -0
  101. package/lib/services/util/object.js.map +1 -0
  102. package/lib/services/util/paths.js +36 -0
  103. package/lib/services/util/paths.js.map +1 -0
  104. package/lib/services/{promise.js → util/promise.js} +5 -7
  105. package/lib/services/util/promise.js.map +1 -0
  106. package/npm-shrinkwrap.json +2143 -1304
  107. package/package.json +50 -42
  108. package/lib/commands/index.js +0 -9
  109. package/lib/commands/index.js.map +0 -1
  110. package/lib/services/app.js.map +0 -1
  111. package/lib/services/args.js +0 -28
  112. package/lib/services/args.js.map +0 -1
  113. package/lib/services/collections.js +0 -17
  114. package/lib/services/collections.js.map +0 -1
  115. package/lib/services/config.js.map +0 -1
  116. package/lib/services/debounce.js +0 -21
  117. package/lib/services/debounce.js.map +0 -1
  118. package/lib/services/defaults.js +0 -8
  119. package/lib/services/defaults.js.map +0 -1
  120. package/lib/services/edit-graphql.js +0 -202
  121. package/lib/services/edit-graphql.js.map +0 -1
  122. package/lib/services/errors.js +0 -277
  123. package/lib/services/errors.js.map +0 -1
  124. package/lib/services/filesync.js +0 -404
  125. package/lib/services/filesync.js.map +0 -1
  126. package/lib/services/fs.js +0 -35
  127. package/lib/services/fs.js.map +0 -1
  128. package/lib/services/http.js +0 -53
  129. package/lib/services/http.js.map +0 -1
  130. package/lib/services/is.js.map +0 -1
  131. package/lib/services/log.js +0 -45
  132. package/lib/services/log.js.map +0 -1
  133. package/lib/services/noop.js +0 -4
  134. package/lib/services/noop.js.map +0 -1
  135. package/lib/services/notify.js.map +0 -1
  136. package/lib/services/output.js +0 -74
  137. package/lib/services/output.js.map +0 -1
  138. package/lib/services/promise.js.map +0 -1
  139. package/lib/services/prompt.js +0 -22
  140. package/lib/services/prompt.js.map +0 -1
  141. package/lib/services/session.js +0 -31
  142. package/lib/services/session.js.map +0 -1
  143. package/lib/services/sleep.js +0 -21
  144. package/lib/services/sleep.js.map +0 -1
  145. package/lib/services/timeout.js +0 -8
  146. package/lib/services/timeout.js.map +0 -1
  147. package/lib/services/user.js.map +0 -1
  148. package/lib/services/version.js.map +0 -1
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "@gadgetinc/ggt",
3
- "version": "0.3.3",
3
+ "version": "0.4.1",
4
4
  "description": "The command-line interface for Gadget",
5
5
  "homepage": "https://github.com/gadget-inc/ggt",
6
- "bugs": "https://github.com/gadget-inc/ggt/issues",
6
+ "bugs": {
7
+ "url": "https://github.com/gadget-inc/ggt/issues"
8
+ },
7
9
  "repository": {
8
10
  "type": "git",
9
11
  "url": "git+https://github.com/gadget-inc/ggt.git"
10
12
  },
11
13
  "license": "MIT",
12
- "author": "Gadget Authors",
14
+ "author": {
15
+ "name": "Gadget Authors"
16
+ },
13
17
  "type": "module",
14
18
  "main": "lib/main.js",
15
19
  "bin": {
@@ -27,97 +31,101 @@
27
31
  "build": "npm run clean && swc src -d lib",
28
32
  "clean": "rimraf lib tmp/spec",
29
33
  "generate:graphql": "graphql-codegen --config graphql-codegen.yml",
30
- "generate:readme": "FORCE_COLOR=0 node --loader @swc-node/register/esm --no-warnings ./scripts/generate-readme.ts",
31
- "lint": "concurrently --prefix none --group 'npm:lint:*(!fix)'",
34
+ "lint": "concurrently --group --names --prefix-colors=auto 'npm:lint:*(!fix)'",
32
35
  "lint:cspell": "cspell --no-progress --show-suggestions --show-context '**'",
33
36
  "lint:eslint": "eslint --max-warnings 0 .",
34
37
  "lint:fix": "eslint --fix . && prettier --write .",
35
38
  "lint:prettier": "prettier --check .",
36
39
  "lint:typescript": "tsc --project tsconfig.json",
37
40
  "release": "npm run build && changeset publish",
38
- "test": "cross-env NODE_OPTIONS=\"--loader @swc-node/register/esm --no-warnings\" vitest",
39
- "version": "changeset version && npm install --package-lock-only && npm run generate:readme"
41
+ "test": "vitest",
42
+ "version": "changeset version && npm install --package-lock-only && ./scripts/generate-readme.ts"
40
43
  },
41
44
  "dependencies": {
42
- "@sentry/node": "^7.75.1",
45
+ "@sentry/node": "^7.88.0",
43
46
  "@swc/helpers": "^0.5.3",
44
47
  "arg": "^5.0.2",
45
48
  "boxen": "^7.1.1",
46
49
  "chalk": "^5.3.0",
47
50
  "chalk-template": "^1.1.0",
48
51
  "clean-stack": "^5.2.0",
52
+ "cli-table3": "^0.6.3",
49
53
  "dayjs": "^1.11.10",
50
- "debug": "^4.3.4",
51
- "enquirer": "^2.4.1",
52
54
  "execa": "^8.0.1",
53
55
  "fast-levenshtein": "^3.0.0",
54
56
  "find-up": "^6.3.0",
55
- "fs-extra": "^11.1.1",
57
+ "fs-extra": "^11.2.0",
56
58
  "get-port": "^7.0.0",
57
59
  "got": "^13.0.0",
58
60
  "graphql": "^16.8.1",
59
61
  "graphql-ws": "^5.14.2",
60
- "ignore": "^5.2.4",
62
+ "ignore": "^5.3.0",
61
63
  "is-wsl": "^3.1.0",
64
+ "mimic-fn": "^5.0.0",
62
65
  "ms": "^2.1.3",
63
66
  "node-notifier": "^10.0.1",
64
67
  "normalize-package-data": "^6.0.0",
65
68
  "normalize-path": "^3.0.0",
66
69
  "open": "^9.1.0",
70
+ "ora": "^7.0.1",
67
71
  "p-map": "^6.0.0",
68
72
  "p-queue": "^7.4.1",
69
73
  "p-retry": "^6.1.0",
74
+ "p-timeout": "^6.1.2",
70
75
  "pluralize": "^8.0.0",
76
+ "prompts": "^2.4.2",
71
77
  "semver": "^7.5.4",
72
- "serialize-error": "^11.0.2",
78
+ "serialize-error": "^11.0.3",
79
+ "strip-ansi": "^7.1.0",
73
80
  "ts-dedent": "^2.2.0",
74
81
  "watcher": "^2.3.0",
75
82
  "which": "^4.0.0",
76
- "ws": "^8.14.2",
83
+ "ws": "^8.15.1",
77
84
  "zod": "^3.22.4"
78
85
  },
79
86
  "devDependencies": {
80
- "@changesets/cli": "^2.26.2",
87
+ "@changesets/cli": "^2.27.1",
81
88
  "@graphql-codegen/add": "^5.0.0",
82
89
  "@graphql-codegen/cli": "^5.0.0",
83
90
  "@graphql-codegen/typescript": "^4.0.0",
84
91
  "@graphql-codegen/typescript-operations": "^4.0.1",
85
92
  "@swc-node/register": "^1.6.8",
86
- "@swc/cli": "^0.1.62",
87
- "@swc/core": "^1.3.95",
88
- "@types/debug": "^4.1.10",
89
- "@types/eslint": "^8.44.6",
90
- "@types/fast-levenshtein": "^0.0.3",
91
- "@types/fs-extra": "^11.0.3",
92
- "@types/ms": "^0.7.33",
93
- "@types/node": "^20.8.9",
94
- "@types/node-notifier": "^8.0.4",
95
- "@types/normalize-path": "^3.0.1",
96
- "@types/pluralize": "^0.0.32",
97
- "@types/which": "^3.0.1",
98
- "@types/ws": "^8.5.8",
99
- "@typescript-eslint/eslint-plugin": "^6.9.0",
100
- "@typescript-eslint/parser": "^6.9.0",
93
+ "@swc/cli": "^0.1.63",
94
+ "@swc/core": "^1.3.100",
95
+ "@types/eslint": "^8.44.9",
96
+ "@types/fast-levenshtein": "^0.0.4",
97
+ "@types/fs-extra": "^11.0.4",
98
+ "@types/ms": "^0.7.34",
99
+ "@types/node": "^18.19.3",
100
+ "@types/node-notifier": "^8.0.5",
101
+ "@types/normalize-path": "^3.0.2",
102
+ "@types/pluralize": "^0.0.33",
103
+ "@types/prompts": "^2.4.9",
104
+ "@types/which": "^3.0.3",
105
+ "@types/ws": "^8.5.10",
106
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
107
+ "@typescript-eslint/parser": "^6.14.0",
101
108
  "concurrently": "^8.2.2",
102
- "cross-env": "^7.0.3",
103
109
  "cspell": "^7.3.8",
104
- "eslint": "^8.52.0",
105
- "eslint-config-prettier": "^9.0.0",
110
+ "eslint": "^8.55.0",
111
+ "eslint-config-prettier": "^9.1.0",
106
112
  "eslint-import-resolver-typescript": "^3.6.1",
107
- "eslint-plugin-import": "^2.29.0",
113
+ "eslint-plugin-import": "^2.29.1",
108
114
  "eslint-plugin-lodash": "^7.4.0",
109
- "eslint-plugin-unicorn": "^48.0.1",
110
- "nock": "^13.3.6",
111
- "prettier": "^3.0.3",
112
- "prettier-plugin-organize-imports": "^3.2.3",
113
- "prettier-plugin-packagejson": "^2.4.6",
115
+ "eslint-plugin-only-warn": "^1.1.0",
116
+ "eslint-plugin-unicorn": "^49.0.0",
117
+ "nock": "^13.4.0",
118
+ "prettier": "^3.1.1",
119
+ "prettier-plugin-organize-imports": "^3.2.4",
120
+ "prettier-plugin-packagejson": "^2.4.7",
114
121
  "remark": "^15.0.1",
115
122
  "remark-gfm": "^4.0.0",
116
123
  "remark-toc": "^9.0.0",
117
124
  "rimraf": "^5.0.5",
118
- "type-fest": "^4.6.0",
119
- "typescript": "^5.2.2",
120
- "vitest": "^0.34.6"
125
+ "type-fest": "^4.8.3",
126
+ "typescript": "^5.3.3",
127
+ "vitest": "^0.34.6",
128
+ "vitest-mock-process": "^1.0.4"
121
129
  },
122
130
  "engines": {
123
131
  "node": ">=16.0.0"
@@ -1,9 +0,0 @@
1
- export const availableCommands = [
2
- "sync",
3
- "list",
4
- "login",
5
- "logout",
6
- "whoami"
7
- ];
8
-
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/commands/index.ts"],"sourcesContent":["import type { RootArgs } from \"./root.js\";\n\nexport interface Command {\n usage: string;\n init?: (rootArgs: RootArgs) => void | Promise<void>;\n run: (rootArgs: RootArgs) => void | Promise<void>;\n}\n\nexport const availableCommands = [\"sync\", \"list\", \"login\", \"logout\", \"whoami\"] as const;\n"],"names":["availableCommands"],"mappings":"AAQA,OAAO,MAAMA,oBAAoB;IAAC;IAAQ;IAAQ;IAAS;IAAU;CAAS,CAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/app.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { config } from \"./config.js\";\nimport { http, loadCookie } from \"./http.js\";\nimport type { User } from \"./user.js\";\n\nexport const App = z.object({\n id: z.union([z.string(), z.number(), z.bigint()]),\n slug: z.string(),\n primaryDomain: z.string(),\n hasSplitEnvironments: z.boolean(),\n});\n\nexport type App = z.infer<typeof App> & { user: User };\n\n/**\n * @returns The list of Gadget applications the current user has access to.\n */\nexport const getApps = async (user: User): Promise<App[]> => {\n const cookie = loadCookie();\n if (!cookie) {\n return [];\n }\n\n const json = await http({\n url: `https://${config.domains.services}/auth/api/apps`,\n headers: { cookie },\n responseType: \"json\",\n resolveBodyOnly: true,\n });\n\n return z\n .array(App)\n .parse(json)\n .map((app) => ({ ...app, user }));\n};\n"],"names":["z","config","http","loadCookie","App","object","id","union","string","number","bigint","slug","primaryDomain","hasSplitEnvironments","boolean","getApps","user","cookie","json","url","domains","services","headers","responseType","resolveBodyOnly","array","parse","map","app"],"mappings":"AAAA,SAASA,CAAC,QAAQ,MAAM;AACxB,SAASC,MAAM,QAAQ,cAAc;AACrC,SAASC,IAAI,EAAEC,UAAU,QAAQ,YAAY;AAG7C,OAAO,MAAMC,MAAMJ,EAAEK,MAAM,CAAC;IAC1BC,IAAIN,EAAEO,KAAK,CAAC;QAACP,EAAEQ,MAAM;QAAIR,EAAES,MAAM;QAAIT,EAAEU,MAAM;KAAG;IAChDC,MAAMX,EAAEQ,MAAM;IACdI,eAAeZ,EAAEQ,MAAM;IACvBK,sBAAsBb,EAAEc,OAAO;AACjC,GAAG;AAIH;;CAEC,GACD,OAAO,MAAMC,UAAU,OAAOC;IAC5B,MAAMC,SAASd;IACf,IAAI,CAACc,QAAQ;QACX,OAAO,EAAE;IACX;IAEA,MAAMC,OAAO,MAAMhB,KAAK;QACtBiB,KAAK,CAAC,QAAQ,EAAElB,OAAOmB,OAAO,CAACC,QAAQ,CAAC,cAAc,CAAC;QACvDC,SAAS;YAAEL;QAAO;QAClBM,cAAc;QACdC,iBAAiB;IACnB;IAEA,OAAOxB,EACJyB,KAAK,CAACrB,KACNsB,KAAK,CAACR,MACNS,GAAG,CAAC,CAACC,MAAS,CAAA;YAAE,GAAGA,GAAG;YAAEZ;QAAK,CAAA;AAClC,EAAE"}
@@ -1,28 +0,0 @@
1
- import { ArgError } from "./errors.js";
2
- import { sprint } from "./output.js";
3
- export const parseBoolean = (value)=>{
4
- value ??= "";
5
- return [
6
- "true",
7
- "1"
8
- ].includes(value.trim().toLowerCase());
9
- };
10
- export const AppArg = (value, name)=>{
11
- const slug = RegExp("^(https:\\/\\/)?(?<slug>[\\w-]+?)(--development)?(\\..*)?$").exec(value)?.groups?.["slug"];
12
- if (slug) {
13
- return slug;
14
- }
15
- throw new ArgError(sprint`
16
- The ${name} option must be the application's slug or URL
17
-
18
- Examples:
19
-
20
- --${name} my-app
21
- --${name} my-app.gadget.app
22
- --${name} https://my-app.gadget.app
23
- --${name} https://my-app.gadget.app/edit
24
- --${name} https://my-app--development.gadget.app/edit
25
- `);
26
- };
27
-
28
- //# sourceMappingURL=args.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/args.ts"],"sourcesContent":["import { ArgError } from \"./errors.js\";\nimport { sprint } from \"./output.js\";\n\nexport const parseBoolean = (value: string | null | undefined) => {\n value ??= \"\";\n return [\"true\", \"1\"].includes(value.trim().toLowerCase());\n};\n\nexport const AppArg = (value: string, name: string) => {\n const slug = /^(https:\\/\\/)?(?<slug>[\\w-]+?)(--development)?(\\..*)?$/.exec(value)?.groups?.[\"slug\"];\n if (slug) {\n return slug;\n }\n\n throw new ArgError(\n sprint`\n The ${name} option must be the application's slug or URL\n\n Examples:\n\n --${name} my-app\n --${name} my-app.gadget.app\n --${name} https://my-app.gadget.app\n --${name} https://my-app.gadget.app/edit\n --${name} https://my-app--development.gadget.app/edit\n `,\n );\n};\n"],"names":["ArgError","sprint","parseBoolean","value","includes","trim","toLowerCase","AppArg","name","slug","exec","groups"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,MAAM,QAAQ,cAAc;AAErC,OAAO,MAAMC,eAAe,CAACC;IAC3BA,UAAU;IACV,OAAO;QAAC;QAAQ;KAAI,CAACC,QAAQ,CAACD,MAAME,IAAI,GAAGC,WAAW;AACxD,EAAE;AAEF,OAAO,MAAMC,SAAS,CAACJ,OAAeK;IACpC,MAAMC,OAAO,qEAAyDC,IAAI,CAACP,QAAQQ,QAAQ,CAAC,OAAO;IACnG,IAAIF,MAAM;QACR,OAAOA;IACT;IAEA,MAAM,IAAIT,SACRC,MAAM,CAAC;UACD,EAAEO,KAAK;;;;UAIP,EAAEA,KAAK;UACP,EAAEA,KAAK;UACP,EAAEA,KAAK;UACP,EAAEA,KAAK;UACP,EAAEA,KAAK;IACb,CAAC;AAEL,EAAE"}
@@ -1,17 +0,0 @@
1
- export const compact = (array)=>{
2
- return array.filter((value)=>Boolean(value));
3
- };
4
- export const uniq = (array)=>{
5
- return [
6
- ...new Set(array)
7
- ];
8
- };
9
- export const pick = (object, keys)=>{
10
- const final = {};
11
- for (const key of keys){
12
- final[key] = object[key];
13
- }
14
- return final;
15
- };
16
-
17
- //# sourceMappingURL=collections.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/collections.ts"],"sourcesContent":["export const compact = (array: unknown[]) => {\n return array.filter((value) => Boolean(value));\n};\n\nexport const uniq = <T>(array: T[]) => {\n return [...new Set(array)];\n};\n\nexport const pick = <T extends Record<string, unknown>, K extends keyof T>(object: T, keys: K[]) => {\n const final = {} as Pick<T, K>;\n for (const key of keys) {\n final[key] = object[key];\n }\n return final;\n};\n"],"names":["compact","array","filter","value","Boolean","uniq","Set","pick","object","keys","final","key"],"mappings":"AAAA,OAAO,MAAMA,UAAU,CAACC;IACtB,OAAOA,MAAMC,MAAM,CAAC,CAACC,QAAUC,QAAQD;AACzC,EAAE;AAEF,OAAO,MAAME,OAAO,CAAIJ;IACtB,OAAO;WAAI,IAAIK,IAAIL;KAAO;AAC5B,EAAE;AAEF,OAAO,MAAMM,OAAO,CAAuDC,QAAWC;IACpF,MAAMC,QAAQ,CAAC;IACf,KAAK,MAAMC,OAAOF,KAAM;QACtBC,KAAK,CAACC,IAAI,GAAGH,MAAM,CAACG,IAAI;IAC1B;IACA,OAAOD;AACT,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/config.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport isWsl from \"is-wsl\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport normalizePackageData, { type Package } from \"normalize-package-data\";\n\n/**\n * The root directory of the ggt package.\n */\nexport const workspaceRoot = path.join(path.dirname(fileURLToPath(import.meta.url)), \"../../\");\n\n/**\n * The package.json of the ggt package.\n */\nexport const pkgJson = (await fs.readJson(path.join(workspaceRoot, \"package.json\"))) as Package;\nnormalizePackageData(pkgJson, true);\n\n/**\n * Captures the name and nature of the environment\n */\nexport const env = {\n get value(): string {\n return process.env[\"GGT_ENV\"] || \"production\";\n },\n\n get productionLike(): boolean {\n return !this.developmentOrTestLike;\n },\n\n get developmentLike(): boolean {\n return this.value.startsWith(\"development\");\n },\n\n get testLike(): boolean {\n return this.value.startsWith(\"test\");\n },\n\n get developmentOrTestLike(): boolean {\n return this.developmentLike || this.testLike;\n },\n};\n\nexport const config = {\n get name(): string {\n return pkgJson.name;\n },\n\n get version(): string {\n return pkgJson.version;\n },\n\n /**\n * @example \"ggt/1.2.3 darwin-arm64 node-v16.0.0\"\n */\n get versionFull(): string {\n return `${this.name}/${this.version} ${this.platform}-${this.arch} node-${process.version}`;\n },\n\n get arch(): string {\n return os.arch() === \"ia32\" ? \"x86\" : os.arch();\n },\n\n get platform(): string {\n return isWsl ? \"wsl\" : os.platform();\n },\n\n get windows(): boolean {\n return process.platform === \"win32\";\n },\n\n get macos(): boolean {\n return process.platform === \"darwin\";\n },\n\n get shell(): string | undefined {\n const SHELL = process.env[\"SHELL\"] ?? os.userInfo().shell?.split(path.sep).pop();\n if (SHELL) {\n return SHELL.split(\"/\").at(-1);\n }\n if (this.windows && process.env[\"COMSPEC\"]) {\n return process.env[\"COMSPEC\"].split(/\\\\|\\//).at(-1);\n }\n return \"unknown\";\n },\n\n get homeDir(): string {\n if (process.env[\"HOME\"]) {\n return process.env[\"HOME\"];\n }\n\n if (this.windows) {\n if (process.env[\"HOMEDRIVE\"] && process.env[\"HOMEPATH\"]) {\n return path.join(process.env[\"HOMEDRIVE\"], process.env[\"HOMEPATH\"]);\n }\n if (process.env[\"USERPROFILE\"]) {\n return process.env[\"USERPROFILE\"];\n }\n }\n\n return os.homedir() || os.tmpdir();\n },\n\n /**\n * - Unix: `~/.config/ggt`\n * - Windows: `%LOCALAPPDATA%\\ggt`\n *\n * Can be overridden by `GGT_CONFIG_DIR`\n */\n get configDir(): string {\n if (process.env[\"GGT_CONFIG_DIR\"]) {\n return process.env[\"GGT_CONFIG_DIR\"];\n }\n\n const base = process.env[\"XDG_CONFIG_HOME\"] || (this.windows && process.env[\"LOCALAPPDATA\"]) || path.join(this.homeDir, \".config\");\n return path.join(base, \"ggt\");\n },\n\n /**\n * - Linux: `~/.cache/ggt`\n * - macOS: `~/Library/Caches/ggt`\n * - Windows: `%LOCALAPPDATA%\\ggt`\n *\n * Can be overridden with `GGT_CACHE_DIR`\n */\n get cacheDir(): string {\n if (process.env[\"GGT_CACHE_DIR\"]) {\n return process.env[\"GGT_CACHE_DIR\"];\n }\n\n if (this.macos) {\n return path.join(this.homeDir, \"Library/Caches/ggt\");\n }\n\n const base = process.env[\"XDG_CACHE_HOME\"] || (this.windows && process.env[\"LOCALAPPDATA\"]) || path.join(this.homeDir, \".cache\");\n return path.join(base, \"ggt\");\n },\n\n /**\n * - Unix: `~/.local/share/ggt`\n * - Windows: `%LOCALAPPDATA%\\ggt`\n *\n * Can be overridden with `GGT_DATA_DIR`\n */\n get dataDir(): string {\n if (process.env[\"GGT_DATA_DIR\"]) {\n return process.env[\"GGT_DATA_DIR\"];\n }\n\n const base = process.env[\"XDG_DATA_HOME\"] || (this.windows && process.env[\"LOCALAPPDATA\"]) || path.join(this.homeDir, \".local/share\");\n return path.join(base, \"ggt\");\n },\n\n /**\n * Domains for various Gadget services.\n */\n domains: {\n /**\n * The domain for the Gadget applications. This is where the user's application is hosted.\n */\n get app() {\n return process.env[\"GGT_GADGET_APP_DOMAIN\"] || (env.productionLike ? \"gadget.app\" : \"ggt.pub\");\n },\n\n /**\n * The domain for the Gadget services. This is where Gadget's API is hosted.\n */\n get services() {\n return process.env[\"GGT_GADGET_SERVICES_DOMAIN\"] || (env.productionLike ? \"app.gadget.dev\" : \"app.ggt.dev\");\n },\n },\n};\n"],"names":["fs","isWsl","os","path","process","fileURLToPath","normalizePackageData","workspaceRoot","join","dirname","url","pkgJson","readJson","env","value","productionLike","developmentOrTestLike","developmentLike","startsWith","testLike","config","name","version","versionFull","platform","arch","windows","macos","shell","SHELL","userInfo","split","sep","pop","at","homeDir","homedir","tmpdir","configDir","base","cacheDir","dataDir","domains","app","services"],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- export const debounce = (delayMS, f)=>{
2
- let timerId;
3
- let upcomingCall;
4
- const debounced = (...args)=>{
5
- upcomingCall = ()=>{
6
- upcomingCall = undefined;
7
- timerId = undefined;
8
- f(...args);
9
- };
10
- clearTimeout(timerId);
11
- timerId = setTimeout(upcomingCall, delayMS);
12
- };
13
- debounced.flush = ()=>{
14
- if (upcomingCall) {
15
- upcomingCall();
16
- }
17
- };
18
- return debounced;
19
- };
20
-
21
- //# sourceMappingURL=debounce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/debounce.ts"],"sourcesContent":["export type DebouncedFunc<F extends (...args: unknown[]) => void> = F & {\n flush: () => void;\n};\n\nexport const debounce = <F extends (...args: unknown[]) => void>(delayMS: number, f: F): DebouncedFunc<F> => {\n let timerId: NodeJS.Timeout | undefined;\n let upcomingCall: (() => void) | undefined;\n\n const debounced = ((...args) => {\n upcomingCall = () => {\n upcomingCall = undefined;\n timerId = undefined;\n f(...args);\n };\n\n clearTimeout(timerId);\n timerId = setTimeout(upcomingCall, delayMS);\n }) as DebouncedFunc<F>;\n\n debounced.flush = () => {\n if (upcomingCall) {\n upcomingCall();\n }\n };\n\n return debounced;\n};\n"],"names":["debounce","delayMS","f","timerId","upcomingCall","debounced","args","undefined","clearTimeout","setTimeout","flush"],"mappings":"AAIA,OAAO,MAAMA,WAAW,CAAyCC,SAAiBC;IAChF,IAAIC;IACJ,IAAIC;IAEJ,MAAMC,YAAa,CAAC,GAAGC;QACrBF,eAAe;YACbA,eAAeG;YACfJ,UAAUI;YACVL,KAAKI;QACP;QAEAE,aAAaL;QACbA,UAAUM,WAAWL,cAAcH;IACrC;IAEAI,UAAUK,KAAK,GAAG;QAChB,IAAIN,cAAc;YAChBA;QACF;IACF;IAEA,OAAOC;AACT,EAAE"}
@@ -1,8 +0,0 @@
1
- export const defaults = (object, source)=>{
2
- return {
3
- ...source,
4
- ...object
5
- };
6
- };
7
-
8
- //# sourceMappingURL=defaults.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/defaults.ts"],"sourcesContent":["export const defaults = <TObject extends object, TSource extends object>(\n object: TObject,\n source: TSource,\n): NonNullable<TSource & TObject> => {\n return { ...source, ...object };\n};\n"],"names":["defaults","object","source"],"mappings":"AAAA,OAAO,MAAMA,WAAW,CACtBC,QACAC;IAEA,OAAO;QAAE,GAAGA,MAAM;QAAE,GAAGD,MAAM;IAAC;AAChC,EAAE"}
@@ -1,202 +0,0 @@
1
- import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
- import { createClient } from "graphql-ws";
3
- import assert from "node:assert";
4
- import WebSocket from "ws";
5
- import { config } from "./config.js";
6
- import { ClientError } from "./errors.js";
7
- import { loadCookie } from "./http.js";
8
- import { isFunction } from "./is.js";
9
- import { createLogger } from "./log.js";
10
- import { noop } from "./noop.js";
11
- var ConnectionStatus;
12
- (function(ConnectionStatus) {
13
- ConnectionStatus[ConnectionStatus["CONNECTED"] = 0] = "CONNECTED";
14
- ConnectionStatus[ConnectionStatus["DISCONNECTED"] = 1] = "DISCONNECTED";
15
- ConnectionStatus[ConnectionStatus["RECONNECTING"] = 2] = "RECONNECTING";
16
- })(ConnectionStatus || (ConnectionStatus = {}));
17
- const log = createLogger("edit-graphql");
18
- /**
19
- * EditGraphQL is a GraphQL client connected to a Gadget application's /edit/api/graphql-ws endpoint.
20
- */ export class EditGraphQL {
21
- /**
22
- * Subscribe to a GraphQL query.
23
- *
24
- * This method is typically used to subscribe to a GraphQL
25
- * subscription. If you want to execute a GraphQL query or mutation,
26
- * use {@link EditGraphQL.query} instead.
27
- *
28
- * @param payload The query and variables to send to the server.
29
- * @param sink The callbacks to invoke when the server responds.
30
- * @returns A function to unsubscribe from the subscription.
31
- */ subscribe(payload, sink) {
32
- const unsubscribe = this._subscribe(payload, {
33
- ...sink,
34
- next: (result)=>{
35
- if (result.errors) {
36
- unsubscribe();
37
- sink.error(new ClientError(payload, result.errors));
38
- return;
39
- }
40
- if (!result.data) {
41
- sink.error(new ClientError(payload, "Received a GraphQL response without errors or data"));
42
- unsubscribe();
43
- return;
44
- }
45
- sink.next(result.data);
46
- }
47
- });
48
- return unsubscribe;
49
- }
50
- /**
51
- * Execute a GraphQL query or mutation.
52
- * @param payload The query and variables to send to the server.
53
- * @returns The data returned by the server.
54
- */ async query(payload) {
55
- const result = await this._query(payload);
56
- if (result.errors) {
57
- throw new ClientError(payload, result.errors);
58
- }
59
- if (!result.data) {
60
- throw new ClientError(payload, "We received a response without data");
61
- }
62
- return result.data;
63
- }
64
- /**
65
- * Close the connection to the server.
66
- */ async dispose() {
67
- await this._client.dispose();
68
- }
69
- /**
70
- * Internal method to subscribe to a GraphQL query.
71
- *
72
- * This method shouldn't be used directly. It's exposed for testing.
73
- */ _subscribe(payload, sink) {
74
- let subscribePayload;
75
- let removeConnectedListener = noop;
76
- if (isFunction(payload.variables)) {
77
- // the caller wants us to re-evaluate the variables every time
78
- // graphql-ws re-subscribes after reconnecting
79
- subscribePayload = {
80
- ...payload,
81
- variables: payload.variables()
82
- };
83
- removeConnectedListener = this._client.on("connected", ()=>{
84
- if (this.status === 2) {
85
- assert(isFunction(payload.variables));
86
- subscribePayload = {
87
- ...payload,
88
- variables: payload.variables()
89
- };
90
- const [type, operation] = subscribePayload.query.split(/ |\(/, 2);
91
- log.info("re-sending graphql query", {
92
- type,
93
- operation
94
- });
95
- }
96
- });
97
- } else {
98
- subscribePayload = payload;
99
- }
100
- const [type, operation] = subscribePayload.query.split(/ |\(/, 2);
101
- log.info("sending graphql query", {
102
- type,
103
- operation
104
- });
105
- const unsubscribe = this._client.subscribe(subscribePayload, {
106
- next: (result)=>{
107
- sink.next(result);
108
- },
109
- error: (error)=>{
110
- sink.error(new ClientError(subscribePayload, error));
111
- },
112
- complete: ()=>{
113
- sink.complete?.();
114
- }
115
- });
116
- return ()=>{
117
- removeConnectedListener();
118
- unsubscribe();
119
- };
120
- }
121
- _query(payload) {
122
- return new Promise((resolve, reject)=>{
123
- this._subscribe(payload, {
124
- next: resolve,
125
- error: reject
126
- });
127
- });
128
- }
129
- constructor(app){
130
- // assume the client is going to connect
131
- _define_property(this, "status", 0);
132
- _define_property(this, "_client", void 0);
133
- this._client = createClient({
134
- url: `wss://${app.slug}.${config.domains.app}/edit/api/graphql-ws`,
135
- shouldRetry: ()=>true,
136
- webSocketImpl: class extends WebSocket {
137
- constructor(address, protocols, wsOptions){
138
- // this cookie should be available since we were given an app which requires a cookie to load
139
- const cookie = loadCookie();
140
- assert(cookie, "missing cookie when connecting to GraphQL API");
141
- super(address, protocols, {
142
- ...wsOptions,
143
- headers: {
144
- ...wsOptions?.headers,
145
- "user-agent": config.versionFull,
146
- cookie
147
- }
148
- });
149
- }
150
- },
151
- on: {
152
- connecting: ()=>{
153
- switch(this.status){
154
- case 1:
155
- this.status = 2;
156
- log.info("reconnecting");
157
- break;
158
- case 2:
159
- log.info("retrying");
160
- break;
161
- default:
162
- log.info("connecting");
163
- break;
164
- }
165
- },
166
- connected: ()=>{
167
- if (this.status === 2) {
168
- log.info("reconnected");
169
- } else {
170
- log.info("connected");
171
- }
172
- // let the other on connected listeners see what status we're in
173
- setImmediate(()=>this.status = 0);
174
- },
175
- closed: (e)=>{
176
- const event = e;
177
- if (event.wasClean) {
178
- log.info("connection closed");
179
- return;
180
- }
181
- if (this.status === 0) {
182
- this.status = 1;
183
- log.info("disconnected");
184
- }
185
- },
186
- error: (error)=>{
187
- if (this.status === 2) {
188
- log.error("failed to reconnect", {
189
- error
190
- });
191
- } else {
192
- log.error("connection error", {
193
- error
194
- });
195
- }
196
- }
197
- }
198
- });
199
- }
200
- }
201
-
202
- //# sourceMappingURL=edit-graphql.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/edit-graphql.ts"],"sourcesContent":["import type { GraphQLError } from \"graphql\";\nimport type { ExecutionResult, SubscribePayload } from \"graphql-ws\";\nimport { createClient } from \"graphql-ws\";\nimport assert from \"node:assert\";\nimport type { ClientRequestArgs } from \"node:http\";\nimport type { JsonObject, SetOptional } from \"type-fest\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport type { App } from \"./app.js\";\nimport { config } from \"./config.js\";\nimport { ClientError } from \"./errors.js\";\nimport { loadCookie } from \"./http.js\";\nimport { isFunction } from \"./is.js\";\nimport { createLogger } from \"./log.js\";\nimport { noop } from \"./noop.js\";\n\nenum ConnectionStatus {\n CONNECTED,\n DISCONNECTED,\n RECONNECTING,\n}\n\nconst log = createLogger(\"edit-graphql\");\n\n/**\n * EditGraphQL is a GraphQL client connected to a Gadget application's /edit/api/graphql-ws endpoint.\n */\nexport class EditGraphQL {\n // assume the client is going to connect\n status = ConnectionStatus.CONNECTED;\n\n private _client: ReturnType<typeof createClient>;\n\n constructor(app: App) {\n this._client = createClient({\n url: `wss://${app.slug}.${config.domains.app}/edit/api/graphql-ws`,\n shouldRetry: () => true,\n webSocketImpl: class extends WebSocket {\n constructor(address: string | URL, protocols?: string | string[], wsOptions?: WebSocket.ClientOptions | ClientRequestArgs) {\n // this cookie should be available since we were given an app which requires a cookie to load\n const cookie = loadCookie();\n assert(cookie, \"missing cookie when connecting to GraphQL API\");\n\n super(address, protocols, {\n ...wsOptions,\n headers: {\n ...wsOptions?.headers,\n \"user-agent\": config.versionFull,\n cookie,\n },\n });\n }\n },\n on: {\n connecting: () => {\n switch (this.status) {\n case ConnectionStatus.DISCONNECTED:\n this.status = ConnectionStatus.RECONNECTING;\n log.info(\"reconnecting\");\n break;\n case ConnectionStatus.RECONNECTING:\n log.info(\"retrying\");\n break;\n default:\n log.info(\"connecting\");\n break;\n }\n },\n connected: () => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n log.info(\"reconnected\");\n } else {\n log.info(\"connected\");\n }\n\n // let the other on connected listeners see what status we're in\n setImmediate(() => (this.status = ConnectionStatus.CONNECTED));\n },\n closed: (e) => {\n const event = e as CloseEvent;\n if (event.wasClean) {\n log.info(\"connection closed\");\n return;\n }\n\n if (this.status === ConnectionStatus.CONNECTED) {\n this.status = ConnectionStatus.DISCONNECTED;\n log.info(\"disconnected\");\n }\n },\n error: (error) => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n log.error(\"failed to reconnect\", { error });\n } else {\n log.error(\"connection error\", { error });\n }\n },\n },\n });\n }\n\n /**\n * Subscribe to a GraphQL query.\n *\n * This method is typically used to subscribe to a GraphQL\n * subscription. If you want to execute a GraphQL query or mutation,\n * use {@link EditGraphQL.query} instead.\n *\n * @param payload The query and variables to send to the server.\n * @param sink The callbacks to invoke when the server responds.\n * @returns A function to unsubscribe from the subscription.\n */\n subscribe<Data extends JsonObject, Variables extends JsonObject>(\n payload: Payload<Data, Variables>,\n sink: { next: (data: Data) => void; error: (error: ClientError) => void },\n ): () => void {\n const unsubscribe = this._subscribe(payload, {\n ...sink,\n next: (result) => {\n if (result.errors) {\n unsubscribe();\n sink.error(new ClientError(payload, result.errors));\n return;\n }\n\n if (!result.data) {\n sink.error(new ClientError(payload, \"Received a GraphQL response without errors or data\"));\n unsubscribe();\n return;\n }\n\n sink.next(result.data);\n },\n });\n\n return unsubscribe;\n }\n\n /**\n * Execute a GraphQL query or mutation.\n * @param payload The query and variables to send to the server.\n * @returns The data returned by the server.\n */\n async query<Data extends JsonObject, Variables extends JsonObject>(payload: Payload<Data, Variables>): Promise<Data> {\n const result = await this._query(payload);\n if (result.errors) {\n throw new ClientError(payload, result.errors);\n }\n if (!result.data) {\n throw new ClientError(payload, \"We received a response without data\");\n }\n return result.data;\n }\n\n /**\n * Close the connection to the server.\n */\n async dispose(): Promise<void> {\n await this._client.dispose();\n }\n\n /**\n * Internal method to subscribe to a GraphQL query.\n *\n * This method shouldn't be used directly. It's exposed for testing.\n */\n _subscribe<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>,\n sink: SetOptional<Sink<Data, Extensions>, \"complete\">,\n ): () => void {\n let subscribePayload: Payload<Data, Variables>;\n let removeConnectedListener = noop;\n\n if (isFunction(payload.variables)) {\n // the caller wants us to re-evaluate the variables every time\n // graphql-ws re-subscribes after reconnecting\n subscribePayload = { ...payload, variables: payload.variables() };\n removeConnectedListener = this._client.on(\"connected\", () => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n assert(isFunction(payload.variables));\n subscribePayload = { ...payload, variables: payload.variables() };\n const [type, operation] = subscribePayload.query.split(/ |\\(/, 2);\n log.info(\"re-sending graphql query\", { type, operation });\n }\n });\n } else {\n subscribePayload = payload;\n }\n\n const [type, operation] = subscribePayload.query.split(/ |\\(/, 2);\n log.info(\"sending graphql query\", { type, operation });\n\n const unsubscribe = this._client.subscribe(subscribePayload as SubscribePayload, {\n next: (result: ExecutionResult<Data, Extensions>) => {\n sink.next(result);\n },\n error: (error) => {\n sink.error(new ClientError(subscribePayload, error as Error | GraphQLError[] | CloseEvent | ErrorEvent));\n },\n complete: () => {\n sink.complete?.();\n },\n });\n\n return () => {\n removeConnectedListener();\n unsubscribe();\n };\n }\n\n private _query<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>,\n ): Promise<ExecutionResult<Data, Extensions>> {\n return new Promise((resolve, reject) => {\n this._subscribe<Data, Variables, Extensions>(payload, { next: resolve, error: reject });\n });\n }\n}\n\nexport type Query<\n Data extends JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject,\n> = string & {\n __TData?: Data;\n __TVariables?: Variables;\n __TExtensions?: Extensions;\n};\n\nexport interface Payload<Data extends JsonObject, Variables extends JsonObject> {\n readonly query: Query<Data, Variables>;\n readonly variables?: Variables | (() => Variables) | null;\n}\n\nexport interface Sink<Data extends JsonObject, Extensions extends JsonObject> {\n next(value: ExecutionResult<Data, Extensions>): void;\n error(error: ClientError): void;\n complete(): void;\n}\n"],"names":["createClient","assert","WebSocket","config","ClientError","loadCookie","isFunction","createLogger","noop","ConnectionStatus","log","EditGraphQL","subscribe","payload","sink","unsubscribe","_subscribe","next","result","errors","error","data","query","_query","dispose","_client","subscribePayload","removeConnectedListener","variables","on","status","type","operation","split","info","complete","Promise","resolve","reject","constructor","app","url","slug","domains","shouldRetry","webSocketImpl","address","protocols","wsOptions","cookie","headers","versionFull","connecting","connected","setImmediate","closed","e","event","wasClean"],"mappings":"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"}