@base44-preview/cli 0.0.15-pr.97.e56bc81 → 0.0.15-pr.99.00fd4f5
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/cli/index.js +530 -182
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { EventEmitter, addAbortListener, on, once, setMaxListeners } from "node:
|
|
|
4
4
|
import childProcess, { ChildProcess, execFile, spawn, spawnSync } from "node:child_process";
|
|
5
5
|
import path, { basename, dirname, join, posix, resolve, win32 } from "node:path";
|
|
6
6
|
import fs, { appendFileSync, createReadStream, createWriteStream, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
7
|
-
import
|
|
7
|
+
import process$1, { execArgv, execPath, hrtime, platform, stdin, stdout } from "node:process";
|
|
8
8
|
import { aborted, callbackify, debuglog, inspect, promisify, stripVTControlCharacters } from "node:util";
|
|
9
9
|
import * as g from "node:readline";
|
|
10
10
|
import O from "node:readline";
|
|
@@ -894,7 +894,7 @@ var require_command = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
894
894
|
const childProcess$1 = __require("node:child_process");
|
|
895
895
|
const path$15 = __require("node:path");
|
|
896
896
|
const fs$10 = __require("node:fs");
|
|
897
|
-
const process$
|
|
897
|
+
const process$4 = __require("node:process");
|
|
898
898
|
const { Argument, humanReadableArgName } = require_argument();
|
|
899
899
|
const { CommanderError } = require_error$1();
|
|
900
900
|
const { Help } = require_help();
|
|
@@ -945,10 +945,10 @@ var require_command = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
945
945
|
this._showHelpAfterError = false;
|
|
946
946
|
this._showSuggestionAfterError = true;
|
|
947
947
|
this._outputConfiguration = {
|
|
948
|
-
writeOut: (str) => process$
|
|
949
|
-
writeErr: (str) => process$
|
|
950
|
-
getOutHelpWidth: () => process$
|
|
951
|
-
getErrHelpWidth: () => process$
|
|
948
|
+
writeOut: (str) => process$4.stdout.write(str),
|
|
949
|
+
writeErr: (str) => process$4.stderr.write(str),
|
|
950
|
+
getOutHelpWidth: () => process$4.stdout.isTTY ? process$4.stdout.columns : void 0,
|
|
951
|
+
getErrHelpWidth: () => process$4.stderr.isTTY ? process$4.stderr.columns : void 0,
|
|
952
952
|
outputError: (str, write) => write(str)
|
|
953
953
|
};
|
|
954
954
|
this._hidden = false;
|
|
@@ -1302,7 +1302,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1302
1302
|
*/
|
|
1303
1303
|
_exit(exitCode, code$1, message) {
|
|
1304
1304
|
if (this._exitCallback) this._exitCallback(new CommanderError(exitCode, code$1, message));
|
|
1305
|
-
process$
|
|
1305
|
+
process$4.exit(exitCode);
|
|
1306
1306
|
}
|
|
1307
1307
|
/**
|
|
1308
1308
|
* Register callback `fn` for the command.
|
|
@@ -1641,11 +1641,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1641
1641
|
if (argv !== void 0 && !Array.isArray(argv)) throw new Error("first parameter to parse must be array or undefined");
|
|
1642
1642
|
parseOptions = parseOptions || {};
|
|
1643
1643
|
if (argv === void 0 && parseOptions.from === void 0) {
|
|
1644
|
-
if (process$
|
|
1645
|
-
const execArgv$1 = process$
|
|
1644
|
+
if (process$4.versions?.electron) parseOptions.from = "electron";
|
|
1645
|
+
const execArgv$1 = process$4.execArgv ?? [];
|
|
1646
1646
|
if (execArgv$1.includes("-e") || execArgv$1.includes("--eval") || execArgv$1.includes("-p") || execArgv$1.includes("--print")) parseOptions.from = "eval";
|
|
1647
1647
|
}
|
|
1648
|
-
if (argv === void 0) argv = process$
|
|
1648
|
+
if (argv === void 0) argv = process$4.argv;
|
|
1649
1649
|
this.rawArgs = argv.slice();
|
|
1650
1650
|
let userArgs;
|
|
1651
1651
|
switch (parseOptions.from) {
|
|
@@ -1655,7 +1655,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1655
1655
|
userArgs = argv.slice(2);
|
|
1656
1656
|
break;
|
|
1657
1657
|
case "electron":
|
|
1658
|
-
if (process$
|
|
1658
|
+
if (process$4.defaultApp) {
|
|
1659
1659
|
this._scriptPath = argv[1];
|
|
1660
1660
|
userArgs = argv.slice(2);
|
|
1661
1661
|
} else userArgs = argv.slice(1);
|
|
@@ -1769,15 +1769,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1769
1769
|
}
|
|
1770
1770
|
launchWithNode = sourceExt.includes(path$15.extname(executableFile));
|
|
1771
1771
|
let proc$1;
|
|
1772
|
-
if (process$
|
|
1772
|
+
if (process$4.platform !== "win32") if (launchWithNode) {
|
|
1773
1773
|
args.unshift(executableFile);
|
|
1774
|
-
args = incrementNodeInspectorPort(process$
|
|
1775
|
-
proc$1 = childProcess$1.spawn(process$
|
|
1774
|
+
args = incrementNodeInspectorPort(process$4.execArgv).concat(args);
|
|
1775
|
+
proc$1 = childProcess$1.spawn(process$4.argv[0], args, { stdio: "inherit" });
|
|
1776
1776
|
} else proc$1 = childProcess$1.spawn(executableFile, args, { stdio: "inherit" });
|
|
1777
1777
|
else {
|
|
1778
1778
|
args.unshift(executableFile);
|
|
1779
|
-
args = incrementNodeInspectorPort(process$
|
|
1780
|
-
proc$1 = childProcess$1.spawn(process$
|
|
1779
|
+
args = incrementNodeInspectorPort(process$4.execArgv).concat(args);
|
|
1780
|
+
proc$1 = childProcess$1.spawn(process$4.execPath, args, { stdio: "inherit" });
|
|
1781
1781
|
}
|
|
1782
1782
|
if (!proc$1.killed) [
|
|
1783
1783
|
"SIGUSR1",
|
|
@@ -1786,14 +1786,14 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1786
1786
|
"SIGINT",
|
|
1787
1787
|
"SIGHUP"
|
|
1788
1788
|
].forEach((signal) => {
|
|
1789
|
-
process$
|
|
1789
|
+
process$4.on(signal, () => {
|
|
1790
1790
|
if (proc$1.killed === false && proc$1.exitCode === null) proc$1.kill(signal);
|
|
1791
1791
|
});
|
|
1792
1792
|
});
|
|
1793
1793
|
const exitCallback = this._exitCallback;
|
|
1794
1794
|
proc$1.on("close", (code$1) => {
|
|
1795
1795
|
code$1 = code$1 ?? 1;
|
|
1796
|
-
if (!exitCallback) process$
|
|
1796
|
+
if (!exitCallback) process$4.exit(code$1);
|
|
1797
1797
|
else exitCallback(new CommanderError(code$1, "commander.executeSubCommandAsync", "(close)"));
|
|
1798
1798
|
});
|
|
1799
1799
|
proc$1.on("error", (err) => {
|
|
@@ -1805,7 +1805,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1805
1805
|
- ${executableDirMessage}`;
|
|
1806
1806
|
throw new Error(executableMissing);
|
|
1807
1807
|
} else if (err.code === "EACCES") throw new Error(`'${executableFile}' not executable`);
|
|
1808
|
-
if (!exitCallback) process$
|
|
1808
|
+
if (!exitCallback) process$4.exit(1);
|
|
1809
1809
|
else {
|
|
1810
1810
|
const wrappedError = new CommanderError(1, "commander.executeSubCommandAsync", "(error)");
|
|
1811
1811
|
wrappedError.nestedError = err;
|
|
@@ -2211,13 +2211,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2211
2211
|
*/
|
|
2212
2212
|
_parseOptionsEnv() {
|
|
2213
2213
|
this.options.forEach((option) => {
|
|
2214
|
-
if (option.envVar && option.envVar in process$
|
|
2214
|
+
if (option.envVar && option.envVar in process$4.env) {
|
|
2215
2215
|
const optionKey = option.attributeName();
|
|
2216
2216
|
if (this.getOptionValue(optionKey) === void 0 || [
|
|
2217
2217
|
"default",
|
|
2218
2218
|
"config",
|
|
2219
2219
|
"env"
|
|
2220
|
-
].includes(this.getOptionValueSource(optionKey))) if (option.required || option.optional) this.emit(`optionEnv:${option.name()}`, process$
|
|
2220
|
+
].includes(this.getOptionValueSource(optionKey))) if (option.required || option.optional) this.emit(`optionEnv:${option.name()}`, process$4.env[option.envVar]);
|
|
2221
2221
|
else this.emit(`optionEnv:${option.name()}`);
|
|
2222
2222
|
}
|
|
2223
2223
|
});
|
|
@@ -2596,7 +2596,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2596
2596
|
*/
|
|
2597
2597
|
help(contextOptions) {
|
|
2598
2598
|
this.outputHelp(contextOptions);
|
|
2599
|
-
let exitCode = process$
|
|
2599
|
+
let exitCode = process$4.exitCode || 0;
|
|
2600
2600
|
if (exitCode === 0 && contextOptions && typeof contextOptions !== "function" && contextOptions.error) exitCode = 1;
|
|
2601
2601
|
this._exit(exitCode, "commander.help", "(outputHelp)");
|
|
2602
2602
|
}
|
|
@@ -2712,16 +2712,16 @@ var require_src = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
2712
2712
|
const CSI = `${ESC}[`;
|
|
2713
2713
|
const beep = "\x07";
|
|
2714
2714
|
const cursor = {
|
|
2715
|
-
to(x$2, y$
|
|
2716
|
-
if (!y$
|
|
2717
|
-
return `${CSI}${y$
|
|
2715
|
+
to(x$2, y$1) {
|
|
2716
|
+
if (!y$1) return `${CSI}${x$2 + 1}G`;
|
|
2717
|
+
return `${CSI}${y$1 + 1};${x$2 + 1}H`;
|
|
2718
2718
|
},
|
|
2719
|
-
move(x$2, y$
|
|
2719
|
+
move(x$2, y$1) {
|
|
2720
2720
|
let ret = "";
|
|
2721
2721
|
if (x$2 < 0) ret += `${CSI}${-x$2}D`;
|
|
2722
2722
|
else if (x$2 > 0) ret += `${CSI}${x$2}C`;
|
|
2723
|
-
if (y$
|
|
2724
|
-
else if (y$
|
|
2723
|
+
if (y$1 < 0) ret += `${CSI}${-y$1}A`;
|
|
2724
|
+
else if (y$1 > 0) ret += `${CSI}${y$1}B`;
|
|
2725
2725
|
return ret;
|
|
2726
2726
|
},
|
|
2727
2727
|
up: (count$1 = 1) => `${CSI}${count$1}A`,
|
|
@@ -3031,13 +3031,13 @@ function rD() {
|
|
|
3031
3031
|
}
|
|
3032
3032
|
}), r;
|
|
3033
3033
|
}
|
|
3034
|
-
const ED = rD(), d$1 = new Set(["\x1B", ""]), oD = 39, y
|
|
3034
|
+
const ED = rD(), d$1 = new Set(["\x1B", ""]), oD = 39, y = "\x07", V$1 = "[", nD = "]", G$1 = "m", _$1 = `${nD}8;;`, z = (e$1) => `${d$1.values().next().value}${V$1}${e$1}${G$1}`, K$1 = (e$1) => `${d$1.values().next().value}${_$1}${e$1}${y}`, aD = (e$1) => e$1.split(" ").map((u$2) => p(u$2)), k$1 = (e$1, u$2, t) => {
|
|
3035
3035
|
const F$1 = [...u$2];
|
|
3036
3036
|
let s = !1, i$1 = !1, D$1 = p(P$1(e$1[e$1.length - 1]));
|
|
3037
3037
|
for (const [C$1, n$1] of F$1.entries()) {
|
|
3038
3038
|
const E = p(n$1);
|
|
3039
3039
|
if (D$1 + E <= t ? e$1[e$1.length - 1] += n$1 : (e$1.push(n$1), D$1 = 0), d$1.has(n$1) && (s = !0, i$1 = F$1.slice(C$1 + 1).join("").startsWith(_$1)), s) {
|
|
3040
|
-
i$1 ? n$1 === y
|
|
3040
|
+
i$1 ? n$1 === y && (s = !1, i$1 = !1) : n$1 === G$1 && (s = !1);
|
|
3041
3041
|
continue;
|
|
3042
3042
|
}
|
|
3043
3043
|
D$1 += E, D$1 === t && C$1 < F$1.length - 1 && (e$1.push(""), D$1 = 0);
|
|
@@ -3079,7 +3079,7 @@ const ED = rD(), d$1 = new Set(["\x1B", ""]), oD = 39, y$1 = "\x07", V$1 = "["
|
|
|
3079
3079
|
`)];
|
|
3080
3080
|
for (const [E, a$1] of n$1.entries()) {
|
|
3081
3081
|
if (F$1 += a$1, d$1.has(a$1)) {
|
|
3082
|
-
const { groups: c$1 } = (/* @__PURE__ */ new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y
|
|
3082
|
+
const { groups: c$1 } = (/* @__PURE__ */ new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y})`)).exec(n$1.slice(E).join("")) || { groups: {} };
|
|
3083
3083
|
if (c$1.code !== void 0) {
|
|
3084
3084
|
const f = Number.parseFloat(c$1.code);
|
|
3085
3085
|
s = f === oD ? void 0 : f;
|
|
@@ -3480,7 +3480,7 @@ var RD = class extends x$1 {
|
|
|
3480
3480
|
//#endregion
|
|
3481
3481
|
//#region node_modules/@clack/prompts/dist/index.mjs
|
|
3482
3482
|
function ce() {
|
|
3483
|
-
return
|
|
3483
|
+
return process$1.platform !== "win32" ? process$1.env.TERM !== "linux" : !!process$1.env.CI || !!process$1.env.WT_SESSION || !!process$1.env.TERMINUS_SUBLIME || process$1.env.ConEmuTask === "{cmd::Cmder}" || process$1.env.TERM_PROGRAM === "Terminus-Sublime" || process$1.env.TERM_PROGRAM === "vscode" || process$1.env.TERM === "xterm-256color" || process$1.env.TERM === "alacritty" || process$1.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
3484
3484
|
}
|
|
3485
3485
|
const V = ce(), u$1 = (t, n$1) => V ? t : n$1, le = u$1("◆", "*"), L = u$1("■", "x"), W = u$1("▲", "x"), C = u$1("◇", "o"), ue = u$1("┌", "T"), o$1 = u$1("│", "|"), d = u$1("└", "—"), k = u$1("●", ">"), P = u$1("○", " "), A = u$1("◻", "[•]"), T = u$1("◼", "[+]"), F = u$1("◻", "[ ]"), $e = u$1("▪", "•"), _ = u$1("─", "-"), me = u$1("╮", "+"), de = u$1("├", "+"), pe = u$1("╯", "+"), q = u$1("●", "•"), D = u$1("◆", "*"), U = u$1("▲", "!"), K = u$1("■", "x"), b = (t) => {
|
|
3486
3486
|
switch (t) {
|
|
@@ -6654,7 +6654,7 @@ function initializeContext(params) {
|
|
|
6654
6654
|
external: params?.external ?? void 0
|
|
6655
6655
|
};
|
|
6656
6656
|
}
|
|
6657
|
-
function process$
|
|
6657
|
+
function process$3(schema, ctx, _params = {
|
|
6658
6658
|
path: [],
|
|
6659
6659
|
schemaPath: []
|
|
6660
6660
|
}) {
|
|
@@ -6691,7 +6691,7 @@ function process$2(schema, ctx, _params = {
|
|
|
6691
6691
|
const parent = schema._zod.parent;
|
|
6692
6692
|
if (parent) {
|
|
6693
6693
|
if (!result.ref) result.ref = parent;
|
|
6694
|
-
process$
|
|
6694
|
+
process$3(parent, ctx, params);
|
|
6695
6695
|
ctx.seen.get(parent).isParent = true;
|
|
6696
6696
|
}
|
|
6697
6697
|
}
|
|
@@ -6903,7 +6903,7 @@ const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {
|
|
|
6903
6903
|
...params,
|
|
6904
6904
|
processors
|
|
6905
6905
|
});
|
|
6906
|
-
process$
|
|
6906
|
+
process$3(schema, ctx);
|
|
6907
6907
|
extractDefs(ctx, schema);
|
|
6908
6908
|
return finalize(ctx, schema);
|
|
6909
6909
|
};
|
|
@@ -6915,7 +6915,7 @@ const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params)
|
|
|
6915
6915
|
io,
|
|
6916
6916
|
processors
|
|
6917
6917
|
});
|
|
6918
|
-
process$
|
|
6918
|
+
process$3(schema, ctx);
|
|
6919
6919
|
extractDefs(ctx, schema);
|
|
6920
6920
|
return finalize(ctx, schema);
|
|
6921
6921
|
};
|
|
@@ -7002,7 +7002,7 @@ const arrayProcessor = (schema, ctx, _json, params) => {
|
|
|
7002
7002
|
if (typeof minimum === "number") json.minItems = minimum;
|
|
7003
7003
|
if (typeof maximum === "number") json.maxItems = maximum;
|
|
7004
7004
|
json.type = "array";
|
|
7005
|
-
json.items = process$
|
|
7005
|
+
json.items = process$3(def.element, ctx, {
|
|
7006
7006
|
...params,
|
|
7007
7007
|
path: [...params.path, "items"]
|
|
7008
7008
|
});
|
|
@@ -7013,7 +7013,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
|
|
|
7013
7013
|
json.type = "object";
|
|
7014
7014
|
json.properties = {};
|
|
7015
7015
|
const shape = def.shape;
|
|
7016
|
-
for (const key in shape) json.properties[key] = process$
|
|
7016
|
+
for (const key in shape) json.properties[key] = process$3(shape[key], ctx, {
|
|
7017
7017
|
...params,
|
|
7018
7018
|
path: [
|
|
7019
7019
|
...params.path,
|
|
@@ -7031,7 +7031,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
|
|
|
7031
7031
|
if (def.catchall?._zod.def.type === "never") json.additionalProperties = false;
|
|
7032
7032
|
else if (!def.catchall) {
|
|
7033
7033
|
if (ctx.io === "output") json.additionalProperties = false;
|
|
7034
|
-
} else if (def.catchall) json.additionalProperties = process$
|
|
7034
|
+
} else if (def.catchall) json.additionalProperties = process$3(def.catchall, ctx, {
|
|
7035
7035
|
...params,
|
|
7036
7036
|
path: [...params.path, "additionalProperties"]
|
|
7037
7037
|
});
|
|
@@ -7039,7 +7039,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
|
|
|
7039
7039
|
const unionProcessor = (schema, ctx, json, params) => {
|
|
7040
7040
|
const def = schema._zod.def;
|
|
7041
7041
|
const isExclusive = def.inclusive === false;
|
|
7042
|
-
const options = def.options.map((x$2, i$1) => process$
|
|
7042
|
+
const options = def.options.map((x$2, i$1) => process$3(x$2, ctx, {
|
|
7043
7043
|
...params,
|
|
7044
7044
|
path: [
|
|
7045
7045
|
...params.path,
|
|
@@ -7052,7 +7052,7 @@ const unionProcessor = (schema, ctx, json, params) => {
|
|
|
7052
7052
|
};
|
|
7053
7053
|
const intersectionProcessor = (schema, ctx, json, params) => {
|
|
7054
7054
|
const def = schema._zod.def;
|
|
7055
|
-
const a$1 = process$
|
|
7055
|
+
const a$1 = process$3(def.left, ctx, {
|
|
7056
7056
|
...params,
|
|
7057
7057
|
path: [
|
|
7058
7058
|
...params.path,
|
|
@@ -7060,7 +7060,7 @@ const intersectionProcessor = (schema, ctx, json, params) => {
|
|
|
7060
7060
|
0
|
|
7061
7061
|
]
|
|
7062
7062
|
});
|
|
7063
|
-
const b$2 = process$
|
|
7063
|
+
const b$2 = process$3(def.right, ctx, {
|
|
7064
7064
|
...params,
|
|
7065
7065
|
path: [
|
|
7066
7066
|
...params.path,
|
|
@@ -7077,7 +7077,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
|
|
|
7077
7077
|
json.type = "array";
|
|
7078
7078
|
const prefixPath$1 = ctx.target === "draft-2020-12" ? "prefixItems" : "items";
|
|
7079
7079
|
const restPath = ctx.target === "draft-2020-12" ? "items" : ctx.target === "openapi-3.0" ? "items" : "additionalItems";
|
|
7080
|
-
const prefixItems = def.items.map((x$2, i$1) => process$
|
|
7080
|
+
const prefixItems = def.items.map((x$2, i$1) => process$3(x$2, ctx, {
|
|
7081
7081
|
...params,
|
|
7082
7082
|
path: [
|
|
7083
7083
|
...params.path,
|
|
@@ -7085,7 +7085,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
|
|
|
7085
7085
|
i$1
|
|
7086
7086
|
]
|
|
7087
7087
|
}));
|
|
7088
|
-
const rest = def.rest ? process$
|
|
7088
|
+
const rest = def.rest ? process$3(def.rest, ctx, {
|
|
7089
7089
|
...params,
|
|
7090
7090
|
path: [
|
|
7091
7091
|
...params.path,
|
|
@@ -7111,7 +7111,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
|
|
|
7111
7111
|
};
|
|
7112
7112
|
const nullableProcessor = (schema, ctx, json, params) => {
|
|
7113
7113
|
const def = schema._zod.def;
|
|
7114
|
-
const inner = process$
|
|
7114
|
+
const inner = process$3(def.innerType, ctx, params);
|
|
7115
7115
|
const seen = ctx.seen.get(schema);
|
|
7116
7116
|
if (ctx.target === "openapi-3.0") {
|
|
7117
7117
|
seen.ref = def.innerType;
|
|
@@ -7120,27 +7120,27 @@ const nullableProcessor = (schema, ctx, json, params) => {
|
|
|
7120
7120
|
};
|
|
7121
7121
|
const nonoptionalProcessor = (schema, ctx, _json, params) => {
|
|
7122
7122
|
const def = schema._zod.def;
|
|
7123
|
-
process$
|
|
7123
|
+
process$3(def.innerType, ctx, params);
|
|
7124
7124
|
const seen = ctx.seen.get(schema);
|
|
7125
7125
|
seen.ref = def.innerType;
|
|
7126
7126
|
};
|
|
7127
7127
|
const defaultProcessor = (schema, ctx, json, params) => {
|
|
7128
7128
|
const def = schema._zod.def;
|
|
7129
|
-
process$
|
|
7129
|
+
process$3(def.innerType, ctx, params);
|
|
7130
7130
|
const seen = ctx.seen.get(schema);
|
|
7131
7131
|
seen.ref = def.innerType;
|
|
7132
7132
|
json.default = JSON.parse(JSON.stringify(def.defaultValue));
|
|
7133
7133
|
};
|
|
7134
7134
|
const prefaultProcessor = (schema, ctx, json, params) => {
|
|
7135
7135
|
const def = schema._zod.def;
|
|
7136
|
-
process$
|
|
7136
|
+
process$3(def.innerType, ctx, params);
|
|
7137
7137
|
const seen = ctx.seen.get(schema);
|
|
7138
7138
|
seen.ref = def.innerType;
|
|
7139
7139
|
if (ctx.io === "input") json._prefault = JSON.parse(JSON.stringify(def.defaultValue));
|
|
7140
7140
|
};
|
|
7141
7141
|
const catchProcessor = (schema, ctx, json, params) => {
|
|
7142
7142
|
const def = schema._zod.def;
|
|
7143
|
-
process$
|
|
7143
|
+
process$3(def.innerType, ctx, params);
|
|
7144
7144
|
const seen = ctx.seen.get(schema);
|
|
7145
7145
|
seen.ref = def.innerType;
|
|
7146
7146
|
let catchValue;
|
|
@@ -7154,20 +7154,20 @@ const catchProcessor = (schema, ctx, json, params) => {
|
|
|
7154
7154
|
const pipeProcessor = (schema, ctx, _json, params) => {
|
|
7155
7155
|
const def = schema._zod.def;
|
|
7156
7156
|
const innerType = ctx.io === "input" ? def.in._zod.def.type === "transform" ? def.out : def.in : def.out;
|
|
7157
|
-
process$
|
|
7157
|
+
process$3(innerType, ctx, params);
|
|
7158
7158
|
const seen = ctx.seen.get(schema);
|
|
7159
7159
|
seen.ref = innerType;
|
|
7160
7160
|
};
|
|
7161
7161
|
const readonlyProcessor = (schema, ctx, json, params) => {
|
|
7162
7162
|
const def = schema._zod.def;
|
|
7163
|
-
process$
|
|
7163
|
+
process$3(def.innerType, ctx, params);
|
|
7164
7164
|
const seen = ctx.seen.get(schema);
|
|
7165
7165
|
seen.ref = def.innerType;
|
|
7166
7166
|
json.readOnly = true;
|
|
7167
7167
|
};
|
|
7168
7168
|
const optionalProcessor = (schema, ctx, _json, params) => {
|
|
7169
7169
|
const def = schema._zod.def;
|
|
7170
|
-
process$
|
|
7170
|
+
process$3(def.innerType, ctx, params);
|
|
7171
7171
|
const seen = ctx.seen.get(schema);
|
|
7172
7172
|
seen.ref = def.innerType;
|
|
7173
7173
|
};
|
|
@@ -7900,6 +7900,19 @@ var AuthValidationError = class extends Error {
|
|
|
7900
7900
|
this.name = "AuthValidationError";
|
|
7901
7901
|
}
|
|
7902
7902
|
};
|
|
7903
|
+
var ConnectorApiError = class extends Error {
|
|
7904
|
+
constructor(message, cause) {
|
|
7905
|
+
super(message);
|
|
7906
|
+
this.cause = cause;
|
|
7907
|
+
this.name = "ConnectorApiError";
|
|
7908
|
+
}
|
|
7909
|
+
};
|
|
7910
|
+
var ConnectorValidationError = class extends Error {
|
|
7911
|
+
constructor(message) {
|
|
7912
|
+
super(message);
|
|
7913
|
+
this.name = "ConnectorValidationError";
|
|
7914
|
+
}
|
|
7915
|
+
};
|
|
7903
7916
|
|
|
7904
7917
|
//#endregion
|
|
7905
7918
|
//#region src/core/consts.ts
|
|
@@ -16193,7 +16206,7 @@ const createIgnorePredicate = (patterns, cwd, baseDir) => {
|
|
|
16193
16206
|
};
|
|
16194
16207
|
const normalizeOptions$2 = (options = {}) => {
|
|
16195
16208
|
const ignoreOption = options.ignore ? Array.isArray(options.ignore) ? options.ignore : [options.ignore] : [];
|
|
16196
|
-
const cwd = toPath$1(options.cwd) ??
|
|
16209
|
+
const cwd = toPath$1(options.cwd) ?? process$1.cwd();
|
|
16197
16210
|
const deep = typeof options.deep === "number" ? Math.max(0, options.deep) + 1 : Number.POSITIVE_INFINITY;
|
|
16198
16211
|
return {
|
|
16199
16212
|
cwd,
|
|
@@ -16290,7 +16303,7 @@ const getDirectoryGlob = ({ directoryPath, files, extensions }) => {
|
|
|
16290
16303
|
const extensionGlob = extensions?.length > 0 ? `.${extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0]}` : "";
|
|
16291
16304
|
return files ? files.map((file) => path.posix.join(directoryPath, `**/${path.extname(file) ? file : `${file}${extensionGlob}`}`)) : [path.posix.join(directoryPath, `**${extensionGlob ? `/*${extensionGlob}` : ""}`)];
|
|
16292
16305
|
};
|
|
16293
|
-
const directoryToGlob = async (directoryPaths, { cwd =
|
|
16306
|
+
const directoryToGlob = async (directoryPaths, { cwd = process$1.cwd(), files, extensions, fs: fsImplementation } = {}) => {
|
|
16294
16307
|
return (await Promise.all(directoryPaths.map(async (directoryPath) => {
|
|
16295
16308
|
if (shouldExpandGlobstarDirectory(isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath)) return getDirectoryGlob({
|
|
16296
16309
|
directoryPath,
|
|
@@ -16304,7 +16317,7 @@ const directoryToGlob = async (directoryPaths, { cwd = y.cwd(), files, extension
|
|
|
16304
16317
|
}) : directoryPath;
|
|
16305
16318
|
}))).flat();
|
|
16306
16319
|
};
|
|
16307
|
-
const directoryToGlobSync = (directoryPaths, { cwd =
|
|
16320
|
+
const directoryToGlobSync = (directoryPaths, { cwd = process$1.cwd(), files, extensions, fs: fsImplementation } = {}) => directoryPaths.flatMap((directoryPath) => {
|
|
16308
16321
|
if (shouldExpandGlobstarDirectory(isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath)) return getDirectoryGlob({
|
|
16309
16322
|
directoryPath,
|
|
16310
16323
|
files,
|
|
@@ -16400,7 +16413,7 @@ const applyIgnoreFilesAndGetFilterSync = (options) => {
|
|
|
16400
16413
|
};
|
|
16401
16414
|
const createFilterFunction = (isIgnored, cwd) => {
|
|
16402
16415
|
const seen = /* @__PURE__ */ new Set();
|
|
16403
|
-
const basePath = cwd ||
|
|
16416
|
+
const basePath = cwd || process$1.cwd();
|
|
16404
16417
|
const pathCache = /* @__PURE__ */ new Map();
|
|
16405
16418
|
return (fastGlobResult) => {
|
|
16406
16419
|
const pathKey$1 = path.normalize(fastGlobResult.path ?? fastGlobResult);
|
|
@@ -16706,12 +16719,6 @@ const ProjectConfigSchema = object({
|
|
|
16706
16719
|
});
|
|
16707
16720
|
const AppConfigSchema = object({ id: string().min(1, "id cannot be empty") });
|
|
16708
16721
|
const CreateProjectResponseSchema = looseObject({ id: string() });
|
|
16709
|
-
const AppSchema = looseObject({
|
|
16710
|
-
id: string(),
|
|
16711
|
-
name: string(),
|
|
16712
|
-
has_source_code: boolean()
|
|
16713
|
-
});
|
|
16714
|
-
const AppsResponseSchema = array(AppSchema);
|
|
16715
16722
|
|
|
16716
16723
|
//#endregion
|
|
16717
16724
|
//#region src/core/project/config.ts
|
|
@@ -16796,13 +16803,6 @@ async function createProject(projectName, description) {
|
|
|
16796
16803
|
} });
|
|
16797
16804
|
return { projectId: CreateProjectResponseSchema.parse(await response.json()).id };
|
|
16798
16805
|
}
|
|
16799
|
-
async function fetchApps() {
|
|
16800
|
-
const response = await base44Client.get("api/apps");
|
|
16801
|
-
return AppsResponseSchema.parse(await response.json());
|
|
16802
|
-
}
|
|
16803
|
-
async function fetchLinkableApps() {
|
|
16804
|
-
return (await fetchApps()).filter((app) => !app.has_source_code);
|
|
16805
|
-
}
|
|
16806
16806
|
|
|
16807
16807
|
//#endregion
|
|
16808
16808
|
//#region node_modules/ejs/lib/utils.js
|
|
@@ -30753,13 +30753,13 @@ var ansi_styles_default = ansiStyles;
|
|
|
30753
30753
|
|
|
30754
30754
|
//#endregion
|
|
30755
30755
|
//#region node_modules/chalk/source/vendor/supports-color/index.js
|
|
30756
|
-
function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args :
|
|
30756
|
+
function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process$1.argv) {
|
|
30757
30757
|
const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
|
|
30758
30758
|
const position = argv.indexOf(prefix + flag);
|
|
30759
30759
|
const terminatorPosition = argv.indexOf("--");
|
|
30760
30760
|
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
30761
30761
|
}
|
|
30762
|
-
const { env } =
|
|
30762
|
+
const { env } = process$1;
|
|
30763
30763
|
let flagForceColor;
|
|
30764
30764
|
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) flagForceColor = 0;
|
|
30765
30765
|
else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) flagForceColor = 1;
|
|
@@ -30792,7 +30792,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
|
|
|
30792
30792
|
if (haveStream && !streamIsTTY && forceColor === void 0) return 0;
|
|
30793
30793
|
const min = forceColor || 0;
|
|
30794
30794
|
if (env.TERM === "dumb") return min;
|
|
30795
|
-
if (
|
|
30795
|
+
if (process$1.platform === "win32") {
|
|
30796
30796
|
const osRelease = os.release().split(".");
|
|
30797
30797
|
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
30798
30798
|
return 1;
|
|
@@ -31005,7 +31005,10 @@ const theme = {
|
|
|
31005
31005
|
base44OrangeBackground: source_default.bgHex("#E86B3C"),
|
|
31006
31006
|
shinyOrange: source_default.hex("#FFD700"),
|
|
31007
31007
|
links: source_default.hex("#00D4FF"),
|
|
31008
|
-
white: source_default.white
|
|
31008
|
+
white: source_default.white,
|
|
31009
|
+
success: source_default.green,
|
|
31010
|
+
warning: source_default.yellow,
|
|
31011
|
+
error: source_default.red
|
|
31009
31012
|
},
|
|
31010
31013
|
styles: {
|
|
31011
31014
|
header: source_default.dim,
|
|
@@ -31531,9 +31534,9 @@ const getSubprocessResult = ({ stdout: stdout$1 }) => {
|
|
|
31531
31534
|
//#region node_modules/execa/lib/utils/standard-stream.js
|
|
31532
31535
|
const isStandardStream = (stream) => STANDARD_STREAMS.includes(stream);
|
|
31533
31536
|
const STANDARD_STREAMS = [
|
|
31534
|
-
|
|
31535
|
-
|
|
31536
|
-
|
|
31537
|
+
process$1.stdin,
|
|
31538
|
+
process$1.stdout,
|
|
31539
|
+
process$1.stderr
|
|
31537
31540
|
];
|
|
31538
31541
|
const STANDARD_STREAMS_ALIASES = [
|
|
31539
31542
|
"stdin",
|
|
@@ -31658,9 +31661,9 @@ const NO_ESCAPE_REGEXP = /^[\w./-]+$/;
|
|
|
31658
31661
|
//#endregion
|
|
31659
31662
|
//#region node_modules/is-unicode-supported/index.js
|
|
31660
31663
|
function isUnicodeSupported() {
|
|
31661
|
-
const { env: env$1 } =
|
|
31664
|
+
const { env: env$1 } = process$1;
|
|
31662
31665
|
const { TERM, TERM_PROGRAM } = env$1;
|
|
31663
|
-
if (
|
|
31666
|
+
if (process$1.platform !== "win32") return TERM !== "linux";
|
|
31664
31667
|
return Boolean(env$1.WT_SESSION) || Boolean(env$1.TERMINUS_SUBLIME) || env$1.ConEmuTask === "{cmd::Cmder}" || TERM_PROGRAM === "Terminus-Sublime" || TERM_PROGRAM === "vscode" || TERM === "xterm-256color" || TERM === "alacritty" || TERM === "rxvt-unicode" || TERM === "rxvt-unicode-256color" || env$1.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
31665
31668
|
}
|
|
31666
31669
|
|
|
@@ -32587,7 +32590,7 @@ const TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;
|
|
|
32587
32590
|
|
|
32588
32591
|
//#endregion
|
|
32589
32592
|
//#region node_modules/npm-run-path/index.js
|
|
32590
|
-
const npmRunPath = ({ cwd =
|
|
32593
|
+
const npmRunPath = ({ cwd = process$1.cwd(), path: pathOption = process$1.env[pathKey()], preferLocal = true, execPath: execPath$1 = process$1.execPath, addExecPath = true } = {}) => {
|
|
32591
32594
|
const cwdPath = path.resolve(toPath(cwd));
|
|
32592
32595
|
const result = [];
|
|
32593
32596
|
const pathParts = pathOption.split(path.delimiter);
|
|
@@ -32605,7 +32608,7 @@ const applyExecPath = (result, pathParts, execPath$1, cwdPath) => {
|
|
|
32605
32608
|
const pathPart = path.resolve(cwdPath, toPath(execPath$1), "..");
|
|
32606
32609
|
if (!pathParts.includes(pathPart)) result.push(pathPart);
|
|
32607
32610
|
};
|
|
32608
|
-
const npmRunPathEnv = ({ env: env$1 =
|
|
32611
|
+
const npmRunPathEnv = ({ env: env$1 = process$1.env, ...options } = {}) => {
|
|
32609
32612
|
env$1 = { ...env$1 };
|
|
32610
32613
|
const pathName = pathKey({ env: env$1 });
|
|
32611
32614
|
options.path = env$1[pathName];
|
|
@@ -33740,7 +33743,7 @@ const normalizeCwd = (cwd = getDefaultCwd()) => {
|
|
|
33740
33743
|
};
|
|
33741
33744
|
const getDefaultCwd = () => {
|
|
33742
33745
|
try {
|
|
33743
|
-
return
|
|
33746
|
+
return process$1.cwd();
|
|
33744
33747
|
} catch (error) {
|
|
33745
33748
|
error.message = `The current directory does not exist.\n${error.message}`;
|
|
33746
33749
|
throw error;
|
|
@@ -33775,7 +33778,7 @@ const normalizeOptions = (filePath, rawArguments, rawOptions) => {
|
|
|
33775
33778
|
options.killSignal = normalizeKillSignal(options.killSignal);
|
|
33776
33779
|
options.forceKillAfterDelay = normalizeForceKillAfterDelay(options.forceKillAfterDelay);
|
|
33777
33780
|
options.lines = options.lines.map((lines, fdNumber) => lines && !BINARY_ENCODINGS.has(options.encoding) && options.buffer[fdNumber]);
|
|
33778
|
-
if (
|
|
33781
|
+
if (process$1.platform === "win32" && path.basename(file, ".exe") === "cmd") commandArguments.unshift("/q");
|
|
33779
33782
|
return {
|
|
33780
33783
|
file,
|
|
33781
33784
|
commandArguments,
|
|
@@ -33802,7 +33805,7 @@ const addDefaultOptions = ({ extendEnv = true, preferLocal = false, cwd, localDi
|
|
|
33802
33805
|
});
|
|
33803
33806
|
const getEnv = ({ env: envOption, extendEnv, preferLocal, node, localDirectory, nodePath }) => {
|
|
33804
33807
|
const env$1 = extendEnv ? {
|
|
33805
|
-
...
|
|
33808
|
+
...process$1.env,
|
|
33806
33809
|
...envOption
|
|
33807
33810
|
} : envOption;
|
|
33808
33811
|
if (preferLocal || node) return npmRunPathEnv({
|
|
@@ -34802,12 +34805,12 @@ const guessStreamDirection = {
|
|
|
34802
34805
|
}
|
|
34803
34806
|
};
|
|
34804
34807
|
const getStandardStreamDirection = (value) => {
|
|
34805
|
-
if ([0,
|
|
34808
|
+
if ([0, process$1.stdin].includes(value)) return "input";
|
|
34806
34809
|
if ([
|
|
34807
34810
|
1,
|
|
34808
34811
|
2,
|
|
34809
|
-
|
|
34810
|
-
|
|
34812
|
+
process$1.stdout,
|
|
34813
|
+
process$1.stderr
|
|
34811
34814
|
].includes(value)) return "output";
|
|
34812
34815
|
};
|
|
34813
34816
|
const DEFAULT_DIRECTION = "output";
|
|
@@ -35871,9 +35874,9 @@ const addIpcMethods = (subprocess, { ipc }) => {
|
|
|
35871
35874
|
Object.assign(subprocess, getIpcMethods(subprocess, false, ipc));
|
|
35872
35875
|
};
|
|
35873
35876
|
const getIpcExport = () => {
|
|
35874
|
-
const anyProcess =
|
|
35877
|
+
const anyProcess = process$1;
|
|
35875
35878
|
const isSubprocess = true;
|
|
35876
|
-
const ipc =
|
|
35879
|
+
const ipc = process$1.channel !== void 0;
|
|
35877
35880
|
return {
|
|
35878
35881
|
...getIpcMethods(anyProcess, isSubprocess, ipc),
|
|
35879
35882
|
getCancelSignal: getCancelSignal$1.bind(void 0, {
|
|
@@ -36115,7 +36118,7 @@ if (process.platform === "linux") signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SI
|
|
|
36115
36118
|
|
|
36116
36119
|
//#endregion
|
|
36117
36120
|
//#region node_modules/signal-exit/dist/mjs/index.js
|
|
36118
|
-
const processOk = (process$
|
|
36121
|
+
const processOk = (process$5) => !!process$5 && typeof process$5 === "object" && typeof process$5.removeListener === "function" && typeof process$5.emit === "function" && typeof process$5.reallyExit === "function" && typeof process$5.listeners === "function" && typeof process$5.kill === "function" && typeof process$5.pid === "number" && typeof process$5.on === "function";
|
|
36119
36122
|
const kExitEmitter = Symbol.for("signal-exit emitter");
|
|
36120
36123
|
const global$1 = globalThis;
|
|
36121
36124
|
const ObjectDefineProperty = Object.defineProperty.bind(Object);
|
|
@@ -36183,7 +36186,7 @@ var SignalExitFallback = class extends SignalExitBase {
|
|
|
36183
36186
|
};
|
|
36184
36187
|
var SignalExit = class extends SignalExitBase {
|
|
36185
36188
|
/* c8 ignore start */
|
|
36186
|
-
#hupSig = process$
|
|
36189
|
+
#hupSig = process$2.platform === "win32" ? "SIGINT" : "SIGHUP";
|
|
36187
36190
|
/* c8 ignore stop */
|
|
36188
36191
|
#emitter = new Emitter();
|
|
36189
36192
|
#process;
|
|
@@ -36191,15 +36194,15 @@ var SignalExit = class extends SignalExitBase {
|
|
|
36191
36194
|
#originalProcessReallyExit;
|
|
36192
36195
|
#sigListeners = {};
|
|
36193
36196
|
#loaded = false;
|
|
36194
|
-
constructor(process$
|
|
36197
|
+
constructor(process$5) {
|
|
36195
36198
|
super();
|
|
36196
|
-
this.#process = process$
|
|
36199
|
+
this.#process = process$5;
|
|
36197
36200
|
this.#sigListeners = {};
|
|
36198
36201
|
for (const sig of signals) this.#sigListeners[sig] = () => {
|
|
36199
36202
|
const listeners = this.#process.listeners(sig);
|
|
36200
36203
|
let { count: count$1 } = this.#emitter;
|
|
36201
36204
|
/* c8 ignore start */
|
|
36202
|
-
const p$1 = process$
|
|
36205
|
+
const p$1 = process$5;
|
|
36203
36206
|
if (typeof p$1.__signal_exit_emitter__ === "object" && typeof p$1.__signal_exit_emitter__.count === "number") count$1 += p$1.__signal_exit_emitter__.count;
|
|
36204
36207
|
/* c8 ignore stop */
|
|
36205
36208
|
if (listeners.length === count$1) {
|
|
@@ -36207,11 +36210,11 @@ var SignalExit = class extends SignalExitBase {
|
|
|
36207
36210
|
const ret = this.#emitter.emit("exit", null, sig);
|
|
36208
36211
|
/* c8 ignore start */
|
|
36209
36212
|
const s = sig === "SIGHUP" ? this.#hupSig : sig;
|
|
36210
|
-
if (!ret) process$
|
|
36213
|
+
if (!ret) process$5.kill(process$5.pid, s);
|
|
36211
36214
|
}
|
|
36212
36215
|
};
|
|
36213
|
-
this.#originalProcessReallyExit = process$
|
|
36214
|
-
this.#originalProcessEmit = process$
|
|
36216
|
+
this.#originalProcessReallyExit = process$5.reallyExit;
|
|
36217
|
+
this.#originalProcessEmit = process$5.emit;
|
|
36215
36218
|
}
|
|
36216
36219
|
onExit(cb, opts) {
|
|
36217
36220
|
/* c8 ignore start */
|
|
@@ -36278,8 +36281,8 @@ var SignalExit = class extends SignalExitBase {
|
|
|
36278
36281
|
} else return og.call(this.#process, ev, ...args);
|
|
36279
36282
|
}
|
|
36280
36283
|
};
|
|
36281
|
-
const process$
|
|
36282
|
-
const { onExit, load, unload } = signalExitWrap(processOk(process$
|
|
36284
|
+
const process$2 = globalThis.process;
|
|
36285
|
+
const { onExit, load, unload } = signalExitWrap(processOk(process$2) ? new SignalExit(process$2) : new SignalExitFallback());
|
|
36283
36286
|
|
|
36284
36287
|
//#endregion
|
|
36285
36288
|
//#region node_modules/execa/lib/terminate/cleanup.js
|
|
@@ -38216,7 +38219,7 @@ function isInsideContainer() {
|
|
|
38216
38219
|
//#endregion
|
|
38217
38220
|
//#region node_modules/is-wsl/index.js
|
|
38218
38221
|
const isWsl = () => {
|
|
38219
|
-
if (
|
|
38222
|
+
if (process$1.platform !== "linux") return false;
|
|
38220
38223
|
if (os.release().toLowerCase().includes("microsoft")) {
|
|
38221
38224
|
if (isInsideContainer()) return false;
|
|
38222
38225
|
return true;
|
|
@@ -38227,12 +38230,12 @@ const isWsl = () => {
|
|
|
38227
38230
|
return false;
|
|
38228
38231
|
}
|
|
38229
38232
|
};
|
|
38230
|
-
var is_wsl_default =
|
|
38233
|
+
var is_wsl_default = process$1.env.__IS_WSL_TEST__ ? isWsl : isWsl();
|
|
38231
38234
|
|
|
38232
38235
|
//#endregion
|
|
38233
38236
|
//#region node_modules/powershell-utils/index.js
|
|
38234
38237
|
const execFile$2 = promisify(childProcess.execFile);
|
|
38235
|
-
const powerShellPath$1 = () => `${
|
|
38238
|
+
const powerShellPath$1 = () => `${process$1.env.SYSTEMROOT || process$1.env.windir || String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
|
|
38236
38239
|
const executePowerShell = async (command, options = {}) => {
|
|
38237
38240
|
const { powerShellPath: psPath, ...execFileOptions } = options;
|
|
38238
38241
|
const encodedCommand = executePowerShell.encodeCommand(command);
|
|
@@ -38343,7 +38346,7 @@ function defineLazyProperty(object$1, propertyName, valueGetter) {
|
|
|
38343
38346
|
//#region node_modules/default-browser-id/index.js
|
|
38344
38347
|
const execFileAsync$3 = promisify(execFile);
|
|
38345
38348
|
async function defaultBrowserId() {
|
|
38346
|
-
if (
|
|
38349
|
+
if (process$1.platform !== "darwin") throw new Error("macOS only");
|
|
38347
38350
|
const { stdout: stdout$1 } = await execFileAsync$3("defaults", [
|
|
38348
38351
|
"read",
|
|
38349
38352
|
"com.apple.LaunchServices/com.apple.launchservices.secure",
|
|
@@ -38358,7 +38361,7 @@ async function defaultBrowserId() {
|
|
|
38358
38361
|
//#region node_modules/run-applescript/index.js
|
|
38359
38362
|
const execFileAsync$2 = promisify(execFile);
|
|
38360
38363
|
async function runAppleScript(script, { humanReadableOutput = true, signal } = {}) {
|
|
38361
|
-
if (
|
|
38364
|
+
if (process$1.platform !== "darwin") throw new Error("macOS only");
|
|
38362
38365
|
const outputArguments = humanReadableOutput ? [] : ["-ss"];
|
|
38363
38366
|
const execOptions = {};
|
|
38364
38367
|
if (signal) execOptions.signal = signal;
|
|
@@ -38467,14 +38470,14 @@ async function defaultBrowser$1(_execFileAsync = execFileAsync$1) {
|
|
|
38467
38470
|
const execFileAsync = promisify(execFile);
|
|
38468
38471
|
const titleize = (string$2) => string$2.toLowerCase().replaceAll(/(?:^|\s|-)\S/g, (x$2) => x$2.toUpperCase());
|
|
38469
38472
|
async function defaultBrowser() {
|
|
38470
|
-
if (
|
|
38473
|
+
if (process$1.platform === "darwin") {
|
|
38471
38474
|
const id = await defaultBrowserId();
|
|
38472
38475
|
return {
|
|
38473
38476
|
name: await bundleName(id),
|
|
38474
38477
|
id
|
|
38475
38478
|
};
|
|
38476
38479
|
}
|
|
38477
|
-
if (
|
|
38480
|
+
if (process$1.platform === "linux") {
|
|
38478
38481
|
const { stdout: stdout$1 } = await execFileAsync("xdg-mime", [
|
|
38479
38482
|
"query",
|
|
38480
38483
|
"default",
|
|
@@ -38486,13 +38489,13 @@ async function defaultBrowser() {
|
|
|
38486
38489
|
id
|
|
38487
38490
|
};
|
|
38488
38491
|
}
|
|
38489
|
-
if (
|
|
38492
|
+
if (process$1.platform === "win32") return defaultBrowser$1();
|
|
38490
38493
|
throw new Error("Only macOS, Linux, and Windows are supported");
|
|
38491
38494
|
}
|
|
38492
38495
|
|
|
38493
38496
|
//#endregion
|
|
38494
38497
|
//#region node_modules/is-in-ssh/index.js
|
|
38495
|
-
const isInSsh = Boolean(
|
|
38498
|
+
const isInSsh = Boolean(process$1.env.SSH_CONNECTION || process$1.env.SSH_CLIENT || process$1.env.SSH_TTY);
|
|
38496
38499
|
var is_in_ssh_default = isInSsh;
|
|
38497
38500
|
|
|
38498
38501
|
//#endregion
|
|
@@ -38500,7 +38503,7 @@ var is_in_ssh_default = isInSsh;
|
|
|
38500
38503
|
const fallbackAttemptSymbol = Symbol("fallbackAttempt");
|
|
38501
38504
|
const __dirname = import.meta.url ? path.dirname(fileURLToPath(import.meta.url)) : "";
|
|
38502
38505
|
const localXdgOpenPath = path.join(__dirname, "xdg-open");
|
|
38503
|
-
const { platform: platform$1, arch } =
|
|
38506
|
+
const { platform: platform$1, arch } = process$1;
|
|
38504
38507
|
const tryEachApp = async (apps$1, opener) => {
|
|
38505
38508
|
if (apps$1.length === 0) return;
|
|
38506
38509
|
const errors = [];
|
|
@@ -38613,7 +38616,7 @@ const baseOpen = async (options) => {
|
|
|
38613
38616
|
await fs$1.access(localXdgOpenPath, constants$1.X_OK);
|
|
38614
38617
|
exeLocalXdgOpen = true;
|
|
38615
38618
|
} catch {}
|
|
38616
|
-
command =
|
|
38619
|
+
command = process$1.versions.electron ?? (platform$1 === "android" || isBundled || !exeLocalXdgOpen) ? "xdg-open" : localXdgOpenPath;
|
|
38617
38620
|
}
|
|
38618
38621
|
if (appArguments.length > 0) cliArguments.push(...appArguments);
|
|
38619
38622
|
if (!options.wait) {
|
|
@@ -38756,33 +38759,20 @@ const deployCommand = new Command("deploy").description("Deploy all project reso
|
|
|
38756
38759
|
//#endregion
|
|
38757
38760
|
//#region src/cli/commands/project/link.ts
|
|
38758
38761
|
function validateNonInteractiveFlags(command) {
|
|
38759
|
-
const { create: create$1,
|
|
38760
|
-
if (create$1 && existing) command.error("--create and --existing cannot be used together");
|
|
38762
|
+
const { create: create$1, name: name$1 } = command.opts();
|
|
38761
38763
|
if (create$1 && !name$1) command.error("--name is required when using --create");
|
|
38762
38764
|
}
|
|
38763
|
-
async function
|
|
38765
|
+
async function promptForProjectDetails() {
|
|
38764
38766
|
const actionOptions = [{
|
|
38765
38767
|
value: "create",
|
|
38766
38768
|
label: "Create a new project",
|
|
38767
38769
|
hint: "Create a new Base44 project and link it"
|
|
38768
38770
|
}];
|
|
38769
|
-
if (linkableApps.length > 0) actionOptions.push({
|
|
38770
|
-
value: "choose",
|
|
38771
|
-
label: "Link an existing project",
|
|
38772
|
-
hint: `Choose from ${linkableApps.length} available project${linkableApps.length === 1 ? "" : "s"}`
|
|
38773
|
-
});
|
|
38774
|
-
const action = await ve({
|
|
38775
|
-
message: "How would you like to link this project?",
|
|
38776
|
-
options: actionOptions
|
|
38777
|
-
});
|
|
38778
|
-
if (pD(action)) {
|
|
38779
|
-
xe("Operation cancelled.");
|
|
38780
|
-
process.exit(0);
|
|
38781
|
-
}
|
|
38782
|
-
return action;
|
|
38783
|
-
}
|
|
38784
|
-
async function promptForNewProjectDetails() {
|
|
38785
38771
|
const result = await Ce({
|
|
38772
|
+
action: () => ve({
|
|
38773
|
+
message: "How would you like to link this project?",
|
|
38774
|
+
options: actionOptions
|
|
38775
|
+
}),
|
|
38786
38776
|
name: () => {
|
|
38787
38777
|
return he({
|
|
38788
38778
|
message: "What is the name of your project?",
|
|
@@ -38802,63 +38792,14 @@ async function promptForNewProjectDetails() {
|
|
|
38802
38792
|
description: result.description ? result.description.trim() : void 0
|
|
38803
38793
|
};
|
|
38804
38794
|
}
|
|
38805
|
-
async function promptForExistingApp(linkableApps) {
|
|
38806
|
-
const selectedApp = await ve({
|
|
38807
|
-
message: "Choose a project to link",
|
|
38808
|
-
options: linkableApps.map((app) => ({
|
|
38809
|
-
value: app,
|
|
38810
|
-
label: app.name
|
|
38811
|
-
}))
|
|
38812
|
-
});
|
|
38813
|
-
if (pD(selectedApp)) {
|
|
38814
|
-
xe("Operation cancelled.");
|
|
38815
|
-
process.exit(0);
|
|
38816
|
-
}
|
|
38817
|
-
return selectedApp;
|
|
38818
|
-
}
|
|
38819
38795
|
async function link(options) {
|
|
38820
38796
|
const projectRoot = await findProjectRoot();
|
|
38821
38797
|
if (!projectRoot) throw new Error("No Base44 project found. Run this command from a project directory with a config.jsonc file.");
|
|
38822
38798
|
if (await appConfigExists(projectRoot.root)) throw new Error("Project is already linked. An .app.jsonc file with the appId already exists.");
|
|
38823
|
-
|
|
38824
|
-
|
|
38825
|
-
|
|
38826
|
-
|
|
38827
|
-
projectRoot: projectRoot.root
|
|
38828
|
-
});
|
|
38829
|
-
M.message(`${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(options.existing))}`);
|
|
38830
|
-
return { outroMessage: "Project linked" };
|
|
38831
|
-
}
|
|
38832
|
-
if (options.create) {
|
|
38833
|
-
const { projectId: projectId$1 } = await runTask("Creating project on Base44...", async () => {
|
|
38834
|
-
return await createProject(options.name.trim(), options.description?.trim());
|
|
38835
|
-
}, {
|
|
38836
|
-
successMessage: "Project created successfully",
|
|
38837
|
-
errorMessage: "Failed to create project"
|
|
38838
|
-
});
|
|
38839
|
-
await writeAppConfig(projectRoot.root, projectId$1);
|
|
38840
|
-
setAppConfig({
|
|
38841
|
-
id: projectId$1,
|
|
38842
|
-
projectRoot: projectRoot.root
|
|
38843
|
-
});
|
|
38844
|
-
M.message(`${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(projectId$1))}`);
|
|
38845
|
-
return { outroMessage: "Project linked" };
|
|
38846
|
-
}
|
|
38847
|
-
const linkableApps = await runTask("Fetching your projects...", async () => fetchLinkableApps(), {
|
|
38848
|
-
successMessage: `Found ${theme.colors.base44Orange("projects")} available for linking`,
|
|
38849
|
-
errorMessage: "Failed to fetch projects"
|
|
38850
|
-
});
|
|
38851
|
-
if (await promptForLinkAction(linkableApps) === "choose") {
|
|
38852
|
-
const selectedApp = await promptForExistingApp(linkableApps);
|
|
38853
|
-
await writeAppConfig(projectRoot.root, selectedApp.id);
|
|
38854
|
-
setAppConfig({
|
|
38855
|
-
id: selectedApp.id,
|
|
38856
|
-
projectRoot: projectRoot.root
|
|
38857
|
-
});
|
|
38858
|
-
M.message(`${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(selectedApp.id))}`);
|
|
38859
|
-
return { outroMessage: "Project linked" };
|
|
38860
|
-
}
|
|
38861
|
-
const { name: name$1, description } = await promptForNewProjectDetails();
|
|
38799
|
+
const { name: name$1, description } = options.create ? {
|
|
38800
|
+
name: options.name.trim(),
|
|
38801
|
+
description: options.description?.trim()
|
|
38802
|
+
} : await promptForProjectDetails();
|
|
38862
38803
|
const { projectId } = await runTask("Creating project on Base44...", async () => {
|
|
38863
38804
|
return await createProject(name$1, description);
|
|
38864
38805
|
}, {
|
|
@@ -38873,7 +38814,7 @@ async function link(options) {
|
|
|
38873
38814
|
M.message(`${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(projectId))}`);
|
|
38874
38815
|
return { outroMessage: "Project linked" };
|
|
38875
38816
|
}
|
|
38876
|
-
const linkCommand = new Command("link").description("Link a local project to a Base44 project").option("-c, --create", "Create a new project (skip selection prompt)").option("-
|
|
38817
|
+
const linkCommand = new Command("link").description("Link a local project to a Base44 project").option("-c, --create", "Create a new project (skip selection prompt)").option("-n, --name <name>", "Project name (required when --create is used)").option("-d, --description <description>", "Project description").hook("preAction", validateNonInteractiveFlags).action(async (options) => {
|
|
38877
38818
|
await runCommand(() => link(options), {
|
|
38878
38819
|
requireAuth: true,
|
|
38879
38820
|
requireAppConfig: false
|
|
@@ -38901,6 +38842,410 @@ const siteDeployCommand = new Command("site").description("Manage site deploymen
|
|
|
38901
38842
|
await runCommand(() => deployAction(options), { requireAuth: true });
|
|
38902
38843
|
}));
|
|
38903
38844
|
|
|
38845
|
+
//#endregion
|
|
38846
|
+
//#region src/core/connectors/schema.ts
|
|
38847
|
+
/**
|
|
38848
|
+
* Response from POST /api/apps/{app_id}/external-auth/initiate
|
|
38849
|
+
*/
|
|
38850
|
+
const InitiateResponseSchema = object({
|
|
38851
|
+
redirect_url: string().optional(),
|
|
38852
|
+
connection_id: string().optional(),
|
|
38853
|
+
already_authorized: boolean().optional(),
|
|
38854
|
+
other_user_email: string().optional(),
|
|
38855
|
+
error: string().optional()
|
|
38856
|
+
});
|
|
38857
|
+
/**
|
|
38858
|
+
* Response from GET /api/apps/{app_id}/external-auth/status
|
|
38859
|
+
*/
|
|
38860
|
+
const StatusResponseSchema = object({
|
|
38861
|
+
status: _enum([
|
|
38862
|
+
"ACTIVE",
|
|
38863
|
+
"PENDING",
|
|
38864
|
+
"FAILED"
|
|
38865
|
+
]),
|
|
38866
|
+
account_email: string().optional(),
|
|
38867
|
+
error: string().optional()
|
|
38868
|
+
}).transform((data) => ({
|
|
38869
|
+
status: data.status,
|
|
38870
|
+
accountEmail: data.account_email,
|
|
38871
|
+
error: data.error
|
|
38872
|
+
}));
|
|
38873
|
+
/**
|
|
38874
|
+
* A connected integration from the list endpoint
|
|
38875
|
+
*/
|
|
38876
|
+
const ConnectorSchema = object({
|
|
38877
|
+
integration_type: string(),
|
|
38878
|
+
status: string(),
|
|
38879
|
+
connected_at: string().optional(),
|
|
38880
|
+
account_info: object({
|
|
38881
|
+
email: string().optional(),
|
|
38882
|
+
name: string().optional()
|
|
38883
|
+
}).optional()
|
|
38884
|
+
}).transform((data) => ({
|
|
38885
|
+
integrationType: data.integration_type,
|
|
38886
|
+
status: data.status,
|
|
38887
|
+
connectedAt: data.connected_at,
|
|
38888
|
+
accountInfo: data.account_info
|
|
38889
|
+
}));
|
|
38890
|
+
/**
|
|
38891
|
+
* Response from GET /api/apps/{app_id}/external-auth/list
|
|
38892
|
+
*/
|
|
38893
|
+
const ListResponseSchema = object({ integrations: array(ConnectorSchema) });
|
|
38894
|
+
/**
|
|
38895
|
+
* Generic API error response
|
|
38896
|
+
*/
|
|
38897
|
+
const ApiErrorSchema = object({
|
|
38898
|
+
error: string(),
|
|
38899
|
+
detail: string().optional()
|
|
38900
|
+
});
|
|
38901
|
+
|
|
38902
|
+
//#endregion
|
|
38903
|
+
//#region src/core/connectors/api.ts
|
|
38904
|
+
/**
|
|
38905
|
+
* Initiates OAuth flow for a connector integration.
|
|
38906
|
+
* Returns a redirect URL to open in the browser.
|
|
38907
|
+
*/
|
|
38908
|
+
async function initiateOAuth(integrationType, scopes = null) {
|
|
38909
|
+
const response = await getAppClient().post("external-auth/initiate", {
|
|
38910
|
+
json: {
|
|
38911
|
+
integration_type: integrationType,
|
|
38912
|
+
scopes
|
|
38913
|
+
},
|
|
38914
|
+
throwHttpErrors: false
|
|
38915
|
+
});
|
|
38916
|
+
const json = await response.json();
|
|
38917
|
+
if (!response.ok) {
|
|
38918
|
+
const errorResult = ApiErrorSchema.safeParse(json);
|
|
38919
|
+
if (errorResult.success) throw new ConnectorApiError(errorResult.data.error);
|
|
38920
|
+
throw new ConnectorApiError(`Failed to initiate OAuth: ${response.status} ${response.statusText}`);
|
|
38921
|
+
}
|
|
38922
|
+
const result = InitiateResponseSchema.safeParse(json);
|
|
38923
|
+
if (!result.success) throw new ConnectorValidationError(`Invalid initiate response from server: ${result.error.message}`);
|
|
38924
|
+
return result.data;
|
|
38925
|
+
}
|
|
38926
|
+
/**
|
|
38927
|
+
* Checks the status of an OAuth connection attempt.
|
|
38928
|
+
*/
|
|
38929
|
+
async function checkOAuthStatus(integrationType, connectionId) {
|
|
38930
|
+
const response = await getAppClient().get("external-auth/status", {
|
|
38931
|
+
searchParams: {
|
|
38932
|
+
integration_type: integrationType,
|
|
38933
|
+
connection_id: connectionId
|
|
38934
|
+
},
|
|
38935
|
+
throwHttpErrors: false
|
|
38936
|
+
});
|
|
38937
|
+
const json = await response.json();
|
|
38938
|
+
if (!response.ok) {
|
|
38939
|
+
const errorResult = ApiErrorSchema.safeParse(json);
|
|
38940
|
+
if (errorResult.success) throw new ConnectorApiError(errorResult.data.error);
|
|
38941
|
+
throw new ConnectorApiError(`Failed to check OAuth status: ${response.status} ${response.statusText}`);
|
|
38942
|
+
}
|
|
38943
|
+
const result = StatusResponseSchema.safeParse(json);
|
|
38944
|
+
if (!result.success) throw new ConnectorValidationError(`Invalid status response from server: ${result.error.message}`);
|
|
38945
|
+
return result.data;
|
|
38946
|
+
}
|
|
38947
|
+
/**
|
|
38948
|
+
* Lists all connected integrations for the current app.
|
|
38949
|
+
*/
|
|
38950
|
+
async function listConnectors() {
|
|
38951
|
+
const response = await getAppClient().get("external-auth/list", { throwHttpErrors: false });
|
|
38952
|
+
const json = await response.json();
|
|
38953
|
+
if (!response.ok) {
|
|
38954
|
+
const errorResult = ApiErrorSchema.safeParse(json);
|
|
38955
|
+
if (errorResult.success) throw new ConnectorApiError(errorResult.data.error);
|
|
38956
|
+
throw new ConnectorApiError(`Failed to list connectors: ${response.status} ${response.statusText}`);
|
|
38957
|
+
}
|
|
38958
|
+
const result = ListResponseSchema.safeParse(json);
|
|
38959
|
+
if (!result.success) throw new ConnectorValidationError(`Invalid list response from server: ${result.error.message}`);
|
|
38960
|
+
return result.data.integrations;
|
|
38961
|
+
}
|
|
38962
|
+
/**
|
|
38963
|
+
* Disconnects (soft delete) a connector integration.
|
|
38964
|
+
*/
|
|
38965
|
+
async function disconnectConnector(integrationType) {
|
|
38966
|
+
const response = await getAppClient().delete(`external-auth/integrations/${integrationType}`, { throwHttpErrors: false });
|
|
38967
|
+
if (!response.ok) {
|
|
38968
|
+
const json = await response.json();
|
|
38969
|
+
const errorResult = ApiErrorSchema.safeParse(json);
|
|
38970
|
+
if (errorResult.success) throw new ConnectorApiError(errorResult.data.error);
|
|
38971
|
+
throw new ConnectorApiError(`Failed to disconnect connector: ${response.status} ${response.statusText}`);
|
|
38972
|
+
}
|
|
38973
|
+
}
|
|
38974
|
+
/**
|
|
38975
|
+
* Removes (hard delete) a connector integration.
|
|
38976
|
+
* This permanently removes the connector and cannot be undone.
|
|
38977
|
+
*/
|
|
38978
|
+
async function removeConnector(integrationType) {
|
|
38979
|
+
const response = await getAppClient().delete(`external-auth/integrations/${integrationType}/remove`, { throwHttpErrors: false });
|
|
38980
|
+
if (!response.ok) {
|
|
38981
|
+
const json = await response.json();
|
|
38982
|
+
const errorResult = ApiErrorSchema.safeParse(json);
|
|
38983
|
+
if (errorResult.success) throw new ConnectorApiError(errorResult.data.error);
|
|
38984
|
+
throw new ConnectorApiError(`Failed to remove connector: ${response.status} ${response.statusText}`);
|
|
38985
|
+
}
|
|
38986
|
+
}
|
|
38987
|
+
|
|
38988
|
+
//#endregion
|
|
38989
|
+
//#region src/core/connectors/constants.ts
|
|
38990
|
+
/**
|
|
38991
|
+
* Supported OAuth connector integrations.
|
|
38992
|
+
* Based on apper/backend/app/external_auth/models/constants.py
|
|
38993
|
+
*/
|
|
38994
|
+
const SUPPORTED_INTEGRATIONS = [
|
|
38995
|
+
"googlecalendar",
|
|
38996
|
+
"googledrive",
|
|
38997
|
+
"gmail",
|
|
38998
|
+
"googlesheets",
|
|
38999
|
+
"googledocs",
|
|
39000
|
+
"googleslides",
|
|
39001
|
+
"slack",
|
|
39002
|
+
"notion",
|
|
39003
|
+
"salesforce",
|
|
39004
|
+
"hubspot",
|
|
39005
|
+
"linkedin",
|
|
39006
|
+
"tiktok"
|
|
39007
|
+
];
|
|
39008
|
+
/**
|
|
39009
|
+
* Display names for integrations (for CLI output)
|
|
39010
|
+
*/
|
|
39011
|
+
const INTEGRATION_DISPLAY_NAMES = {
|
|
39012
|
+
googlecalendar: "Google Calendar",
|
|
39013
|
+
googledrive: "Google Drive",
|
|
39014
|
+
gmail: "Gmail",
|
|
39015
|
+
googlesheets: "Google Sheets",
|
|
39016
|
+
googledocs: "Google Docs",
|
|
39017
|
+
googleslides: "Google Slides",
|
|
39018
|
+
slack: "Slack",
|
|
39019
|
+
notion: "Notion",
|
|
39020
|
+
salesforce: "Salesforce",
|
|
39021
|
+
hubspot: "HubSpot",
|
|
39022
|
+
linkedin: "LinkedIn",
|
|
39023
|
+
tiktok: "TikTok"
|
|
39024
|
+
};
|
|
39025
|
+
function isValidIntegration(type) {
|
|
39026
|
+
return SUPPORTED_INTEGRATIONS.includes(type);
|
|
39027
|
+
}
|
|
39028
|
+
function getIntegrationDisplayName(type) {
|
|
39029
|
+
if (isValidIntegration(type)) return INTEGRATION_DISPLAY_NAMES[type];
|
|
39030
|
+
return type;
|
|
39031
|
+
}
|
|
39032
|
+
|
|
39033
|
+
//#endregion
|
|
39034
|
+
//#region src/cli/commands/connectors/add.ts
|
|
39035
|
+
const POLL_INTERVAL_MS = 2e3;
|
|
39036
|
+
const POLL_TIMEOUT_MS = 300 * 1e3;
|
|
39037
|
+
async function promptForIntegrationType() {
|
|
39038
|
+
const selected = await ve({
|
|
39039
|
+
message: "Select an integration to connect:",
|
|
39040
|
+
options: SUPPORTED_INTEGRATIONS.map((type) => ({
|
|
39041
|
+
value: type,
|
|
39042
|
+
label: getIntegrationDisplayName(type)
|
|
39043
|
+
}))
|
|
39044
|
+
});
|
|
39045
|
+
if (pD(selected)) return null;
|
|
39046
|
+
return selected;
|
|
39047
|
+
}
|
|
39048
|
+
async function waitForOAuthCompletion(integrationType, connectionId) {
|
|
39049
|
+
let accountEmail;
|
|
39050
|
+
let error;
|
|
39051
|
+
try {
|
|
39052
|
+
await runTask("Waiting for authorization...", async (updateMessage) => {
|
|
39053
|
+
await pWaitFor(async () => {
|
|
39054
|
+
const status = await checkOAuthStatus(integrationType, connectionId);
|
|
39055
|
+
if (status.status === "ACTIVE") {
|
|
39056
|
+
accountEmail = status.accountEmail;
|
|
39057
|
+
return true;
|
|
39058
|
+
}
|
|
39059
|
+
if (status.status === "FAILED") {
|
|
39060
|
+
error = status.error || "Authorization failed";
|
|
39061
|
+
throw new Error(error);
|
|
39062
|
+
}
|
|
39063
|
+
updateMessage("Waiting for authorization in browser...");
|
|
39064
|
+
return false;
|
|
39065
|
+
}, {
|
|
39066
|
+
interval: POLL_INTERVAL_MS,
|
|
39067
|
+
timeout: POLL_TIMEOUT_MS
|
|
39068
|
+
});
|
|
39069
|
+
}, {
|
|
39070
|
+
successMessage: "Authorization completed!",
|
|
39071
|
+
errorMessage: "Authorization failed"
|
|
39072
|
+
});
|
|
39073
|
+
return {
|
|
39074
|
+
success: true,
|
|
39075
|
+
accountEmail
|
|
39076
|
+
};
|
|
39077
|
+
} catch (err) {
|
|
39078
|
+
if (err instanceof Error && err.message.includes("timed out")) return {
|
|
39079
|
+
success: false,
|
|
39080
|
+
error: "Authorization timed out. Please try again."
|
|
39081
|
+
};
|
|
39082
|
+
return {
|
|
39083
|
+
success: false,
|
|
39084
|
+
error: error || (err instanceof Error ? err.message : "Unknown error")
|
|
39085
|
+
};
|
|
39086
|
+
}
|
|
39087
|
+
}
|
|
39088
|
+
async function addConnector(integrationType) {
|
|
39089
|
+
let selectedType;
|
|
39090
|
+
if (!integrationType) {
|
|
39091
|
+
const prompted = await promptForIntegrationType();
|
|
39092
|
+
if (!prompted) return { outroMessage: "Cancelled" };
|
|
39093
|
+
selectedType = prompted;
|
|
39094
|
+
} else {
|
|
39095
|
+
if (!isValidIntegration(integrationType)) {
|
|
39096
|
+
const supportedList = SUPPORTED_INTEGRATIONS.join(", ");
|
|
39097
|
+
throw new Error(`Unsupported connector: ${integrationType}\nSupported connectors: ${supportedList}`);
|
|
39098
|
+
}
|
|
39099
|
+
selectedType = integrationType;
|
|
39100
|
+
}
|
|
39101
|
+
const displayName = getIntegrationDisplayName(selectedType);
|
|
39102
|
+
const initiateResponse = await runTask(`Initiating ${displayName} connection...`, async () => {
|
|
39103
|
+
return await initiateOAuth(selectedType);
|
|
39104
|
+
}, {
|
|
39105
|
+
successMessage: `${displayName} OAuth initiated`,
|
|
39106
|
+
errorMessage: `Failed to initiate ${displayName} connection`
|
|
39107
|
+
});
|
|
39108
|
+
if (initiateResponse.already_authorized) return { outroMessage: `Already connected to ${theme.styles.bold(displayName)}` };
|
|
39109
|
+
if (initiateResponse.error === "different_user" && initiateResponse.other_user_email) throw new Error(`This app is already connected to ${displayName} by ${initiateResponse.other_user_email}`);
|
|
39110
|
+
if (!initiateResponse.redirect_url || !initiateResponse.connection_id) throw new Error("Invalid response from server: missing redirect URL or connection ID");
|
|
39111
|
+
M.info(`Opening browser for ${displayName} authorization...`);
|
|
39112
|
+
await open_default(initiateResponse.redirect_url);
|
|
39113
|
+
const result = await waitForOAuthCompletion(selectedType, initiateResponse.connection_id);
|
|
39114
|
+
if (!result.success) throw new Error(result.error || "Authorization failed");
|
|
39115
|
+
const accountInfo = result.accountEmail ? ` as ${theme.styles.bold(result.accountEmail)}` : "";
|
|
39116
|
+
return { outroMessage: `Successfully connected to ${theme.styles.bold(displayName)}${accountInfo}` };
|
|
39117
|
+
}
|
|
39118
|
+
const connectorsAddCommand = new Command("connectors:add").argument("[type]", "Integration type (e.g., slack, notion, googlecalendar)").description("Connect an OAuth integration").action(async (type) => {
|
|
39119
|
+
await runCommand(() => addConnector(type), {
|
|
39120
|
+
requireAuth: true,
|
|
39121
|
+
requireAppConfig: true
|
|
39122
|
+
});
|
|
39123
|
+
});
|
|
39124
|
+
|
|
39125
|
+
//#endregion
|
|
39126
|
+
//#region src/cli/commands/connectors/list.ts
|
|
39127
|
+
function formatDate(dateString) {
|
|
39128
|
+
if (!dateString) return "-";
|
|
39129
|
+
try {
|
|
39130
|
+
return new Date(dateString).toLocaleDateString("en-US", {
|
|
39131
|
+
year: "numeric",
|
|
39132
|
+
month: "short",
|
|
39133
|
+
day: "numeric"
|
|
39134
|
+
});
|
|
39135
|
+
} catch {
|
|
39136
|
+
return dateString;
|
|
39137
|
+
}
|
|
39138
|
+
}
|
|
39139
|
+
function formatStatus(status) {
|
|
39140
|
+
const normalized = status.toLowerCase();
|
|
39141
|
+
if (normalized === "active" || normalized === "connected") return theme.colors.success("● active");
|
|
39142
|
+
if (normalized === "expired") return theme.colors.warning("● expired");
|
|
39143
|
+
if (normalized === "failed" || normalized === "disconnected") return theme.colors.error("● disconnected");
|
|
39144
|
+
return status;
|
|
39145
|
+
}
|
|
39146
|
+
async function listConnectorsCommand() {
|
|
39147
|
+
const connectors = await runTask("Fetching connectors...", async () => {
|
|
39148
|
+
return await listConnectors();
|
|
39149
|
+
}, {
|
|
39150
|
+
successMessage: "Connectors loaded",
|
|
39151
|
+
errorMessage: "Failed to fetch connectors"
|
|
39152
|
+
});
|
|
39153
|
+
if (connectors.length === 0) {
|
|
39154
|
+
M.info("No connectors configured for this app.");
|
|
39155
|
+
M.info(`Run ${theme.styles.bold("base44 connectors:add")} to connect an integration.`);
|
|
39156
|
+
return { outroMessage: "" };
|
|
39157
|
+
}
|
|
39158
|
+
console.log();
|
|
39159
|
+
console.log(theme.styles.bold("Connected Integrations:"));
|
|
39160
|
+
console.log();
|
|
39161
|
+
const headers = [
|
|
39162
|
+
"Type",
|
|
39163
|
+
"Account",
|
|
39164
|
+
"Status",
|
|
39165
|
+
"Connected"
|
|
39166
|
+
];
|
|
39167
|
+
const colWidths = [
|
|
39168
|
+
20,
|
|
39169
|
+
30,
|
|
39170
|
+
15,
|
|
39171
|
+
15
|
|
39172
|
+
];
|
|
39173
|
+
const headerRow = headers.map((h$2, i$1) => h$2.padEnd(colWidths[i$1])).join(" ");
|
|
39174
|
+
console.log(theme.styles.dim(headerRow));
|
|
39175
|
+
console.log(theme.styles.dim("─".repeat(headerRow.length)));
|
|
39176
|
+
for (const connector of connectors) {
|
|
39177
|
+
const type = getIntegrationDisplayName(connector.integrationType).padEnd(colWidths[0]);
|
|
39178
|
+
const account = (connector.accountInfo?.email || connector.accountInfo?.name || "-").padEnd(colWidths[1]);
|
|
39179
|
+
const status = formatStatus(connector.status);
|
|
39180
|
+
const connected = formatDate(connector.connectedAt).padEnd(colWidths[3]);
|
|
39181
|
+
console.log(`${type} ${account} ${status.padEnd(colWidths[2] + 10)} ${connected}`);
|
|
39182
|
+
}
|
|
39183
|
+
console.log();
|
|
39184
|
+
return { outroMessage: `${connectors.length} connector${connectors.length === 1 ? "" : "s"} configured` };
|
|
39185
|
+
}
|
|
39186
|
+
const connectorsListCommand = new Command("connectors:list").description("List all connected OAuth integrations").action(async () => {
|
|
39187
|
+
await runCommand(listConnectorsCommand, {
|
|
39188
|
+
requireAuth: true,
|
|
39189
|
+
requireAppConfig: true
|
|
39190
|
+
});
|
|
39191
|
+
});
|
|
39192
|
+
|
|
39193
|
+
//#endregion
|
|
39194
|
+
//#region src/cli/commands/connectors/remove.ts
|
|
39195
|
+
async function promptForConnectorToRemove(connectors) {
|
|
39196
|
+
const selected = await ve({
|
|
39197
|
+
message: "Select a connector to remove:",
|
|
39198
|
+
options: connectors.map((c$1) => ({
|
|
39199
|
+
value: c$1.integrationType,
|
|
39200
|
+
label: `${getIntegrationDisplayName(c$1.integrationType)}${c$1.accountInfo?.email ? ` (${c$1.accountInfo.email})` : ""}`
|
|
39201
|
+
}))
|
|
39202
|
+
});
|
|
39203
|
+
if (pD(selected)) return null;
|
|
39204
|
+
return selected;
|
|
39205
|
+
}
|
|
39206
|
+
async function removeConnectorCommand(integrationType, options = {}) {
|
|
39207
|
+
const isHardDelete = options.hard === true;
|
|
39208
|
+
const connectors = await runTask("Fetching connectors...", async () => {
|
|
39209
|
+
return await listConnectors();
|
|
39210
|
+
}, {
|
|
39211
|
+
successMessage: "Connectors loaded",
|
|
39212
|
+
errorMessage: "Failed to fetch connectors"
|
|
39213
|
+
});
|
|
39214
|
+
if (connectors.length === 0) return { outroMessage: "No connectors to remove" };
|
|
39215
|
+
let selectedType;
|
|
39216
|
+
if (!integrationType) {
|
|
39217
|
+
const prompted = await promptForConnectorToRemove(connectors);
|
|
39218
|
+
if (!prompted) return { outroMessage: "Cancelled" };
|
|
39219
|
+
selectedType = prompted;
|
|
39220
|
+
} else {
|
|
39221
|
+
if (!isValidIntegration(integrationType)) throw new Error(`Invalid connector type: ${integrationType}`);
|
|
39222
|
+
if (!connectors.some((c$1) => c$1.integrationType === integrationType)) throw new Error(`No ${getIntegrationDisplayName(integrationType)} connector found for this app`);
|
|
39223
|
+
selectedType = integrationType;
|
|
39224
|
+
}
|
|
39225
|
+
const displayName = getIntegrationDisplayName(selectedType);
|
|
39226
|
+
const connector = connectors.find((c$1) => c$1.integrationType === selectedType);
|
|
39227
|
+
const accountInfo = connector?.accountInfo?.email ? ` (${connector.accountInfo.email})` : "";
|
|
39228
|
+
const shouldRemove = await ye({
|
|
39229
|
+
message: `${isHardDelete ? "Permanently remove" : "Disconnect"} ${displayName}${accountInfo}?`,
|
|
39230
|
+
initialValue: false
|
|
39231
|
+
});
|
|
39232
|
+
if (pD(shouldRemove) || !shouldRemove) return { outroMessage: "Cancelled" };
|
|
39233
|
+
await runTask(isHardDelete ? `Removing ${displayName}...` : `Disconnecting ${displayName}...`, async () => {
|
|
39234
|
+
if (isHardDelete) await removeConnector(selectedType);
|
|
39235
|
+
else await disconnectConnector(selectedType);
|
|
39236
|
+
}, {
|
|
39237
|
+
successMessage: isHardDelete ? `${displayName} removed` : `${displayName} disconnected`,
|
|
39238
|
+
errorMessage: isHardDelete ? `Failed to remove ${displayName}` : `Failed to disconnect ${displayName}`
|
|
39239
|
+
});
|
|
39240
|
+
return { outroMessage: `Successfully ${isHardDelete ? "removed" : "disconnected"} ${theme.styles.bold(displayName)}` };
|
|
39241
|
+
}
|
|
39242
|
+
const connectorsRemoveCommand = new Command("connectors:remove").argument("[type]", "Integration type to remove (e.g., slack, notion)").option("--hard", "Permanently remove the connector (cannot be undone)").description("Disconnect an OAuth integration").action(async (type, options) => {
|
|
39243
|
+
await runCommand(() => removeConnectorCommand(type, options), {
|
|
39244
|
+
requireAuth: true,
|
|
39245
|
+
requireAppConfig: true
|
|
39246
|
+
});
|
|
39247
|
+
});
|
|
39248
|
+
|
|
38904
39249
|
//#endregion
|
|
38905
39250
|
//#region package.json
|
|
38906
39251
|
var version = "0.0.15";
|
|
@@ -38920,6 +39265,9 @@ program.addCommand(linkCommand);
|
|
|
38920
39265
|
program.addCommand(entitiesPushCommand);
|
|
38921
39266
|
program.addCommand(functionsDeployCommand);
|
|
38922
39267
|
program.addCommand(siteDeployCommand);
|
|
39268
|
+
program.addCommand(connectorsAddCommand);
|
|
39269
|
+
program.addCommand(connectorsListCommand);
|
|
39270
|
+
program.addCommand(connectorsRemoveCommand);
|
|
38923
39271
|
program.parse();
|
|
38924
39272
|
|
|
38925
39273
|
//#endregion
|
package/package.json
CHANGED