epismo 0.1.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/README.md +115 -0
- package/dist/api.js +37 -0
- package/dist/api.js.map +1 -0
- package/dist/assets.js +85 -0
- package/dist/assets.js.map +1 -0
- package/dist/auth.js +330 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/credits.js +48 -0
- package/dist/credits.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/input.js +124 -0
- package/dist/input.js.map +1 -0
- package/dist/output.js +7 -0
- package/dist/output.js.map +1 -0
- package/dist/program.js +401 -0
- package/dist/program.js.map +1 -0
- package/dist/tracks.js +55 -0
- package/dist/tracks.js.map +1 -0
- package/package.json +28 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
export function getConfigDir() {
|
|
5
|
+
const override = process.env.EPISMO_CONFIG_DIR?.trim();
|
|
6
|
+
if (override) {
|
|
7
|
+
return override;
|
|
8
|
+
}
|
|
9
|
+
return path.join(os.homedir(), ".epismo");
|
|
10
|
+
}
|
|
11
|
+
export function getConfigPath() {
|
|
12
|
+
return path.join(getConfigDir(), "config");
|
|
13
|
+
}
|
|
14
|
+
export function getCredentialsPath() {
|
|
15
|
+
return path.join(getConfigDir(), "credentials");
|
|
16
|
+
}
|
|
17
|
+
async function readJsonFile(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = await readFile(filePath, "utf8");
|
|
20
|
+
const parsed = JSON.parse(raw);
|
|
21
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.code === "ENOENT") {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function readCliConfig() {
|
|
34
|
+
return (await readJsonFile(getConfigPath())) ?? {};
|
|
35
|
+
}
|
|
36
|
+
export async function writeCliConfig(config) {
|
|
37
|
+
const dir = getConfigDir();
|
|
38
|
+
await mkdir(dir, { recursive: true });
|
|
39
|
+
await writeFile(getConfigPath(), `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
40
|
+
}
|
|
41
|
+
export async function readCredentials() {
|
|
42
|
+
const data = await readJsonFile(getCredentialsPath());
|
|
43
|
+
if (!data?.accessToken || !data?.userId || !data?.refreshToken || !data?.expiresAt) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
export async function writeCredentials(credentials) {
|
|
49
|
+
const filePath = getCredentialsPath();
|
|
50
|
+
await mkdir(getConfigDir(), { recursive: true });
|
|
51
|
+
await writeFile(filePath, `${JSON.stringify(credentials, null, 2)}\n`, {
|
|
52
|
+
encoding: "utf8",
|
|
53
|
+
mode: 0o600
|
|
54
|
+
});
|
|
55
|
+
try {
|
|
56
|
+
await chmod(filePath, 0o600);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// chmod may fail on Windows; silently ignore
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function clearCredentials() {
|
|
63
|
+
const filePath = getCredentialsPath();
|
|
64
|
+
await mkdir(getConfigDir(), { recursive: true });
|
|
65
|
+
await writeFile(filePath, "{}\n", { encoding: "utf8", mode: 0o600 });
|
|
66
|
+
try {
|
|
67
|
+
await chmod(filePath, 0o600);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// chmod may fail on Windows; silently ignore
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const isDev = process.env.APP_ENV === "dev";
|
|
74
|
+
export function resolveApiUrl() {
|
|
75
|
+
return isDev ? "http://localhost:8000" : "https://api.epismo.ai";
|
|
76
|
+
}
|
|
77
|
+
export function resolveWebUrl() {
|
|
78
|
+
return isDev ? "http://localhost:5173" : "https://epismo.ai";
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { readCliConfig } from "./config.js";
|
|
2
|
+
import { resolveAuthentication } from "./auth.js";
|
|
3
|
+
export async function resolveExecutionContext(options) {
|
|
4
|
+
const config = await readCliConfig();
|
|
5
|
+
const requestedWorkspaceId = options.workspaceId?.trim() ?? "";
|
|
6
|
+
const savedWorkspaceId = config.defaultWorkspaceId?.trim() ?? "";
|
|
7
|
+
const workspaceId = requestedWorkspaceId || savedWorkspaceId;
|
|
8
|
+
const auth = await resolveAuthentication();
|
|
9
|
+
return {
|
|
10
|
+
auth,
|
|
11
|
+
workspaceId: workspaceId || undefined
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAqB,MAAM,WAAW,CAAC;AAOrE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAE7C;IACA,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,WAAW,GAAG,oBAAoB,IAAI,gBAAgB,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAE3C,OAAO;QACN,IAAI;QACJ,WAAW,EAAE,WAAW,IAAI,SAAS;KACrC,CAAC;AACH,CAAC"}
|
package/dist/credits.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { requestJson } from "./api.js";
|
|
2
|
+
import { resolveApiUrl } from "./config.js";
|
|
3
|
+
import { resolveAuthentication } from "./auth.js";
|
|
4
|
+
export async function creditBalance(workspaceId) {
|
|
5
|
+
const auth = await resolveAuthentication();
|
|
6
|
+
const apiUrl = resolveApiUrl();
|
|
7
|
+
const params = new URLSearchParams();
|
|
8
|
+
if (workspaceId?.trim()) {
|
|
9
|
+
params.set("workspaceId", workspaceId.trim());
|
|
10
|
+
}
|
|
11
|
+
const pathname = `/v1/credits${params.size > 0 ? `?${params}` : ""}`;
|
|
12
|
+
return requestJson(apiUrl, pathname, {
|
|
13
|
+
authToken: auth.accessToken
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export async function creditCheckout(context, payload) {
|
|
17
|
+
const auth = await resolveAuthentication();
|
|
18
|
+
const apiUrl = resolveApiUrl();
|
|
19
|
+
const workspaceId = (typeof payload.workspaceId === "string" ? payload.workspaceId : undefined) ??
|
|
20
|
+
context.workspaceId;
|
|
21
|
+
const rawAllocations = payload.allocations;
|
|
22
|
+
if (!Array.isArray(rawAllocations) || rawAllocations.length === 0) {
|
|
23
|
+
throw new Error("allocations is required and must be a non-empty array.");
|
|
24
|
+
}
|
|
25
|
+
const allocations = rawAllocations.map((item, i) => {
|
|
26
|
+
if (typeof item !== "object" || item === null) {
|
|
27
|
+
throw new Error(`allocations[${i}] must be an object.`);
|
|
28
|
+
}
|
|
29
|
+
const { userId, quantity } = item;
|
|
30
|
+
if (typeof userId !== "string" || !userId.trim()) {
|
|
31
|
+
throw new Error(`allocations[${i}].userId must be a non-empty string.`);
|
|
32
|
+
}
|
|
33
|
+
if (typeof quantity !== "number" || !Number.isInteger(quantity) || quantity <= 0) {
|
|
34
|
+
throw new Error(`allocations[${i}].quantity must be a positive integer.`);
|
|
35
|
+
}
|
|
36
|
+
return { userId: userId.trim(), quantity };
|
|
37
|
+
});
|
|
38
|
+
const body = { allocations };
|
|
39
|
+
if (workspaceId?.trim()) {
|
|
40
|
+
body.workspaceId = workspaceId.trim();
|
|
41
|
+
}
|
|
42
|
+
return requestJson(apiUrl, "/v1/credits", {
|
|
43
|
+
method: "POST",
|
|
44
|
+
authToken: auth.accessToken,
|
|
45
|
+
body
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=credits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../src/credits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAiBlD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAoB;IACvD,MAAM,IAAI,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAErE,OAAO,WAAW,CAAwB,MAAM,EAAE,QAAQ,EAAE;QAC3D,SAAS,EAAE,IAAI,CAAC,WAAW;KAC3B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,OAAiC,EACjC,OAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,WAAW,GAChB,CAAC,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO,CAAC,WAAW,CAAC;IAErB,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,WAAW,GAAuB,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACtE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAA+B,CAAC;QAC7D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,sCAAsC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,wCAAwC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAwB,EAAE,WAAW,EAAE,CAAC;IAClD,IAAI,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,WAAW,CAAkB,MAAM,EAAE,aAAa,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,IAAI,CAAC,WAAW;QAC3B,IAAI;KACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { buildProgram } from "./program.js";
|
|
3
|
+
async function main() {
|
|
4
|
+
await buildProgram().parseAsync(process.argv);
|
|
5
|
+
}
|
|
6
|
+
await main().catch((error) => {
|
|
7
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
8
|
+
process.stderr.write(`${message}\n`);
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,UAAU,IAAI;IAClB,MAAM,YAAY,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACrC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC"}
|
package/dist/input.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
export async function readStdin() {
|
|
3
|
+
const chunks = [];
|
|
4
|
+
for await (const chunk of process.stdin) {
|
|
5
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
6
|
+
}
|
|
7
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
8
|
+
}
|
|
9
|
+
function parseJson(text, label) {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(text);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
15
|
+
throw new Error(`Invalid JSON for ${label}: ${message}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function readJsonObjectInput(input) {
|
|
19
|
+
if (!input) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
const trimmed = input.trim();
|
|
23
|
+
if (!trimmed) {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
let raw;
|
|
27
|
+
if (trimmed === "-") {
|
|
28
|
+
raw = await readStdin();
|
|
29
|
+
}
|
|
30
|
+
else if (trimmed.startsWith("@")) {
|
|
31
|
+
raw = await readFile(trimmed.slice(1), "utf8");
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
raw = trimmed;
|
|
35
|
+
}
|
|
36
|
+
const parsed = parseJson(raw, "--input");
|
|
37
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
38
|
+
throw new Error("Invalid JSON for --input: object expected.");
|
|
39
|
+
}
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
export function parseJsonObjectOption(value, label) {
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
if (typeof value !== "string") {
|
|
50
|
+
throw new Error(`Invalid ${label}: JSON object expected.`);
|
|
51
|
+
}
|
|
52
|
+
if (!value.trim()) {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
const parsed = parseJson(value, label);
|
|
56
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
57
|
+
throw new Error(`Invalid ${label}: JSON object expected.`);
|
|
58
|
+
}
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
export function parseJsonArrayOption(value, label) {
|
|
62
|
+
if (value === undefined) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
if (typeof value !== "string") {
|
|
69
|
+
throw new Error(`Invalid ${label}: JSON array expected.`);
|
|
70
|
+
}
|
|
71
|
+
if (!value.trim()) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const parsed = parseJson(value, label);
|
|
75
|
+
if (!Array.isArray(parsed)) {
|
|
76
|
+
throw new Error(`Invalid ${label}: JSON array expected.`);
|
|
77
|
+
}
|
|
78
|
+
return parsed;
|
|
79
|
+
}
|
|
80
|
+
export function parseStringArrayInput(value, label) {
|
|
81
|
+
if (value === undefined) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
if (Array.isArray(value)) {
|
|
85
|
+
return value.map((item) => String(item).trim()).filter(Boolean);
|
|
86
|
+
}
|
|
87
|
+
if (typeof value !== "string") {
|
|
88
|
+
throw new Error(`Invalid ${label}: string array expected.`);
|
|
89
|
+
}
|
|
90
|
+
const trimmed = value.trim();
|
|
91
|
+
if (!trimmed) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
if (trimmed.startsWith("[")) {
|
|
95
|
+
return parseJsonArrayOption(trimmed, label)?.map((item) => String(item).trim()) ?? [];
|
|
96
|
+
}
|
|
97
|
+
return trimmed
|
|
98
|
+
.split(",")
|
|
99
|
+
.map((item) => item.trim())
|
|
100
|
+
.filter(Boolean);
|
|
101
|
+
}
|
|
102
|
+
export function mergeDefined(base, overrides) {
|
|
103
|
+
const next = { ...base };
|
|
104
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
105
|
+
if (value !== undefined) {
|
|
106
|
+
next[key] = value;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return next;
|
|
110
|
+
}
|
|
111
|
+
export function parseOptionalInteger(value, label) {
|
|
112
|
+
if (value === undefined) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (typeof value === "number" && Number.isInteger(value)) {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
119
|
+
if (!Number.isInteger(parsed)) {
|
|
120
|
+
throw new Error(`Invalid ${label}: integer expected.`);
|
|
121
|
+
}
|
|
122
|
+
return parsed;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,SAAS;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACrB,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACP,GAAG,GAAG,OAAO,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAiC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,KAAc,EACd,KAAa;IAEb,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAgC,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,yBAAyB,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,yBAAyB,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAiC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAc,KAAc,EAAE,KAAa;IAC9E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAY,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,wBAAwB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,wBAAwB,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAa,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,KAAa;IAClE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,0BAA0B,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,oBAAoB,CAAS,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,OAAO;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,IAA6B,EAC7B,SAAY;IAEZ,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,KAAa;IACjE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,qBAAqB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAc;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AACpC,CAAC"}
|