@benglo/storu-cli 1.1.0 → 1.2.0
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/api-client.d.ts +5 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +24 -0
- package/dist/api-client.js.map +1 -1
- package/dist/commands/apps.d.ts +2 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +60 -49
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/epics.d.ts +2 -1
- package/dist/commands/epics.d.ts.map +1 -1
- package/dist/commands/epics.js +66 -61
- package/dist/commands/epics.js.map +1 -1
- package/dist/commands/labels.d.ts +2 -1
- package/dist/commands/labels.d.ts.map +1 -1
- package/dist/commands/labels.js +43 -37
- package/dist/commands/labels.js.map +1 -1
- package/dist/commands/releases.d.ts +2 -1
- package/dist/commands/releases.d.ts.map +1 -1
- package/dist/commands/releases.js +85 -82
- package/dist/commands/releases.js.map +1 -1
- package/dist/commands/stories.d.ts +2 -1
- package/dist/commands/stories.d.ts.map +1 -1
- package/dist/commands/stories.js +278 -162
- package/dist/commands/stories.js.map +1 -1
- package/dist/commands/subscribers.d.ts +2 -1
- package/dist/commands/subscribers.d.ts.map +1 -1
- package/dist/commands/subscribers.js +39 -33
- package/dist/commands/subscribers.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -12
- package/dist/config.js.map +1 -1
- package/dist/helpers.d.ts +20 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +32 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.js +29 -25
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,49 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { shortId, output, resolveApp } from "../helpers.js";
|
|
2
|
+
export function registerSubscriberCommand(program, client, getConfig) {
|
|
3
|
+
const subscriberCmd = program.command("subscriber").description("Manage subscribers");
|
|
4
|
+
subscriberCmd
|
|
5
|
+
.command("list")
|
|
4
6
|
.description("List subscribers for an application")
|
|
5
|
-
.
|
|
6
|
-
.
|
|
7
|
-
|
|
7
|
+
.option("--app <slug-or-id>", "Application UUID or slug")
|
|
8
|
+
.option("--json", "Output raw JSON")
|
|
9
|
+
.action(async (opts) => {
|
|
10
|
+
const appId = await resolveApp(client, opts, getConfig());
|
|
11
|
+
const result = await client.listSubscribers({ app: appId });
|
|
8
12
|
if (!result.success || !result.data) {
|
|
9
|
-
|
|
10
|
-
process.exit(1);
|
|
13
|
+
throw new Error(result.error ?? "Failed to list subscribers");
|
|
11
14
|
}
|
|
12
15
|
const rows = result.data;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
output(rows, opts, (data) => {
|
|
17
|
+
if (data.length === 0) {
|
|
18
|
+
process.stdout.write("No subscribers found.\n");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const tableData = data.map((sub) => ({
|
|
22
|
+
ID: shortId(sub.id),
|
|
23
|
+
Email: sub.email,
|
|
24
|
+
Name: sub.name ?? "",
|
|
25
|
+
}));
|
|
26
|
+
console.table(tableData);
|
|
27
|
+
});
|
|
23
28
|
});
|
|
24
|
-
const subscriberCmd = program.command("subscriber").description("Manage subscribers");
|
|
25
29
|
subscriberCmd
|
|
26
30
|
.command("add")
|
|
27
31
|
.description("Add a subscriber to an application")
|
|
28
|
-
.
|
|
32
|
+
.option("--app <slug-or-id>", "Application UUID or slug")
|
|
29
33
|
.requiredOption("--email <email>", "Subscriber email address")
|
|
30
34
|
.option("--name <name>", "Subscriber display name")
|
|
31
|
-
.
|
|
35
|
+
.option("--json", "Output raw JSON")
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
const appId = await resolveApp(client, opts, getConfig());
|
|
32
38
|
const result = await client.createSubscriber({
|
|
33
|
-
application_id:
|
|
34
|
-
email:
|
|
35
|
-
name:
|
|
39
|
+
application_id: appId,
|
|
40
|
+
email: opts.email,
|
|
41
|
+
name: opts.name,
|
|
36
42
|
});
|
|
37
43
|
if (!result.success || !result.data) {
|
|
38
|
-
|
|
39
|
-
process.exit(1);
|
|
44
|
+
throw new Error(result.error ?? "Failed to add subscriber");
|
|
40
45
|
}
|
|
41
46
|
const sub = result.data;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
output(sub, opts, (data) => {
|
|
48
|
+
process.stdout.write(`Subscriber added: ${data.id}\n`);
|
|
49
|
+
process.stdout.write(` Email: ${data.email}\n`);
|
|
50
|
+
if (data.name) {
|
|
51
|
+
process.stdout.write(` Name: ${data.name}\n`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
47
54
|
});
|
|
48
55
|
subscriberCmd
|
|
49
56
|
.command("remove <id>")
|
|
@@ -51,8 +58,7 @@ export function registerSubscribersCommand(program, client) {
|
|
|
51
58
|
.action(async (id) => {
|
|
52
59
|
const result = await client.deleteSubscriber(id);
|
|
53
60
|
if (!result.success) {
|
|
54
|
-
|
|
55
|
-
process.exit(1);
|
|
61
|
+
throw new Error(result.error ?? "Failed to remove subscriber");
|
|
56
62
|
}
|
|
57
63
|
process.stdout.write(`Subscriber removed: ${id}\n`);
|
|
58
64
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/commands/subscribers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/commands/subscribers.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAyCxC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAIrD;AAaD,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA6D7C"}
|
package/dist/config.js
CHANGED
|
@@ -20,7 +20,11 @@ export function readConfig() {
|
|
|
20
20
|
const envUrl = process.env.STORU_API_URL;
|
|
21
21
|
const envKey = process.env.STORU_API_KEY;
|
|
22
22
|
if (envUrl && envKey) {
|
|
23
|
-
return {
|
|
23
|
+
return {
|
|
24
|
+
api_url: envUrl,
|
|
25
|
+
api_key: envKey,
|
|
26
|
+
default_app: process.env.STORU_APP,
|
|
27
|
+
};
|
|
24
28
|
}
|
|
25
29
|
let raw;
|
|
26
30
|
try {
|
|
@@ -43,7 +47,11 @@ export function readConfig() {
|
|
|
43
47
|
if (typeof cfg.api_key !== "string" || cfg.api_key.length === 0) {
|
|
44
48
|
throw new Error(`Config is missing 'api_key'. Run 'storu init' to fix.`);
|
|
45
49
|
}
|
|
46
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
api_url: cfg.api_url,
|
|
52
|
+
api_key: cfg.api_key,
|
|
53
|
+
default_app: typeof cfg.default_app === "string" ? cfg.default_app : undefined,
|
|
54
|
+
};
|
|
47
55
|
}
|
|
48
56
|
export function writeConfig(config) {
|
|
49
57
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
@@ -61,13 +69,13 @@ function prompt(question, defaultValue) {
|
|
|
61
69
|
});
|
|
62
70
|
}
|
|
63
71
|
export async function runInit() {
|
|
64
|
-
|
|
72
|
+
process.stdout.write("\n Storu CLI Setup\n\n");
|
|
65
73
|
const existing = configExists();
|
|
66
74
|
let defaults = {};
|
|
67
75
|
if (existing) {
|
|
68
76
|
try {
|
|
69
77
|
defaults = readConfig();
|
|
70
|
-
|
|
78
|
+
process.stdout.write(` Existing config found at ${CONFIG_FILE}\n\n`);
|
|
71
79
|
}
|
|
72
80
|
catch {
|
|
73
81
|
// Ignore — broken config, we'll overwrite
|
|
@@ -76,16 +84,21 @@ export async function runInit() {
|
|
|
76
84
|
const apiUrl = await prompt(" API URL", defaults.api_url || "https://storu.netlify.app");
|
|
77
85
|
const apiKey = await prompt(" API Key", defaults.api_key);
|
|
78
86
|
if (!apiUrl || !apiKey) {
|
|
79
|
-
|
|
87
|
+
process.stderr.write("\n Both API URL and API Key are required.\n\n");
|
|
80
88
|
process.exit(1);
|
|
81
89
|
}
|
|
90
|
+
const defaultApp = await prompt(" Default app slug (optional, press Enter to skip)", defaults.default_app);
|
|
82
91
|
// Strip trailing slashes to avoid double-slash in URL construction
|
|
83
92
|
const cleanUrl = apiUrl.replace(/\/+$/, "");
|
|
84
|
-
writeConfig({
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
writeConfig({
|
|
94
|
+
api_url: cleanUrl,
|
|
95
|
+
api_key: apiKey,
|
|
96
|
+
default_app: defaultApp || undefined,
|
|
97
|
+
});
|
|
98
|
+
process.stdout.write(`\n Config saved to ${CONFIG_FILE}\n`);
|
|
99
|
+
process.stdout.write(` Permissions set to owner-only (600)\n\n`);
|
|
87
100
|
// Test the connection
|
|
88
|
-
|
|
101
|
+
process.stdout.write(" Testing connection...\n");
|
|
89
102
|
try {
|
|
90
103
|
const res = await fetch(`${cleanUrl}/api/apps`, {
|
|
91
104
|
headers: { "X-API-Key": apiKey },
|
|
@@ -93,14 +106,14 @@ export async function runInit() {
|
|
|
93
106
|
if (res.ok) {
|
|
94
107
|
const data = await res.json();
|
|
95
108
|
const count = data.data?.length ?? 0;
|
|
96
|
-
|
|
109
|
+
process.stdout.write(` Connected! Found ${count} application${count !== 1 ? "s" : ""}.\n\n`);
|
|
97
110
|
}
|
|
98
111
|
else {
|
|
99
|
-
|
|
112
|
+
process.stdout.write(` Warning: API returned ${res.status}. Check your URL and key.\n\n`);
|
|
100
113
|
}
|
|
101
114
|
}
|
|
102
115
|
catch {
|
|
103
|
-
|
|
116
|
+
process.stdout.write(` Warning: Could not reach ${cleanUrl}. Check the URL.\n\n`);
|
|
104
117
|
}
|
|
105
118
|
}
|
|
106
119
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { StoruApiClient } from "./api-client.js";
|
|
2
|
+
import type { StoruConfig } from "./config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shorten a UUID to first 8 chars for compact table display.
|
|
5
|
+
*/
|
|
6
|
+
export declare function shortId(uuid: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Output data either as raw JSON (when --json) or via a formatter function.
|
|
9
|
+
*/
|
|
10
|
+
export declare function output<T>(data: T, opts: {
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}, formatter?: (data: T) => void): void;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the app slug/id from --app flag, STORU_APP env var, or config default_app.
|
|
15
|
+
* Returns the resolved UUID.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveApp(client: StoruApiClient, opts: {
|
|
18
|
+
app?: string;
|
|
19
|
+
}, config: StoruConfig): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,IAAI,EAAE,CAAC,EACP,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAC5B,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shorten a UUID to first 8 chars for compact table display.
|
|
3
|
+
*/
|
|
4
|
+
export function shortId(uuid) {
|
|
5
|
+
return uuid.slice(0, 8);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Output data either as raw JSON (when --json) or via a formatter function.
|
|
9
|
+
*/
|
|
10
|
+
export function output(data, opts, formatter) {
|
|
11
|
+
if (opts.json) {
|
|
12
|
+
process.stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
13
|
+
}
|
|
14
|
+
else if (formatter) {
|
|
15
|
+
formatter(data);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
process.stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the app slug/id from --app flag, STORU_APP env var, or config default_app.
|
|
23
|
+
* Returns the resolved UUID.
|
|
24
|
+
*/
|
|
25
|
+
export async function resolveApp(client, opts, config) {
|
|
26
|
+
const slug = opts.app ?? process.env.STORU_APP ?? config.default_app;
|
|
27
|
+
if (!slug) {
|
|
28
|
+
throw new Error("No app specified. Use --app <slug> or set STORU_APP.");
|
|
29
|
+
}
|
|
30
|
+
return client.resolveAppId(slug);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,IAAO,EACP,IAAwB,EACxB,SAA6B;IAE7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAsB,EACtB,IAAsB,EACtB,MAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC;IACrE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { readConfig, runInit } from "./config.js";
|
|
4
4
|
import { StoruApiClient } from "./api-client.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
5
|
+
import { registerAppCommand } from "./commands/apps.js";
|
|
6
|
+
import { registerEpicCommand } from "./commands/epics.js";
|
|
7
|
+
import { registerStoryCommand } from "./commands/stories.js";
|
|
8
|
+
import { registerReleaseCommand } from "./commands/releases.js";
|
|
9
|
+
import { registerLabelCommand } from "./commands/labels.js";
|
|
10
|
+
import { registerSubscriberCommand } from "./commands/subscribers.js";
|
|
11
11
|
const program = new Command();
|
|
12
12
|
program
|
|
13
13
|
.name("storu")
|
|
@@ -20,30 +20,34 @@ program
|
|
|
20
20
|
.action(async () => {
|
|
21
21
|
await runInit();
|
|
22
22
|
});
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
const message = err instanceof Error ? err.message : "Configuration error";
|
|
31
|
-
process.stderr.write(`${message}\n`);
|
|
32
|
-
process.exit(1);
|
|
23
|
+
// Lazy-resolved config and client — only read when a command actually runs
|
|
24
|
+
let _config = null;
|
|
25
|
+
function getConfig() {
|
|
26
|
+
if (!_config) {
|
|
27
|
+
_config = readConfig();
|
|
33
28
|
}
|
|
29
|
+
return _config;
|
|
34
30
|
}
|
|
35
|
-
|
|
31
|
+
function getClient() {
|
|
32
|
+
const cfg = getConfig();
|
|
33
|
+
return new StoruApiClient(cfg.api_url, cfg.api_key);
|
|
34
|
+
}
|
|
35
|
+
// Lazy proxy: reads config/creates client on first method call
|
|
36
36
|
const client = new Proxy({}, {
|
|
37
37
|
get(_target, prop) {
|
|
38
38
|
const real = getClient();
|
|
39
|
-
return real[prop]
|
|
39
|
+
return real[prop];
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
program.
|
|
42
|
+
registerAppCommand(program, client, getConfig);
|
|
43
|
+
registerEpicCommand(program, client, getConfig);
|
|
44
|
+
registerStoryCommand(program, client, getConfig);
|
|
45
|
+
registerReleaseCommand(program, client, getConfig);
|
|
46
|
+
registerLabelCommand(program, client, getConfig);
|
|
47
|
+
registerSubscriberCommand(program, client, getConfig);
|
|
48
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
49
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
50
|
+
process.stderr.write(`Error: ${message}\n`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
|
49
53
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAoB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,kCAAkC;AAClC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,2EAA2E;AAC3E,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC,SAAS,SAAS;IAChB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,UAAU,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,+DAA+D;AAC/D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,EAAoB,EAAE;IAC7C,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,OAAQ,IAAoD,CAAC,IAAuB,CAAC,CAAC;IACxF,CAAC;CACF,CAAC,CAAC;AAEH,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/C,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAChD,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACjD,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACnD,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACjD,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAEtD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|