affitor 0.4.1 → 0.4.3
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/README.md +29 -16
- package/dist/cli.js +0 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +18 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/onboard.d.ts +8 -1
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +29 -1
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/setup-stripe.d.ts +6 -0
- package/dist/commands/setup-stripe.d.ts.map +1 -1
- package/dist/commands/setup-stripe.js +18 -145
- package/dist/commands/setup-stripe.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +34 -11
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +5 -5
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +3 -0
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lib/api-client.d.ts +30 -10
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +128 -14
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config.d.ts +25 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +60 -13
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/inject.js +2 -2
- package/dist/lib/inject.js.map +1 -1
- package/dist/lib/logger.d.ts +8 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +10 -0
- package/dist/lib/logger.js.map +1 -1
- package/dist/types.d.ts +1 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -11
- package/dist/types.js.map +1 -1
- package/package.json +1 -2
- package/dist/lib/stripe-oauth.d.ts +0 -15
- package/dist/lib/stripe-oauth.d.ts.map +0 -1
- package/dist/lib/stripe-oauth.js +0 -168
- package/dist/lib/stripe-oauth.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-stripe.js","sourceRoot":"","sources":["../../src/commands/setup-stripe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"setup-stripe.js","sourceRoot":"","sources":["../../src/commands/setup-stripe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAOrD;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,QAAQ,iBAuG9C"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as logger from "../lib/logger.js";
|
|
2
2
|
import { format } from "../lib/logger.js";
|
|
3
|
-
import {
|
|
3
|
+
import { readConfigOrKeyOnly, ConfigNotFoundError, apiKeySourceLabel } from "../lib/config.js";
|
|
4
4
|
import { AffitorAPI, APIError, NetworkError } from "../lib/api-client.js";
|
|
5
5
|
import { getFlags } from "../lib/flags.js";
|
|
6
6
|
export function registerStatusCommand(program) {
|
|
@@ -11,10 +11,10 @@ export function registerStatusCommand(program) {
|
|
|
11
11
|
await runStatus(getFlags(cmd));
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
async function runStatus(flags) {
|
|
14
|
+
export async function runStatus(flags) {
|
|
15
15
|
let config;
|
|
16
16
|
try {
|
|
17
|
-
config =
|
|
17
|
+
config = readConfigOrKeyOnly(flags);
|
|
18
18
|
}
|
|
19
19
|
catch (err) {
|
|
20
20
|
if (err instanceof ConfigNotFoundError) {
|
|
@@ -25,9 +25,9 @@ async function runStatus(flags) {
|
|
|
25
25
|
}
|
|
26
26
|
throw err;
|
|
27
27
|
}
|
|
28
|
-
const api = AffitorAPI.fromFlags({ apiKey: flags.apiKey, apiUrl: flags.apiUrl ?? config
|
|
28
|
+
const api = AffitorAPI.fromFlags({ apiKey: flags.apiKey, apiUrl: flags.apiUrl ?? config?.api_url });
|
|
29
29
|
try {
|
|
30
|
-
const status = await api.getStatus(config
|
|
30
|
+
const status = await api.getStatus(config?.program_id);
|
|
31
31
|
if (flags.json) {
|
|
32
32
|
logger.json(status);
|
|
33
33
|
return;
|
|
@@ -46,12 +46,15 @@ async function runStatus(flags) {
|
|
|
46
46
|
? "ok"
|
|
47
47
|
: "warn"
|
|
48
48
|
: "error";
|
|
49
|
+
// The config's domain when there is one; otherwise the website the API returns, which keeps
|
|
50
|
+
// its path ("example.com/pricing/"), reduced to its hostname for the DNS hint.
|
|
51
|
+
const domain = config?.domain ?? hostnameOf(status.domain);
|
|
49
52
|
// Find max for progress bars
|
|
50
53
|
const events = status.recent_events;
|
|
51
54
|
const maxEvent = Math.max(events.clicks_24h, events.leads_24h, events.sales_24h, 1);
|
|
52
55
|
logger.banner();
|
|
53
56
|
logger.titledBox(status.name, [
|
|
54
|
-
` ${format.dim(
|
|
57
|
+
` ${format.dim(domain)}`,
|
|
55
58
|
` ${format.dim("ID:")} ${status.program_id}`,
|
|
56
59
|
"",
|
|
57
60
|
` ${format.bold("Integrations")}`,
|
|
@@ -66,18 +69,28 @@ async function runStatus(flags) {
|
|
|
66
69
|
` ${format.dim("Partners:")} ${format.bold(String(status.active_partners))} ${format.dim("Pending:")} ${format.bold(String(status.pending_commissions))}`,
|
|
67
70
|
]);
|
|
68
71
|
// Action hints
|
|
69
|
-
if (!status.dns_verified) {
|
|
70
|
-
logger.step(`DNS: Add CNAME t.${
|
|
72
|
+
if (!status.dns_verified && domain) {
|
|
73
|
+
logger.step(`DNS: Add CNAME t.${domain} → track.affitor.com`);
|
|
71
74
|
}
|
|
72
75
|
if (!status.stripe_connected) {
|
|
73
|
-
logger.step("Stripe:
|
|
76
|
+
logger.step("Stripe: Connect it in the Affitor dashboard (program Settings, Connect Stripe)");
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
catch (err) {
|
|
77
80
|
if (err instanceof APIError) {
|
|
78
|
-
if (err.
|
|
81
|
+
if (err.code === "api_key_rotation_required") {
|
|
82
|
+
// The key was retired on purpose: a new one is the only fix, and the API
|
|
83
|
+
// already says by when and where. Do not bury that under the generic 401.
|
|
84
|
+
logger.error(err.message);
|
|
85
|
+
}
|
|
86
|
+
else if (err.status === 401) {
|
|
87
|
+
// Regenerating is what returns a working key for a program that already exists, and
|
|
88
|
+
// only a workspace owner of that program can do it. The new key then has to land where
|
|
89
|
+
// this command actually reads one: `--api-key` wins over the environment, so naming
|
|
90
|
+
// only AFFITOR_API_KEY would leave the refused key on the wire.
|
|
79
91
|
logger.error("API key expired or invalid.\n" +
|
|
80
|
-
|
|
92
|
+
` Ask a workspace owner of ${config ? `program ${config.program_id}` : "the program"} to open Affitor → Settings → API Key and click Regenerate.\n` +
|
|
93
|
+
` Then replace the key in ${apiKeySourceLabel(flags)} with the new one.`);
|
|
81
94
|
}
|
|
82
95
|
else {
|
|
83
96
|
logger.error(`API error: ${err.message}`);
|
|
@@ -98,4 +111,14 @@ async function runStatus(flags) {
|
|
|
98
111
|
process.exit(1);
|
|
99
112
|
}
|
|
100
113
|
}
|
|
114
|
+
function hostnameOf(site) {
|
|
115
|
+
if (!site)
|
|
116
|
+
return "";
|
|
117
|
+
try {
|
|
118
|
+
return new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(site) ? site : `https://${site}`).hostname;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return "";
|
|
122
|
+
}
|
|
123
|
+
}
|
|
101
124
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/test.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
+
import type { CLIFlags } from "../types.js";
|
|
2
3
|
export declare function registerTestCommand(program: Command): void;
|
|
4
|
+
export declare function runTest(eventType: string | undefined, flags: CLIFlags): Promise<void>;
|
|
3
5
|
//# sourceMappingURL=test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAOnD;AAED,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,iBA6E3E"}
|
package/dist/commands/test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as logger from "../lib/logger.js";
|
|
2
2
|
import { format } from "../lib/logger.js";
|
|
3
|
-
import {
|
|
3
|
+
import { readConfigOrKeyOnly, ConfigNotFoundError } from "../lib/config.js";
|
|
4
4
|
import { AffitorAPI, APIError, NetworkError } from "../lib/api-client.js";
|
|
5
5
|
import { getFlags } from "../lib/flags.js";
|
|
6
6
|
export function registerTestCommand(program) {
|
|
@@ -11,10 +11,10 @@ export function registerTestCommand(program) {
|
|
|
11
11
|
await runTest(eventType, getFlags(cmd));
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
async function runTest(eventType, flags) {
|
|
14
|
+
export async function runTest(eventType, flags) {
|
|
15
15
|
let config;
|
|
16
16
|
try {
|
|
17
|
-
config =
|
|
17
|
+
config = readConfigOrKeyOnly(flags);
|
|
18
18
|
}
|
|
19
19
|
catch (err) {
|
|
20
20
|
if (err instanceof ConfigNotFoundError) {
|
|
@@ -35,11 +35,11 @@ async function runTest(eventType, flags) {
|
|
|
35
35
|
logger.json({ error: "invalid_event_type" });
|
|
36
36
|
process.exit(1);
|
|
37
37
|
}
|
|
38
|
-
const api = AffitorAPI.fromFlags({ apiKey: flags.apiKey, apiUrl: flags.apiUrl ?? config
|
|
38
|
+
const api = AffitorAPI.fromFlags({ apiKey: flags.apiKey, apiUrl: flags.apiUrl ?? config?.api_url });
|
|
39
39
|
logger.newline();
|
|
40
40
|
try {
|
|
41
41
|
const result = await api.sendTestEvent({
|
|
42
|
-
program_id: config
|
|
42
|
+
program_id: config?.program_id,
|
|
43
43
|
event_type: type,
|
|
44
44
|
});
|
|
45
45
|
if (flags.json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,QA0CpD"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -11,6 +11,9 @@ export function registerWhoamiCommand(parent) {
|
|
|
11
11
|
if (!creds) {
|
|
12
12
|
if (flags.json) {
|
|
13
13
|
logger.json({ logged_in: false });
|
|
14
|
+
// Same exit code as the text mode below. exitCode, not exit(), so the
|
|
15
|
+
// JSON reaches a piped stdout before the process ends.
|
|
16
|
+
process.exitCode = 1;
|
|
14
17
|
return;
|
|
15
18
|
}
|
|
16
19
|
logger.info("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;gBAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC5E,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE;YAC1B,kBAAkB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACxC,kBAAkB,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACzD,kBAAkB,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;SAC/E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClC,sEAAsE;gBACtE,uDAAuD;gBACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;gBAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC5E,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE;YAC1B,kBAAkB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACxC,kBAAkB,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACzD,kBAAkB,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;SAC/E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InitResponse,
|
|
1
|
+
import type { InitResponse, ProgramStatus, ProgramSummary, TestEventResult, ReadinessResult, VerificationChainResult } from "../types.js";
|
|
2
2
|
export interface AuthStartResponse {
|
|
3
3
|
state: string;
|
|
4
4
|
auth_url: string;
|
|
@@ -14,6 +14,13 @@ export interface AuthPollResponse {
|
|
|
14
14
|
export declare class AffitorAPI {
|
|
15
15
|
private apiUrl;
|
|
16
16
|
private apiKey?;
|
|
17
|
+
/**
|
|
18
|
+
* Warning codes this client has already printed. A flagged key warns on every
|
|
19
|
+
* response, so one command would otherwise print the same line once per request
|
|
20
|
+
* it makes. A command builds one client, so this lasts exactly one run: a second
|
|
21
|
+
* client, or a second run in the same process, warns again.
|
|
22
|
+
*/
|
|
23
|
+
private reportedWarnings;
|
|
17
24
|
constructor(opts?: {
|
|
18
25
|
apiUrl?: string;
|
|
19
26
|
apiKey?: string;
|
|
@@ -35,18 +42,12 @@ export declare class AffitorAPI {
|
|
|
35
42
|
duration_months?: number;
|
|
36
43
|
advertiser_id?: number;
|
|
37
44
|
}): Promise<InitResponse>;
|
|
38
|
-
|
|
39
|
-
program_id: string;
|
|
40
|
-
stripe_user_id: string;
|
|
41
|
-
webhook_endpoint_id: string;
|
|
42
|
-
webhook_secret: string;
|
|
43
|
-
}): Promise<StripeConnectResponse>;
|
|
44
|
-
getStatus(programId: string): Promise<ProgramStatus>;
|
|
45
|
+
getStatus(programId?: string): Promise<ProgramStatus>;
|
|
45
46
|
authStart(): Promise<AuthStartResponse>;
|
|
46
47
|
authPoll(state: string): Promise<AuthPollResponse>;
|
|
47
48
|
listPrograms(): Promise<ProgramSummary[]>;
|
|
48
49
|
sendTestEvent(data: {
|
|
49
|
-
program_id
|
|
50
|
+
program_id?: string;
|
|
50
51
|
event_type: "click" | "lead" | "sale";
|
|
51
52
|
}): Promise<TestEventResult>;
|
|
52
53
|
/**
|
|
@@ -73,11 +74,30 @@ export declare class AffitorAPI {
|
|
|
73
74
|
apiKey?: string;
|
|
74
75
|
apiUrl?: string;
|
|
75
76
|
}): Promise<VerificationChainResult>;
|
|
77
|
+
/** Forget which warnings this client has printed, so they are printed again. */
|
|
78
|
+
resetReportedWarnings(): void;
|
|
79
|
+
/** Print each new `warnings[]` entry as one stderr line: what is wrong, what to do. */
|
|
80
|
+
private reportWarnings;
|
|
81
|
+
/**
|
|
82
|
+
* Print the rotation signal the API sets in headers on EVERY response made with a
|
|
83
|
+
* flagged key — `Deprecation` (RFC 9745), `Sunset` (RFC 8594) and a `deprecation`
|
|
84
|
+
* link. Past the deadline the API answers 401 and drops `warnings[]`, so these
|
|
85
|
+
* headers are the only thing left saying why (W37-1362).
|
|
86
|
+
*
|
|
87
|
+
* Shares `reportedWarnings` with the body warning under one key, so a response
|
|
88
|
+
* carrying both prints once. Anything missing or unparseable is skipped in
|
|
89
|
+
* silence: a side signal must never break a command that is otherwise working.
|
|
90
|
+
*/
|
|
91
|
+
private reportDeprecationHeaders;
|
|
76
92
|
private request;
|
|
77
93
|
}
|
|
78
94
|
export declare class APIError extends Error {
|
|
79
95
|
status: number;
|
|
80
|
-
|
|
96
|
+
/** The API's own error code, when it sent one (e.g. api_key_rotation_required). */
|
|
97
|
+
code?: string | undefined;
|
|
98
|
+
constructor(status: number, message: string,
|
|
99
|
+
/** The API's own error code, when it sent one (e.g. api_key_rotation_required). */
|
|
100
|
+
code?: string | undefined);
|
|
81
101
|
}
|
|
82
102
|
export declare class NetworkError extends Error {
|
|
83
103
|
constructor(message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAiDD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAqB;gBAEjC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAK3D;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU;IAQjF,WAAW,CAAC,IAAI,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQrD,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAMvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQlD,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,aAAa,CAAC,IAAI,EAAE;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;KACvC,GAAG,OAAO,CAAC,eAAe,CAAC;IAS5B;;;;OAIG;IACG,YAAY,CAAC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAO7F;;;;;;;;;;OAUG;IACG,oBAAoB,CACxB,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9C,OAAO,CAAC,uBAAuB,CAAC;IAgDnC,gFAAgF;IAChF,qBAAqB,IAAI,IAAI;IAI7B,uFAAuF;IACvF,OAAO,CAAC,cAAc;IAatB;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB;YA4BlB,OAAO;CAyFtB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;IAErB,mFAAmF;IAC5E,IAAI,CAAC,EAAE,MAAM;gBAHb,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;IACf,mFAAmF;IAC5E,IAAI,CAAC,EAAE,MAAM,YAAA;CAKvB;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/lib/api-client.js
CHANGED
|
@@ -1,9 +1,45 @@
|
|
|
1
1
|
import { DEFAULT_API_URL } from "../types.js";
|
|
2
2
|
import * as logger from "./logger.js";
|
|
3
3
|
import { resolveApiKey } from "./config.js";
|
|
4
|
+
/**
|
|
5
|
+
* The dedupe key the body warning and the response headers share. Both say the same
|
|
6
|
+
* thing about the same key, so whichever arrives first speaks and the other stays
|
|
7
|
+
* quiet — the body wins when it is there, because it carries a hint as well.
|
|
8
|
+
*/
|
|
9
|
+
const ROTATION_KEY = "api_key_rotation_required";
|
|
10
|
+
/** The `Sunset` deadline as a plain date, or undefined if it will not parse. */
|
|
11
|
+
function parseSunset(sunset) {
|
|
12
|
+
if (!sunset)
|
|
13
|
+
return undefined;
|
|
14
|
+
const at = new Date(sunset);
|
|
15
|
+
// An unparseable date is a signal we cannot use, not a reason to fail the command.
|
|
16
|
+
if (Number.isNaN(at.getTime()))
|
|
17
|
+
return undefined;
|
|
18
|
+
return at.toISOString().slice(0, 10);
|
|
19
|
+
}
|
|
20
|
+
/** The URL out of `Link: <url>; rel="deprecation"`, ignoring links with any other rel. */
|
|
21
|
+
function parseDeprecationLink(link) {
|
|
22
|
+
if (!link)
|
|
23
|
+
return undefined;
|
|
24
|
+
for (const entry of link.split(",")) {
|
|
25
|
+
if (!/rel\s*=\s*"?deprecation"?/i.test(entry))
|
|
26
|
+
continue;
|
|
27
|
+
const url = /<([^>]+)>/.exec(entry);
|
|
28
|
+
if (url)
|
|
29
|
+
return url[1].trim();
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
4
33
|
export class AffitorAPI {
|
|
5
34
|
apiUrl;
|
|
6
35
|
apiKey;
|
|
36
|
+
/**
|
|
37
|
+
* Warning codes this client has already printed. A flagged key warns on every
|
|
38
|
+
* response, so one command would otherwise print the same line once per request
|
|
39
|
+
* it makes. A command builds one client, so this lasts exactly one run: a second
|
|
40
|
+
* client, or a second run in the same process, warns again.
|
|
41
|
+
*/
|
|
42
|
+
reportedWarnings = new Set();
|
|
7
43
|
constructor(opts = {}) {
|
|
8
44
|
this.apiUrl = opts.apiUrl ?? DEFAULT_API_URL;
|
|
9
45
|
this.apiKey = opts.apiKey;
|
|
@@ -25,14 +61,8 @@ export class AffitorAPI {
|
|
|
25
61
|
body: data,
|
|
26
62
|
});
|
|
27
63
|
}
|
|
28
|
-
async saveStripeConnection(data) {
|
|
29
|
-
return this.request("/api/v1/cli/stripe-connect", {
|
|
30
|
-
method: "POST",
|
|
31
|
-
body: data,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
64
|
async getStatus(programId) {
|
|
35
|
-
return this.request(`/api/v1/cli/status?program_id=${programId}`);
|
|
65
|
+
return this.request(programId ? `/api/v1/cli/status?program_id=${programId}` : "/api/v1/cli/status");
|
|
36
66
|
}
|
|
37
67
|
// ─── Auth endpoints ───────────────────────────────────────────
|
|
38
68
|
async authStart() {
|
|
@@ -99,6 +129,8 @@ export class AffitorAPI {
|
|
|
99
129
|
throw new NetworkError(err.message);
|
|
100
130
|
}
|
|
101
131
|
const body = (await res.json().catch(() => ({})));
|
|
132
|
+
this.reportWarnings(body);
|
|
133
|
+
this.reportDeprecationHeaders(res);
|
|
102
134
|
if (res.ok) {
|
|
103
135
|
// Server returns { data: { verdict, attributed, ... } } or the bare object.
|
|
104
136
|
return (body.data ?? body);
|
|
@@ -115,6 +147,61 @@ export class AffitorAPI {
|
|
|
115
147
|
...(retryAfter !== undefined ? { retry_after_seconds: retryAfter } : {}),
|
|
116
148
|
};
|
|
117
149
|
}
|
|
150
|
+
/** Forget which warnings this client has printed, so they are printed again. */
|
|
151
|
+
resetReportedWarnings() {
|
|
152
|
+
this.reportedWarnings.clear();
|
|
153
|
+
}
|
|
154
|
+
/** Print each new `warnings[]` entry as one stderr line: what is wrong, what to do. */
|
|
155
|
+
reportWarnings(body) {
|
|
156
|
+
const warnings = body?.warnings;
|
|
157
|
+
if (!Array.isArray(warnings))
|
|
158
|
+
return;
|
|
159
|
+
for (const warning of warnings) {
|
|
160
|
+
if (!warning?.message)
|
|
161
|
+
continue;
|
|
162
|
+
const key = warning.code ?? warning.message;
|
|
163
|
+
if (this.reportedWarnings.has(key))
|
|
164
|
+
continue;
|
|
165
|
+
this.reportedWarnings.add(key);
|
|
166
|
+
logger.notice(warning.hint ? `${warning.message} ${warning.hint}` : warning.message);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Print the rotation signal the API sets in headers on EVERY response made with a
|
|
171
|
+
* flagged key — `Deprecation` (RFC 9745), `Sunset` (RFC 8594) and a `deprecation`
|
|
172
|
+
* link. Past the deadline the API answers 401 and drops `warnings[]`, so these
|
|
173
|
+
* headers are the only thing left saying why (W37-1362).
|
|
174
|
+
*
|
|
175
|
+
* Shares `reportedWarnings` with the body warning under one key, so a response
|
|
176
|
+
* carrying both prints once. Anything missing or unparseable is skipped in
|
|
177
|
+
* silence: a side signal must never break a command that is otherwise working.
|
|
178
|
+
*/
|
|
179
|
+
reportDeprecationHeaders(res) {
|
|
180
|
+
let deprecation = null;
|
|
181
|
+
let sunset = null;
|
|
182
|
+
let link = null;
|
|
183
|
+
try {
|
|
184
|
+
deprecation = res.headers?.get("Deprecation") ?? null;
|
|
185
|
+
sunset = res.headers?.get("Sunset") ?? null;
|
|
186
|
+
link = res.headers?.get("Link") ?? null;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (!deprecation && !sunset)
|
|
192
|
+
return;
|
|
193
|
+
if (this.reportedWarnings.has(ROTATION_KEY))
|
|
194
|
+
return;
|
|
195
|
+
this.reportedWarnings.add(ROTATION_KEY);
|
|
196
|
+
const by = parseSunset(sunset);
|
|
197
|
+
const docs = parseDeprecationLink(link);
|
|
198
|
+
logger.notice([
|
|
199
|
+
by ? `This API key must be replaced by ${by}.` : "This API key must be replaced.",
|
|
200
|
+
docs ? `See ${docs}` : undefined,
|
|
201
|
+
]
|
|
202
|
+
.filter(Boolean)
|
|
203
|
+
.join(" "));
|
|
204
|
+
}
|
|
118
205
|
async request(path, opts = {}) {
|
|
119
206
|
const url = `${opts.apiUrl ?? this.apiUrl}${path}`;
|
|
120
207
|
const key = opts.apiKey ?? this.apiKey;
|
|
@@ -134,23 +221,46 @@ export class AffitorAPI {
|
|
|
134
221
|
headers,
|
|
135
222
|
body: opts.body ? JSON.stringify(opts.body) : undefined,
|
|
136
223
|
});
|
|
224
|
+
// `warnings` sits beside `data`, and the API attaches it to an error
|
|
225
|
+
// response too: a key inside its rotation window still has to hear about
|
|
226
|
+
// the deadline while a call fails for an unrelated reason. So read the
|
|
227
|
+
// body once and report before branching on status. A body that will not
|
|
228
|
+
// parse only matters on a 2xx, where it was the payload.
|
|
229
|
+
let body = {};
|
|
230
|
+
let bodyError;
|
|
231
|
+
try {
|
|
232
|
+
body = await res.json();
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
bodyError = err;
|
|
236
|
+
}
|
|
237
|
+
this.reportWarnings(body);
|
|
238
|
+
// After the body, so the richer body warning claims the shared key, and
|
|
239
|
+
// before every branch below, so a 429 or a 401 reports too — the 401 past
|
|
240
|
+
// the deadline has nothing but these headers.
|
|
241
|
+
this.reportDeprecationHeaders(res);
|
|
137
242
|
if (res.status === 429) {
|
|
138
243
|
const retryAfter = res.headers.get("Retry-After");
|
|
139
244
|
const wait = retryAfter ? parseInt(retryAfter, 10) * 1000 : 5000;
|
|
140
245
|
throw new APIError(429, `Rate limited. Wait ${Math.ceil(wait / 1000)} seconds and try again.`);
|
|
141
246
|
}
|
|
142
247
|
if (!res.ok) {
|
|
143
|
-
const
|
|
248
|
+
const errorBody = (body ?? {});
|
|
144
249
|
// Strapi returns errors as an object ({ error: { message, ... } }),
|
|
145
250
|
// but some endpoints return { error: "string" } or { message }.
|
|
146
251
|
// Extract a string so we never surface "[object Object]".
|
|
147
|
-
const rawError =
|
|
148
|
-
const
|
|
149
|
-
|
|
252
|
+
const rawError = errorBody.error;
|
|
253
|
+
const errObject = typeof rawError === "object" && rawError !== null ? rawError : undefined;
|
|
254
|
+
const message = (typeof rawError === "string" ? rawError : errObject?.message) ??
|
|
255
|
+
errorBody.message ??
|
|
150
256
|
`API returned ${res.status}`;
|
|
151
|
-
|
|
257
|
+
// A `hint` means the caller has to do something specific rather than retry
|
|
258
|
+
// (a retired key needs a new key), so keep it attached to the message, and
|
|
259
|
+
// keep `code` so a command can tell that case from a plain bad key.
|
|
260
|
+
throw new APIError(res.status, errObject?.hint ? `${message} ${errObject.hint}` : message, errObject?.code);
|
|
152
261
|
}
|
|
153
|
-
|
|
262
|
+
if (bodyError)
|
|
263
|
+
throw bodyError;
|
|
154
264
|
return body.data ?? body;
|
|
155
265
|
}
|
|
156
266
|
catch (err) {
|
|
@@ -169,9 +279,13 @@ export class AffitorAPI {
|
|
|
169
279
|
}
|
|
170
280
|
export class APIError extends Error {
|
|
171
281
|
status;
|
|
172
|
-
|
|
282
|
+
code;
|
|
283
|
+
constructor(status, message,
|
|
284
|
+
/** The API's own error code, when it sent one (e.g. api_key_rotation_required). */
|
|
285
|
+
code) {
|
|
173
286
|
super(message);
|
|
174
287
|
this.status = status;
|
|
288
|
+
this.code = code;
|
|
175
289
|
this.name = "APIError";
|
|
176
290
|
}
|
|
177
291
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { type AffitorConfig, type AffitorSecrets, type UserCredentials } from "../types.js";
|
|
2
2
|
export declare function configExists(cwd?: string): boolean;
|
|
3
3
|
export declare function readConfig(cwd?: string): AffitorConfig;
|
|
4
|
+
/**
|
|
5
|
+
* The project config, or null when this directory has none but a key was passed with
|
|
6
|
+
* `--api-key` or AFFITOR_API_KEY. The API finds the program from the key alone, so `status` and
|
|
7
|
+
* `test` work for a program created in the dashboard, without `init` (which makes a new one).
|
|
8
|
+
*/
|
|
9
|
+
export declare function readConfigOrKeyOnly(flags: {
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
}, cwd?: string): AffitorConfig | null;
|
|
4
12
|
export declare function writeConfig(config: AffitorConfig, cwd?: string): void;
|
|
5
13
|
export declare function updateConfig(updates: Partial<AffitorConfig>, cwd?: string): AffitorConfig;
|
|
6
14
|
export declare function readSecrets(cwd?: string): AffitorSecrets | null;
|
|
@@ -8,9 +16,26 @@ export declare function writeSecrets(secrets: AffitorSecrets, cwd?: string): voi
|
|
|
8
16
|
export declare function readCredentials(): UserCredentials | null;
|
|
9
17
|
export declare function writeCredentials(creds: UserCredentials): void;
|
|
10
18
|
export declare function deleteCredentials(): void;
|
|
19
|
+
/** Where the key a command sends came from, so "replace it" can name the right place. */
|
|
20
|
+
export type ApiKeySource = "flag" | "env" | "secrets" | "legacy-config" | "none";
|
|
11
21
|
export declare function resolveApiKey(flags: {
|
|
12
22
|
apiKey?: string;
|
|
13
23
|
}, cwd?: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Name the place a rejected key has to be replaced.
|
|
26
|
+
*
|
|
27
|
+
* The chain above is a priority chain: `--api-key` beats AFFITOR_API_KEY, which beats
|
|
28
|
+
* `.affitor/.env`. Telling someone who passed `--api-key` to update the env variable
|
|
29
|
+
* would leave the same key on the wire and the same 401, so an error names the source
|
|
30
|
+
* that actually won. Derived from the one resolver, so the two cannot drift apart.
|
|
31
|
+
*
|
|
32
|
+
* Each label names the thing the reader has to edit, spelled as that place spells it:
|
|
33
|
+
* `.affitor/.env` holds `AFFITOR_API_KEY=` (readSecrets/writeSecrets above), while
|
|
34
|
+
* `api_key` is a field name and only appears in a v1 `.affitor/config.json`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function apiKeySourceLabel(flags: {
|
|
37
|
+
apiKey?: string;
|
|
38
|
+
}, cwd?: string): string;
|
|
14
39
|
export declare function writeEnvExample(config: AffitorConfig, apiKey: string, cwd?: string): void;
|
|
15
40
|
export declare function writeSkillsFile(config: AffitorConfig, programName: string, apiKey: string, cwd?: string): void;
|
|
16
41
|
export declare function appendToGitignore(cwd?: string): void;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAiBrB,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,CActD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,EAC/B,GAAG,CAAC,EAAE,MAAM,GACX,aAAa,CAKf;AAID,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAuB/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAiBrB,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,CActD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOlG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,EAC/B,GAAG,CAAC,EAAE,MAAM,GACX,aAAa,CAKf;AAID,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAuB/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAmBxE;AAYD,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAgBxD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAS7D;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAID,yFAAyF;AACzF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,eAAe,GAAG,MAAM,CAAC;AA+BjF,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAalF;AA4CD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAUN;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAwIN;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBpD;AAgBD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,EAAE,MAAM;CAOxB"}
|