@freegamestore/cli 0.1.4 → 0.1.5
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/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 +13 -13
- package/LICENSE +0 -21
- 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/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.
|
|
4
|
-
"description": "fgs
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"description": "fgs \u2014 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",
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
"engines": {
|
|
31
31
|
"node": ">=22"
|
|
32
32
|
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"dev": "tsc --watch"
|
|
37
|
+
},
|
|
33
38
|
"dependencies": {
|
|
39
|
+
"@freegamestore/compliance": "workspace:*",
|
|
34
40
|
"commander": "^12.1.0",
|
|
35
|
-
"prompts": "^2.4.2"
|
|
36
|
-
"@freeappstore/compliance": "0.2.0"
|
|
41
|
+
"prompts": "^2.4.2"
|
|
37
42
|
},
|
|
38
43
|
"devDependencies": {
|
|
39
44
|
"@types/node": "^22.0.0",
|
|
40
45
|
"@types/prompts": "^2.4.9",
|
|
41
46
|
"typescript": "^5.7.0"
|
|
42
|
-
},
|
|
43
|
-
"scripts": {
|
|
44
|
-
"build": "tsc",
|
|
45
|
-
"typecheck": "tsc --noEmit",
|
|
46
|
-
"dev": "tsc --watch"
|
|
47
47
|
}
|
|
48
|
-
}
|
|
48
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 FreeAppStore
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -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":""}
|