@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.
- package/LICENSE +1 -1
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +2 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +2 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/publish.d.ts +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +18 -23
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/screencheck.d.ts.map +1 -1
- package/dist/commands/screencheck.js +12 -9
- package/dist/commands/screencheck.js.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/config.js +2 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/history.js +1 -1
- package/dist/lib/history.js.map +1 -1
- package/dist/lib/style.js +2 -2
- package/dist/lib/style.js.map +1 -1
- package/package.json +5 -5
- package/dist/commands/list.test.d.ts +0 -2
- package/dist/commands/list.test.d.ts.map +0 -1
- package/dist/commands/list.test.js +0 -25
- package/dist/commands/list.test.js.map +0 -1
- package/dist/commands/publish.test.d.ts +0 -2
- package/dist/commands/publish.test.d.ts.map +0 -1
- package/dist/commands/publish.test.js +0 -166
- package/dist/commands/publish.test.js.map +0 -1
- package/dist/lib/app-id.test.d.ts +0 -2
- package/dist/lib/app-id.test.d.ts.map +0 -1
- package/dist/lib/app-id.test.js +0 -45
- package/dist/lib/app-id.test.js.map +0 -1
- package/dist/lib/apps.test.d.ts +0 -2
- package/dist/lib/apps.test.d.ts.map +0 -1
- package/dist/lib/apps.test.js +0 -42
- package/dist/lib/apps.test.js.map +0 -1
- package/dist/lib/config.test.d.ts +0 -2
- package/dist/lib/config.test.d.ts.map +0 -1
- package/dist/lib/config.test.js +0 -22
- package/dist/lib/config.test.js.map +0 -1
- package/dist/lib/history.test.d.ts +0 -2
- package/dist/lib/history.test.d.ts.map +0 -1
- package/dist/lib/history.test.js +0 -30
- package/dist/lib/history.test.js.map +0 -1
- package/dist/one-shot/doctor.test.d.ts +0 -2
- package/dist/one-shot/doctor.test.d.ts.map +0 -1
- package/dist/one-shot/doctor.test.js +0 -63
- package/dist/one-shot/doctor.test.js.map +0 -1
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"}
|
package/dist/lib/history.js
CHANGED
|
@@ -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
|
|
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;
|
package/dist/lib/history.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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}]`)
|
|
16
|
+
return `${cyan(`[${n}/${total}]`)} ${bold(label)}`;
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=style.js.map
|
package/dist/lib/style.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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/
|
|
10
|
+
"homepage": "https://github.com/freegamestore-online/platform#readme",
|
|
11
11
|
"repository": {
|
|
12
12
|
"type": "git",
|
|
13
|
-
"url": "git+https://github.com/
|
|
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/
|
|
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
|
-
"@
|
|
36
|
+
"@freegamestore/compliance": "0.2.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.0.0",
|
|
@@ -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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-id.test.d.ts","sourceRoot":"","sources":["../../src/lib/app-id.test.ts"],"names":[],"mappings":""}
|
package/dist/lib/app-id.test.js
DELETED
|
@@ -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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"}
|
package/dist/lib/apps.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apps.test.d.ts","sourceRoot":"","sources":["../../src/lib/apps.test.ts"],"names":[],"mappings":""}
|
package/dist/lib/apps.test.js
DELETED
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":""}
|
package/dist/lib/config.test.js
DELETED
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"history.test.d.ts","sourceRoot":"","sources":["../../src/lib/history.test.ts"],"names":[],"mappings":""}
|
package/dist/lib/history.test.js
DELETED
|
@@ -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 +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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"}
|