@proappstore/cli 2.6.58 → 2.6.60
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/billing.d.ts +49 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +66 -0
- package/dist/billing.js.map +1 -0
- package/dist/billing.test.d.ts +2 -0
- package/dist/billing.test.d.ts.map +1 -0
- package/dist/billing.test.js +42 -0
- package/dist/billing.test.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/login.d.ts +7 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +29 -7
- package/dist/login.js.map +1 -1
- package/dist/login.test.d.ts +2 -0
- package/dist/login.test.d.ts.map +1 -0
- package/dist/login.test.js +33 -0
- package/dist/login.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface BillingProductRow {
|
|
3
|
+
key: string;
|
|
4
|
+
name: string;
|
|
5
|
+
amount: number;
|
|
6
|
+
currency: string;
|
|
7
|
+
modes: string[];
|
|
8
|
+
interval: {
|
|
9
|
+
unit: string;
|
|
10
|
+
count: number | null;
|
|
11
|
+
} | null;
|
|
12
|
+
active: boolean;
|
|
13
|
+
syncError: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface LedgerRow {
|
|
16
|
+
purchaseId: string;
|
|
17
|
+
product: string;
|
|
18
|
+
buyerUserId: string;
|
|
19
|
+
subjects: string[];
|
|
20
|
+
status: string;
|
|
21
|
+
createdAt: number;
|
|
22
|
+
currency: string | null;
|
|
23
|
+
gross: number;
|
|
24
|
+
refunded: number;
|
|
25
|
+
fee: number | null;
|
|
26
|
+
net: number;
|
|
27
|
+
}
|
|
28
|
+
export interface EntitlementRow {
|
|
29
|
+
product: string;
|
|
30
|
+
subject: string;
|
|
31
|
+
status: string;
|
|
32
|
+
periodEnd: number | null;
|
|
33
|
+
graceUntil: number | null;
|
|
34
|
+
renews: boolean;
|
|
35
|
+
buyerUserId: string | null;
|
|
36
|
+
}
|
|
37
|
+
/** 1234 -> "12.34 AUD". Amounts are in the smallest unit; a zero-decimal currency would need its own table, so the code is always shown. */
|
|
38
|
+
export declare function money(minor: number, currency: string | null): string;
|
|
39
|
+
export declare function formatProducts(enabled: boolean, products: BillingProductRow[]): string;
|
|
40
|
+
export declare function formatPurchases(rows: LedgerRow[], totals: {
|
|
41
|
+
currency: string;
|
|
42
|
+
gross: number;
|
|
43
|
+
refunded: number;
|
|
44
|
+
fee: number;
|
|
45
|
+
net: number;
|
|
46
|
+
}[]): string;
|
|
47
|
+
export declare function formatEntitlements(rows: EntitlementRow[]): string;
|
|
48
|
+
export declare const billingCommand: Command;
|
|
49
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../src/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,4IAA4I;AAC5I,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEpE;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAQtF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAMpJ;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CAIjE;AAID,eAAO,MAAM,cAAc,SAuCxB,CAAC"}
|
package/dist/billing.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { requireSession, resolveAppIdOrExit, ownerApi } from './secret.js';
|
|
3
|
+
/** 1234 -> "12.34 AUD". Amounts are in the smallest unit; a zero-decimal currency would need its own table, so the code is always shown. */
|
|
4
|
+
export function money(minor, currency) {
|
|
5
|
+
return `${(minor / 100).toFixed(2)}${currency ? ` ${currency.toUpperCase()}` : ''}`;
|
|
6
|
+
}
|
|
7
|
+
const day = (ms) => (ms ? new Date(ms).toISOString().slice(0, 10) : '-');
|
|
8
|
+
export function formatProducts(enabled, products) {
|
|
9
|
+
const lines = [`Billing is ${enabled ? 'ENABLED' : 'not enabled'} for this app${enabled ? '' : ' (a platform admin turns it on)'}.`];
|
|
10
|
+
if (products.length === 0)
|
|
11
|
+
return `${lines[0]}\nNo products declared.\n`;
|
|
12
|
+
for (const p of products) {
|
|
13
|
+
const term = p.interval ? `every ${p.interval.count ?? 1} ${p.interval.unit}` : 'one-off';
|
|
14
|
+
lines.push(`${p.key.padEnd(24)} ${money(p.amount, p.currency).padEnd(14)} ${p.modes.join('/').padEnd(18)} ${term}${p.active ? '' : ' (inactive)'}${p.syncError ? ` sync error: ${p.syncError}` : ''}`);
|
|
15
|
+
}
|
|
16
|
+
return `${lines.join('\n')}\n`;
|
|
17
|
+
}
|
|
18
|
+
export function formatPurchases(rows, totals) {
|
|
19
|
+
if (rows.length === 0)
|
|
20
|
+
return 'No paid purchases.\n';
|
|
21
|
+
const lines = rows.map((r) => `${day(r.createdAt)} ${r.purchaseId.slice(0, 8)} ${r.product.padEnd(20)} ${r.buyerUserId.padEnd(14)} gross ${money(r.gross, r.currency)} refunded ${money(r.refunded, r.currency)} fee ${r.fee === null ? 'pending' : money(r.fee, r.currency)} net ${money(r.net, r.currency)} ${r.status}${r.subjects.length ? ` [${r.subjects.join(', ')}]` : ''}`);
|
|
22
|
+
for (const t of totals)
|
|
23
|
+
lines.push(`TOTAL ${t.currency.toUpperCase() || '?'}: gross ${money(t.gross, t.currency)} refunded ${money(t.refunded, t.currency)} fees ${money(t.fee, t.currency)} net ${money(t.net, t.currency)}`);
|
|
24
|
+
return `${lines.join('\n')}\n`;
|
|
25
|
+
}
|
|
26
|
+
export function formatEntitlements(rows) {
|
|
27
|
+
if (rows.length === 0)
|
|
28
|
+
return 'No entitlements.\n';
|
|
29
|
+
return `${rows.map((e) => `${e.product.padEnd(24)} ${(e.subject || '(none)').padEnd(20)} ${e.status.padEnd(9)} until ${day(e.periodEnd)}${e.status === 'grace' ? ` (grace to ${day(e.graceUntil)})` : ''}${e.renews ? ' renews' : ''} ${e.buyerUserId ?? ''}`).join('\n')}\n`;
|
|
30
|
+
}
|
|
31
|
+
const appOption = ['--app <id>', 'app id (defaults to package.json name in cwd)'];
|
|
32
|
+
export const billingCommand = new Command('billing')
|
|
33
|
+
.description("What your app sells: products, purchases with refunds and Stripe fees, and entitlements. Owner only.")
|
|
34
|
+
.addCommand(new Command('products')
|
|
35
|
+
.description('The products the app declares, and whether billing is enabled.')
|
|
36
|
+
.option(...appOption)
|
|
37
|
+
.option('--json', 'Output JSON.')
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
const cfg = await requireSession();
|
|
40
|
+
const appId = await resolveAppIdOrExit(opts.app);
|
|
41
|
+
const data = await ownerApi(cfg, 'GET', `/v1/apps/${appId}/billing/owner/products`, 'list billing products');
|
|
42
|
+
process.stdout.write(opts.json ? `${JSON.stringify(data, null, 2)}\n` : formatProducts(data.enabled, data.products));
|
|
43
|
+
}))
|
|
44
|
+
.addCommand(new Command('purchases')
|
|
45
|
+
.description('Paid purchases with gross, refunds and Stripe fees (the revenue ledger).')
|
|
46
|
+
.option(...appOption)
|
|
47
|
+
.option('--json', 'Output JSON.')
|
|
48
|
+
.action(async (opts) => {
|
|
49
|
+
const cfg = await requireSession();
|
|
50
|
+
const appId = await resolveAppIdOrExit(opts.app);
|
|
51
|
+
const data = await ownerApi(cfg, 'GET', `/v1/apps/${appId}/billing/owner/purchases`, 'list billing purchases');
|
|
52
|
+
process.stdout.write(opts.json ? `${JSON.stringify(data, null, 2)}\n` : formatPurchases(data.purchases, data.totals));
|
|
53
|
+
}))
|
|
54
|
+
.addCommand(new Command('entitlements')
|
|
55
|
+
.description('Every entitlement of the app: who has paid access to what, until when.')
|
|
56
|
+
.option(...appOption)
|
|
57
|
+
.option('--product <key>', 'only this product')
|
|
58
|
+
.option('--json', 'Output JSON.')
|
|
59
|
+
.action(async (opts) => {
|
|
60
|
+
const cfg = await requireSession();
|
|
61
|
+
const appId = await resolveAppIdOrExit(opts.app);
|
|
62
|
+
const query = opts.product ? `?product=${encodeURIComponent(opts.product)}` : '';
|
|
63
|
+
const data = await ownerApi(cfg, 'GET', `/v1/apps/${appId}/billing/owner/entitlements${query}`, 'list entitlements');
|
|
64
|
+
process.stdout.write(opts.json ? `${JSON.stringify(data, null, 2)}\n` : formatEntitlements(data.entitlements));
|
|
65
|
+
}));
|
|
66
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../src/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.test.d.ts","sourceRoot":"","sources":["../src/billing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { billingCommand, formatEntitlements, formatProducts, formatPurchases, money } from './billing.js';
|
|
3
|
+
// #509: the owner's CLI. The server decides who may see this; these pin what is shown and that every subcommand is there.
|
|
4
|
+
describe('pas billing', () => {
|
|
5
|
+
it('has products, purchases and entitlements, each with --app', () => {
|
|
6
|
+
expect(billingCommand.commands.map((c) => c.name()).sort()).toEqual(['entitlements', 'products', 'purchases']);
|
|
7
|
+
for (const c of billingCommand.commands)
|
|
8
|
+
expect(c.options.map((o) => o.long)).toContain('--app');
|
|
9
|
+
});
|
|
10
|
+
it('formats money from the smallest unit', () => {
|
|
11
|
+
expect(money(1234, 'aud')).toBe('12.34 AUD');
|
|
12
|
+
expect(money(5, null)).toBe('0.05');
|
|
13
|
+
});
|
|
14
|
+
it('says plainly when billing is off, and shows a sync error', () => {
|
|
15
|
+
const out = formatProducts(false, [{ key: 'term', name: 'Term', amount: 1000, currency: 'aud', modes: ['one_time', 'recurring'], interval: { unit: 'month', count: 3 }, active: true, syncError: 'stripe down' }]);
|
|
16
|
+
expect(out).toContain('not enabled');
|
|
17
|
+
expect(out).toContain('10.00 AUD');
|
|
18
|
+
expect(out).toContain('every 3 month');
|
|
19
|
+
expect(out).toContain('sync error: stripe down');
|
|
20
|
+
});
|
|
21
|
+
it('shows refunds, a pending fee, net and totals per purchase', () => {
|
|
22
|
+
const row = { purchaseId: 'abcdef123456', product: 'term', buyerUserId: 'gh:2', subjects: ['kid-a', 'kid-b'], status: 'paid', createdAt: Date.UTC(2026, 9, 1), currency: 'aud', gross: 2000, refunded: 500, fee: null, net: 1500 };
|
|
23
|
+
const out = formatPurchases([row, { ...row, purchaseId: 'ffffffff0000', fee: 88, net: 1412 }], [{ currency: 'aud', gross: 4000, refunded: 1000, fee: 88, net: 2912 }]);
|
|
24
|
+
expect(out).toContain('2026-10-01 abcdef12');
|
|
25
|
+
expect(out).toContain('refunded 5.00 AUD');
|
|
26
|
+
expect(out).toContain('fee pending');
|
|
27
|
+
expect(out).toContain('fee 0.88 AUD');
|
|
28
|
+
expect(out).toContain('TOTAL AUD: gross 40.00 AUD refunded 10.00 AUD fees 0.88 AUD net 29.12 AUD');
|
|
29
|
+
expect(formatPurchases([], [])).toBe('No paid purchases.\n');
|
|
30
|
+
});
|
|
31
|
+
it('shows entitlements with grace and renewal', () => {
|
|
32
|
+
const out = formatEntitlements([
|
|
33
|
+
{ product: 'term', subject: 'kid-a', status: 'grace', periodEnd: Date.UTC(2026, 9, 1), graceUntil: Date.UTC(2026, 9, 6), renews: true, buyerUserId: 'gh:2' },
|
|
34
|
+
{ product: 'donation', subject: '', status: 'active', periodEnd: null, graceUntil: null, renews: false, buyerUserId: null },
|
|
35
|
+
]);
|
|
36
|
+
expect(out).toContain('grace to 2026-10-06');
|
|
37
|
+
expect(out).toContain('renews');
|
|
38
|
+
expect(out).toContain('(none)');
|
|
39
|
+
expect(formatEntitlements([])).toBe('No entitlements.\n');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=billing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.test.js","sourceRoot":"","sources":["../src/billing.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import { checkCommand } from './check.js';
|
|
7
7
|
import { createApp } from './create.js';
|
|
8
|
+
import { billingCommand } from './billing.js';
|
|
8
9
|
import { domainCommand } from './domain.js';
|
|
9
10
|
import { loginCommand } from './login.js';
|
|
10
11
|
import { logoutCommand } from './logout.js';
|
|
@@ -61,6 +62,7 @@ program
|
|
|
61
62
|
});
|
|
62
63
|
program.addCommand(checkCommand);
|
|
63
64
|
program.addCommand(domainCommand);
|
|
65
|
+
program.addCommand(billingCommand);
|
|
64
66
|
program.addCommand(secretCommand);
|
|
65
67
|
program.addCommand(proxyCommand);
|
|
66
68
|
program.addCommand(integrateCommand);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
declare const LOGIN_PROVIDERS: readonly ["github", "google"];
|
|
3
|
+
export type LoginProvider = (typeof LOGIN_PROVIDERS)[number];
|
|
4
|
+
/** The value of `--provider`, or an error naming the choices (#489). GitHub and Google are separate accounts. */
|
|
5
|
+
export declare function parseProvider(value: string | undefined): LoginProvider;
|
|
6
|
+
/** The URL the user opens to sign in with `provider`; the platform redirects back to `callbackUrl` with a one-time code. */
|
|
7
|
+
export declare function loginStartUrl(authApiBase: string, provider: LoginProvider, callbackUrl: string): URL;
|
|
2
8
|
export declare const loginCommand: Command;
|
|
9
|
+
export {};
|
|
3
10
|
//# sourceMappingURL=login.d.ts.map
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,eAAe,+BAAgC,CAAC;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,iHAAiH;AACjH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAItE;AAED,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAKpG;AAkHD,eAAO,MAAM,YAAY,SAYrB,CAAC"}
|
package/dist/login.js
CHANGED
|
@@ -2,12 +2,25 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { createServer } from 'node:http';
|
|
3
3
|
import { readConfig, writeConfig } from './lib/config.js';
|
|
4
4
|
const LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
5
|
-
|
|
5
|
+
const LOGIN_PROVIDERS = ['github', 'google'];
|
|
6
|
+
/** The value of `--provider`, or an error naming the choices (#489). GitHub and Google are separate accounts. */
|
|
7
|
+
export function parseProvider(value) {
|
|
8
|
+
const provider = (value ?? 'github').toLowerCase();
|
|
9
|
+
if (LOGIN_PROVIDERS.includes(provider))
|
|
10
|
+
return provider;
|
|
11
|
+
throw new Error(`Unknown provider "${value}". Use one of: ${LOGIN_PROVIDERS.join(', ')}.`);
|
|
12
|
+
}
|
|
13
|
+
/** The URL the user opens to sign in with `provider`; the platform redirects back to `callbackUrl` with a one-time code. */
|
|
14
|
+
export function loginStartUrl(authApiBase, provider, callbackUrl) {
|
|
15
|
+
const startUrl = new URL(`${authApiBase}/v1/auth/${provider}/start`);
|
|
16
|
+
startUrl.searchParams.set('return_to', callbackUrl);
|
|
17
|
+
startUrl.searchParams.set('response_mode', 'query');
|
|
18
|
+
return startUrl;
|
|
19
|
+
}
|
|
20
|
+
async function runLogin(provider) {
|
|
6
21
|
const config = await readConfig();
|
|
7
22
|
const callback = await startCallbackServer();
|
|
8
|
-
const startUrl =
|
|
9
|
-
startUrl.searchParams.set('return_to', callback.url);
|
|
10
|
-
startUrl.searchParams.set('response_mode', 'query');
|
|
23
|
+
const startUrl = loginStartUrl(config.authApiBase, provider, callback.url);
|
|
11
24
|
process.stdout.write(`\nOpen this URL to sign in to ProAppStore:\n${startUrl.toString()}\n\n`);
|
|
12
25
|
process.stdout.write('Waiting for authorization...\n');
|
|
13
26
|
let code;
|
|
@@ -107,8 +120,17 @@ function startCallbackServer() {
|
|
|
107
120
|
});
|
|
108
121
|
}
|
|
109
122
|
export const loginCommand = new Command('login')
|
|
110
|
-
.description('Sign in with GitHub.')
|
|
111
|
-
.
|
|
112
|
-
|
|
123
|
+
.description('Sign in with GitHub or Google.')
|
|
124
|
+
.option('--provider <provider>', `sign-in provider: ${LOGIN_PROVIDERS.join(' or ')}`, 'github')
|
|
125
|
+
.action(async (opts) => {
|
|
126
|
+
let provider;
|
|
127
|
+
try {
|
|
128
|
+
provider = parseProvider(opts.provider);
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
process.stderr.write(`pas login: ${e.message}\n`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
await runLogin(provider);
|
|
113
135
|
});
|
|
114
136
|
//# sourceMappingURL=login.js.map
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../src/login.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { loginCommand, loginStartUrl, parseProvider } from './login.js';
|
|
3
|
+
// #489: `pas login --provider google|github`; GitHub stays the default. They are separate accounts.
|
|
4
|
+
describe('pas login --provider', () => {
|
|
5
|
+
it('defaults to github, and accepts github and google in any case', () => {
|
|
6
|
+
expect(parseProvider(undefined)).toBe('github');
|
|
7
|
+
expect(parseProvider('github')).toBe('github');
|
|
8
|
+
expect(parseProvider('google')).toBe('google');
|
|
9
|
+
expect(parseProvider('Google')).toBe('google');
|
|
10
|
+
});
|
|
11
|
+
it('refuses anything else and names the choices', () => {
|
|
12
|
+
expect(() => parseProvider('facebook')).toThrow('Unknown provider "facebook". Use one of: github, google.');
|
|
13
|
+
expect(() => parseProvider('')).toThrow('Unknown provider');
|
|
14
|
+
expect(() => parseProvider('../x')).toThrow('Unknown provider');
|
|
15
|
+
});
|
|
16
|
+
it('builds the start URL for the chosen provider, returning a one-time code to the local callback', () => {
|
|
17
|
+
const cb = 'http://127.0.0.1:4567/callback';
|
|
18
|
+
const github = loginStartUrl('https://api.proappstore.online', 'github', cb);
|
|
19
|
+
expect(github.origin + github.pathname).toBe('https://api.proappstore.online/v1/auth/github/start');
|
|
20
|
+
const google = loginStartUrl('https://api.proappstore.online', 'google', cb);
|
|
21
|
+
expect(google.origin + google.pathname).toBe('https://api.proappstore.online/v1/auth/google/start');
|
|
22
|
+
for (const u of [github, google]) {
|
|
23
|
+
expect(u.searchParams.get('return_to')).toBe(cb);
|
|
24
|
+
expect(u.searchParams.get('response_mode')).toBe('query');
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('is on the command, defaulting to github', () => {
|
|
28
|
+
const option = loginCommand.options.find((o) => o.long === '--provider');
|
|
29
|
+
expect(option?.defaultValue).toBe('github');
|
|
30
|
+
expect(loginCommand.description()).toBe('Sign in with GitHub or Google.');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=login.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.js","sourceRoot":"","sources":["../src/login.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,oGAAoG;AAEpG,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;QAC5G,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,GAAG,EAAE;QACvG,MAAM,EAAE,GAAG,gCAAgC,CAAC;QAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,gCAAgC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,aAAa,CAAC,gCAAgC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpG,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|