arcadible 0.1.45 → 0.1.47

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 (55) hide show
  1. package/bin/arc-build.js +9 -17
  2. package/bin/arc-deploy.js +20 -36
  3. package/bin/arc-init.js +6 -16
  4. package/bin/arc-inspect.js +3 -7
  5. package/bin/arc-login.js +5 -5
  6. package/bin/arc-logout.js +4 -8
  7. package/bin/arc-open.js +7 -20
  8. package/bin/arc-pack.js +4 -14
  9. package/bin/arc-play.js +6 -20
  10. package/bin/arc-validate.js +8 -17
  11. package/bin/arc-whoami.js +5 -9
  12. package/bin/arc.js +7 -2
  13. package/package.json +1 -1
  14. package/src/account.js +5 -5
  15. package/src/action/build/tool.js +8 -15
  16. package/src/action/deploy/tool-git.js +1 -6
  17. package/src/action/deploy/wait.js +5 -11
  18. package/src/action/init/manifest.js +9 -37
  19. package/src/action/login/flow.js +3 -10
  20. package/src/action/open/tool.js +2 -1
  21. package/src/action/pack/limits.js +4 -6
  22. package/src/action/pack/tool.js +27 -5
  23. package/src/action/play/tool.js +3 -3
  24. package/src/action/predeploy/ac.js +28 -43
  25. package/src/action/predeploy/git.js +4 -4
  26. package/src/action/predeploy/pm.js +1 -1
  27. package/src/action/predeploy/published.js +4 -4
  28. package/src/action/predeploy/tool-git.js +10 -10
  29. package/src/action/validate/unknown.js +11 -10
  30. package/src/config/code.js +1 -0
  31. package/src/config/file.js +23 -0
  32. package/src/config/limit.js +21 -0
  33. package/src/parser/env.js +0 -2
  34. package/src/parser/manifest.js +15 -13
  35. package/src/parser/media.js +9 -11
  36. package/src/parser/project.js +31 -9
  37. package/src/phrase.js +178 -39
  38. package/src/schema/check/workflow.js +15 -0
  39. package/src/schema/game.js +65 -42
  40. package/src/schema/workflow.js +21 -8
  41. package/src/util/argv.js +27 -1
  42. package/src/util/command.js +18 -0
  43. package/src/util/delay.js +5 -21
  44. package/src/util/doc.js +4 -13
  45. package/src/util/links.js +17 -2
  46. package/src/util/media.js +2 -2
  47. package/src/util/objs.js +8 -1
  48. package/src/util/output.js +24 -2
  49. package/src/util/rc.js +2 -2
  50. package/src/util/request.js +1 -1
  51. package/src/util/s3.js +1 -1
  52. package/src/util/schema.js +9 -3
  53. package/src/util/uris.js +1 -1
  54. package/src/util/zip.js +2 -2
  55. package/src/config/doc.js +0 -7
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ // [declare]
4
+
5
+ const MB = 1024 * 1024;
6
+
7
+ // [export]
8
+
9
+ // the limits on a packed game, as Arcadible enforces them when it publishes
10
+ // a release (docs: limits.md). arc pack checks them so a build that would
11
+ // fail there fails before it's uploaded.
12
+ module.exports = {
13
+ // the most files in the zip.
14
+ FILES: 10000,
15
+ // the largest file, uncompressed.
16
+ FILE_SIZE: 64 * MB,
17
+ // everything packed, uncompressed.
18
+ TOTAL_SIZE: 256 * MB,
19
+ // the zip of deploy_dir alone, compressed.
20
+ ZIP_SIZE: 64 * MB,
21
+ };
package/src/parser/env.js CHANGED
@@ -58,10 +58,8 @@ const parseJson = function (buf) {
58
58
  // (node_modules/.bin), and its prebuild and postbuild run, as they do
59
59
  // locally. npm runs the scripts of a pnpm or Yarn project too.
60
60
  const extract = function (conf) {
61
- /* eslint-disable camelcase */
62
61
  const game = { version: conf.version };
63
62
  const workflow = conf.scripts?.build ? { build: NPM_RUN_BUILD } : {};
64
- /* eslint-enable camelcase */
65
63
  return deepCompact({ game, workflow }) ?? {};
66
64
  };
67
65
 
@@ -11,22 +11,23 @@ const fs = require("fs-extra");
11
11
  // [import]
12
12
 
13
13
  const cfgcode = require("../config/code");
14
- const cfgproduct = require("../config/product");
14
+ const cfgfile = require("../config/file");
15
15
  const error = require("../util/error");
16
+ const objs = require("../util/objs");
16
17
  const phrase = require("../phrase");
17
18
  const TOML = require("../util/toml");
18
19
 
19
20
  // [use]
20
21
 
21
22
  const ArcError = error.ArcError;
23
+ const isTable = objs.isTable;
22
24
  const join = path.join;
23
25
  const pathExists = fs.pathExists;
24
26
  const readFile = fs.readFile;
25
27
 
26
28
  // [declare]
27
29
 
28
- const HANDLE = cfgproduct.handle;
29
- const MANIFEST = `${HANDLE}.toml`;
30
+ const MANIFEST = cfgfile.MANIFEST;
30
31
 
31
32
  // [function]
32
33
 
@@ -45,12 +46,7 @@ const parseToml = function (buf) {
45
46
  // [function]
46
47
 
47
48
  const isEmptyTable = function (value) {
48
- return (
49
- value !== null &&
50
- typeof value === "object" &&
51
- !Array.isArray(value) &&
52
- !Object.keys(value).length
53
- );
49
+ return isTable(value) && !Object.keys(value).length;
54
50
  };
55
51
 
56
52
  // [function]
@@ -65,14 +61,20 @@ const extract = function (conf) {
65
61
 
66
62
  // [function]
67
63
 
68
- const main = function (root) {
64
+ // arcadible.toml as written, or {} without it.
65
+ const read = function (root) {
69
66
  const file = join(root, MANIFEST);
70
67
  return pathExists(file)
71
68
  .then((exists) => (exists ? readFile(file, "utf8") : null))
72
- .then((buf) => (buf === null ? {} : parseToml(buf)))
73
- .then((conf) => (Object.keys(conf).length ? extract(conf) : {}));
69
+ .then((buf) => (buf === null ? {} : parseToml(buf)));
70
+ };
71
+
72
+ // [function]
73
+
74
+ const main = function (root) {
75
+ return read(root).then(extract);
74
76
  };
75
77
 
76
78
  // [export]
77
79
 
78
- module.exports = main;
80
+ module.exports = Object.assign(main, { read });
@@ -11,8 +11,8 @@ const fs = require("fs-extra");
11
11
  // [import]
12
12
 
13
13
  const cfgart = require("../config/art");
14
+ const cfgfile = require("../config/file");
14
15
  const cfgimage = require("../config/image");
15
- const cfgproduct = require("../config/product");
16
16
  const cfgvideo = require("../config/video");
17
17
  const objs = require("../util/objs");
18
18
 
@@ -22,17 +22,15 @@ const deepCompact = objs.deepCompact;
22
22
  const extname = path.extname;
23
23
  const join = path.join;
24
24
  const parse = path.parse;
25
+ // the manifest's paths use `/` on every platform, as Arcadible's do.
26
+ const posixJoin = path.posix.join;
25
27
  const pathExists = fs.pathExists;
26
28
  const readdir = fs.promises.readdir;
27
29
 
28
30
  // [declare]
29
31
 
30
- const ART = cfgart;
31
-
32
- // [declare]
33
-
34
- const HANDLE = cfgproduct.handle;
35
- const MEDIA = `.${HANDLE}`;
32
+ const GALLERY = cfgfile.GALLERY;
33
+ const MEDIA = cfgfile.MEDIA;
36
34
 
37
35
  // [function]
38
36
 
@@ -50,9 +48,9 @@ const art = function (root) {
50
48
  list(join(root, MEDIA)).then((names) => ({
51
49
  ...game,
52
50
  ...Object.fromEntries(
53
- ART.map((f) => [
51
+ cfgart.map((f) => [
54
52
  parse(f).name,
55
- names.includes(f) ? join(MEDIA, f) : null,
53
+ names.includes(f) ? posixJoin(MEDIA, f) : null,
56
54
  ]),
57
55
  ),
58
56
  }));
@@ -64,7 +62,7 @@ const handleGallery = function (entries) {
64
62
  const exts = [...Object.keys(cfgimage), ...Object.keys(cfgvideo)];
65
63
  return entries
66
64
  .filter((f) => exts.includes(extname(f)))
67
- .map((f) => join(MEDIA, "gallery", f))
65
+ .map((f) => posixJoin(GALLERY, f))
68
66
  .sort();
69
67
  };
70
68
 
@@ -72,7 +70,7 @@ const handleGallery = function (entries) {
72
70
 
73
71
  const gallery = function (root) {
74
72
  return (game) =>
75
- list(join(root, MEDIA, "gallery"))
73
+ list(join(root, GALLERY))
76
74
  .then(handleGallery)
77
75
  .then((data) => ({ ...game, gallery: data }));
78
76
  };
@@ -11,15 +11,17 @@ const fs = require("fs-extra");
11
11
  // [import]
12
12
 
13
13
  const cfgcode = require("../config/code");
14
- const cfgproduct = require("../config/product");
14
+ const cfgfile = require("../config/file");
15
15
  const cfgworkflow = require("../config/workflow");
16
16
  const env = require("./env");
17
17
  const error = require("../util/error");
18
+ const gameSchema = require("../schema/game");
18
19
  const manifest = require("./manifest");
19
20
  const media = require("./media");
20
21
  const phrase = require("../phrase");
21
22
  const promise = require("../util/promise");
22
23
  const readme = require("./readme");
24
+ const workflowSchema = require("../schema/workflow");
23
25
 
24
26
  // [use]
25
27
 
@@ -33,7 +35,7 @@ const sep = path.sep;
33
35
 
34
36
  // [declare]
35
37
 
36
- const MANIFEST = `${cfgproduct.handle}.toml`;
38
+ const MANIFEST = cfgfile.MANIFEST;
37
39
 
38
40
  // [function]
39
41
 
@@ -48,6 +50,18 @@ const configGame = function (readmeGame, mediaGame, envGame, manifestGame) {
48
50
 
49
51
  // [function]
50
52
 
53
+ // the fields of `values` that `schema` knows. Arcadible ignores the rest, so
54
+ // they're left out of what's packed and inspected; arc validate warns about
55
+ // each (action/validate/unknown.js).
56
+ const known = function (values, schema, root) {
57
+ const fields = Object.keys(schema({}, { root }).shape);
58
+ return Object.fromEntries(
59
+ Object.entries(values).filter(([field]) => fields.includes(field)),
60
+ );
61
+ };
62
+
63
+ // [function]
64
+
51
65
  const configWorkflow = function (envWorkflow, manifestWorkflow) {
52
66
  return {
53
67
  ...cfgworkflow,
@@ -95,7 +109,7 @@ const ensureManifest = function (root) {
95
109
  if (found !== false) {
96
110
  throw new ArcError(
97
111
  cfgcode.MANIFEST_MISSING,
98
- phrase.noManifest(MANIFEST, shown(root), found && shown(found)),
112
+ phrase.manifestMissing(MANIFEST, shown(root), found && shown(found)),
99
113
  );
100
114
  }
101
115
  });
@@ -113,13 +127,21 @@ const parseSources = function (root, manifestData) {
113
127
  () => env(root),
114
128
  ];
115
129
  return promise.serial(parsers).then(([readmeData, mediaData, envData]) => ({
116
- game: configGame(
117
- readmeData.game,
118
- mediaData.game,
119
- envData.game,
120
- manifestData.game,
130
+ game: known(
131
+ configGame(
132
+ readmeData.game,
133
+ mediaData.game,
134
+ envData.game,
135
+ manifestData.game,
136
+ ),
137
+ gameSchema,
138
+ root,
139
+ ),
140
+ workflow: known(
141
+ configWorkflow(envData.workflow, manifestData.workflow),
142
+ workflowSchema,
143
+ root,
121
144
  ),
122
- workflow: configWorkflow(envData.workflow, manifestData.workflow),
123
145
  }));
124
146
  };
125
147
 
package/src/phrase.js CHANGED
@@ -32,6 +32,13 @@ const waited = function (seconds) {
32
32
 
33
33
  // [function]
34
34
 
35
+ // a command's heading when it fails: `Deploy aborted.`
36
+ const aborted = function (command) {
37
+ return `${command[0].toUpperCase()}${command.slice(1)} aborted.`;
38
+ };
39
+
40
+ // [function]
41
+
35
42
  // a build that exited with `code`, or was stopped by `signal`, with what it
36
43
  // wrote to stderr.
37
44
  const buildFailed = function ({ code, signal, stderr }) {
@@ -71,12 +78,30 @@ const buildSubmitted = function (version, channel, built) {
71
78
 
72
79
  // [function]
73
80
 
81
+ const buildSucceeded = function () {
82
+ return "Built.";
83
+ };
84
+
85
+ // [function]
86
+
87
+ const cmdBuild = function () {
88
+ return `\`${TOOL} build\``;
89
+ };
90
+
91
+ // [function]
92
+
74
93
  const cmdDeploy = function () {
75
94
  return `\`${TOOL} deploy\``;
76
95
  };
77
96
 
78
97
  // [function]
79
98
 
99
+ const cmdDeployGit = function () {
100
+ return `\`${TOOL} deploy git\``;
101
+ };
102
+
103
+ // [function]
104
+
80
105
  const cmdInit = function () {
81
106
  return `\`${TOOL} init\``;
82
107
  };
@@ -104,12 +129,18 @@ const cmdValidate = function () {
104
129
  const deployDirMissing = function (dir) {
105
130
  return blocks(
106
131
  `Unable to find deploy_dir: ${dir}`,
107
- "Run `arc build`, or set deploy_dir to the folder your build writes.",
132
+ `Run ${cmdBuild()}, or set deploy_dir to the folder your build writes.`,
108
133
  );
109
134
  };
110
135
 
111
136
  // [function]
112
137
 
138
+ const didYouMean = function (near) {
139
+ return `Did you mean: ${near}?`;
140
+ };
141
+
142
+ // [function]
143
+
113
144
  const docAttrInvalid = function (tag, attr, value) {
114
145
  return `Value '${value}' is not valid for the '${attr}' attribute on the '${tag}' tag.`;
115
146
  };
@@ -140,20 +171,22 @@ const docMediaMissing = function (src) {
140
171
 
141
172
  // [function]
142
173
 
143
- const docMediaType = function (src) {
144
- return `Must be a PNG or MP4 file: ${src}`;
174
+ // a description media src that isn't written as the gallery's path to it,
175
+ // such as `./.arcadible/gallery/x.png`: Arcadible matches it as written.
176
+ const docMediaPath = function (src, gallery) {
177
+ return `Must be written as ${gallery}/<file>: ${src}`;
145
178
  };
146
179
 
147
180
  // [function]
148
181
 
149
- const docTagUnallowed = function (tag) {
150
- return `Tag '${tag}' is not permitted.`;
182
+ const docMediaType = function (src) {
183
+ return `Must be a PNG or MP4 file: ${src}`;
151
184
  };
152
185
 
153
186
  // [function]
154
187
 
155
- const docUnsupported = function () {
156
- return "Document has an unsupported file type.";
188
+ const docTagUnallowed = function (tag) {
189
+ return `Tag '${tag}' is not permitted.`;
157
190
  };
158
191
 
159
192
  // [function]
@@ -183,8 +216,76 @@ const gameNotDeployed = function (game) {
183
216
 
184
217
  // [function]
185
218
 
219
+ const initialized = function () {
220
+ return "Initialized.";
221
+ };
222
+
223
+ // [function]
224
+
225
+ // the heading of arc validate's list of issues, warnings, or references:
226
+ // `2 issues:`
227
+ const listed = function (count, noun) {
228
+ return `${count} ${noun}${count === 1 ? "" : "s"}:`;
229
+ };
230
+
231
+ // [function]
232
+
233
+ const loggedIn = function () {
234
+ return "Logged in.";
235
+ };
236
+
237
+ // [function]
238
+
239
+ const loggedOut = function () {
240
+ return "Logged out.";
241
+ };
242
+
243
+ // [function]
244
+
245
+ const loggingIn = function () {
246
+ return "Logging in...";
247
+ };
248
+
249
+ // [function]
250
+
251
+ const noAccount = function () {
252
+ return "Not logged in.";
253
+ };
254
+
255
+ // [function]
256
+
257
+ const noIssuesFound = function () {
258
+ return "No issues found.";
259
+ };
260
+
261
+ // [function]
262
+
263
+ const nothingToDo = function () {
264
+ return "Nothing to do.";
265
+ };
266
+
267
+ // [function]
268
+
269
+ const packed = function () {
270
+ return "Packed.";
271
+ };
272
+
273
+ // [function]
274
+
275
+ const pressEnterToOpen = function () {
276
+ return "Press Enter to open the URL.";
277
+ };
278
+
279
+ // [function]
280
+
281
+ const releaseFailedHeading = function () {
282
+ return "Release failed.";
283
+ };
284
+
285
+ // [function]
286
+
186
287
  // origin isn't the game's connected repository: none is, or another is.
187
- const gameRepoMissing = function (game, repo, url) {
288
+ const repoNotConnected = function (game, repo, url) {
188
289
  return blocks(`${repo} isn't ${game}'s repository on ${TITLE}.`, [
189
290
  `The game's owner connects it in ${TITLE} Studio, on the game's Repository tab, and connects it again if it was renamed on GitHub:`,
190
291
  url,
@@ -208,7 +309,7 @@ const gameUnavailable = function (id) {
208
309
 
209
310
  // [function]
210
311
 
211
- const gitChangesPresent = function () {
312
+ const gitUncommitted = function () {
212
313
  return blocks(
213
314
  "Uncommitted changes found.",
214
315
  "Commit, stash, or discard them first.",
@@ -235,12 +336,12 @@ const gitRemoteUnreachable = function () {
235
336
 
236
337
  // [function]
237
338
 
238
- const noManifest = function (file, dir, found) {
339
+ const manifestMissing = function (file, dir, found) {
239
340
  return blocks(
240
341
  dir === "." ? `No ${file} in this directory.` : `No ${file} in ${dir}.`,
241
342
  found
242
- ? `The project is in \`${found}\`: run arc there, or pass \`-C ${found}\`.`
243
- : "Run arc in the project's directory, or pass -C, or start a project with `arc init`.",
343
+ ? `The project is in \`${found}\`: run ${TOOL} there, or pass \`-C ${found}\`.`
344
+ : `Run ${TOOL} in the project's directory, or pass \`-C\`, or start a project with ${cmdInit()}.`,
244
345
  );
245
346
  };
246
347
 
@@ -248,8 +349,8 @@ const noManifest = function (file, dir, found) {
248
349
 
249
350
  const projectNotRepoRoot = function (prefix) {
250
351
  return blocks(
251
- `arc deploy git releases the project at the repository's root, and this one is in ${prefix}`,
252
- "Deploy it with `arc deploy`, or give it a repository of its own.",
352
+ `${cmdDeployGit()} releases the project at the repository's root, and this one is in ${prefix}.`,
353
+ `Deploy it with ${cmdDeploy()}, or give it a repository of its own.`,
253
354
  );
254
355
  };
255
356
 
@@ -282,7 +383,7 @@ const gitTagPushFailed = function (version) {
282
383
 
283
384
  // [function]
284
385
 
285
- const gitVersionExists = function (version) {
386
+ const gitTagExists = function (version) {
286
387
  return blocks(
287
388
  `Git tag for v${version} already exists, here or on origin.`,
288
389
  "Bump the version.",
@@ -390,7 +491,7 @@ const loginFailed = function () {
390
491
 
391
492
  // [function]
392
493
 
393
- const noGameId = function () {
494
+ const gameIdMissing = function () {
394
495
  return blocks(
395
496
  "No game handle or ID.",
396
497
  `Pass one, or run it in a project after ${cmdInit()} has added an ID.`,
@@ -399,7 +500,7 @@ const noGameId = function () {
399
500
 
400
501
  // [function]
401
502
 
402
- const noLockFile = function () {
503
+ const lockfileMissing = function () {
403
504
  return blocks("No lockfile found.", [
404
505
  "Install your dependencies to create one.",
405
506
  "Then commit it.",
@@ -414,7 +515,7 @@ const noProductionRelease = function () {
414
515
 
415
516
  // [function]
416
517
 
417
- const noTemplate = function () {
518
+ const templateMissing = function () {
418
519
  return blocks("No template chosen.", [
419
520
  "Pass `--template <user/repo>`.",
420
521
  "Or pass `--yes` for the blank starter.",
@@ -424,7 +525,7 @@ const noTemplate = function () {
424
525
  // [function]
425
526
 
426
527
  const notLoggedIn = function () {
427
- return blocks("Not logged in.", `Run ${cmdLogin()} to log in.`);
528
+ return blocks(noAccount(), `Run ${cmdLogin()} to log in.`);
428
529
  };
429
530
 
430
531
  // [function]
@@ -453,7 +554,7 @@ const openToContinue = function () {
453
554
 
454
555
  // [function]
455
556
 
456
- const packageFileMissing = function (file) {
557
+ const packageIndexMissing = function (file) {
457
558
  return `Package is missing '${file}'.`;
458
559
  };
459
560
 
@@ -465,6 +566,15 @@ const packageFileTooLarge = function (file, size) {
465
566
 
466
567
  // [function]
467
568
 
569
+ const packagePathReserved = function (folder) {
570
+ return blocks(
571
+ `'${folder}/' is reserved for ${TITLE}.`,
572
+ "Rename the folder, and the paths that load from it.",
573
+ );
574
+ };
575
+
576
+ // [function]
577
+
468
578
  const packageTooLarge = function (size) {
469
579
  return blocks(
470
580
  `Package is larger than ${size} MB.`,
@@ -622,12 +732,6 @@ const templateUnavailable = function (template) {
622
732
 
623
733
  // [function]
624
734
 
625
- const timedOut = function () {
626
- return "Timed out.";
627
- };
628
-
629
- // [function]
630
-
631
735
  const unableToFind = function (file) {
632
736
  return `Unable to find: ${file}`;
633
737
  };
@@ -641,7 +745,7 @@ const unableToOpen = function () {
641
745
  // [function]
642
746
 
643
747
  const unableToParse = function (file, message) {
644
- return blocks(`Unable to parse ${file}.`, message);
748
+ return blocks(`Unable to parse ${file}.`, message.trim());
645
749
  };
646
750
 
647
751
  // [function]
@@ -655,6 +759,18 @@ const unableToReach = function () {
655
759
 
656
760
  // [function]
657
761
 
762
+ const unknownField = function () {
763
+ return "Unknown field.";
764
+ };
765
+
766
+ // [function]
767
+
768
+ const unknownTable = function () {
769
+ return "Unknown table.";
770
+ };
771
+
772
+ // [function]
773
+
658
774
  const uploadFailed = function (status) {
659
775
  return `Upload failed with status ${status}.`;
660
776
  };
@@ -670,6 +786,12 @@ const uploadRateLimited = function (version) {
670
786
 
671
787
  // [function]
672
788
 
789
+ const waitTimedOut = function () {
790
+ return "Wait timed out.";
791
+ };
792
+
793
+ // [function]
794
+
673
795
  const workflowMissing = function (file) {
674
796
  return blocks(
675
797
  `No release workflow found: ${file}`,
@@ -687,7 +809,7 @@ const versionPrerelease = function (version) {
687
809
 
688
810
  // a version that's already published, with what is, so the developer knows
689
811
  // what to bump to.
690
- const versionPublished = function (version, { next, production, staging }) {
812
+ const versionExists = function (version, { next, production, staging }) {
691
813
  const latest = [
692
814
  production ? `Production: ${production}` : null,
693
815
  staging ? `Staging: ${staging}` : null,
@@ -780,35 +902,38 @@ const videoWidthMin = function (width) {
780
902
  // [export]
781
903
 
782
904
  module.exports = {
905
+ aborted,
783
906
  buildFailed,
784
907
  buildOutputMissing,
785
908
  buildPublishing,
786
909
  buildPublishingGit,
787
910
  buildSubmitted,
911
+ buildSucceeded,
788
912
  cmdInit,
789
913
  cmdInspect,
790
914
  deployDirMissing,
915
+ didYouMean,
791
916
  docAttrInvalid,
792
917
  docAttrUnallowed,
793
918
  docCommentUnallowed,
794
919
  docMediaElement,
795
920
  docMediaMissing,
921
+ docMediaPath,
796
922
  docMediaType,
797
923
  docTagUnallowed,
798
- docUnsupported,
799
924
  errorCode,
800
925
  gameHandleTaken,
926
+ gameIdMissing,
801
927
  gameNotDeployed,
802
928
  gameNotFound,
803
- gameRepoMissing,
804
929
  gameUnavailable,
805
- gitChangesPresent,
806
930
  gitRemoteMissing,
807
931
  gitRemoteUnreachable,
808
932
  gitRepoMissing,
809
933
  gitTagCreateFailed,
934
+ gitTagExists,
810
935
  gitTagPushFailed,
811
- gitVersionExists,
936
+ gitUncommitted,
812
937
  httpError,
813
938
  imageAspect,
814
939
  imageFound,
@@ -819,30 +944,41 @@ module.exports = {
819
944
  imageUnsupported,
820
945
  imageWidthMax,
821
946
  imageWidthMin,
947
+ initialized,
822
948
  issuesAfterBuild,
823
949
  issuesFound,
950
+ listed,
951
+ lockfileMissing,
952
+ loggedIn,
953
+ loggedOut,
954
+ loggingIn,
824
955
  loginCodeExpired,
825
956
  loginFailed,
826
- noGameId,
827
- noLockFile,
828
- noManifest,
957
+ manifestMissing,
958
+ noAccount,
959
+ noIssuesFound,
829
960
  noProductionRelease,
830
- noTemplate,
831
961
  noVideoMetadata,
832
962
  noVideoTrack,
833
963
  notLoggedIn,
964
+ nothingToDo,
834
965
  openToContinue,
835
966
  opened,
836
- packageFileMissing,
837
967
  packageFileTooLarge,
968
+ packageIndexMissing,
969
+ packagePathReserved,
838
970
  packageTooLarge,
839
971
  packageTooManyFiles,
840
972
  packageUncompressedTooLarge,
973
+ packed,
974
+ pressEnterToOpen,
841
975
  projectNotRepoRoot,
842
976
  releaseFailed,
977
+ releaseFailedHeading,
843
978
  releasePublished,
844
979
  releaseTimedOut,
845
980
  releaseWaiting,
981
+ repoNotConnected,
846
982
  sessionExpired,
847
983
  sizeB,
848
984
  sizeGb,
@@ -854,17 +990,19 @@ module.exports = {
854
990
  starterPixiJs,
855
991
  starterThreeJs,
856
992
  tagPushed,
993
+ templateMissing,
857
994
  templateUnavailable,
858
- timedOut,
859
995
  timeoutInvalid,
860
996
  unableToFind,
861
997
  unableToOpen,
862
998
  unableToParse,
863
999
  unableToReach,
1000
+ unknownField,
1001
+ unknownTable,
864
1002
  uploadFailed,
865
1003
  uploadRateLimited,
1004
+ versionExists,
866
1005
  versionPrerelease,
867
- versionPublished,
868
1006
  versionRelease,
869
1007
  versionUnchecked,
870
1008
  videoAspect,
@@ -878,5 +1016,6 @@ module.exports = {
878
1016
  videoUnsupported,
879
1017
  videoWidthMax,
880
1018
  videoWidthMin,
1019
+ waitTimedOut,
881
1020
  workflowMissing,
882
1021
  };