arcadible 0.1.45 → 0.1.46

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 (53) 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 +6 -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/file.js +23 -0
  31. package/src/config/limit.js +21 -0
  32. package/src/parser/env.js +0 -2
  33. package/src/parser/manifest.js +15 -13
  34. package/src/parser/media.js +9 -11
  35. package/src/parser/project.js +31 -9
  36. package/src/phrase.js +168 -39
  37. package/src/schema/game.js +65 -42
  38. package/src/schema/workflow.js +7 -8
  39. package/src/util/argv.js +27 -1
  40. package/src/util/command.js +18 -0
  41. package/src/util/delay.js +5 -21
  42. package/src/util/doc.js +4 -13
  43. package/src/util/links.js +17 -2
  44. package/src/util/media.js +2 -2
  45. package/src/util/objs.js +8 -1
  46. package/src/util/output.js +24 -2
  47. package/src/util/rc.js +2 -2
  48. package/src/util/request.js +1 -1
  49. package/src/util/s3.js +1 -1
  50. package/src/util/schema.js +9 -3
  51. package/src/util/uris.js +1 -1
  52. package/src/util/zip.js +2 -2
  53. package/src/config/doc.js +0 -7
@@ -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
 
@@ -622,12 +723,6 @@ const templateUnavailable = function (template) {
622
723
 
623
724
  // [function]
624
725
 
625
- const timedOut = function () {
626
- return "Timed out.";
627
- };
628
-
629
- // [function]
630
-
631
726
  const unableToFind = function (file) {
632
727
  return `Unable to find: ${file}`;
633
728
  };
@@ -641,7 +736,7 @@ const unableToOpen = function () {
641
736
  // [function]
642
737
 
643
738
  const unableToParse = function (file, message) {
644
- return blocks(`Unable to parse ${file}.`, message);
739
+ return blocks(`Unable to parse ${file}.`, message.trim());
645
740
  };
646
741
 
647
742
  // [function]
@@ -655,6 +750,18 @@ const unableToReach = function () {
655
750
 
656
751
  // [function]
657
752
 
753
+ const unknownField = function () {
754
+ return "Unknown field.";
755
+ };
756
+
757
+ // [function]
758
+
759
+ const unknownTable = function () {
760
+ return "Unknown table.";
761
+ };
762
+
763
+ // [function]
764
+
658
765
  const uploadFailed = function (status) {
659
766
  return `Upload failed with status ${status}.`;
660
767
  };
@@ -670,6 +777,12 @@ const uploadRateLimited = function (version) {
670
777
 
671
778
  // [function]
672
779
 
780
+ const waitTimedOut = function () {
781
+ return "Wait timed out.";
782
+ };
783
+
784
+ // [function]
785
+
673
786
  const workflowMissing = function (file) {
674
787
  return blocks(
675
788
  `No release workflow found: ${file}`,
@@ -687,7 +800,7 @@ const versionPrerelease = function (version) {
687
800
 
688
801
  // a version that's already published, with what is, so the developer knows
689
802
  // what to bump to.
690
- const versionPublished = function (version, { next, production, staging }) {
803
+ const versionExists = function (version, { next, production, staging }) {
691
804
  const latest = [
692
805
  production ? `Production: ${production}` : null,
693
806
  staging ? `Staging: ${staging}` : null,
@@ -780,35 +893,38 @@ const videoWidthMin = function (width) {
780
893
  // [export]
781
894
 
782
895
  module.exports = {
896
+ aborted,
783
897
  buildFailed,
784
898
  buildOutputMissing,
785
899
  buildPublishing,
786
900
  buildPublishingGit,
787
901
  buildSubmitted,
902
+ buildSucceeded,
788
903
  cmdInit,
789
904
  cmdInspect,
790
905
  deployDirMissing,
906
+ didYouMean,
791
907
  docAttrInvalid,
792
908
  docAttrUnallowed,
793
909
  docCommentUnallowed,
794
910
  docMediaElement,
795
911
  docMediaMissing,
912
+ docMediaPath,
796
913
  docMediaType,
797
914
  docTagUnallowed,
798
- docUnsupported,
799
915
  errorCode,
800
916
  gameHandleTaken,
917
+ gameIdMissing,
801
918
  gameNotDeployed,
802
919
  gameNotFound,
803
- gameRepoMissing,
804
920
  gameUnavailable,
805
- gitChangesPresent,
806
921
  gitRemoteMissing,
807
922
  gitRemoteUnreachable,
808
923
  gitRepoMissing,
809
924
  gitTagCreateFailed,
925
+ gitTagExists,
810
926
  gitTagPushFailed,
811
- gitVersionExists,
927
+ gitUncommitted,
812
928
  httpError,
813
929
  imageAspect,
814
930
  imageFound,
@@ -819,30 +935,40 @@ module.exports = {
819
935
  imageUnsupported,
820
936
  imageWidthMax,
821
937
  imageWidthMin,
938
+ initialized,
822
939
  issuesAfterBuild,
823
940
  issuesFound,
941
+ listed,
942
+ lockfileMissing,
943
+ loggedIn,
944
+ loggedOut,
945
+ loggingIn,
824
946
  loginCodeExpired,
825
947
  loginFailed,
826
- noGameId,
827
- noLockFile,
828
- noManifest,
948
+ manifestMissing,
949
+ noAccount,
950
+ noIssuesFound,
829
951
  noProductionRelease,
830
- noTemplate,
831
952
  noVideoMetadata,
832
953
  noVideoTrack,
833
954
  notLoggedIn,
955
+ nothingToDo,
834
956
  openToContinue,
835
957
  opened,
836
- packageFileMissing,
837
958
  packageFileTooLarge,
959
+ packageIndexMissing,
838
960
  packageTooLarge,
839
961
  packageTooManyFiles,
840
962
  packageUncompressedTooLarge,
963
+ packed,
964
+ pressEnterToOpen,
841
965
  projectNotRepoRoot,
842
966
  releaseFailed,
967
+ releaseFailedHeading,
843
968
  releasePublished,
844
969
  releaseTimedOut,
845
970
  releaseWaiting,
971
+ repoNotConnected,
846
972
  sessionExpired,
847
973
  sizeB,
848
974
  sizeGb,
@@ -854,17 +980,19 @@ module.exports = {
854
980
  starterPixiJs,
855
981
  starterThreeJs,
856
982
  tagPushed,
983
+ templateMissing,
857
984
  templateUnavailable,
858
- timedOut,
859
985
  timeoutInvalid,
860
986
  unableToFind,
861
987
  unableToOpen,
862
988
  unableToParse,
863
989
  unableToReach,
990
+ unknownField,
991
+ unknownTable,
864
992
  uploadFailed,
865
993
  uploadRateLimited,
994
+ versionExists,
866
995
  versionPrerelease,
867
- versionPublished,
868
996
  versionRelease,
869
997
  versionUnchecked,
870
998
  videoAspect,
@@ -878,5 +1006,6 @@ module.exports = {
878
1006
  videoUnsupported,
879
1007
  videoWidthMax,
880
1008
  videoWidthMin,
1009
+ waitTimedOut,
881
1010
  workflowMissing,
882
1011
  };