@freegamestore/cli 0.1.4 → 0.1.6

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 (65) hide show
  1. package/LICENSE +1 -1
  2. package/dist/commands/check.d.ts +1 -1
  3. package/dist/commands/check.d.ts.map +1 -1
  4. package/dist/commands/check.js +2 -2
  5. package/dist/commands/check.js.map +1 -1
  6. package/dist/commands/doctor.js +1 -1
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +3 -3
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/list.d.ts.map +1 -1
  12. package/dist/commands/list.js +2 -2
  13. package/dist/commands/list.js.map +1 -1
  14. package/dist/commands/login.js +1 -1
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/logout.d.ts.map +1 -1
  17. package/dist/commands/logout.js +1 -1
  18. package/dist/commands/logout.js.map +1 -1
  19. package/dist/commands/logs.d.ts.map +1 -1
  20. package/dist/commands/logs.js +1 -1
  21. package/dist/commands/logs.js.map +1 -1
  22. package/dist/commands/publish.d.ts +1 -1
  23. package/dist/commands/publish.d.ts.map +1 -1
  24. package/dist/commands/publish.js +18 -23
  25. package/dist/commands/publish.js.map +1 -1
  26. package/dist/commands/screencheck.d.ts.map +1 -1
  27. package/dist/commands/screencheck.js +12 -9
  28. package/dist/commands/screencheck.js.map +1 -1
  29. package/dist/index.js +7 -7
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/config.js +2 -2
  32. package/dist/lib/config.js.map +1 -1
  33. package/dist/lib/history.js +1 -1
  34. package/dist/lib/history.js.map +1 -1
  35. package/dist/lib/style.js +2 -2
  36. package/dist/lib/style.js.map +1 -1
  37. package/package.json +5 -5
  38. package/dist/commands/list.test.d.ts +0 -2
  39. package/dist/commands/list.test.d.ts.map +0 -1
  40. package/dist/commands/list.test.js +0 -25
  41. package/dist/commands/list.test.js.map +0 -1
  42. package/dist/commands/publish.test.d.ts +0 -2
  43. package/dist/commands/publish.test.d.ts.map +0 -1
  44. package/dist/commands/publish.test.js +0 -166
  45. package/dist/commands/publish.test.js.map +0 -1
  46. package/dist/lib/app-id.test.d.ts +0 -2
  47. package/dist/lib/app-id.test.d.ts.map +0 -1
  48. package/dist/lib/app-id.test.js +0 -45
  49. package/dist/lib/app-id.test.js.map +0 -1
  50. package/dist/lib/apps.test.d.ts +0 -2
  51. package/dist/lib/apps.test.d.ts.map +0 -1
  52. package/dist/lib/apps.test.js +0 -42
  53. package/dist/lib/apps.test.js.map +0 -1
  54. package/dist/lib/config.test.d.ts +0 -2
  55. package/dist/lib/config.test.d.ts.map +0 -1
  56. package/dist/lib/config.test.js +0 -22
  57. package/dist/lib/config.test.js.map +0 -1
  58. package/dist/lib/history.test.d.ts +0 -2
  59. package/dist/lib/history.test.d.ts.map +0 -1
  60. package/dist/lib/history.test.js +0 -30
  61. package/dist/lib/history.test.js.map +0 -1
  62. package/dist/one-shot/doctor.test.d.ts +0 -2
  63. package/dist/one-shot/doctor.test.d.ts.map +0 -1
  64. package/dist/one-shot/doctor.test.js +0 -63
  65. package/dist/one-shot/doctor.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAoBpD,MAAM,cAAc,GAAc;IAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,iCAAiC;CAC1E,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAChD,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAoBpD,MAAM,cAAc,GAAc;IAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iCAAiC;CACvE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAChD,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -15,7 +15,7 @@ export async function fetchAppHistory(slug) {
15
15
  Accept: 'application/vnd.github+json',
16
16
  'X-GitHub-Api-Version': '2022-11-28',
17
17
  };
