@proappstore/cli 2.6.49 → 2.6.50

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/whoami.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import { Command } from 'commander';
2
+ export declare function runWhoami(): Promise<void>;
2
3
  export declare const whoamiCommand: Command;
3
4
  //# sourceMappingURL=whoami.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAUtB,CAAC"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B/C;AAED,eAAO,MAAM,aAAa,SAEN,CAAC"}
package/dist/whoami.js CHANGED
@@ -1,15 +1,33 @@
1
1
  import { Command } from 'commander';
2
- import { readConfig } from './lib/config.js';
3
- export const whoamiCommand = new Command('whoami')
4
- .description('Show the currently signed-in user.')
5
- .action(async () => {
2
+ import { readConfig, resolveToken } from './lib/config.js';
3
+ export async function runWhoami() {
6
4
  const config = await readConfig();
7
- if (config.github?.login) {
8
- process.stdout.write(`@${config.github.login}\n`);
9
- }
10
- else {
5
+ // #458: `pas login` writes config.session (the obsolete config.github this
6
+ // used to check is never set any more), so verify the session the same way
7
+ // `pas publish` does — against /v1/auth/me — rather than trusting a stale field.
8
+ const token = resolveToken();
9
+ if (!token) {
11
10
  process.stdout.write('Not signed in. Run `pas login` first.\n');
12
11
  process.exit(1);
13
12
  }
14
- });
13
+ let res;
14
+ try {
15
+ res = await fetch(`${config.authApiBase}/v1/auth/me`, {
16
+ headers: { Authorization: `Bearer ${token}` },
17
+ });
18
+ }
19
+ catch (e) {
20
+ process.stderr.write(`Network error: ${e}\n`);
21
+ process.exit(1);
22
+ }
23
+ if (!res.ok) {
24
+ process.stdout.write('Not signed in (session expired or invalid). Run `pas login` again.\n');
25
+ process.exit(1);
26
+ }
27
+ const me = (await res.json());
28
+ process.stdout.write(`@${me.login ?? me.name ?? me.id ?? 'unknown'}\n`);
29
+ }
30
+ export const whoamiCommand = new Command('whoami')
31
+ .description('Show the currently signed-in user.')
32
+ .action(runWhoami);
15
33
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,2EAA2E;IAC3E,2EAA2E;IAC3E,iFAAiF;IACjF,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,aAAa,EAAE;YACpD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmD,CAAC;IAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whoami.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.test.d.ts","sourceRoot":"","sources":["../src/whoami.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, expect, it, vi, afterEach } from 'vitest';
2
+ import { mkdtemp, rm } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ // #458: `pas whoami` must recognise a session-token login written by `pas
6
+ // login` (config.session), not the obsolete config.github field. Mock
7
+ // homedir() the same way config.test.ts does, so this never touches the
8
+ // real ~/.proappstore/config.json.
9
+ const testHome = await mkdtemp(join(tmpdir(), 'pas-cli-whoami-test-'));
10
+ vi.mock('node:os', async () => {
11
+ const actual = await vi.importActual('node:os');
12
+ return { ...actual, homedir: () => testHome };
13
+ });
14
+ const { writeConfig } = await import('./lib/config.js');
15
+ const { runWhoami } = await import('./whoami.js');
16
+ let stdout;
17
+ function captureOutput() {
18
+ stdout = [];
19
+ vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => { stdout.push(String(chunk)); return true; });
20
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
21
+ vi.spyOn(process, 'exit').mockImplementation(((code) => { throw new Error(`exit ${code}`); }));
22
+ }
23
+ afterEach(async () => {
24
+ try {
25
+ await rm(join(testHome, '.proappstore'), { recursive: true, force: true });
26
+ }
27
+ catch { }
28
+ vi.restoreAllMocks();
29
+ vi.unstubAllGlobals();
30
+ delete process.env.PAS_SESSION_TOKEN;
31
+ });
32
+ describe('pas whoami (#458)', () => {
33
+ it('reports the signed-in login for a valid session token', async () => {
34
+ captureOutput();
35
+ await writeConfig({
36
+ apiBase: 'https://api.proappstore.online',
37
+ authApiBase: 'https://api.proappstore.online',
38
+ session: { token: 'sess-tok', obtainedAt: Date.now() },
39
+ });
40
+ vi.stubGlobal('fetch', vi.fn(async (url, init) => {
41
+ expect(url).toBe('https://api.proappstore.online/v1/auth/me');
42
+ expect(init.headers.Authorization).toBe('Bearer sess-tok');
43
+ return Response.json({ id: 'gh:1', name: 'serge-ivo', login: 'serge-ivo' });
44
+ }));
45
+ await runWhoami();
46
+ expect(stdout.join('')).toBe('@serge-ivo\n');
47
+ });
48
+ it('reports not signed in when there is no session at all', async () => {
49
+ captureOutput();
50
+ vi.stubGlobal('fetch', vi.fn(() => { throw new Error('must not call fetch'); }));
51
+ await expect(runWhoami()).rejects.toThrow('exit 1');
52
+ expect(stdout.join('')).toContain('Not signed in');
53
+ });
54
+ it('reports not signed in (not a stale "signed in" claim) when the session token is rejected', async () => {
55
+ captureOutput();
56
+ await writeConfig({
57
+ apiBase: 'https://api.proappstore.online',
58
+ authApiBase: 'https://api.proappstore.online',
59
+ session: { token: 'expired-tok', obtainedAt: 1 },
60
+ });
61
+ vi.stubGlobal('fetch', vi.fn(async () => new Response('invalid or expired session', { status: 401 })));
62
+ await expect(runWhoami()).rejects.toThrow('exit 1');
63
+ expect(stdout.join('')).toContain('session expired or invalid');
64
+ });
65
+ it('never reports a signed-in user from the obsolete config.github field alone', async () => {
66
+ captureOutput();
67
+ await writeConfig({
68
+ apiBase: 'https://api.proappstore.online',
69
+ authApiBase: 'https://api.proappstore.online',
70
+ github: { accessToken: 'legacy', login: 'stale-login', obtainedAt: 1 },
71
+ });
72
+ vi.stubGlobal('fetch', vi.fn(() => { throw new Error('must not call fetch'); }));
73
+ await expect(runWhoami()).rejects.toThrow('exit 1');
74
+ expect(stdout.join('')).toContain('Not signed in');
75
+ expect(stdout.join('')).not.toContain('stale-login');
76
+ });
77
+ it('falls back to PAS_SESSION_TOKEN when no config file exists', async () => {
78
+ captureOutput();
79
+ process.env.PAS_SESSION_TOKEN = 'env-tok';
80
+ vi.stubGlobal('fetch', vi.fn(async (_url, init) => {
81
+ expect(init.headers.Authorization).toBe('Bearer env-tok');
82
+ return Response.json({ login: 'env-user' });
83
+ }));
84
+ await runWhoami();
85
+ expect(stdout.join('')).toBe('@env-user\n');
86
+ });
87
+ });
88
+ //# sourceMappingURL=whoami.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.test.js","sourceRoot":"","sources":["../src/whoami.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proappstore/cli",
3
- "version": "2.6.49",
3
+ "version": "2.6.50",
4
4
  "description": "pas — CLI for publishing paid apps to proappstore.online",
5
5
  "license": "MIT",
6
6
  "type": "module",