18
- const token = process.env['GH_TOKEN'] ?? process.env['GITHUB_TOKEN'];
18
+ const token = process.env.GH_TOKEN ?? process.env.GITHUB_TOKEN;
19
19
  if (token)
20
20
  headers.Authorization = `Bearer ${token}`;
21
21
  let res;
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,MAAM,KAAK,GAAe,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAA2B;QACtC,YAAY,EAAE,SAAS;QACvB,MAAM,EAAE,6BAA6B;QACrC,sBAAsB,EAAE,YAAY;KACrC,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrE,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,gCAAgC,IAAI,qBAAqB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACzE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,+CAA+C;IAC7F,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAW1B,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAe,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;QACnE,OAAO,EAAE,CAAC,CAAC,QAAQ;KACpB,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,MAAY,IAAI,IAAI,EAAE;IAChE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,UAAU,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,MAAM,OAAO,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,WAAW,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,SAAS,SAAS,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
package/dist/lib/style.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // Tiny ANSI styling without pulling chalk. Auto-disables when stdout
2
2
  // isn't a TTY (CI logs, redirected output) so plain text is captured.
3
- const isTTY = Boolean(process.stdout.isTTY) && process.env['NO_COLOR'] !== '1';
3
+ const isTTY = Boolean(process.stdout.isTTY) && process.env.NO_COLOR !== '1';
4
4
  const wrap = (open, close) => (s) => isTTY ? `\x1b[${open}m${s}\x1b[${close}m` : s;
5
5
  export const bold = wrap('1', '22');
6
6
  export const dim = wrap('2', '22');
@@ -13,6 +13,6 @@ export function header(s) {
13
13
  return `\n${cyan(line)}\n${cyan(' ')}${bold(s)}\n${cyan(line)}\n`;
14
14
  }
15
15
  export function step(n, total, label) {
16
- return cyan(`[${n}/${total}]`) + ' ' + bold(label);
16
+ return `${cyan(`[${n}/${total}]`)} ${bold(label)}`;
17
17
  }
18
18
  //# sourceMappingURL=style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/lib/style.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sEAAsE;AAEtE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AAE/E,MAAM,IAAI,GACR,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAChC,CAAC,CAAS,EAAU,EAAE,CACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,KAAa,EAAE,KAAa;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/lib/style.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sEAAsE;AAEtE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC;AAE5E,MAAM,IAAI,GACR,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAChC,CAAC,CAAS,EAAU,EAAE,CACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,KAAa,EAAE,KAAa;IAC1D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACrD,CAAC"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@freegamestore/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "fgs — CLI for publishing free games to freegamestore.online",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "fgs": "./dist/index.js"
9
9
  },
10
- "homepage": "https://github.com/freeappstore-online/sdk#readme",
10
+ "homepage": "https://github.com/freegamestore-online/platform#readme",
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "git+https://github.com/freeappstore-online/sdk.git",
13
+ "url": "git+https://github.com/freegamestore-online/platform.git",
14
14
  "directory": "packages/fgs-cli"
15
15
  },
16
16
  "bugs": {
17
- "url": "https://github.com/freeappstore-online/sdk/issues"
17
+ "url": "https://github.com/freegamestore-online/platform/issues"
18
18
  },
19
19
  "keywords": [
20
20
  "freegamestore",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "commander": "^12.1.0",
35
35
  "prompts": "^2.4.2",
36
- "@freeappstore/compliance": "0.2.0"
36
+ "@freegamestore/compliance": "0.2.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.0.0",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=list.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { repoSlug } from './list.js';
3
- describe('repoSlug', () => {
4
- it('parses owner/name from a github HTTPS URL', () => {
5
- expect(repoSlug('https://github.com/foo/bar')).toBe('foo/bar');
6
- });
7
- it('strips a trailing .git', () => {
8
- expect(repoSlug('https://github.com/foo/bar.git')).toBe('foo/bar');
9
- });
10
- it('strips a trailing slash', () => {
11
- expect(repoSlug('https://github.com/foo/bar/')).toBe('foo/bar');
12
- });
13
- it('keeps dots in the repo name (regression: previously stopped at the dot)', () => {
14
- expect(repoSlug('https://github.com/nodejs/node.js')).toBe('nodejs/node.js');
15
- expect(repoSlug('https://github.com/nodejs/node.js.git')).toBe('nodejs/node.js');
16
- });
17
- it('parses SSH-style URLs too', () => {
18
- expect(repoSlug('git@github.com:foo/bar.git')).toBe('foo/bar');
19
- });
20
- it('returns empty string for non-github URLs', () => {
21
- expect(repoSlug('https://gitlab.com/foo/bar')).toBe('');
22
- expect(repoSlug('')).toBe('');
23
- });
24
- });
25
- //# sourceMappingURL=list.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7E,MAAM,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=publish.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish.test.d.ts","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":""}
@@ -1,166 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseGitHubRepo, buildSubmissionUrl, resolveCategory, resolveType, resolveFromFlags, buildPromptList, } from './publish.js';
3
- describe('parseGitHubRepo', () => {
4
- it('parses HTTPS clone URLs', () => {
5
- expect(parseGitHubRepo('https://github.com/foo/bar')).toBe('foo/bar');
6
- expect(parseGitHubRepo('https://github.com/foo/bar.git')).toBe('foo/bar');
7
- expect(parseGitHubRepo('https://github.com/foo/bar/')).toBe('foo/bar');
8
- expect(parseGitHubRepo('https://github.com/foo/bar.git/')).toBe('foo/bar');
9
- });
10
- it('parses SSH clone URLs', () => {
11
- expect(parseGitHubRepo('git@github.com:foo/bar.git')).toBe('foo/bar');
12
- expect(parseGitHubRepo('git@github.com:foo/bar')).toBe('foo/bar');
13
- });
14
- it('allows dots in repo names (e.g. node.js, foo.config)', () => {
15
- expect(parseGitHubRepo('https://github.com/nodejs/node.js')).toBe('nodejs/node.js');
16
- expect(parseGitHubRepo('git@github.com:nodejs/node.js.git')).toBe('nodejs/node.js');
17
- });
18
- it('allows hyphens, underscores, and digits', () => {
19
- expect(parseGitHubRepo('https://github.com/foo-bar/baz_qux-2')).toBe('foo-bar/baz_qux-2');
20
- });
21
- it('returns null for non-GitHub URLs', () => {
22
- expect(parseGitHubRepo('https://gitlab.com/foo/bar')).toBeNull();
23
- expect(parseGitHubRepo('https://example.com/repo')).toBeNull();
24
- expect(parseGitHubRepo('not a url')).toBeNull();
25
- expect(parseGitHubRepo('')).toBeNull();
26
- });
27
- });
28
- describe('buildSubmissionUrl', () => {
29
- const baseInput = {
30
- name: 'my-app',
31
- category: 'Productivity',
32
- type: 'Standalone (no backend, localStorage only)',
33
- oneliner: 'A quick way to track tasks',
34
- description: 'Detailed description here.',
35
- repo: null,
36
- demo: null,
37
- };
38
- it('builds a github.com submission URL with the right template', () => {
39
- const url = new URL(buildSubmissionUrl(baseInput));
40
- expect(url.host).toBe('github.com');
41
- expect(url.pathname).toBe('/freeappstore-online/submissions/issues/new');
42
- expect(url.searchParams.get('template')).toBe('app-submission.yml');
43
- });
44
- it('prefills every required template field', () => {
45
- const url = new URL(buildSubmissionUrl(baseInput));
46
- expect(url.searchParams.get('name')).toBe('my-app');
47
- expect(url.searchParams.get('category')).toBe('Productivity');
48
- expect(url.searchParams.get('type')).toBe(baseInput.type);
49
- expect(url.searchParams.get('oneliner')).toBe('A quick way to track tasks');
50
- expect(url.searchParams.get('description')).toBe('Detailed description here.');
51
- expect(url.searchParams.get('title')).toBe('[Submission] my-app');
52
- });
53
- it('includes repo when present, omits when null', () => {
54
- const withRepo = new URL(buildSubmissionUrl({ ...baseInput, repo: 'https://github.com/me/x' }));
55
- expect(withRepo.searchParams.get('repo')).toBe('https://github.com/me/x');
56
- const without = new URL(buildSubmissionUrl(baseInput));
57
- expect(without.searchParams.has('repo')).toBe(false);
58
- });
59
- it('includes demo when present, omits when null', () => {
60
- const withDemo = new URL(buildSubmissionUrl({ ...baseInput, demo: 'https://demo.example' }));
61
- expect(withDemo.searchParams.get('demo')).toBe('https://demo.example');
62
- const without = new URL(buildSubmissionUrl(baseInput));
63
- expect(without.searchParams.has('demo')).toBe(false);
64
- });
65
- it('properly URL-encodes special characters in description', () => {
66
- const url = new URL(buildSubmissionUrl({
67
- ...baseInput,
68
- description: 'A "quoted" thing & more (with parens)',
69
- }));
70
- expect(url.searchParams.get('description')).toBe('A "quoted" thing & more (with parens)');
71
- });
72
- });
73
- describe('resolveCategory', () => {
74
- it('matches exact label', () => {
75
- expect(resolveCategory('Productivity')).toBe('Productivity');
76
- });
77
- it('matches case-insensitive', () => {
78
- expect(resolveCategory('utilities')).toBe('Utilities');
79
- expect(resolveCategory('UTILITIES')).toBe('Utilities');
80
- expect(resolveCategory(' Brain Training ')).toBe('Brain Training');
81
- });
82
- it('matches "other" short form', () => {
83
- expect(resolveCategory('other')).toBe('Other (specify in description)');
84
- });
85
- it('returns null for unknown', () => {
86
- expect(resolveCategory('nope')).toBeNull();
87
- expect(resolveCategory('')).toBeNull();
88
- });
89
- });
90
- describe('resolveType', () => {
91
- it('matches short forms', () => {
92
- expect(resolveType('standalone')).toBe('Standalone (no backend, localStorage only)');
93
- expect(resolveType('connected')).toBe('Connected (Firebase/Supabase backend, shared with Pro version)');
94
- });
95
- it('matches case-insensitive full label', () => {
96
- expect(resolveType('STANDALONE')).toBe('Standalone (no backend, localStorage only)');
97
- });
98
- it('returns null for unknown', () => {
99
- expect(resolveType('something')).toBeNull();
100
- });
101
- });
102
- describe('resolveFromFlags', () => {
103
- it('returns empty values when no flags supplied', () => {
104
- const r = resolveFromFlags({});
105
- expect(r.values).toEqual({});
106
- expect(r.errors).toEqual([]);
107
- });
108
- it('resolves valid combinations', () => {
109
- const r = resolveFromFlags({
110
- name: 'my-app',
111
- category: 'utilities',
112
- type: 'standalone',
113
- oneliner: 'Does a thing',
114
- demo: 'https://demo.example',
115
- });
116
- expect(r.errors).toEqual([]);
117
- expect(r.values.name).toBe('my-app');
118
- expect(r.values.category).toBe('Utilities');
119
- expect(r.values.type).toBe('Standalone (no backend, localStorage only)');
120
- expect(r.values.oneliner).toBe('Does a thing');
121
- expect(r.values.demo).toBe('https://demo.example');
122
- });
123
- it('treats blank --demo as null', () => {
124
- const r = resolveFromFlags({ demo: ' ' });
125
- expect(r.values.demo).toBeNull();
126
- });
127
- it('rejects invalid app id', () => {
128
- const r = resolveFromFlags({ name: 'BadName' });
129
- expect(r.errors[0]).toMatch(/--name/);
130
- expect(r.values.name).toBeUndefined();
131
- });
132
- it('rejects unknown category and type', () => {
133
- const r = resolveFromFlags({ category: 'nope', type: 'foo' });
134
- expect(r.errors).toHaveLength(2);
135
- });
136
- it('rejects empty oneliner', () => {
137
- const r = resolveFromFlags({ oneliner: ' ' });
138
- expect(r.errors[0]).toMatch(/oneliner/);
139
- });
140
- });
141
- describe('buildPromptList', () => {
142
- const defaults = { appName: null, description: null };
143
- it('returns all 5 prompts when nothing resolved', () => {
144
- expect(buildPromptList({}, defaults).map((p) => p.name)).toEqual([
145
- 'name',
146
- 'category',
147
- 'type',
148
- 'oneliner',
149
- 'demo',
150
- ]);
151
- });
152
- it('skips a prompt when its value is already resolved', () => {
153
- const list = buildPromptList({ name: 'my-app', category: 'Utilities', type: 'Standalone (no backend, localStorage only)' }, defaults);
154
- expect(list.map((p) => p.name)).toEqual(['oneliner', 'demo']);
155
- });
156
- it('returns empty list when everything resolved', () => {
157
- expect(buildPromptList({
158
- name: 'x',
159
- category: 'Utilities',
160
- type: 'Standalone (no backend, localStorage only)',
161
- oneliner: 'y',
162
- demo: null,
163
- }, defaults)).toEqual([]);
164
- });
165
- });
166
- //# sourceMappingURL=publish.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish.test.js","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=app-id.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-id.test.d.ts","sourceRoot":"","sources":["../../src/lib/app-id.test.ts"],"names":[],"mappings":""}
@@ -1,45 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { isValidAppId, assertValidAppId } from './app-id.js';
3
- describe('isValidAppId', () => {
4
- it('accepts typical short app ids', () => {
5
- expect(isValidAppId('chess')).toBe(true);
6
- expect(isValidAppId('calculator')).toBe(true);
7
- expect(isValidAppId('todo')).toBe(true);
8
- });
9
- it('accepts ids with digits and hyphens', () => {
10
- expect(isValidAppId('app2')).toBe(true);
11
- expect(isValidAppId('my-app')).toBe(true);
12
- expect(isValidAppId('a1-b2-c3')).toBe(true);
13
- });
14
- it('rejects single-char ids (must be 2-31 chars total)', () => {
15
- expect(isValidAppId('a')).toBe(false);
16
- });
17
- it('accepts 31-char ids and rejects 32+', () => {
18
- expect(isValidAppId('a' + 'b'.repeat(30))).toBe(true); // 31 total
19
- expect(isValidAppId('a' + 'b'.repeat(31))).toBe(false); // 32 total
20
- });
21
- it('rejects ids that start with a digit, hyphen, or uppercase', () => {
22
- expect(isValidAppId('1app')).toBe(false);
23
- expect(isValidAppId('-app')).toBe(false);
24
- expect(isValidAppId('App')).toBe(false);
25
- });
26
- it('rejects ids with disallowed characters', () => {
27
- expect(isValidAppId('my_app')).toBe(false); // underscore
28
- expect(isValidAppId('my.app')).toBe(false); // dot
29
- expect(isValidAppId('my app')).toBe(false); // space
30
- expect(isValidAppId('my/app')).toBe(false); // slash
31
- expect(isValidAppId('myapp!')).toBe(false);
32
- });
33
- it('rejects empty string', () => {
34
- expect(isValidAppId('')).toBe(false);
35
- });
36
- });
37
- describe('assertValidAppId', () => {
38
- it('throws with a clear message on invalid input', () => {
39
- expect(() => assertValidAppId('Bad')).toThrow(/lowercase/);
40
- });
41
- it('does not throw on valid input', () => {
42
- expect(() => assertValidAppId('good-app')).not.toThrow();
43
- });
44
- });
45
- //# sourceMappingURL=app-id.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-id.test.js","sourceRoot":"","sources":["../../src/lib/app-id.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=apps.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apps.test.d.ts","sourceRoot":"","sources":["../../src/lib/apps.test.ts"],"names":[],"mappings":""}
@@ -1,42 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { APPS, cfProjectFor, urlFor } from './apps.js';
3
- describe('cfProjectFor', () => {
4
- it('returns the registered cfProject for known non-conventional games', () => {
5
- expect(cfProjectFor('puzzle')).toBe('freepuzzle');
6
- });
7
- it('falls back to free<id>app convention for games not in the registry', () => {
8
- // Games follow `free<id>app` even though the convention reads
9
- // app-flavored — Cloudflare Pages project namespaces are shared
10
- // across stores and most games adopted the existing pattern.
11
- expect(cfProjectFor('tetris')).toBe('freetetrisapp');
12
- expect(cfProjectFor('asteroids')).toBe('freeasteroidsapp');
13
- expect(cfProjectFor('hangman')).toBe('freehangmanapp');
14
- });
15
- });
16
- describe('urlFor', () => {
17
- it('returns the registered subdomain for non-conventional games', () => {
18
- expect(urlFor('puzzle')).toBe('https://puzzle.freegamestore.online');
19
- });
20
- it('falls back to <id>.freegamestore.online (NOT freeappstore.online)', () => {
21
- // Regression test for a real bug: the file was copied verbatim from
22
- // fas-cli and the default fallback routed `fgs logs/publish/list` at
23
- // *.freeappstore.online — wrong store, silent failure.
24
- expect(urlFor('tetris')).toBe('https://tetris.freegamestore.online');
25
- expect(urlFor('asteroids')).toBe('https://asteroids.freegamestore.online');
26
- expect(urlFor('hangman')).toBe('https://hangman.freegamestore.online');
27
- });
28
- });
29
- describe('APPS registry', () => {
30
- it('all entries have non-empty cfProject and subdomain', () => {
31
- for (const [id, record] of Object.entries(APPS)) {
32
- expect(record.cfProject, `cfProject for ${id}`).toBeTruthy();
33
- expect(record.subdomain, `subdomain for ${id}`).toBeTruthy();
34
- }
35
- });
36
- it('every entry points at *.freegamestore.online (not freeappstore)', () => {
37
- for (const [id, record] of Object.entries(APPS)) {
38
- expect(record.subdomain, `subdomain for ${id}`).toMatch(/freegamestore\.online$/);
39
- }
40
- });
41
- });
42
- //# sourceMappingURL=apps.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apps.test.js","sourceRoot":"","sources":["../../src/lib/apps.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEvD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,8DAA8D;QAC9D,gEAAgE;QAChE,6DAA6D;QAC7D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,oEAAoE;QACpE,qEAAqE;QACrE,uDAAuD;QACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":""}
@@ -1,22 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { normalizeApiBase } from './config.js';
3
- describe('normalizeApiBase', () => {
4
- it('leaves a clean URL alone', () => {
5
- expect(normalizeApiBase('https://api.freeappstore.online')).toBe('https://api.freeappstore.online');
6
- });
7
- it('strips a single trailing slash (regression: //health URLs)', () => {
8
- expect(normalizeApiBase('https://api.freeappstore.online/')).toBe('https://api.freeappstore.online');
9
- });
10
- it('strips multiple trailing slashes', () => {
11
- expect(normalizeApiBase('https://api.freeappstore.online////')).toBe('https://api.freeappstore.online');
12
- });
13
- it('preserves path segments and only strips the rightmost slashes', () => {
14
- expect(normalizeApiBase('https://api.example.com/v1/')).toBe('https://api.example.com/v1');
15
- expect(normalizeApiBase('https://api.example.com/v1//')).toBe('https://api.example.com/v1');
16
- });
17
- it('handles localhost dev URLs', () => {
18
- expect(normalizeApiBase('http://localhost:8787/')).toBe('http://localhost:8787');
19
- expect(normalizeApiBase('http://127.0.0.1:8787')).toBe('http://127.0.0.1:8787');
20
- });
21
- });
22
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAC9D,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAC/D,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,gBAAgB,CAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAClE,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3F,MAAM,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=history.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.test.d.ts","sourceRoot":"","sources":["../../src/lib/history.test.ts"],"names":[],"mappings":""}
@@ -1,30 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { formatRelative } from './history.js';
3
- describe('formatRelative', () => {
4
- const now = new Date('2026-05-06T12:00:00Z');
5
- it('seconds', () => {
6
- expect(formatRelative('2026-05-06T11:59:30Z', now)).toBe('30s ago');
7
- });
8
- it('minutes', () => {
9
- expect(formatRelative('2026-05-06T11:55:00Z', now)).toBe('5 min ago');
10
- });
11
- it('hours', () => {
12
- expect(formatRelative('2026-05-06T08:00:00Z', now)).toBe('4h ago');
13
- });
14
- it('yesterday singular', () => {
15
- expect(formatRelative('2026-05-05T12:00:00Z', now)).toBe('yesterday');
16
- });
17
- it('days', () => {
18
- expect(formatRelative('2026-05-01T12:00:00Z', now)).toBe('5 days ago');
19
- });
20
- it('months', () => {
21
- expect(formatRelative('2026-02-06T12:00:00Z', now)).toBe('3 months ago');
22
- });
23
- it('years', () => {
24
- expect(formatRelative('2024-05-06T12:00:00Z', now)).toBe('2 years ago');
25
- });
26
- it('returns the input when not a valid date', () => {
27
- expect(formatRelative('not-a-date', now)).toBe('not-a-date');
28
- });
29
- });
30
- //# sourceMappingURL=history.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.test.js","sourceRoot":"","sources":["../../src/lib/history.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAE7C,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACf,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACd,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAChB,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACf,MAAM,CAAC,cAAc,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=doctor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/one-shot/doctor.test.ts"],"names":[],"mappings":""}
@@ -1,63 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { runDoctor } from './doctor.js';
3
- beforeEach(() => {
4
- // Provide a fast, deterministic /health response unless a test overrides.
5
- globalThis.fetch = vi.fn().mockResolvedValue(new Response(JSON.stringify({ ok: true }), { status: 200 }));
6
- });
7
- afterEach(() => {
8
- delete globalThis['fetch'];
9
- vi.restoreAllMocks();
10
- });
11
- describe('runDoctor', () => {
12
- it('runs all 6 expected checks and returns them in stable order', async () => {
13
- const results = await runDoctor();
14
- const names = results.map((r) => r.name);
15
- expect(names).toEqual([
16
- 'Node version',
17
- 'git installed',
18
- 'pnpm installed',
19
- 'Config file',
20
- 'Signed in',
21
- 'API reachable',
22
- ]);
23
- });
24
- it('flags Node < 22 as fail', async () => {
25
- const original = process.versions;
26
- Object.defineProperty(process, 'versions', {
27
- value: { ...original, node: '20.0.0' },
28
- configurable: true,
29
- });
30
- try {
31
- const results = await runDoctor();
32
- const node = results.find((r) => r.name === 'Node version');
33
- expect(node?.status).toBe('fail');
34
- expect(node?.detail).toContain('20.0.0');
35
- }
36
- finally {
37
- Object.defineProperty(process, 'versions', { value: original, configurable: true });
38
- }
39
- });
40
- it('marks API reachable as fail on 5xx', async () => {
41
- globalThis.fetch = vi.fn().mockResolvedValue(new Response('boom', { status: 503 }));
42
- const results = await runDoctor();
43
- const api = results.find((r) => r.name === 'API reachable');
44
- expect(api?.status).toBe('fail');
45
- expect(api?.detail).toContain('503');
46
- });
47
- it('marks API reachable as fail on network error', async () => {
48
- globalThis.fetch = vi.fn().mockRejectedValue(new Error('getaddrinfo ENOTFOUND'));
49
- const results = await runDoctor();
50
- const api = results.find((r) => r.name === 'API reachable');
51
- expect(api?.status).toBe('fail');
52
- expect(api?.detail).toContain('ENOTFOUND');
53
- });
54
- it('all check results have a non-empty name and detail', async () => {
55
- const results = await runDoctor();
56
- for (const r of results) {
57
- expect(r.name.length).toBeGreaterThan(0);
58
- expect(r.detail.length).toBeGreaterThan(0);
59
- expect(['pass', 'warn', 'fail']).toContain(r.status);
60
- }
61
- });
62
- });
63
- //# sourceMappingURL=doctor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/one-shot/doctor.test.ts"],"names":[],"mappings":"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"}