@base44-preview/cli 0.1.32-pr.662.e04bb64 → 0.1.32-pr.663.1a6cb8e
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 +4 -0
- package/dist/cli/index.js +2122 -218
- package/dist/cli/index.js.map +28 -11
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -31177,7 +31177,7 @@ function cleanDoc(doc) {
|
|
|
31177
31177
|
return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
|
|
31178
31178
|
}
|
|
31179
31179
|
function replaceEndOfLine(doc, replacement = literalline) {
|
|
31180
|
-
return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ?
|
|
31180
|
+
return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join31(replacement, currentDoc.split(`
|
|
31181
31181
|
`)) : currentDoc);
|
|
31182
31182
|
}
|
|
31183
31183
|
function canBreakFn(doc) {
|
|
@@ -31257,7 +31257,7 @@ function indentIfBreak(contents, options) {
|
|
|
31257
31257
|
negate: options.negate
|
|
31258
31258
|
};
|
|
31259
31259
|
}
|
|
31260
|
-
function
|
|
31260
|
+
function join31(separator, docs) {
|
|
31261
31261
|
assertDoc(separator);
|
|
31262
31262
|
assertDocArray(docs);
|
|
31263
31263
|
const parts = [];
|
|
@@ -31968,7 +31968,7 @@ var init_doc = __esm(() => {
|
|
|
31968
31968
|
MODE_FLAT = Symbol("MODE_FLAT");
|
|
31969
31969
|
DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
|
|
31970
31970
|
builders = {
|
|
31971
|
-
join:
|
|
31971
|
+
join: join31,
|
|
31972
31972
|
line,
|
|
31973
31973
|
softline,
|
|
31974
31974
|
hardline,
|
|
@@ -39570,9 +39570,9 @@ function tm(e, t, r) {
|
|
|
39570
39570
|
return l(["<", r("name"), r("typeArguments"), " ", ...e.map(r, "attributes"), n.selfClosing ? " />" : ">"]);
|
|
39571
39571
|
let i = n.attributes?.some((u) => V3(u.value) && u.value.value.includes(`
|
|
39572
39572
|
`)), o = t.singleAttributePerLine && n.attributes.length > 1 ? E : A;
|
|
39573
|
-
return l(["<", r("name"), r("typeArguments"), m(e.map(() => [o, r()], "attributes")), ...
|
|
39573
|
+
return l(["<", r("name"), r("typeArguments"), m(e.map(() => [o, r()], "attributes")), ...rm3(n, t, s)], { shouldBreak: i });
|
|
39574
39574
|
}
|
|
39575
|
-
function
|
|
39575
|
+
function rm3(e, t, r) {
|
|
39576
39576
|
return e.selfClosing ? [A, "/>"] : nm(e, t, r) ? [">"] : [f, ">"];
|
|
39577
39577
|
}
|
|
39578
39578
|
function nm(e, t, r) {
|
|
@@ -111521,7 +111521,7 @@ function N62(e) {
|
|
|
111521
111521
|
function nm2(e, t, a) {
|
|
111522
111522
|
return ie10(t, a, e.typeParameters) || ie10(t, a, e.parameters) || S7(t, e.type);
|
|
111523
111523
|
}
|
|
111524
|
-
function
|
|
111524
|
+
function rm4(e, t, a) {
|
|
111525
111525
|
return ie10(t, a, e.types);
|
|
111526
111526
|
}
|
|
111527
111527
|
function im2(e, t, a) {
|
|
@@ -114489,7 +114489,7 @@ ${Me.join(`
|
|
|
114489
114489
|
return S7(a, t.elementType);
|
|
114490
114490
|
}, 190: function(t, a, _) {
|
|
114491
114491
|
return ie10(a, _, t.elements);
|
|
114492
|
-
}, 193:
|
|
114492
|
+
}, 193: rm4, 194: rm4, 195: function(t, a, _) {
|
|
114493
114493
|
return S7(a, t.checkType) || S7(a, t.extendsType) || S7(a, t.trueType) || S7(a, t.falseType);
|
|
114494
114494
|
}, 196: function(t, a, _) {
|
|
114495
114495
|
return S7(a, t.typeParameter);
|
|
@@ -119123,7 +119123,7 @@ import url22 from "url";
|
|
|
119123
119123
|
function diffLines(oldStr, newStr, options8) {
|
|
119124
119124
|
return lineDiff.diff(oldStr, newStr, options8);
|
|
119125
119125
|
}
|
|
119126
|
-
function
|
|
119126
|
+
function tokenize2(value, options8) {
|
|
119127
119127
|
if (options8.stripTrailingCr) {
|
|
119128
119128
|
value = value.replace(/\r\n/g, `
|
|
119129
119129
|
`);
|
|
@@ -120053,7 +120053,7 @@ function highlight(text) {
|
|
|
120053
120053
|
for (const {
|
|
120054
120054
|
type,
|
|
120055
120055
|
value
|
|
120056
|
-
} of
|
|
120056
|
+
} of tokenize22(text)) {
|
|
120057
120057
|
if (type in defs) {
|
|
120058
120058
|
highlighted += value.split(NEWLINE$1).map((str) => defs[type](str)).join(`
|
|
120059
120059
|
`);
|
|
@@ -124581,7 +124581,7 @@ var require2, __filename2, __dirname3, __create2, __defProp3, __getOwnPropDesc2,
|
|
|
124581
124581
|
return internalize({ "": root }, "", reviver);
|
|
124582
124582
|
}
|
|
124583
124583
|
return root;
|
|
124584
|
-
}, lexState, buffer, doubleQuote, sign, c7, lexStates, parseStates, dist_default, import_picocolors4, import_js_tokens, nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-Ა-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ--ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ", nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ--ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・", nonASCIIidentifierStart, nonASCIIidentifier, reservedWords, keywords, reservedWordsStrictSet, reservedWordsStrictBindSet, compose = (f, g) => (v) => f(g(v)), defsOn, defsOff, sometimesKeywords, NEWLINE$1, BRACKET,
|
|
124584
|
+
}, lexState, buffer, doubleQuote, sign, c7, lexStates, parseStates, dist_default, import_picocolors4, import_js_tokens, nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-Ა-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ--ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ", nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ--ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・", nonASCIIidentifierStart, nonASCIIidentifier, reservedWords, keywords, reservedWordsStrictSet, reservedWordsStrictBindSet, compose = (f, g) => (v) => f(g(v)), defsOn, defsOff, sometimesKeywords, NEWLINE$1, BRACKET, tokenize22, NEWLINE, getOffsets = ({
|
|
124585
124585
|
oneBased,
|
|
124586
124586
|
oneBasedLine = oneBased,
|
|
124587
124587
|
oneBasedColumn = oneBased
|
|
@@ -124807,7 +124807,7 @@ var require2, __filename2, __dirname3, __create2, __defProp3, __getOwnPropDesc2,
|
|
|
124807
124807
|
}
|
|
124808
124808
|
}
|
|
124809
124809
|
}, ast_path_default, is_object_default, skipWhitespace, skipSpaces, skipToLineEnd, skipEverythingButNewLine, isNewlineCharacter = (character) => character === `
|
|
124810
|
-
` || character === "\r" || character === "\u2028" || character === "\u2029", skip_newline_default, has_newline_default, is_non_empty_array_default, get_sorted_child_nodes_default, childNodesCache, returnFalse = () => false, isAllEmptyAndNoLineBreak = (text) => !/[\S\n\u2028\u2029]/u.test(text), is_previous_line_empty_default, breakParent2, hardline2, indent2,
|
|
124810
|
+
` || character === "\r" || character === "\u2028" || character === "\u2029", skip_newline_default, has_newline_default, is_non_empty_array_default, get_sorted_child_nodes_default, childNodesCache, returnFalse = () => false, isAllEmptyAndNoLineBreak = (text) => !/[\S\n\u2028\u2029]/u.test(text), is_previous_line_empty_default, breakParent2, hardline2, indent2, join33, line22, lineSuffix2, create_print_pre_check_function_default = () => noop_default2, core_options_evaluate_default, arrayToReversed, toReversed, method_to_reversed_default, import_n_readlines, get_interpreter_default, getFileBasename = (file) => {
|
|
124811
124811
|
try {
|
|
124812
124812
|
return path112.basename(toPath3(file));
|
|
124813
124813
|
} catch {
|
|
@@ -133471,7 +133471,7 @@ globstar while`, file, fr, pattern, pr, swallowee);
|
|
|
133471
133471
|
LineDiff = class extends Diff {
|
|
133472
133472
|
constructor() {
|
|
133473
133473
|
super(...arguments);
|
|
133474
|
-
this.tokenize =
|
|
133474
|
+
this.tokenize = tokenize2;
|
|
133475
133475
|
}
|
|
133476
133476
|
equals(left, right, options8) {
|
|
133477
133477
|
if (options8.ignoreWhitespace) {
|
|
@@ -134348,7 +134348,7 @@ globstar while`, file, fr, pattern, pr, swallowee);
|
|
|
134348
134348
|
return "uncolored";
|
|
134349
134349
|
}
|
|
134350
134350
|
};
|
|
134351
|
-
|
|
134351
|
+
tokenize22 = function* (text) {
|
|
134352
134352
|
for (const token2 of (0, import_js_tokens.default)(text, {
|
|
134353
134353
|
jsx: true
|
|
134354
134354
|
})) {
|
|
@@ -134836,7 +134836,7 @@ ${codeblock}`, options8);
|
|
|
134836
134836
|
breakParent: breakParent2,
|
|
134837
134837
|
hardline: hardline2,
|
|
134838
134838
|
indent: indent2,
|
|
134839
|
-
join:
|
|
134839
|
+
join: join33,
|
|
134840
134840
|
line: line22,
|
|
134841
134841
|
lineSuffix: lineSuffix2
|
|
134842
134842
|
} = builders);
|
|
@@ -228838,7 +228838,7 @@ function normalizeBase44Env() {
|
|
|
228838
228838
|
loadProjectEnvFiles();
|
|
228839
228839
|
|
|
228840
228840
|
// src/cli/index.ts
|
|
228841
|
-
import { dirname as dirname29, join as
|
|
228841
|
+
import { dirname as dirname29, join as join41 } from "node:path";
|
|
228842
228842
|
import { fileURLToPath as fileURLToPath7 } from "node:url";
|
|
228843
228843
|
|
|
228844
228844
|
// ../../node_modules/@clack/core/dist/index.mjs
|
|
@@ -239451,6 +239451,7 @@ var package_default = {
|
|
|
239451
239451
|
jsonwebtoken: "^9.0.3",
|
|
239452
239452
|
ky: "^1.14.2",
|
|
239453
239453
|
lodash: "^4.17.23",
|
|
239454
|
+
minisearch: "^7.1.2",
|
|
239454
239455
|
ms: "^2.1.3",
|
|
239455
239456
|
multer: "^2.0.0",
|
|
239456
239457
|
nanoid: "^5.1.6",
|
|
@@ -247586,8 +247587,8 @@ function normalizeDatetime(value) {
|
|
|
247586
247587
|
return `${value}Z`;
|
|
247587
247588
|
}
|
|
247588
247589
|
// src/cli/utils/json.ts
|
|
247589
|
-
function toJsonStdout(result) {
|
|
247590
|
-
return `${JSON.stringify(result, null, 2)}
|
|
247590
|
+
function toJsonStdout(result, options = {}) {
|
|
247591
|
+
return `${JSON.stringify(result, null, options.compact ? undefined : 2)}
|
|
247591
247592
|
`;
|
|
247592
247593
|
}
|
|
247593
247594
|
// src/cli/errors.ts
|
|
@@ -248041,13 +248042,1873 @@ function getAgentsCommand() {
|
|
|
248041
248042
|
return new Command2("agents").description("Manage project agents").addCommand(getAgentsPushCommand()).addCommand(getAgentsPullCommand());
|
|
248042
248043
|
}
|
|
248043
248044
|
|
|
248045
|
+
// ../../node_modules/minisearch/dist/es/index.js
|
|
248046
|
+
var ENTRIES = "ENTRIES";
|
|
248047
|
+
var KEYS = "KEYS";
|
|
248048
|
+
var VALUES = "VALUES";
|
|
248049
|
+
var LEAF = "";
|
|
248050
|
+
|
|
248051
|
+
class TreeIterator {
|
|
248052
|
+
constructor(set, type) {
|
|
248053
|
+
const node = set._tree;
|
|
248054
|
+
const keys = Array.from(node.keys());
|
|
248055
|
+
this.set = set;
|
|
248056
|
+
this._type = type;
|
|
248057
|
+
this._path = keys.length > 0 ? [{ node, keys }] : [];
|
|
248058
|
+
}
|
|
248059
|
+
next() {
|
|
248060
|
+
const value = this.dive();
|
|
248061
|
+
this.backtrack();
|
|
248062
|
+
return value;
|
|
248063
|
+
}
|
|
248064
|
+
dive() {
|
|
248065
|
+
if (this._path.length === 0) {
|
|
248066
|
+
return { done: true, value: undefined };
|
|
248067
|
+
}
|
|
248068
|
+
const { node, keys } = last$1(this._path);
|
|
248069
|
+
if (last$1(keys) === LEAF) {
|
|
248070
|
+
return { done: false, value: this.result() };
|
|
248071
|
+
}
|
|
248072
|
+
const child = node.get(last$1(keys));
|
|
248073
|
+
this._path.push({ node: child, keys: Array.from(child.keys()) });
|
|
248074
|
+
return this.dive();
|
|
248075
|
+
}
|
|
248076
|
+
backtrack() {
|
|
248077
|
+
if (this._path.length === 0) {
|
|
248078
|
+
return;
|
|
248079
|
+
}
|
|
248080
|
+
const keys = last$1(this._path).keys;
|
|
248081
|
+
keys.pop();
|
|
248082
|
+
if (keys.length > 0) {
|
|
248083
|
+
return;
|
|
248084
|
+
}
|
|
248085
|
+
this._path.pop();
|
|
248086
|
+
this.backtrack();
|
|
248087
|
+
}
|
|
248088
|
+
key() {
|
|
248089
|
+
return this.set._prefix + this._path.map(({ keys }) => last$1(keys)).filter((key) => key !== LEAF).join("");
|
|
248090
|
+
}
|
|
248091
|
+
value() {
|
|
248092
|
+
return last$1(this._path).node.get(LEAF);
|
|
248093
|
+
}
|
|
248094
|
+
result() {
|
|
248095
|
+
switch (this._type) {
|
|
248096
|
+
case VALUES:
|
|
248097
|
+
return this.value();
|
|
248098
|
+
case KEYS:
|
|
248099
|
+
return this.key();
|
|
248100
|
+
default:
|
|
248101
|
+
return [this.key(), this.value()];
|
|
248102
|
+
}
|
|
248103
|
+
}
|
|
248104
|
+
[Symbol.iterator]() {
|
|
248105
|
+
return this;
|
|
248106
|
+
}
|
|
248107
|
+
}
|
|
248108
|
+
var last$1 = (array) => {
|
|
248109
|
+
return array[array.length - 1];
|
|
248110
|
+
};
|
|
248111
|
+
var fuzzySearch = (node, query, maxDistance) => {
|
|
248112
|
+
const results = new Map;
|
|
248113
|
+
if (query === undefined)
|
|
248114
|
+
return results;
|
|
248115
|
+
const n = query.length + 1;
|
|
248116
|
+
const m = n + maxDistance;
|
|
248117
|
+
const matrix = new Uint8Array(m * n).fill(maxDistance + 1);
|
|
248118
|
+
for (let j = 0;j < n; ++j)
|
|
248119
|
+
matrix[j] = j;
|
|
248120
|
+
for (let i = 1;i < m; ++i)
|
|
248121
|
+
matrix[i * n] = i;
|
|
248122
|
+
recurse(node, query, maxDistance, results, matrix, 1, n, "");
|
|
248123
|
+
return results;
|
|
248124
|
+
};
|
|
248125
|
+
var recurse = (node, query, maxDistance, results, matrix, m, n, prefix) => {
|
|
248126
|
+
const offset = m * n;
|
|
248127
|
+
key:
|
|
248128
|
+
for (const key of node.keys()) {
|
|
248129
|
+
if (key === LEAF) {
|
|
248130
|
+
const distance = matrix[offset - 1];
|
|
248131
|
+
if (distance <= maxDistance) {
|
|
248132
|
+
results.set(prefix, [node.get(key), distance]);
|
|
248133
|
+
}
|
|
248134
|
+
} else {
|
|
248135
|
+
let i = m;
|
|
248136
|
+
for (let pos = 0;pos < key.length; ++pos, ++i) {
|
|
248137
|
+
const char = key[pos];
|
|
248138
|
+
const thisRowOffset = n * i;
|
|
248139
|
+
const prevRowOffset = thisRowOffset - n;
|
|
248140
|
+
let minDistance = matrix[thisRowOffset];
|
|
248141
|
+
const jmin = Math.max(0, i - maxDistance - 1);
|
|
248142
|
+
const jmax = Math.min(n - 1, i + maxDistance);
|
|
248143
|
+
for (let j = jmin;j < jmax; ++j) {
|
|
248144
|
+
const different = char !== query[j];
|
|
248145
|
+
const rpl = matrix[prevRowOffset + j] + +different;
|
|
248146
|
+
const del = matrix[prevRowOffset + j + 1] + 1;
|
|
248147
|
+
const ins = matrix[thisRowOffset + j] + 1;
|
|
248148
|
+
const dist = matrix[thisRowOffset + j + 1] = Math.min(rpl, del, ins);
|
|
248149
|
+
if (dist < minDistance)
|
|
248150
|
+
minDistance = dist;
|
|
248151
|
+
}
|
|
248152
|
+
if (minDistance > maxDistance) {
|
|
248153
|
+
continue key;
|
|
248154
|
+
}
|
|
248155
|
+
}
|
|
248156
|
+
recurse(node.get(key), query, maxDistance, results, matrix, i, n, prefix + key);
|
|
248157
|
+
}
|
|
248158
|
+
}
|
|
248159
|
+
};
|
|
248160
|
+
|
|
248161
|
+
class SearchableMap {
|
|
248162
|
+
constructor(tree = new Map, prefix = "") {
|
|
248163
|
+
this._size = undefined;
|
|
248164
|
+
this._tree = tree;
|
|
248165
|
+
this._prefix = prefix;
|
|
248166
|
+
}
|
|
248167
|
+
atPrefix(prefix) {
|
|
248168
|
+
if (!prefix.startsWith(this._prefix)) {
|
|
248169
|
+
throw new Error("Mismatched prefix");
|
|
248170
|
+
}
|
|
248171
|
+
const [node, path] = trackDown(this._tree, prefix.slice(this._prefix.length));
|
|
248172
|
+
if (node === undefined) {
|
|
248173
|
+
const [parentNode, key] = last(path);
|
|
248174
|
+
for (const k of parentNode.keys()) {
|
|
248175
|
+
if (k !== LEAF && k.startsWith(key)) {
|
|
248176
|
+
const node = new Map;
|
|
248177
|
+
node.set(k.slice(key.length), parentNode.get(k));
|
|
248178
|
+
return new SearchableMap(node, prefix);
|
|
248179
|
+
}
|
|
248180
|
+
}
|
|
248181
|
+
}
|
|
248182
|
+
return new SearchableMap(node, prefix);
|
|
248183
|
+
}
|
|
248184
|
+
clear() {
|
|
248185
|
+
this._size = undefined;
|
|
248186
|
+
this._tree.clear();
|
|
248187
|
+
}
|
|
248188
|
+
delete(key) {
|
|
248189
|
+
this._size = undefined;
|
|
248190
|
+
return remove(this._tree, key);
|
|
248191
|
+
}
|
|
248192
|
+
entries() {
|
|
248193
|
+
return new TreeIterator(this, ENTRIES);
|
|
248194
|
+
}
|
|
248195
|
+
forEach(fn) {
|
|
248196
|
+
for (const [key, value] of this) {
|
|
248197
|
+
fn(key, value, this);
|
|
248198
|
+
}
|
|
248199
|
+
}
|
|
248200
|
+
fuzzyGet(key, maxEditDistance) {
|
|
248201
|
+
return fuzzySearch(this._tree, key, maxEditDistance);
|
|
248202
|
+
}
|
|
248203
|
+
get(key) {
|
|
248204
|
+
const node = lookup(this._tree, key);
|
|
248205
|
+
return node !== undefined ? node.get(LEAF) : undefined;
|
|
248206
|
+
}
|
|
248207
|
+
has(key) {
|
|
248208
|
+
const node = lookup(this._tree, key);
|
|
248209
|
+
return node !== undefined && node.has(LEAF);
|
|
248210
|
+
}
|
|
248211
|
+
keys() {
|
|
248212
|
+
return new TreeIterator(this, KEYS);
|
|
248213
|
+
}
|
|
248214
|
+
set(key, value) {
|
|
248215
|
+
if (typeof key !== "string") {
|
|
248216
|
+
throw new Error("key must be a string");
|
|
248217
|
+
}
|
|
248218
|
+
this._size = undefined;
|
|
248219
|
+
const node = createPath(this._tree, key);
|
|
248220
|
+
node.set(LEAF, value);
|
|
248221
|
+
return this;
|
|
248222
|
+
}
|
|
248223
|
+
get size() {
|
|
248224
|
+
if (this._size) {
|
|
248225
|
+
return this._size;
|
|
248226
|
+
}
|
|
248227
|
+
this._size = 0;
|
|
248228
|
+
const iter = this.entries();
|
|
248229
|
+
while (!iter.next().done)
|
|
248230
|
+
this._size += 1;
|
|
248231
|
+
return this._size;
|
|
248232
|
+
}
|
|
248233
|
+
update(key, fn) {
|
|
248234
|
+
if (typeof key !== "string") {
|
|
248235
|
+
throw new Error("key must be a string");
|
|
248236
|
+
}
|
|
248237
|
+
this._size = undefined;
|
|
248238
|
+
const node = createPath(this._tree, key);
|
|
248239
|
+
node.set(LEAF, fn(node.get(LEAF)));
|
|
248240
|
+
return this;
|
|
248241
|
+
}
|
|
248242
|
+
fetch(key, initial) {
|
|
248243
|
+
if (typeof key !== "string") {
|
|
248244
|
+
throw new Error("key must be a string");
|
|
248245
|
+
}
|
|
248246
|
+
this._size = undefined;
|
|
248247
|
+
const node = createPath(this._tree, key);
|
|
248248
|
+
let value = node.get(LEAF);
|
|
248249
|
+
if (value === undefined) {
|
|
248250
|
+
node.set(LEAF, value = initial());
|
|
248251
|
+
}
|
|
248252
|
+
return value;
|
|
248253
|
+
}
|
|
248254
|
+
values() {
|
|
248255
|
+
return new TreeIterator(this, VALUES);
|
|
248256
|
+
}
|
|
248257
|
+
[Symbol.iterator]() {
|
|
248258
|
+
return this.entries();
|
|
248259
|
+
}
|
|
248260
|
+
static from(entries) {
|
|
248261
|
+
const tree = new SearchableMap;
|
|
248262
|
+
for (const [key, value] of entries) {
|
|
248263
|
+
tree.set(key, value);
|
|
248264
|
+
}
|
|
248265
|
+
return tree;
|
|
248266
|
+
}
|
|
248267
|
+
static fromObject(object) {
|
|
248268
|
+
return SearchableMap.from(Object.entries(object));
|
|
248269
|
+
}
|
|
248270
|
+
}
|
|
248271
|
+
var trackDown = (tree, key, path = []) => {
|
|
248272
|
+
if (key.length === 0 || tree == null) {
|
|
248273
|
+
return [tree, path];
|
|
248274
|
+
}
|
|
248275
|
+
for (const k of tree.keys()) {
|
|
248276
|
+
if (k !== LEAF && key.startsWith(k)) {
|
|
248277
|
+
path.push([tree, k]);
|
|
248278
|
+
return trackDown(tree.get(k), key.slice(k.length), path);
|
|
248279
|
+
}
|
|
248280
|
+
}
|
|
248281
|
+
path.push([tree, key]);
|
|
248282
|
+
return trackDown(undefined, "", path);
|
|
248283
|
+
};
|
|
248284
|
+
var lookup = (tree, key) => {
|
|
248285
|
+
if (key.length === 0 || tree == null) {
|
|
248286
|
+
return tree;
|
|
248287
|
+
}
|
|
248288
|
+
for (const k of tree.keys()) {
|
|
248289
|
+
if (k !== LEAF && key.startsWith(k)) {
|
|
248290
|
+
return lookup(tree.get(k), key.slice(k.length));
|
|
248291
|
+
}
|
|
248292
|
+
}
|
|
248293
|
+
};
|
|
248294
|
+
var createPath = (node, key) => {
|
|
248295
|
+
const keyLength = key.length;
|
|
248296
|
+
outer:
|
|
248297
|
+
for (let pos = 0;node && pos < keyLength; ) {
|
|
248298
|
+
for (const k of node.keys()) {
|
|
248299
|
+
if (k !== LEAF && key[pos] === k[0]) {
|
|
248300
|
+
const len = Math.min(keyLength - pos, k.length);
|
|
248301
|
+
let offset = 1;
|
|
248302
|
+
while (offset < len && key[pos + offset] === k[offset])
|
|
248303
|
+
++offset;
|
|
248304
|
+
const child = node.get(k);
|
|
248305
|
+
if (offset === k.length) {
|
|
248306
|
+
node = child;
|
|
248307
|
+
} else {
|
|
248308
|
+
const intermediate = new Map;
|
|
248309
|
+
intermediate.set(k.slice(offset), child);
|
|
248310
|
+
node.set(key.slice(pos, pos + offset), intermediate);
|
|
248311
|
+
node.delete(k);
|
|
248312
|
+
node = intermediate;
|
|
248313
|
+
}
|
|
248314
|
+
pos += offset;
|
|
248315
|
+
continue outer;
|
|
248316
|
+
}
|
|
248317
|
+
}
|
|
248318
|
+
const child = new Map;
|
|
248319
|
+
node.set(key.slice(pos), child);
|
|
248320
|
+
return child;
|
|
248321
|
+
}
|
|
248322
|
+
return node;
|
|
248323
|
+
};
|
|
248324
|
+
var remove = (tree, key) => {
|
|
248325
|
+
const [node, path] = trackDown(tree, key);
|
|
248326
|
+
if (node === undefined) {
|
|
248327
|
+
return;
|
|
248328
|
+
}
|
|
248329
|
+
node.delete(LEAF);
|
|
248330
|
+
if (node.size === 0) {
|
|
248331
|
+
cleanup(path);
|
|
248332
|
+
} else if (node.size === 1) {
|
|
248333
|
+
const [key, value] = node.entries().next().value;
|
|
248334
|
+
merge3(path, key, value);
|
|
248335
|
+
}
|
|
248336
|
+
};
|
|
248337
|
+
var cleanup = (path) => {
|
|
248338
|
+
if (path.length === 0) {
|
|
248339
|
+
return;
|
|
248340
|
+
}
|
|
248341
|
+
const [node, key] = last(path);
|
|
248342
|
+
node.delete(key);
|
|
248343
|
+
if (node.size === 0) {
|
|
248344
|
+
cleanup(path.slice(0, -1));
|
|
248345
|
+
} else if (node.size === 1) {
|
|
248346
|
+
const [key, value] = node.entries().next().value;
|
|
248347
|
+
if (key !== LEAF) {
|
|
248348
|
+
merge3(path.slice(0, -1), key, value);
|
|
248349
|
+
}
|
|
248350
|
+
}
|
|
248351
|
+
};
|
|
248352
|
+
var merge3 = (path, key, value) => {
|
|
248353
|
+
if (path.length === 0) {
|
|
248354
|
+
return;
|
|
248355
|
+
}
|
|
248356
|
+
const [node, nodeKey] = last(path);
|
|
248357
|
+
node.set(nodeKey + key, value);
|
|
248358
|
+
node.delete(nodeKey);
|
|
248359
|
+
};
|
|
248360
|
+
var last = (array) => {
|
|
248361
|
+
return array[array.length - 1];
|
|
248362
|
+
};
|
|
248363
|
+
var OR = "or";
|
|
248364
|
+
var AND = "and";
|
|
248365
|
+
var AND_NOT = "and_not";
|
|
248366
|
+
|
|
248367
|
+
class MiniSearch {
|
|
248368
|
+
constructor(options) {
|
|
248369
|
+
if ((options === null || options === undefined ? undefined : options.fields) == null) {
|
|
248370
|
+
throw new Error('MiniSearch: option "fields" must be provided');
|
|
248371
|
+
}
|
|
248372
|
+
const autoVacuum = options.autoVacuum == null || options.autoVacuum === true ? defaultAutoVacuumOptions : options.autoVacuum;
|
|
248373
|
+
this._options = {
|
|
248374
|
+
...defaultOptions,
|
|
248375
|
+
...options,
|
|
248376
|
+
autoVacuum,
|
|
248377
|
+
searchOptions: { ...defaultSearchOptions, ...options.searchOptions || {} },
|
|
248378
|
+
autoSuggestOptions: { ...defaultAutoSuggestOptions, ...options.autoSuggestOptions || {} }
|
|
248379
|
+
};
|
|
248380
|
+
this._index = new SearchableMap;
|
|
248381
|
+
this._documentCount = 0;
|
|
248382
|
+
this._documentIds = new Map;
|
|
248383
|
+
this._idToShortId = new Map;
|
|
248384
|
+
this._fieldIds = {};
|
|
248385
|
+
this._fieldLength = new Map;
|
|
248386
|
+
this._avgFieldLength = [];
|
|
248387
|
+
this._nextId = 0;
|
|
248388
|
+
this._storedFields = new Map;
|
|
248389
|
+
this._dirtCount = 0;
|
|
248390
|
+
this._currentVacuum = null;
|
|
248391
|
+
this._enqueuedVacuum = null;
|
|
248392
|
+
this._enqueuedVacuumConditions = defaultVacuumConditions;
|
|
248393
|
+
this.addFields(this._options.fields);
|
|
248394
|
+
}
|
|
248395
|
+
add(document2) {
|
|
248396
|
+
const { extractField, tokenize, processTerm, fields, idField } = this._options;
|
|
248397
|
+
const id = extractField(document2, idField);
|
|
248398
|
+
if (id == null) {
|
|
248399
|
+
throw new Error(`MiniSearch: document does not have ID field "${idField}"`);
|
|
248400
|
+
}
|
|
248401
|
+
if (this._idToShortId.has(id)) {
|
|
248402
|
+
throw new Error(`MiniSearch: duplicate ID ${id}`);
|
|
248403
|
+
}
|
|
248404
|
+
const shortDocumentId = this.addDocumentId(id);
|
|
248405
|
+
this.saveStoredFields(shortDocumentId, document2);
|
|
248406
|
+
for (const field of fields) {
|
|
248407
|
+
const fieldValue = extractField(document2, field);
|
|
248408
|
+
if (fieldValue == null)
|
|
248409
|
+
continue;
|
|
248410
|
+
const tokens = tokenize(fieldValue.toString(), field);
|
|
248411
|
+
const fieldId = this._fieldIds[field];
|
|
248412
|
+
const uniqueTerms = new Set(tokens).size;
|
|
248413
|
+
this.addFieldLength(shortDocumentId, fieldId, this._documentCount - 1, uniqueTerms);
|
|
248414
|
+
for (const term of tokens) {
|
|
248415
|
+
const processedTerm = processTerm(term, field);
|
|
248416
|
+
if (Array.isArray(processedTerm)) {
|
|
248417
|
+
for (const t of processedTerm) {
|
|
248418
|
+
this.addTerm(fieldId, shortDocumentId, t);
|
|
248419
|
+
}
|
|
248420
|
+
} else if (processedTerm) {
|
|
248421
|
+
this.addTerm(fieldId, shortDocumentId, processedTerm);
|
|
248422
|
+
}
|
|
248423
|
+
}
|
|
248424
|
+
}
|
|
248425
|
+
}
|
|
248426
|
+
addAll(documents) {
|
|
248427
|
+
for (const document2 of documents)
|
|
248428
|
+
this.add(document2);
|
|
248429
|
+
}
|
|
248430
|
+
addAllAsync(documents, options = {}) {
|
|
248431
|
+
const { chunkSize = 10 } = options;
|
|
248432
|
+
const acc = { chunk: [], promise: Promise.resolve() };
|
|
248433
|
+
const { chunk, promise } = documents.reduce(({ chunk, promise }, document2, i) => {
|
|
248434
|
+
chunk.push(document2);
|
|
248435
|
+
if ((i + 1) % chunkSize === 0) {
|
|
248436
|
+
return {
|
|
248437
|
+
chunk: [],
|
|
248438
|
+
promise: promise.then(() => new Promise((resolve) => setTimeout(resolve, 0))).then(() => this.addAll(chunk))
|
|
248439
|
+
};
|
|
248440
|
+
} else {
|
|
248441
|
+
return { chunk, promise };
|
|
248442
|
+
}
|
|
248443
|
+
}, acc);
|
|
248444
|
+
return promise.then(() => this.addAll(chunk));
|
|
248445
|
+
}
|
|
248446
|
+
remove(document2) {
|
|
248447
|
+
const { tokenize, processTerm, extractField, fields, idField } = this._options;
|
|
248448
|
+
const id = extractField(document2, idField);
|
|
248449
|
+
if (id == null) {
|
|
248450
|
+
throw new Error(`MiniSearch: document does not have ID field "${idField}"`);
|
|
248451
|
+
}
|
|
248452
|
+
const shortId = this._idToShortId.get(id);
|
|
248453
|
+
if (shortId == null) {
|
|
248454
|
+
throw new Error(`MiniSearch: cannot remove document with ID ${id}: it is not in the index`);
|
|
248455
|
+
}
|
|
248456
|
+
for (const field of fields) {
|
|
248457
|
+
const fieldValue = extractField(document2, field);
|
|
248458
|
+
if (fieldValue == null)
|
|
248459
|
+
continue;
|
|
248460
|
+
const tokens = tokenize(fieldValue.toString(), field);
|
|
248461
|
+
const fieldId = this._fieldIds[field];
|
|
248462
|
+
const uniqueTerms = new Set(tokens).size;
|
|
248463
|
+
this.removeFieldLength(shortId, fieldId, this._documentCount, uniqueTerms);
|
|
248464
|
+
for (const term of tokens) {
|
|
248465
|
+
const processedTerm = processTerm(term, field);
|
|
248466
|
+
if (Array.isArray(processedTerm)) {
|
|
248467
|
+
for (const t of processedTerm) {
|
|
248468
|
+
this.removeTerm(fieldId, shortId, t);
|
|
248469
|
+
}
|
|
248470
|
+
} else if (processedTerm) {
|
|
248471
|
+
this.removeTerm(fieldId, shortId, processedTerm);
|
|
248472
|
+
}
|
|
248473
|
+
}
|
|
248474
|
+
}
|
|
248475
|
+
this._storedFields.delete(shortId);
|
|
248476
|
+
this._documentIds.delete(shortId);
|
|
248477
|
+
this._idToShortId.delete(id);
|
|
248478
|
+
this._fieldLength.delete(shortId);
|
|
248479
|
+
this._documentCount -= 1;
|
|
248480
|
+
}
|
|
248481
|
+
removeAll(documents) {
|
|
248482
|
+
if (documents) {
|
|
248483
|
+
for (const document2 of documents)
|
|
248484
|
+
this.remove(document2);
|
|
248485
|
+
} else if (arguments.length > 0) {
|
|
248486
|
+
throw new Error("Expected documents to be present. Omit the argument to remove all documents.");
|
|
248487
|
+
} else {
|
|
248488
|
+
this._index = new SearchableMap;
|
|
248489
|
+
this._documentCount = 0;
|
|
248490
|
+
this._documentIds = new Map;
|
|
248491
|
+
this._idToShortId = new Map;
|
|
248492
|
+
this._fieldLength = new Map;
|
|
248493
|
+
this._avgFieldLength = [];
|
|
248494
|
+
this._storedFields = new Map;
|
|
248495
|
+
this._nextId = 0;
|
|
248496
|
+
}
|
|
248497
|
+
}
|
|
248498
|
+
discard(id) {
|
|
248499
|
+
const shortId = this._idToShortId.get(id);
|
|
248500
|
+
if (shortId == null) {
|
|
248501
|
+
throw new Error(`MiniSearch: cannot discard document with ID ${id}: it is not in the index`);
|
|
248502
|
+
}
|
|
248503
|
+
this._idToShortId.delete(id);
|
|
248504
|
+
this._documentIds.delete(shortId);
|
|
248505
|
+
this._storedFields.delete(shortId);
|
|
248506
|
+
(this._fieldLength.get(shortId) || []).forEach((fieldLength, fieldId) => {
|
|
248507
|
+
this.removeFieldLength(shortId, fieldId, this._documentCount, fieldLength);
|
|
248508
|
+
});
|
|
248509
|
+
this._fieldLength.delete(shortId);
|
|
248510
|
+
this._documentCount -= 1;
|
|
248511
|
+
this._dirtCount += 1;
|
|
248512
|
+
this.maybeAutoVacuum();
|
|
248513
|
+
}
|
|
248514
|
+
maybeAutoVacuum() {
|
|
248515
|
+
if (this._options.autoVacuum === false) {
|
|
248516
|
+
return;
|
|
248517
|
+
}
|
|
248518
|
+
const { minDirtFactor, minDirtCount, batchSize, batchWait } = this._options.autoVacuum;
|
|
248519
|
+
this.conditionalVacuum({ batchSize, batchWait }, { minDirtCount, minDirtFactor });
|
|
248520
|
+
}
|
|
248521
|
+
discardAll(ids) {
|
|
248522
|
+
const autoVacuum = this._options.autoVacuum;
|
|
248523
|
+
try {
|
|
248524
|
+
this._options.autoVacuum = false;
|
|
248525
|
+
for (const id of ids) {
|
|
248526
|
+
this.discard(id);
|
|
248527
|
+
}
|
|
248528
|
+
} finally {
|
|
248529
|
+
this._options.autoVacuum = autoVacuum;
|
|
248530
|
+
}
|
|
248531
|
+
this.maybeAutoVacuum();
|
|
248532
|
+
}
|
|
248533
|
+
replace(updatedDocument) {
|
|
248534
|
+
const { idField, extractField } = this._options;
|
|
248535
|
+
const id = extractField(updatedDocument, idField);
|
|
248536
|
+
this.discard(id);
|
|
248537
|
+
this.add(updatedDocument);
|
|
248538
|
+
}
|
|
248539
|
+
vacuum(options = {}) {
|
|
248540
|
+
return this.conditionalVacuum(options);
|
|
248541
|
+
}
|
|
248542
|
+
conditionalVacuum(options, conditions) {
|
|
248543
|
+
if (this._currentVacuum) {
|
|
248544
|
+
this._enqueuedVacuumConditions = this._enqueuedVacuumConditions && conditions;
|
|
248545
|
+
if (this._enqueuedVacuum != null) {
|
|
248546
|
+
return this._enqueuedVacuum;
|
|
248547
|
+
}
|
|
248548
|
+
this._enqueuedVacuum = this._currentVacuum.then(() => {
|
|
248549
|
+
const conditions = this._enqueuedVacuumConditions;
|
|
248550
|
+
this._enqueuedVacuumConditions = defaultVacuumConditions;
|
|
248551
|
+
return this.performVacuuming(options, conditions);
|
|
248552
|
+
});
|
|
248553
|
+
return this._enqueuedVacuum;
|
|
248554
|
+
}
|
|
248555
|
+
if (this.vacuumConditionsMet(conditions) === false) {
|
|
248556
|
+
return Promise.resolve();
|
|
248557
|
+
}
|
|
248558
|
+
this._currentVacuum = this.performVacuuming(options);
|
|
248559
|
+
return this._currentVacuum;
|
|
248560
|
+
}
|
|
248561
|
+
async performVacuuming(options, conditions) {
|
|
248562
|
+
const initialDirtCount = this._dirtCount;
|
|
248563
|
+
if (this.vacuumConditionsMet(conditions)) {
|
|
248564
|
+
const batchSize = options.batchSize || defaultVacuumOptions.batchSize;
|
|
248565
|
+
const batchWait = options.batchWait || defaultVacuumOptions.batchWait;
|
|
248566
|
+
let i = 1;
|
|
248567
|
+
for (const [term, fieldsData] of this._index) {
|
|
248568
|
+
for (const [fieldId, fieldIndex] of fieldsData) {
|
|
248569
|
+
for (const [shortId] of fieldIndex) {
|
|
248570
|
+
if (this._documentIds.has(shortId)) {
|
|
248571
|
+
continue;
|
|
248572
|
+
}
|
|
248573
|
+
if (fieldIndex.size <= 1) {
|
|
248574
|
+
fieldsData.delete(fieldId);
|
|
248575
|
+
} else {
|
|
248576
|
+
fieldIndex.delete(shortId);
|
|
248577
|
+
}
|
|
248578
|
+
}
|
|
248579
|
+
}
|
|
248580
|
+
if (this._index.get(term).size === 0) {
|
|
248581
|
+
this._index.delete(term);
|
|
248582
|
+
}
|
|
248583
|
+
if (i % batchSize === 0) {
|
|
248584
|
+
await new Promise((resolve) => setTimeout(resolve, batchWait));
|
|
248585
|
+
}
|
|
248586
|
+
i += 1;
|
|
248587
|
+
}
|
|
248588
|
+
this._dirtCount -= initialDirtCount;
|
|
248589
|
+
}
|
|
248590
|
+
await null;
|
|
248591
|
+
this._currentVacuum = this._enqueuedVacuum;
|
|
248592
|
+
this._enqueuedVacuum = null;
|
|
248593
|
+
}
|
|
248594
|
+
vacuumConditionsMet(conditions) {
|
|
248595
|
+
if (conditions == null) {
|
|
248596
|
+
return true;
|
|
248597
|
+
}
|
|
248598
|
+
let { minDirtCount, minDirtFactor } = conditions;
|
|
248599
|
+
minDirtCount = minDirtCount || defaultAutoVacuumOptions.minDirtCount;
|
|
248600
|
+
minDirtFactor = minDirtFactor || defaultAutoVacuumOptions.minDirtFactor;
|
|
248601
|
+
return this.dirtCount >= minDirtCount && this.dirtFactor >= minDirtFactor;
|
|
248602
|
+
}
|
|
248603
|
+
get isVacuuming() {
|
|
248604
|
+
return this._currentVacuum != null;
|
|
248605
|
+
}
|
|
248606
|
+
get dirtCount() {
|
|
248607
|
+
return this._dirtCount;
|
|
248608
|
+
}
|
|
248609
|
+
get dirtFactor() {
|
|
248610
|
+
return this._dirtCount / (1 + this._documentCount + this._dirtCount);
|
|
248611
|
+
}
|
|
248612
|
+
has(id) {
|
|
248613
|
+
return this._idToShortId.has(id);
|
|
248614
|
+
}
|
|
248615
|
+
getStoredFields(id) {
|
|
248616
|
+
const shortId = this._idToShortId.get(id);
|
|
248617
|
+
if (shortId == null) {
|
|
248618
|
+
return;
|
|
248619
|
+
}
|
|
248620
|
+
return this._storedFields.get(shortId);
|
|
248621
|
+
}
|
|
248622
|
+
search(query, searchOptions = {}) {
|
|
248623
|
+
const { searchOptions: globalSearchOptions } = this._options;
|
|
248624
|
+
const searchOptionsWithDefaults = { ...globalSearchOptions, ...searchOptions };
|
|
248625
|
+
const rawResults = this.executeQuery(query, searchOptions);
|
|
248626
|
+
const results = [];
|
|
248627
|
+
for (const [docId, { score, terms, match }] of rawResults) {
|
|
248628
|
+
const quality = terms.length || 1;
|
|
248629
|
+
const result = {
|
|
248630
|
+
id: this._documentIds.get(docId),
|
|
248631
|
+
score: score * quality,
|
|
248632
|
+
terms: Object.keys(match),
|
|
248633
|
+
queryTerms: terms,
|
|
248634
|
+
match
|
|
248635
|
+
};
|
|
248636
|
+
Object.assign(result, this._storedFields.get(docId));
|
|
248637
|
+
if (searchOptionsWithDefaults.filter == null || searchOptionsWithDefaults.filter(result)) {
|
|
248638
|
+
results.push(result);
|
|
248639
|
+
}
|
|
248640
|
+
}
|
|
248641
|
+
if (query === MiniSearch.wildcard && searchOptionsWithDefaults.boostDocument == null) {
|
|
248642
|
+
return results;
|
|
248643
|
+
}
|
|
248644
|
+
results.sort(byScore);
|
|
248645
|
+
return results;
|
|
248646
|
+
}
|
|
248647
|
+
autoSuggest(queryString, options = {}) {
|
|
248648
|
+
options = { ...this._options.autoSuggestOptions, ...options };
|
|
248649
|
+
const suggestions = new Map;
|
|
248650
|
+
for (const { score, terms } of this.search(queryString, options)) {
|
|
248651
|
+
const phrase = terms.join(" ");
|
|
248652
|
+
const suggestion = suggestions.get(phrase);
|
|
248653
|
+
if (suggestion != null) {
|
|
248654
|
+
suggestion.score += score;
|
|
248655
|
+
suggestion.count += 1;
|
|
248656
|
+
} else {
|
|
248657
|
+
suggestions.set(phrase, { score, terms, count: 1 });
|
|
248658
|
+
}
|
|
248659
|
+
}
|
|
248660
|
+
const results = [];
|
|
248661
|
+
for (const [suggestion, { score, terms, count }] of suggestions) {
|
|
248662
|
+
results.push({ suggestion, terms, score: score / count });
|
|
248663
|
+
}
|
|
248664
|
+
results.sort(byScore);
|
|
248665
|
+
return results;
|
|
248666
|
+
}
|
|
248667
|
+
get documentCount() {
|
|
248668
|
+
return this._documentCount;
|
|
248669
|
+
}
|
|
248670
|
+
get termCount() {
|
|
248671
|
+
return this._index.size;
|
|
248672
|
+
}
|
|
248673
|
+
static loadJSON(json, options) {
|
|
248674
|
+
if (options == null) {
|
|
248675
|
+
throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");
|
|
248676
|
+
}
|
|
248677
|
+
return this.loadJS(JSON.parse(json), options);
|
|
248678
|
+
}
|
|
248679
|
+
static async loadJSONAsync(json, options) {
|
|
248680
|
+
if (options == null) {
|
|
248681
|
+
throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");
|
|
248682
|
+
}
|
|
248683
|
+
return this.loadJSAsync(JSON.parse(json), options);
|
|
248684
|
+
}
|
|
248685
|
+
static getDefault(optionName) {
|
|
248686
|
+
if (defaultOptions.hasOwnProperty(optionName)) {
|
|
248687
|
+
return getOwnProperty(defaultOptions, optionName);
|
|
248688
|
+
} else {
|
|
248689
|
+
throw new Error(`MiniSearch: unknown option "${optionName}"`);
|
|
248690
|
+
}
|
|
248691
|
+
}
|
|
248692
|
+
static loadJS(js, options) {
|
|
248693
|
+
const { index, documentIds, fieldLength, storedFields, serializationVersion } = js;
|
|
248694
|
+
const miniSearch = this.instantiateMiniSearch(js, options);
|
|
248695
|
+
miniSearch._documentIds = objectToNumericMap(documentIds);
|
|
248696
|
+
miniSearch._fieldLength = objectToNumericMap(fieldLength);
|
|
248697
|
+
miniSearch._storedFields = objectToNumericMap(storedFields);
|
|
248698
|
+
for (const [shortId, id] of miniSearch._documentIds) {
|
|
248699
|
+
miniSearch._idToShortId.set(id, shortId);
|
|
248700
|
+
}
|
|
248701
|
+
for (const [term, data] of index) {
|
|
248702
|
+
const dataMap = new Map;
|
|
248703
|
+
for (const fieldId of Object.keys(data)) {
|
|
248704
|
+
let indexEntry = data[fieldId];
|
|
248705
|
+
if (serializationVersion === 1) {
|
|
248706
|
+
indexEntry = indexEntry.ds;
|
|
248707
|
+
}
|
|
248708
|
+
dataMap.set(parseInt(fieldId, 10), objectToNumericMap(indexEntry));
|
|
248709
|
+
}
|
|
248710
|
+
miniSearch._index.set(term, dataMap);
|
|
248711
|
+
}
|
|
248712
|
+
return miniSearch;
|
|
248713
|
+
}
|
|
248714
|
+
static async loadJSAsync(js, options) {
|
|
248715
|
+
const { index, documentIds, fieldLength, storedFields, serializationVersion } = js;
|
|
248716
|
+
const miniSearch = this.instantiateMiniSearch(js, options);
|
|
248717
|
+
miniSearch._documentIds = await objectToNumericMapAsync(documentIds);
|
|
248718
|
+
miniSearch._fieldLength = await objectToNumericMapAsync(fieldLength);
|
|
248719
|
+
miniSearch._storedFields = await objectToNumericMapAsync(storedFields);
|
|
248720
|
+
for (const [shortId, id] of miniSearch._documentIds) {
|
|
248721
|
+
miniSearch._idToShortId.set(id, shortId);
|
|
248722
|
+
}
|
|
248723
|
+
let count = 0;
|
|
248724
|
+
for (const [term, data] of index) {
|
|
248725
|
+
const dataMap = new Map;
|
|
248726
|
+
for (const fieldId of Object.keys(data)) {
|
|
248727
|
+
let indexEntry = data[fieldId];
|
|
248728
|
+
if (serializationVersion === 1) {
|
|
248729
|
+
indexEntry = indexEntry.ds;
|
|
248730
|
+
}
|
|
248731
|
+
dataMap.set(parseInt(fieldId, 10), await objectToNumericMapAsync(indexEntry));
|
|
248732
|
+
}
|
|
248733
|
+
if (++count % 1000 === 0)
|
|
248734
|
+
await wait(0);
|
|
248735
|
+
miniSearch._index.set(term, dataMap);
|
|
248736
|
+
}
|
|
248737
|
+
return miniSearch;
|
|
248738
|
+
}
|
|
248739
|
+
static instantiateMiniSearch(js, options) {
|
|
248740
|
+
const { documentCount, nextId, fieldIds, averageFieldLength, dirtCount, serializationVersion } = js;
|
|
248741
|
+
if (serializationVersion !== 1 && serializationVersion !== 2) {
|
|
248742
|
+
throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");
|
|
248743
|
+
}
|
|
248744
|
+
const miniSearch = new MiniSearch(options);
|
|
248745
|
+
miniSearch._documentCount = documentCount;
|
|
248746
|
+
miniSearch._nextId = nextId;
|
|
248747
|
+
miniSearch._idToShortId = new Map;
|
|
248748
|
+
miniSearch._fieldIds = fieldIds;
|
|
248749
|
+
miniSearch._avgFieldLength = averageFieldLength;
|
|
248750
|
+
miniSearch._dirtCount = dirtCount || 0;
|
|
248751
|
+
miniSearch._index = new SearchableMap;
|
|
248752
|
+
return miniSearch;
|
|
248753
|
+
}
|
|
248754
|
+
executeQuery(query, searchOptions = {}) {
|
|
248755
|
+
if (query === MiniSearch.wildcard) {
|
|
248756
|
+
return this.executeWildcardQuery(searchOptions);
|
|
248757
|
+
}
|
|
248758
|
+
if (typeof query !== "string") {
|
|
248759
|
+
const options = { ...searchOptions, ...query, queries: undefined };
|
|
248760
|
+
const results = query.queries.map((subquery) => this.executeQuery(subquery, options));
|
|
248761
|
+
return this.combineResults(results, options.combineWith);
|
|
248762
|
+
}
|
|
248763
|
+
const { tokenize, processTerm, searchOptions: globalSearchOptions } = this._options;
|
|
248764
|
+
const options = { tokenize, processTerm, ...globalSearchOptions, ...searchOptions };
|
|
248765
|
+
const { tokenize: searchTokenize, processTerm: searchProcessTerm } = options;
|
|
248766
|
+
const terms = searchTokenize(query).flatMap((term) => searchProcessTerm(term)).filter((term) => !!term);
|
|
248767
|
+
const queries = terms.map(termToQuerySpec(options));
|
|
248768
|
+
const results = queries.map((query) => this.executeQuerySpec(query, options));
|
|
248769
|
+
return this.combineResults(results, options.combineWith);
|
|
248770
|
+
}
|
|
248771
|
+
executeQuerySpec(query, searchOptions) {
|
|
248772
|
+
const options = { ...this._options.searchOptions, ...searchOptions };
|
|
248773
|
+
const boosts = (options.fields || this._options.fields).reduce((boosts, field) => ({ ...boosts, [field]: getOwnProperty(options.boost, field) || 1 }), {});
|
|
248774
|
+
const { boostDocument, weights, maxFuzzy, bm25: bm25params } = options;
|
|
248775
|
+
const { fuzzy: fuzzyWeight, prefix: prefixWeight } = { ...defaultSearchOptions.weights, ...weights };
|
|
248776
|
+
const data = this._index.get(query.term);
|
|
248777
|
+
const results = this.termResults(query.term, query.term, 1, query.termBoost, data, boosts, boostDocument, bm25params);
|
|
248778
|
+
let prefixMatches;
|
|
248779
|
+
let fuzzyMatches;
|
|
248780
|
+
if (query.prefix) {
|
|
248781
|
+
prefixMatches = this._index.atPrefix(query.term);
|
|
248782
|
+
}
|
|
248783
|
+
if (query.fuzzy) {
|
|
248784
|
+
const fuzzy = query.fuzzy === true ? 0.2 : query.fuzzy;
|
|
248785
|
+
const maxDistance = fuzzy < 1 ? Math.min(maxFuzzy, Math.round(query.term.length * fuzzy)) : fuzzy;
|
|
248786
|
+
if (maxDistance)
|
|
248787
|
+
fuzzyMatches = this._index.fuzzyGet(query.term, maxDistance);
|
|
248788
|
+
}
|
|
248789
|
+
if (prefixMatches) {
|
|
248790
|
+
for (const [term, data] of prefixMatches) {
|
|
248791
|
+
const distance = term.length - query.term.length;
|
|
248792
|
+
if (!distance) {
|
|
248793
|
+
continue;
|
|
248794
|
+
}
|
|
248795
|
+
fuzzyMatches === null || fuzzyMatches === undefined || fuzzyMatches.delete(term);
|
|
248796
|
+
const weight = prefixWeight * term.length / (term.length + 0.3 * distance);
|
|
248797
|
+
this.termResults(query.term, term, weight, query.termBoost, data, boosts, boostDocument, bm25params, results);
|
|
248798
|
+
}
|
|
248799
|
+
}
|
|
248800
|
+
if (fuzzyMatches) {
|
|
248801
|
+
for (const term of fuzzyMatches.keys()) {
|
|
248802
|
+
const [data, distance] = fuzzyMatches.get(term);
|
|
248803
|
+
if (!distance) {
|
|
248804
|
+
continue;
|
|
248805
|
+
}
|
|
248806
|
+
const weight = fuzzyWeight * term.length / (term.length + distance);
|
|
248807
|
+
this.termResults(query.term, term, weight, query.termBoost, data, boosts, boostDocument, bm25params, results);
|
|
248808
|
+
}
|
|
248809
|
+
}
|
|
248810
|
+
return results;
|
|
248811
|
+
}
|
|
248812
|
+
executeWildcardQuery(searchOptions) {
|
|
248813
|
+
const results = new Map;
|
|
248814
|
+
const options = { ...this._options.searchOptions, ...searchOptions };
|
|
248815
|
+
for (const [shortId, id] of this._documentIds) {
|
|
248816
|
+
const score = options.boostDocument ? options.boostDocument(id, "", this._storedFields.get(shortId)) : 1;
|
|
248817
|
+
results.set(shortId, {
|
|
248818
|
+
score,
|
|
248819
|
+
terms: [],
|
|
248820
|
+
match: {}
|
|
248821
|
+
});
|
|
248822
|
+
}
|
|
248823
|
+
return results;
|
|
248824
|
+
}
|
|
248825
|
+
combineResults(results, combineWith = OR) {
|
|
248826
|
+
if (results.length === 0) {
|
|
248827
|
+
return new Map;
|
|
248828
|
+
}
|
|
248829
|
+
const operator = combineWith.toLowerCase();
|
|
248830
|
+
const combinator = combinators[operator];
|
|
248831
|
+
if (!combinator) {
|
|
248832
|
+
throw new Error(`Invalid combination operator: ${combineWith}`);
|
|
248833
|
+
}
|
|
248834
|
+
return results.reduce(combinator) || new Map;
|
|
248835
|
+
}
|
|
248836
|
+
toJSON() {
|
|
248837
|
+
const index = [];
|
|
248838
|
+
for (const [term, fieldIndex] of this._index) {
|
|
248839
|
+
const data = {};
|
|
248840
|
+
for (const [fieldId, freqs] of fieldIndex) {
|
|
248841
|
+
data[fieldId] = Object.fromEntries(freqs);
|
|
248842
|
+
}
|
|
248843
|
+
index.push([term, data]);
|
|
248844
|
+
}
|
|
248845
|
+
return {
|
|
248846
|
+
documentCount: this._documentCount,
|
|
248847
|
+
nextId: this._nextId,
|
|
248848
|
+
documentIds: Object.fromEntries(this._documentIds),
|
|
248849
|
+
fieldIds: this._fieldIds,
|
|
248850
|
+
fieldLength: Object.fromEntries(this._fieldLength),
|
|
248851
|
+
averageFieldLength: this._avgFieldLength,
|
|
248852
|
+
storedFields: Object.fromEntries(this._storedFields),
|
|
248853
|
+
dirtCount: this._dirtCount,
|
|
248854
|
+
index,
|
|
248855
|
+
serializationVersion: 2
|
|
248856
|
+
};
|
|
248857
|
+
}
|
|
248858
|
+
termResults(sourceTerm, derivedTerm, termWeight, termBoost, fieldTermData, fieldBoosts, boostDocumentFn, bm25params, results = new Map) {
|
|
248859
|
+
if (fieldTermData == null)
|
|
248860
|
+
return results;
|
|
248861
|
+
for (const field of Object.keys(fieldBoosts)) {
|
|
248862
|
+
const fieldBoost = fieldBoosts[field];
|
|
248863
|
+
const fieldId = this._fieldIds[field];
|
|
248864
|
+
const fieldTermFreqs = fieldTermData.get(fieldId);
|
|
248865
|
+
if (fieldTermFreqs == null)
|
|
248866
|
+
continue;
|
|
248867
|
+
let matchingFields = fieldTermFreqs.size;
|
|
248868
|
+
const avgFieldLength = this._avgFieldLength[fieldId];
|
|
248869
|
+
for (const docId of fieldTermFreqs.keys()) {
|
|
248870
|
+
if (!this._documentIds.has(docId)) {
|
|
248871
|
+
this.removeTerm(fieldId, docId, derivedTerm);
|
|
248872
|
+
matchingFields -= 1;
|
|
248873
|
+
continue;
|
|
248874
|
+
}
|
|
248875
|
+
const docBoost = boostDocumentFn ? boostDocumentFn(this._documentIds.get(docId), derivedTerm, this._storedFields.get(docId)) : 1;
|
|
248876
|
+
if (!docBoost)
|
|
248877
|
+
continue;
|
|
248878
|
+
const termFreq = fieldTermFreqs.get(docId);
|
|
248879
|
+
const fieldLength = this._fieldLength.get(docId)[fieldId];
|
|
248880
|
+
const rawScore = calcBM25Score(termFreq, matchingFields, this._documentCount, fieldLength, avgFieldLength, bm25params);
|
|
248881
|
+
const weightedScore = termWeight * termBoost * fieldBoost * docBoost * rawScore;
|
|
248882
|
+
const result = results.get(docId);
|
|
248883
|
+
if (result) {
|
|
248884
|
+
result.score += weightedScore;
|
|
248885
|
+
assignUniqueTerm(result.terms, sourceTerm);
|
|
248886
|
+
const match = getOwnProperty(result.match, derivedTerm);
|
|
248887
|
+
if (match) {
|
|
248888
|
+
match.push(field);
|
|
248889
|
+
} else {
|
|
248890
|
+
result.match[derivedTerm] = [field];
|
|
248891
|
+
}
|
|
248892
|
+
} else {
|
|
248893
|
+
results.set(docId, {
|
|
248894
|
+
score: weightedScore,
|
|
248895
|
+
terms: [sourceTerm],
|
|
248896
|
+
match: { [derivedTerm]: [field] }
|
|
248897
|
+
});
|
|
248898
|
+
}
|
|
248899
|
+
}
|
|
248900
|
+
}
|
|
248901
|
+
return results;
|
|
248902
|
+
}
|
|
248903
|
+
addTerm(fieldId, documentId, term) {
|
|
248904
|
+
const indexData = this._index.fetch(term, createMap);
|
|
248905
|
+
let fieldIndex = indexData.get(fieldId);
|
|
248906
|
+
if (fieldIndex == null) {
|
|
248907
|
+
fieldIndex = new Map;
|
|
248908
|
+
fieldIndex.set(documentId, 1);
|
|
248909
|
+
indexData.set(fieldId, fieldIndex);
|
|
248910
|
+
} else {
|
|
248911
|
+
const docs = fieldIndex.get(documentId);
|
|
248912
|
+
fieldIndex.set(documentId, (docs || 0) + 1);
|
|
248913
|
+
}
|
|
248914
|
+
}
|
|
248915
|
+
removeTerm(fieldId, documentId, term) {
|
|
248916
|
+
if (!this._index.has(term)) {
|
|
248917
|
+
this.warnDocumentChanged(documentId, fieldId, term);
|
|
248918
|
+
return;
|
|
248919
|
+
}
|
|
248920
|
+
const indexData = this._index.fetch(term, createMap);
|
|
248921
|
+
const fieldIndex = indexData.get(fieldId);
|
|
248922
|
+
if (fieldIndex == null || fieldIndex.get(documentId) == null) {
|
|
248923
|
+
this.warnDocumentChanged(documentId, fieldId, term);
|
|
248924
|
+
} else if (fieldIndex.get(documentId) <= 1) {
|
|
248925
|
+
if (fieldIndex.size <= 1) {
|
|
248926
|
+
indexData.delete(fieldId);
|
|
248927
|
+
} else {
|
|
248928
|
+
fieldIndex.delete(documentId);
|
|
248929
|
+
}
|
|
248930
|
+
} else {
|
|
248931
|
+
fieldIndex.set(documentId, fieldIndex.get(documentId) - 1);
|
|
248932
|
+
}
|
|
248933
|
+
if (this._index.get(term).size === 0) {
|
|
248934
|
+
this._index.delete(term);
|
|
248935
|
+
}
|
|
248936
|
+
}
|
|
248937
|
+
warnDocumentChanged(shortDocumentId, fieldId, term) {
|
|
248938
|
+
for (const fieldName of Object.keys(this._fieldIds)) {
|
|
248939
|
+
if (this._fieldIds[fieldName] === fieldId) {
|
|
248940
|
+
this._options.logger("warn", `MiniSearch: document with ID ${this._documentIds.get(shortDocumentId)} has changed before removal: term "${term}" was not present in field "${fieldName}". Removing a document after it has changed can corrupt the index!`, "version_conflict");
|
|
248941
|
+
return;
|
|
248942
|
+
}
|
|
248943
|
+
}
|
|
248944
|
+
}
|
|
248945
|
+
addDocumentId(documentId) {
|
|
248946
|
+
const shortDocumentId = this._nextId;
|
|
248947
|
+
this._idToShortId.set(documentId, shortDocumentId);
|
|
248948
|
+
this._documentIds.set(shortDocumentId, documentId);
|
|
248949
|
+
this._documentCount += 1;
|
|
248950
|
+
this._nextId += 1;
|
|
248951
|
+
return shortDocumentId;
|
|
248952
|
+
}
|
|
248953
|
+
addFields(fields) {
|
|
248954
|
+
for (let i = 0;i < fields.length; i++) {
|
|
248955
|
+
this._fieldIds[fields[i]] = i;
|
|
248956
|
+
}
|
|
248957
|
+
}
|
|
248958
|
+
addFieldLength(documentId, fieldId, count, length) {
|
|
248959
|
+
let fieldLengths = this._fieldLength.get(documentId);
|
|
248960
|
+
if (fieldLengths == null)
|
|
248961
|
+
this._fieldLength.set(documentId, fieldLengths = []);
|
|
248962
|
+
fieldLengths[fieldId] = length;
|
|
248963
|
+
const averageFieldLength = this._avgFieldLength[fieldId] || 0;
|
|
248964
|
+
const totalFieldLength = averageFieldLength * count + length;
|
|
248965
|
+
this._avgFieldLength[fieldId] = totalFieldLength / (count + 1);
|
|
248966
|
+
}
|
|
248967
|
+
removeFieldLength(documentId, fieldId, count, length) {
|
|
248968
|
+
if (count === 1) {
|
|
248969
|
+
this._avgFieldLength[fieldId] = 0;
|
|
248970
|
+
return;
|
|
248971
|
+
}
|
|
248972
|
+
const totalFieldLength = this._avgFieldLength[fieldId] * count - length;
|
|
248973
|
+
this._avgFieldLength[fieldId] = totalFieldLength / (count - 1);
|
|
248974
|
+
}
|
|
248975
|
+
saveStoredFields(documentId, doc) {
|
|
248976
|
+
const { storeFields, extractField } = this._options;
|
|
248977
|
+
if (storeFields == null || storeFields.length === 0) {
|
|
248978
|
+
return;
|
|
248979
|
+
}
|
|
248980
|
+
let documentFields = this._storedFields.get(documentId);
|
|
248981
|
+
if (documentFields == null)
|
|
248982
|
+
this._storedFields.set(documentId, documentFields = {});
|
|
248983
|
+
for (const fieldName of storeFields) {
|
|
248984
|
+
const fieldValue = extractField(doc, fieldName);
|
|
248985
|
+
if (fieldValue !== undefined)
|
|
248986
|
+
documentFields[fieldName] = fieldValue;
|
|
248987
|
+
}
|
|
248988
|
+
}
|
|
248989
|
+
}
|
|
248990
|
+
MiniSearch.wildcard = Symbol("*");
|
|
248991
|
+
var getOwnProperty = (object, property) => Object.prototype.hasOwnProperty.call(object, property) ? object[property] : undefined;
|
|
248992
|
+
var combinators = {
|
|
248993
|
+
[OR]: (a, b) => {
|
|
248994
|
+
for (const docId of b.keys()) {
|
|
248995
|
+
const existing = a.get(docId);
|
|
248996
|
+
if (existing == null) {
|
|
248997
|
+
a.set(docId, b.get(docId));
|
|
248998
|
+
} else {
|
|
248999
|
+
const { score, terms, match } = b.get(docId);
|
|
249000
|
+
existing.score = existing.score + score;
|
|
249001
|
+
existing.match = Object.assign(existing.match, match);
|
|
249002
|
+
assignUniqueTerms(existing.terms, terms);
|
|
249003
|
+
}
|
|
249004
|
+
}
|
|
249005
|
+
return a;
|
|
249006
|
+
},
|
|
249007
|
+
[AND]: (a, b) => {
|
|
249008
|
+
const combined = new Map;
|
|
249009
|
+
for (const docId of b.keys()) {
|
|
249010
|
+
const existing = a.get(docId);
|
|
249011
|
+
if (existing == null)
|
|
249012
|
+
continue;
|
|
249013
|
+
const { score, terms, match } = b.get(docId);
|
|
249014
|
+
assignUniqueTerms(existing.terms, terms);
|
|
249015
|
+
combined.set(docId, {
|
|
249016
|
+
score: existing.score + score,
|
|
249017
|
+
terms: existing.terms,
|
|
249018
|
+
match: Object.assign(existing.match, match)
|
|
249019
|
+
});
|
|
249020
|
+
}
|
|
249021
|
+
return combined;
|
|
249022
|
+
},
|
|
249023
|
+
[AND_NOT]: (a, b) => {
|
|
249024
|
+
for (const docId of b.keys())
|
|
249025
|
+
a.delete(docId);
|
|
249026
|
+
return a;
|
|
249027
|
+
}
|
|
249028
|
+
};
|
|
249029
|
+
var defaultBM25params = { k: 1.2, b: 0.7, d: 0.5 };
|
|
249030
|
+
var calcBM25Score = (termFreq, matchingCount, totalCount, fieldLength, avgFieldLength, bm25params) => {
|
|
249031
|
+
const { k, b, d } = bm25params;
|
|
249032
|
+
const invDocFreq = Math.log(1 + (totalCount - matchingCount + 0.5) / (matchingCount + 0.5));
|
|
249033
|
+
return invDocFreq * (d + termFreq * (k + 1) / (termFreq + k * (1 - b + b * fieldLength / avgFieldLength)));
|
|
249034
|
+
};
|
|
249035
|
+
var termToQuerySpec = (options) => (term, i, terms) => {
|
|
249036
|
+
const fuzzy = typeof options.fuzzy === "function" ? options.fuzzy(term, i, terms) : options.fuzzy || false;
|
|
249037
|
+
const prefix = typeof options.prefix === "function" ? options.prefix(term, i, terms) : options.prefix === true;
|
|
249038
|
+
const termBoost = typeof options.boostTerm === "function" ? options.boostTerm(term, i, terms) : 1;
|
|
249039
|
+
return { term, fuzzy, prefix, termBoost };
|
|
249040
|
+
};
|
|
249041
|
+
var defaultOptions = {
|
|
249042
|
+
idField: "id",
|
|
249043
|
+
extractField: (document2, fieldName) => document2[fieldName],
|
|
249044
|
+
tokenize: (text) => text.split(SPACE_OR_PUNCTUATION),
|
|
249045
|
+
processTerm: (term) => term.toLowerCase(),
|
|
249046
|
+
fields: undefined,
|
|
249047
|
+
searchOptions: undefined,
|
|
249048
|
+
storeFields: [],
|
|
249049
|
+
logger: (level, message) => {
|
|
249050
|
+
if (typeof (console === null || console === undefined ? undefined : console[level]) === "function")
|
|
249051
|
+
console[level](message);
|
|
249052
|
+
},
|
|
249053
|
+
autoVacuum: true
|
|
249054
|
+
};
|
|
249055
|
+
var defaultSearchOptions = {
|
|
249056
|
+
combineWith: OR,
|
|
249057
|
+
prefix: false,
|
|
249058
|
+
fuzzy: false,
|
|
249059
|
+
maxFuzzy: 6,
|
|
249060
|
+
boost: {},
|
|
249061
|
+
weights: { fuzzy: 0.45, prefix: 0.375 },
|
|
249062
|
+
bm25: defaultBM25params
|
|
249063
|
+
};
|
|
249064
|
+
var defaultAutoSuggestOptions = {
|
|
249065
|
+
combineWith: AND,
|
|
249066
|
+
prefix: (term, i, terms) => i === terms.length - 1
|
|
249067
|
+
};
|
|
249068
|
+
var defaultVacuumOptions = { batchSize: 1000, batchWait: 10 };
|
|
249069
|
+
var defaultVacuumConditions = { minDirtFactor: 0.1, minDirtCount: 20 };
|
|
249070
|
+
var defaultAutoVacuumOptions = { ...defaultVacuumOptions, ...defaultVacuumConditions };
|
|
249071
|
+
var assignUniqueTerm = (target, term) => {
|
|
249072
|
+
if (!target.includes(term))
|
|
249073
|
+
target.push(term);
|
|
249074
|
+
};
|
|
249075
|
+
var assignUniqueTerms = (target, source) => {
|
|
249076
|
+
for (const term of source) {
|
|
249077
|
+
if (!target.includes(term))
|
|
249078
|
+
target.push(term);
|
|
249079
|
+
}
|
|
249080
|
+
};
|
|
249081
|
+
var byScore = ({ score: a }, { score: b }) => b - a;
|
|
249082
|
+
var createMap = () => new Map;
|
|
249083
|
+
var objectToNumericMap = (object) => {
|
|
249084
|
+
const map = new Map;
|
|
249085
|
+
for (const key of Object.keys(object)) {
|
|
249086
|
+
map.set(parseInt(key, 10), object[key]);
|
|
249087
|
+
}
|
|
249088
|
+
return map;
|
|
249089
|
+
};
|
|
249090
|
+
var objectToNumericMapAsync = async (object) => {
|
|
249091
|
+
const map = new Map;
|
|
249092
|
+
let count = 0;
|
|
249093
|
+
for (const key of Object.keys(object)) {
|
|
249094
|
+
map.set(parseInt(key, 10), object[key]);
|
|
249095
|
+
if (++count % 1000 === 0) {
|
|
249096
|
+
await wait(0);
|
|
249097
|
+
}
|
|
249098
|
+
}
|
|
249099
|
+
return map;
|
|
249100
|
+
};
|
|
249101
|
+
var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
249102
|
+
var SPACE_OR_PUNCTUATION = /[\n\r\p{Z}\p{P}]+/u;
|
|
249103
|
+
|
|
249104
|
+
// src/core/api-spec/search.ts
|
|
249105
|
+
var BOOST = {
|
|
249106
|
+
method: 1,
|
|
249107
|
+
path: 8,
|
|
249108
|
+
summary: 5,
|
|
249109
|
+
description: 2,
|
|
249110
|
+
parameters: 0.5
|
|
249111
|
+
};
|
|
249112
|
+
var MIN_RELATIVE_SCORE = 0.2;
|
|
249113
|
+
var TOKEN_SEPARATOR = /[\n\r\p{Z}\p{P}\p{S}]+/u;
|
|
249114
|
+
var STOPWORDS = new Set("a an and are at be by do does for from how i id in is it its me my of on or our that the this to we what who with you your".split(" "));
|
|
249115
|
+
function tokenize(text) {
|
|
249116
|
+
return text.split(TOKEN_SEPARATOR).filter((word) => word.length >= 2 && !STOPWORDS.has(word.toLowerCase()));
|
|
249117
|
+
}
|
|
249118
|
+
function toOperationSummary(op) {
|
|
249119
|
+
return { endpoint: op.endpoint, summary: op.summary };
|
|
249120
|
+
}
|
|
249121
|
+
function buildSearchIndex(operations) {
|
|
249122
|
+
const index = new MiniSearch({
|
|
249123
|
+
fields: ["method", "path", "summary", "description", "parameters"],
|
|
249124
|
+
tokenize
|
|
249125
|
+
});
|
|
249126
|
+
index.addAll(operations.map((op, id) => ({
|
|
249127
|
+
id,
|
|
249128
|
+
method: op.method,
|
|
249129
|
+
path: op.path.replace(/\{[^}]*\}/g, ""),
|
|
249130
|
+
summary: op.summary,
|
|
249131
|
+
description: op.description,
|
|
249132
|
+
parameters: op.parameterText
|
|
249133
|
+
})));
|
|
249134
|
+
return index;
|
|
249135
|
+
}
|
|
249136
|
+
function summaryMatch(terms, op) {
|
|
249137
|
+
const words = tokenize(op?.summary.toLowerCase() ?? "");
|
|
249138
|
+
const named = (word) => terms.some((term) => word.startsWith(term));
|
|
249139
|
+
return {
|
|
249140
|
+
coverage: terms.filter((term) => words.some((word) => word.startsWith(term))).length / terms.length,
|
|
249141
|
+
precision: words.length ? words.filter(named).length / words.length : 0
|
|
249142
|
+
};
|
|
249143
|
+
}
|
|
249144
|
+
var readsFirst = (op) => op?.method === "GET" ? 0 : 1;
|
|
249145
|
+
function searchOperations(operations, query, options = {}) {
|
|
249146
|
+
const terms = tokenize(query.toLowerCase());
|
|
249147
|
+
if (terms.length === 0) {
|
|
249148
|
+
return [];
|
|
249149
|
+
}
|
|
249150
|
+
const index = buildSearchIndex(operations);
|
|
249151
|
+
const hits = index.search(query, {
|
|
249152
|
+
prefix: (term) => term.length >= 3,
|
|
249153
|
+
fuzzy: (term) => term.length >= 4 ? 0.2 : false,
|
|
249154
|
+
boost: BOOST,
|
|
249155
|
+
filter: options.readOnly ? (hit) => operations[hit.id]?.readOnly === true : undefined
|
|
249156
|
+
}).map((hit) => {
|
|
249157
|
+
const match = summaryMatch(terms, operations[hit.id]);
|
|
249158
|
+
return {
|
|
249159
|
+
...hit,
|
|
249160
|
+
...match,
|
|
249161
|
+
full: match.coverage === 1,
|
|
249162
|
+
score: hit.score * (1 + match.coverage)
|
|
249163
|
+
};
|
|
249164
|
+
}).sort((a, b) => Number(b.full) - Number(a.full) || (a.full ? b.precision - a.precision || readsFirst(operations[a.id]) - readsFirst(operations[b.id]) : 0) || b.score - a.score);
|
|
249165
|
+
const baseline = Math.max(0, ...hits.map((hit) => hit.score)) * MIN_RELATIVE_SCORE;
|
|
249166
|
+
return hits.filter((hit) => hit.full || hit.score >= baseline).slice(0, options.limit ?? 5).flatMap((hit) => {
|
|
249167
|
+
const op = operations[hit.id];
|
|
249168
|
+
return op ? [toOperationSummary(op)] : [];
|
|
249169
|
+
});
|
|
249170
|
+
}
|
|
249171
|
+
|
|
249172
|
+
// src/core/api-spec/catalog.ts
|
|
249173
|
+
var INLINE_AREA_MAX = 2;
|
|
249174
|
+
var AREA_SAMPLE_MAX = 3;
|
|
249175
|
+
var AREA_OPERATIONS_MAX = 200;
|
|
249176
|
+
var byCodePoint = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
249177
|
+
function areaOf(path) {
|
|
249178
|
+
const parts = path.split("/").filter(Boolean);
|
|
249179
|
+
const appIdIndex = parts.indexOf("{app_id}");
|
|
249180
|
+
if (appIdIndex !== -1 && appIdIndex + 1 < parts.length) {
|
|
249181
|
+
return parts[appIdIndex + 1] ?? "other";
|
|
249182
|
+
}
|
|
249183
|
+
if (parts[0] === "api" && parts.length > 1) {
|
|
249184
|
+
return parts[1] ?? "other";
|
|
249185
|
+
}
|
|
249186
|
+
return parts[0] ?? "other";
|
|
249187
|
+
}
|
|
249188
|
+
function groupByArea(operations) {
|
|
249189
|
+
const sorted = [...operations].sort((a, b) => byCodePoint(`${a.method} ${a.path}`, `${b.method} ${b.path}`));
|
|
249190
|
+
const areas = new Map;
|
|
249191
|
+
for (const op of sorted) {
|
|
249192
|
+
const area = areaOf(op.path);
|
|
249193
|
+
areas.set(area, [...areas.get(area) ?? [], op]);
|
|
249194
|
+
}
|
|
249195
|
+
return new Map([...areas].sort(([a], [b]) => byCodePoint(a, b)));
|
|
249196
|
+
}
|
|
249197
|
+
function readsFirst2(ops) {
|
|
249198
|
+
const isRead = (op) => op.method === "GET" ? 0 : 1;
|
|
249199
|
+
return [...ops].sort((a, b) => isRead(a) - isRead(b));
|
|
249200
|
+
}
|
|
249201
|
+
function catalogIndex(operations) {
|
|
249202
|
+
const areas = [...groupByArea(operations)].map(([area, ops]) => ops.length <= INLINE_AREA_MAX ? { area, operations: ops.map(toOperationSummary) } : {
|
|
249203
|
+
area,
|
|
249204
|
+
operationCount: ops.length,
|
|
249205
|
+
sample: readsFirst2(ops).slice(0, AREA_SAMPLE_MAX).map((op) => op.summary)
|
|
249206
|
+
});
|
|
249207
|
+
return { areas, total: operations.length };
|
|
249208
|
+
}
|
|
249209
|
+
function areaListing(area, operations, max = AREA_OPERATIONS_MAX) {
|
|
249210
|
+
return {
|
|
249211
|
+
area,
|
|
249212
|
+
operations: operations.slice(0, max).map(toOperationSummary),
|
|
249213
|
+
total: operations.length,
|
|
249214
|
+
truncated: operations.length > max
|
|
249215
|
+
};
|
|
249216
|
+
}
|
|
249217
|
+
// src/core/api-spec/schema.ts
|
|
249218
|
+
var HTTP_METHODS = [
|
|
249219
|
+
"get",
|
|
249220
|
+
"put",
|
|
249221
|
+
"post",
|
|
249222
|
+
"delete",
|
|
249223
|
+
"patch",
|
|
249224
|
+
"head",
|
|
249225
|
+
"options",
|
|
249226
|
+
"trace"
|
|
249227
|
+
];
|
|
249228
|
+
var ParameterSchema = looseObject({
|
|
249229
|
+
name: string2(),
|
|
249230
|
+
in: string2(),
|
|
249231
|
+
required: boolean2().optional(),
|
|
249232
|
+
description: string2().optional(),
|
|
249233
|
+
schema: unknown().optional(),
|
|
249234
|
+
example: unknown().optional()
|
|
249235
|
+
});
|
|
249236
|
+
var MediaTypesSchema = record(string2(), looseObject({ schema: unknown().optional() }));
|
|
249237
|
+
var MediaContentSchema = looseObject({
|
|
249238
|
+
content: MediaTypesSchema.optional()
|
|
249239
|
+
});
|
|
249240
|
+
var ResponseObjectSchema = looseObject({
|
|
249241
|
+
description: string2().optional(),
|
|
249242
|
+
content: MediaTypesSchema.optional()
|
|
249243
|
+
});
|
|
249244
|
+
var SecurityRequirementSchema = record(string2(), array(string2()));
|
|
249245
|
+
var OperationSchema = looseObject({
|
|
249246
|
+
summary: string2().optional(),
|
|
249247
|
+
description: string2().optional(),
|
|
249248
|
+
operationId: string2().optional(),
|
|
249249
|
+
parameters: array(unknown()).optional(),
|
|
249250
|
+
requestBody: unknown().optional(),
|
|
249251
|
+
responses: record(string2(), unknown()).optional(),
|
|
249252
|
+
security: array(SecurityRequirementSchema).optional()
|
|
249253
|
+
});
|
|
249254
|
+
var OpenApiSpecSchema = looseObject({
|
|
249255
|
+
openapi: string2(),
|
|
249256
|
+
paths: record(string2(), record(string2(), unknown())),
|
|
249257
|
+
components: looseObject({
|
|
249258
|
+
schemas: record(string2(), unknown()).optional()
|
|
249259
|
+
}).optional(),
|
|
249260
|
+
security: array(SecurityRequirementSchema).optional().catch(undefined)
|
|
249261
|
+
});
|
|
249262
|
+
var ParameterListSchema = array(unknown());
|
|
249263
|
+
|
|
249264
|
+
// src/core/api-spec/text.ts
|
|
249265
|
+
var DOCS_CALLOUT = /<(Info|Note|Tip|Check|Warning)>([\s\S]*?)<\/\1>/g;
|
|
249266
|
+
var RELATIVE_LINK = /\[([^\]]+)\]\(\/[^)]*\)/g;
|
|
249267
|
+
function cleanText(text) {
|
|
249268
|
+
return text.replace(DOCS_CALLOUT, (_, kind, body) => kind === "Warning" ? `Warning: ${body}` : body).replace(RELATIVE_LINK, "$1");
|
|
249269
|
+
}
|
|
249270
|
+
|
|
249271
|
+
// src/core/api-spec/operations.ts
|
|
249272
|
+
var PERSONAL_ACCESS_TOKEN_SCHEME = "PersonalAccessTokenAuth";
|
|
249273
|
+
var READ_ONLY_SCOPE = "read_only";
|
|
249274
|
+
function isReadOnly(operation, spec) {
|
|
249275
|
+
const security = operation.security ?? spec.security ?? [];
|
|
249276
|
+
return security.some((requirement) => requirement[PERSONAL_ACCESS_TOKEN_SCHEME]?.includes(READ_ONLY_SCOPE));
|
|
249277
|
+
}
|
|
249278
|
+
function parameterText(operation) {
|
|
249279
|
+
return (operation.parameters ?? []).flatMap((parameter) => {
|
|
249280
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249281
|
+
return parsed.success ? [parsed.data.name, cleanText(parsed.data.description ?? "")] : [];
|
|
249282
|
+
}).join(" ");
|
|
249283
|
+
}
|
|
249284
|
+
var COMPONENT_REF = /^#\/components\/([^/]+)\/([^/]+)$/;
|
|
249285
|
+
function resolveComponentRef(spec, value) {
|
|
249286
|
+
const ref = value !== null && typeof value === "object" ? value.$ref : undefined;
|
|
249287
|
+
const match = typeof ref === "string" ? COMPONENT_REF.exec(ref) : null;
|
|
249288
|
+
if (!match?.[1] || !match[2]) {
|
|
249289
|
+
return value;
|
|
249290
|
+
}
|
|
249291
|
+
const components = spec.components;
|
|
249292
|
+
return components?.[match[1]]?.[match[2]] ?? value;
|
|
249293
|
+
}
|
|
249294
|
+
function mergeParameters(shared, own) {
|
|
249295
|
+
if (!shared?.length) {
|
|
249296
|
+
return own;
|
|
249297
|
+
}
|
|
249298
|
+
const key = (parameter) => {
|
|
249299
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249300
|
+
return parsed.success ? `${parsed.data.in}:${parsed.data.name}` : undefined;
|
|
249301
|
+
};
|
|
249302
|
+
const ownKeys = new Set((own ?? []).map(key));
|
|
249303
|
+
return [
|
|
249304
|
+
...shared.filter((parameter) => !ownKeys.has(key(parameter))),
|
|
249305
|
+
...own ?? []
|
|
249306
|
+
];
|
|
249307
|
+
}
|
|
249308
|
+
function listOperations(spec) {
|
|
249309
|
+
return Object.entries(spec.paths).flatMap(([path, item]) => HTTP_METHODS.flatMap((method) => {
|
|
249310
|
+
const parsed = OperationSchema.safeParse(item[method]);
|
|
249311
|
+
if (!parsed.success) {
|
|
249312
|
+
return [];
|
|
249313
|
+
}
|
|
249314
|
+
const shared = ParameterListSchema.safeParse(item.parameters);
|
|
249315
|
+
const resolve = (list) => list?.map((parameter) => resolveComponentRef(spec, parameter));
|
|
249316
|
+
const operation = {
|
|
249317
|
+
...parsed.data,
|
|
249318
|
+
parameters: mergeParameters(resolve(shared.success ? shared.data : undefined), resolve(parsed.data.parameters))
|
|
249319
|
+
};
|
|
249320
|
+
return [
|
|
249321
|
+
{
|
|
249322
|
+
endpoint: `${method.toUpperCase()} ${path}`,
|
|
249323
|
+
method: method.toUpperCase(),
|
|
249324
|
+
path,
|
|
249325
|
+
summary: operation.summary ?? "",
|
|
249326
|
+
description: cleanText(operation.description ?? ""),
|
|
249327
|
+
parameterText: parameterText(operation),
|
|
249328
|
+
readOnly: isReadOnly(operation, spec),
|
|
249329
|
+
operation
|
|
249330
|
+
}
|
|
249331
|
+
];
|
|
249332
|
+
}));
|
|
249333
|
+
}
|
|
249334
|
+
function pathSegments(path) {
|
|
249335
|
+
const pathname = path.split(/[?#]/, 1)[0] ?? "";
|
|
249336
|
+
return pathname.replace(/^\/+|\/+$/g, "").split("/");
|
|
249337
|
+
}
|
|
249338
|
+
function segmentPattern(segment) {
|
|
249339
|
+
const source = segment.split(/(\{[^}]+\})/).map((part) => part.startsWith("{") ? "[^/]+" : part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("");
|
|
249340
|
+
return new RegExp(`^${source}$`);
|
|
249341
|
+
}
|
|
249342
|
+
function literalSegments(path) {
|
|
249343
|
+
return pathSegments(path).map((segment) => segment.includes("{") ? "0" : "1").join("");
|
|
249344
|
+
}
|
|
249345
|
+
function matchOperation(operations, method, concretePath) {
|
|
249346
|
+
const upperMethod = method.toUpperCase();
|
|
249347
|
+
const segments = pathSegments(concretePath);
|
|
249348
|
+
const candidates = operations.filter((op) => {
|
|
249349
|
+
if (op.method !== upperMethod) {
|
|
249350
|
+
return false;
|
|
249351
|
+
}
|
|
249352
|
+
const template = pathSegments(op.path);
|
|
249353
|
+
return template.length === segments.length && template.every((part, i) => segmentPattern(part).test(segments[i] ?? ""));
|
|
249354
|
+
});
|
|
249355
|
+
return candidates.sort((a, b) => literalSegments(b.path).localeCompare(literalSegments(a.path)))[0];
|
|
249356
|
+
}
|
|
249357
|
+
|
|
249358
|
+
// src/core/api-spec/contract.ts
|
|
249359
|
+
var SCHEMA_REF_PREFIX = "#/components/schemas/";
|
|
249360
|
+
var MAX_REF_DEPTH = 4;
|
|
249361
|
+
function inlineRefs(node, schemas, seen = new Set, depth = 0) {
|
|
249362
|
+
if (depth > MAX_REF_DEPTH) {
|
|
249363
|
+
return node;
|
|
249364
|
+
}
|
|
249365
|
+
if (Array.isArray(node)) {
|
|
249366
|
+
return node.map((item) => inlineRefs(item, schemas, seen, depth));
|
|
249367
|
+
}
|
|
249368
|
+
if (node === null || typeof node !== "object") {
|
|
249369
|
+
return node;
|
|
249370
|
+
}
|
|
249371
|
+
const { $ref, ...siblings } = node;
|
|
249372
|
+
if (typeof $ref === "string" && $ref.startsWith(SCHEMA_REF_PREFIX)) {
|
|
249373
|
+
const name = $ref.slice(SCHEMA_REF_PREFIX.length);
|
|
249374
|
+
if (seen.has(name) || !(name in schemas)) {
|
|
249375
|
+
return node;
|
|
249376
|
+
}
|
|
249377
|
+
const resolved = inlineRefs(schemas[name], schemas, new Set([...seen, name]), depth + 1);
|
|
249378
|
+
return resolved !== null && typeof resolved === "object" ? { ...resolved, ...siblings } : resolved;
|
|
249379
|
+
}
|
|
249380
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [
|
|
249381
|
+
key,
|
|
249382
|
+
inlineRefs(value, schemas, seen, depth)
|
|
249383
|
+
]));
|
|
249384
|
+
}
|
|
249385
|
+
function bodyOf(value) {
|
|
249386
|
+
const parsed = MediaContentSchema.safeParse(value);
|
|
249387
|
+
const content = parsed.success ? parsed.data.content ?? {} : {};
|
|
249388
|
+
const contentType = "application/json" in content ? "application/json" : Object.keys(content)[0];
|
|
249389
|
+
return contentType ? { contentType, schema: content[contentType]?.schema } : {};
|
|
249390
|
+
}
|
|
249391
|
+
function leftoverRefs(node, schemas, found = new Map) {
|
|
249392
|
+
if (Array.isArray(node)) {
|
|
249393
|
+
for (const item of node) {
|
|
249394
|
+
leftoverRefs(item, schemas, found);
|
|
249395
|
+
}
|
|
249396
|
+
} else if (node !== null && typeof node === "object") {
|
|
249397
|
+
for (const [key, value] of Object.entries(node)) {
|
|
249398
|
+
if (key === "$ref" && typeof value === "string" && value.startsWith(SCHEMA_REF_PREFIX) && !found.has(value)) {
|
|
249399
|
+
const schema = schemas[value.slice(SCHEMA_REF_PREFIX.length)];
|
|
249400
|
+
if (schema !== undefined) {
|
|
249401
|
+
found.set(value, schema);
|
|
249402
|
+
leftoverRefs(schema, schemas, found);
|
|
249403
|
+
}
|
|
249404
|
+
} else {
|
|
249405
|
+
leftoverRefs(value, schemas, found);
|
|
249406
|
+
}
|
|
249407
|
+
}
|
|
249408
|
+
}
|
|
249409
|
+
return found;
|
|
249410
|
+
}
|
|
249411
|
+
var SCHEMA_DATA_KEYS = new Set([
|
|
249412
|
+
"example",
|
|
249413
|
+
"examples",
|
|
249414
|
+
"default",
|
|
249415
|
+
"enum",
|
|
249416
|
+
"const"
|
|
249417
|
+
]);
|
|
249418
|
+
function slimSchema(node, isPropertyMap = false) {
|
|
249419
|
+
if (Array.isArray(node)) {
|
|
249420
|
+
return node.map((item) => slimSchema(item));
|
|
249421
|
+
}
|
|
249422
|
+
if (node === null || typeof node !== "object") {
|
|
249423
|
+
return node;
|
|
249424
|
+
}
|
|
249425
|
+
const entries = Object.entries(node);
|
|
249426
|
+
if (isPropertyMap) {
|
|
249427
|
+
return Object.fromEntries(entries.map(([name, value]) => [name, slimSchema(value)]));
|
|
249428
|
+
}
|
|
249429
|
+
const slim = {};
|
|
249430
|
+
for (const [key, value] of entries) {
|
|
249431
|
+
if (key === "title" && typeof value === "string") {
|
|
249432
|
+
continue;
|
|
249433
|
+
}
|
|
249434
|
+
slim[key] = SCHEMA_DATA_KEYS.has(key) ? value : key === "properties" ? slimSchema(value, true) : key === "description" && typeof value === "string" ? cleanText(value) : slimSchema(value);
|
|
249435
|
+
}
|
|
249436
|
+
const { anyOf, ...rest } = slim;
|
|
249437
|
+
const nullable = Array.isArray(anyOf) && anyOf.length === 2 ? nullableType(anyOf) : undefined;
|
|
249438
|
+
return nullable ? { type: [nullable, "null"], ...rest } : slim;
|
|
249439
|
+
}
|
|
249440
|
+
function nullableType(variants) {
|
|
249441
|
+
const types = variants.map((variant) => variant !== null && typeof variant === "object" && Object.keys(variant).length === 1 && typeof variant.type === "string" ? variant.type : undefined);
|
|
249442
|
+
if (types.includes(undefined) || !types.includes("null")) {
|
|
249443
|
+
return;
|
|
249444
|
+
}
|
|
249445
|
+
return types.find((type) => type !== "null");
|
|
249446
|
+
}
|
|
249447
|
+
function getOperationContract(spec, op) {
|
|
249448
|
+
const schemas = spec.components?.schemas ?? {};
|
|
249449
|
+
const inline = (node) => node === undefined ? null : slimSchema(inlineRefs(node, schemas));
|
|
249450
|
+
const responses = Object.entries(op.operation.responses ?? {}).flatMap(([status, response]) => {
|
|
249451
|
+
const parsed = ResponseObjectSchema.safeParse(resolveComponentRef(spec, response));
|
|
249452
|
+
return parsed.success ? [[status, parsed.data]] : [];
|
|
249453
|
+
});
|
|
249454
|
+
const success = responses.filter(([status]) => status.startsWith("2")).sort(([a], [b]) => a.localeCompare(b)).map(([, response]) => bodyOf(response).schema).find(Boolean);
|
|
249455
|
+
const requestBody = bodyOf(resolveComponentRef(spec, op.operation.requestBody));
|
|
249456
|
+
const contract = {
|
|
249457
|
+
endpoint: op.endpoint,
|
|
249458
|
+
method: op.method,
|
|
249459
|
+
path: op.path,
|
|
249460
|
+
summary: op.summary,
|
|
249461
|
+
description: op.description,
|
|
249462
|
+
parameters: (op.operation.parameters ?? []).flatMap((parameter) => {
|
|
249463
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249464
|
+
if (!parsed.success) {
|
|
249465
|
+
return [parameter];
|
|
249466
|
+
}
|
|
249467
|
+
const { name, in: location2, required, schema, description } = parsed.data;
|
|
249468
|
+
const inSchema = schema !== null && typeof schema === "object" && "description" in schema;
|
|
249469
|
+
return [
|
|
249470
|
+
{
|
|
249471
|
+
name,
|
|
249472
|
+
in: location2,
|
|
249473
|
+
required: required ?? false,
|
|
249474
|
+
schema: inline(schema ?? {}),
|
|
249475
|
+
...description && !inSchema ? { description: cleanText(description) } : {},
|
|
249476
|
+
..."example" in parsed.data ? { example: parsed.data.example } : {}
|
|
249477
|
+
}
|
|
249478
|
+
];
|
|
249479
|
+
}),
|
|
249480
|
+
...requestBody.contentType && requestBody.contentType !== "application/json" ? { requestBodyContentType: requestBody.contentType } : {},
|
|
249481
|
+
requestBodySchema: inline(requestBody.schema),
|
|
249482
|
+
responseSchema: inline(success)
|
|
249483
|
+
};
|
|
249484
|
+
const refs = leftoverRefs(contract, schemas);
|
|
249485
|
+
return {
|
|
249486
|
+
...contract,
|
|
249487
|
+
...refs.size > 0 ? {
|
|
249488
|
+
refs: Object.fromEntries([...refs].map(([ref, schema]) => [ref, slimSchema(schema)]))
|
|
249489
|
+
} : {}
|
|
249490
|
+
};
|
|
249491
|
+
}
|
|
249492
|
+
// src/core/api-spec/grep.ts
|
|
249493
|
+
function grepOperations(spec, operations, pattern, options = {}) {
|
|
249494
|
+
const regex = new RegExp(pattern, options.ignoreCase ? "i" : "");
|
|
249495
|
+
return operations.filter((op) => regex.test(JSON.stringify(getOperationContract(spec, op)))).slice(0, options.limit ?? 20).map(toOperationSummary);
|
|
249496
|
+
}
|
|
249497
|
+
// src/core/api-spec/request.ts
|
|
249498
|
+
var MAX_ERROR_BODY_CHARS = 4000;
|
|
249499
|
+
var QUERY_STRING = /\?\S*/g;
|
|
249500
|
+
async function readBody(response) {
|
|
249501
|
+
try {
|
|
249502
|
+
const text = (await response.clone().text()).trim();
|
|
249503
|
+
return text.length > MAX_ERROR_BODY_CHARS ? `${text.slice(0, MAX_ERROR_BODY_CHARS)}…` : text || undefined;
|
|
249504
|
+
} catch {
|
|
249505
|
+
return;
|
|
249506
|
+
}
|
|
249507
|
+
}
|
|
249508
|
+
function normalizePath(path) {
|
|
249509
|
+
const url = new URL(path.replace(/^\/*/, "/"), "http://placeholder");
|
|
249510
|
+
return `${url.pathname}${url.search}`;
|
|
249511
|
+
}
|
|
249512
|
+
async function sendApiRequest(method, path, body) {
|
|
249513
|
+
try {
|
|
249514
|
+
const response = await base44Client(path.replace(/^\/+/, ""), {
|
|
249515
|
+
method,
|
|
249516
|
+
body,
|
|
249517
|
+
headers: typeof body === "string" ? { "Content-Type": "application/json" } : {},
|
|
249518
|
+
timeout: false,
|
|
249519
|
+
retry: { methods: ["get", "head"] }
|
|
249520
|
+
});
|
|
249521
|
+
return {
|
|
249522
|
+
status: response.status,
|
|
249523
|
+
contentType: response.headers.get("content-type") ?? "",
|
|
249524
|
+
body: new Uint8Array(await response.arrayBuffer())
|
|
249525
|
+
};
|
|
249526
|
+
} catch (error) {
|
|
249527
|
+
const apiError = await ApiError.fromHttpError(error, `calling ${method} ${path}`);
|
|
249528
|
+
const response = error instanceof HTTPError ? error.response : undefined;
|
|
249529
|
+
const raw = response ? await readBody(response) : undefined;
|
|
249530
|
+
const retryAfter = response?.headers.get("retry-after") ?? undefined;
|
|
249531
|
+
throw redactedApiError(apiError, raw, method, path, retryAfter);
|
|
249532
|
+
}
|
|
249533
|
+
}
|
|
249534
|
+
function redactedApiError(apiError, raw, method, path, retryAfter) {
|
|
249535
|
+
const wait = retryAfter ? ` (retry after ${/^\d+$/.test(retryAfter) ? `${retryAfter} s` : retryAfter})` : "";
|
|
249536
|
+
const reason = apiError.statusCode !== undefined ? `HTTP ${apiError.statusCode}${wait}` : (apiError.cause?.message ?? "request failed").replace(QUERY_STRING, "");
|
|
249537
|
+
const message = `Error calling ${method} ${path.split("?", 1)[0]}: ${reason}`;
|
|
249538
|
+
return new ApiError(message, {
|
|
249539
|
+
statusCode: apiError.statusCode,
|
|
249540
|
+
requestUrl: apiError.requestUrl?.split("?", 1)[0],
|
|
249541
|
+
requestMethod: apiError.requestMethod,
|
|
249542
|
+
requestId: apiError.requestId,
|
|
249543
|
+
hints: apiError.hints,
|
|
249544
|
+
details: [
|
|
249545
|
+
...raw ? [`Response body: ${raw}`] : apiError.details ?? [],
|
|
249546
|
+
...apiError.requestId ? [`Request ID: ${apiError.requestId}`] : []
|
|
249547
|
+
]
|
|
249548
|
+
});
|
|
249549
|
+
}
|
|
249550
|
+
// src/core/api-spec/spec.ts
|
|
249551
|
+
import { rename, rm, stat as stat3 } from "node:fs/promises";
|
|
249552
|
+
import { join as join22 } from "node:path";
|
|
249553
|
+
var SPEC_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
249554
|
+
function getSpecCachePath(apiUrl = getBase44ApiUrl()) {
|
|
249555
|
+
const server = new URL(apiUrl).host.replace(/[^a-zA-Z0-9.-]/g, "_");
|
|
249556
|
+
return join22(getBase44GlobalDir(), "cache", server, "openapi.json");
|
|
249557
|
+
}
|
|
249558
|
+
function isSpecCacheFresh(mtimeMs, now = Date.now()) {
|
|
249559
|
+
return now - mtimeMs < SPEC_CACHE_TTL_MS;
|
|
249560
|
+
}
|
|
249561
|
+
function parseSpec(text) {
|
|
249562
|
+
let json;
|
|
249563
|
+
try {
|
|
249564
|
+
json = JSON.parse(text);
|
|
249565
|
+
} catch {
|
|
249566
|
+
throw new ApiError("The API spec from the server is not valid JSON");
|
|
249567
|
+
}
|
|
249568
|
+
const result = OpenApiSpecSchema.safeParse(json);
|
|
249569
|
+
if (!result.success) {
|
|
249570
|
+
throw new SchemaValidationError("Invalid API spec", result.error);
|
|
249571
|
+
}
|
|
249572
|
+
return result.data;
|
|
249573
|
+
}
|
|
249574
|
+
var SPEC_DOWNLOAD_TIMEOUT_MS = 60000;
|
|
249575
|
+
async function readFreshCache(path) {
|
|
249576
|
+
try {
|
|
249577
|
+
const { mtimeMs } = await stat3(path);
|
|
249578
|
+
if (!isSpecCacheFresh(mtimeMs)) {
|
|
249579
|
+
return null;
|
|
249580
|
+
}
|
|
249581
|
+
const text = await readTextFile(path);
|
|
249582
|
+
return { text, spec: parseSpec(text) };
|
|
249583
|
+
} catch {
|
|
249584
|
+
return null;
|
|
249585
|
+
}
|
|
249586
|
+
}
|
|
249587
|
+
async function downloadSpec() {
|
|
249588
|
+
try {
|
|
249589
|
+
const response = await base44Client.get("api/openapi.json", {
|
|
249590
|
+
timeout: SPEC_DOWNLOAD_TIMEOUT_MS
|
|
249591
|
+
});
|
|
249592
|
+
return await response.text();
|
|
249593
|
+
} catch (error) {
|
|
249594
|
+
throw await ApiError.fromHttpError(error, "fetching the API spec");
|
|
249595
|
+
}
|
|
249596
|
+
}
|
|
249597
|
+
async function loadSpec(options = {}) {
|
|
249598
|
+
const path = getSpecCachePath();
|
|
249599
|
+
const cached = options.refresh ? null : await readFreshCache(path);
|
|
249600
|
+
if (cached !== null) {
|
|
249601
|
+
return cached;
|
|
249602
|
+
}
|
|
249603
|
+
const text = await downloadSpec();
|
|
249604
|
+
const spec = parseSpec(text);
|
|
249605
|
+
const partial = `${path}.${process.pid}.tmp`;
|
|
249606
|
+
try {
|
|
249607
|
+
await writeFile(partial, text);
|
|
249608
|
+
await rename(partial, path);
|
|
249609
|
+
} catch {
|
|
249610
|
+
await rm(partial, { force: true }).catch(() => {
|
|
249611
|
+
return;
|
|
249612
|
+
});
|
|
249613
|
+
}
|
|
249614
|
+
return { text, spec };
|
|
249615
|
+
}
|
|
249616
|
+
// src/cli/commands/api/shared.ts
|
|
249617
|
+
import { basename as basename6 } from "node:path";
|
|
249618
|
+
function formatJson(value) {
|
|
249619
|
+
return toJsonStdout(value, { compact: !process.stdout.isTTY });
|
|
249620
|
+
}
|
|
249621
|
+
function parseLimit(value) {
|
|
249622
|
+
if (value === undefined) {
|
|
249623
|
+
return;
|
|
249624
|
+
}
|
|
249625
|
+
const n = Number.parseInt(value, 10);
|
|
249626
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
249627
|
+
throw new InvalidInputError("--limit must be a positive integer.");
|
|
249628
|
+
}
|
|
249629
|
+
return n;
|
|
249630
|
+
}
|
|
249631
|
+
var READ_ONLY_FILTER_HELP = "Only read-only operations";
|
|
249632
|
+
var REFRESH_OPTION_HELP = "Fetch the API spec again instead of using the cached copy (kept 1 hour)";
|
|
249633
|
+
function loadSpecTask({ runTask }, refresh) {
|
|
249634
|
+
return runTask("Loading the API spec", () => loadSpec({ refresh }), {
|
|
249635
|
+
successMessage: "Loaded the API spec"
|
|
249636
|
+
});
|
|
249637
|
+
}
|
|
249638
|
+
function operationsInArea(operations, area) {
|
|
249639
|
+
const areas = groupByArea(operations);
|
|
249640
|
+
const inArea = areas.get(area);
|
|
249641
|
+
if (!inArea) {
|
|
249642
|
+
throw new InvalidInputError(`Unknown API area: ${area}`, {
|
|
249643
|
+
details: [`Areas: ${[...areas.keys()].join(", ")}`],
|
|
249644
|
+
hints: [{ message: "List the areas", command: "base44 api catalog" }]
|
|
249645
|
+
});
|
|
249646
|
+
}
|
|
249647
|
+
return inArea;
|
|
249648
|
+
}
|
|
249649
|
+
async function readRequestBody(flag) {
|
|
249650
|
+
if (flag === "@-") {
|
|
249651
|
+
return readStdin("--body @-", { trim: false });
|
|
249652
|
+
}
|
|
249653
|
+
if (flag?.startsWith("@")) {
|
|
249654
|
+
return readTextFile(flag.slice(1));
|
|
249655
|
+
}
|
|
249656
|
+
return flag;
|
|
249657
|
+
}
|
|
249658
|
+
var FORM_FILE = /^@(.+?)(?:;type=([^;]+))?$/;
|
|
249659
|
+
async function readFormBody(fields) {
|
|
249660
|
+
const form = new FormData;
|
|
249661
|
+
for (const field of fields) {
|
|
249662
|
+
const separator = field.indexOf("=");
|
|
249663
|
+
if (separator < 1) {
|
|
249664
|
+
throw new InvalidInputError(`--form takes name=value or name=@file, got "${field}".`);
|
|
249665
|
+
}
|
|
249666
|
+
const name = field.slice(0, separator);
|
|
249667
|
+
const value = field.slice(separator + 1);
|
|
249668
|
+
const file = FORM_FILE.exec(value);
|
|
249669
|
+
if (file?.[1]) {
|
|
249670
|
+
const type = file[2] ?? "application/octet-stream";
|
|
249671
|
+
const blob = new Blob([await readFile(file[1])], { type });
|
|
249672
|
+
form.append(name, blob, basename6(file[1]));
|
|
249673
|
+
} else {
|
|
249674
|
+
form.append(name, value);
|
|
249675
|
+
}
|
|
249676
|
+
}
|
|
249677
|
+
return form;
|
|
249678
|
+
}
|
|
249679
|
+
function withoutQuery(path) {
|
|
249680
|
+
return path.split("?", 1)[0] ?? "";
|
|
249681
|
+
}
|
|
249682
|
+
function reportedFetchCommand(method, path, options) {
|
|
249683
|
+
return {
|
|
249684
|
+
name: "api fetch",
|
|
249685
|
+
args: [method, withoutQuery(path)],
|
|
249686
|
+
options: {
|
|
249687
|
+
...options,
|
|
249688
|
+
...options.body === undefined ? {} : { body: "[not reported]" },
|
|
249689
|
+
...Array.isArray(options.form) && options.form.length > 0 ? { form: "[not reported]" } : {}
|
|
249690
|
+
}
|
|
249691
|
+
};
|
|
249692
|
+
}
|
|
249693
|
+
|
|
249694
|
+
// src/cli/commands/api/catalog.ts
|
|
249695
|
+
async function catalogAction(ctx, area, options) {
|
|
249696
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249697
|
+
const operations = listOperations(spec);
|
|
249698
|
+
const filterReadOnly = (ops) => options.readOnly ? ops.filter((op) => op.readOnly) : ops;
|
|
249699
|
+
if (!area) {
|
|
249700
|
+
return { stdout: formatJson(catalogIndex(filterReadOnly(operations))) };
|
|
249701
|
+
}
|
|
249702
|
+
const inArea = filterReadOnly(operationsInArea(operations, area));
|
|
249703
|
+
return { stdout: formatJson(areaListing(area, inArea)) };
|
|
249704
|
+
}
|
|
249705
|
+
function getApiCatalogCommand() {
|
|
249706
|
+
return new Base44Command("catalog", {
|
|
249707
|
+
requireAuth: false,
|
|
249708
|
+
requireAppContext: false
|
|
249709
|
+
}).description("List the API's areas, or every operation in one area").argument("[area]", 'An area from the list, e.g. "workflows"').option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(catalogAction);
|
|
249710
|
+
}
|
|
249711
|
+
|
|
249712
|
+
// src/cli/commands/api/fetch.ts
|
|
249713
|
+
async function findOperation(ctx, method, path, { refresh, flag }) {
|
|
249714
|
+
const { spec } = await loadSpecTask(ctx, refresh);
|
|
249715
|
+
const op = matchOperation(listOperations(spec), method, path);
|
|
249716
|
+
if (!op) {
|
|
249717
|
+
throw new InvalidInputError(`No operation in the API spec matches ${method} ${withoutQuery(path)}.`, {
|
|
249718
|
+
hints: [
|
|
249719
|
+
{
|
|
249720
|
+
message: "The cached spec may predate this route; fetch it again",
|
|
249721
|
+
command: `base44 api fetch ${method} ${path} ${flag} --refresh`
|
|
249722
|
+
},
|
|
249723
|
+
{
|
|
249724
|
+
message: "Find the operation and its path template",
|
|
249725
|
+
command: 'base44 api search "<what you want to do>"'
|
|
249726
|
+
}
|
|
249727
|
+
]
|
|
249728
|
+
});
|
|
249729
|
+
}
|
|
249730
|
+
return { spec, op };
|
|
249731
|
+
}
|
|
249732
|
+
var ENCODED_SEPARATOR = /%(2f|5c|2e)/i;
|
|
249733
|
+
async function fillAppId(ctx, path, command) {
|
|
249734
|
+
let filled = path;
|
|
249735
|
+
if (withoutQuery(path).includes("{app_id}")) {
|
|
249736
|
+
const { appId } = command.optsWithGlobals();
|
|
249737
|
+
await ensureAppContext(ctx, { appId });
|
|
249738
|
+
filled = path.replaceAll("{app_id}", requireApp(ctx).id);
|
|
249739
|
+
}
|
|
249740
|
+
const placeholder = withoutQuery(filled).match(/\{[^}/]*\}/);
|
|
249741
|
+
if (placeholder) {
|
|
249742
|
+
throw new InvalidInputError(`Replace ${placeholder[0]} in the path with a real value; only {app_id} is filled in.`);
|
|
249743
|
+
}
|
|
249744
|
+
return filled;
|
|
249745
|
+
}
|
|
249746
|
+
var MULTIPART_HINT = "Send this body with --form name=value, and --form name=@path for files.";
|
|
249747
|
+
var CONTRACT_HELP = "The contract is JSON; cut it down with e.g. | jq '.parameters, .requestBodySchema'";
|
|
249748
|
+
var TEXT_CONTENT_TYPES = [
|
|
249749
|
+
"json",
|
|
249750
|
+
"text/",
|
|
249751
|
+
"xml",
|
|
249752
|
+
"javascript",
|
|
249753
|
+
"x-www-form-urlencoded"
|
|
249754
|
+
];
|
|
249755
|
+
function decodeText(body, contentType) {
|
|
249756
|
+
const type = contentType.toLowerCase();
|
|
249757
|
+
if (type && !TEXT_CONTENT_TYPES.some((hint) => type.includes(hint))) {
|
|
249758
|
+
return;
|
|
249759
|
+
}
|
|
249760
|
+
try {
|
|
249761
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(body);
|
|
249762
|
+
} catch {
|
|
249763
|
+
return;
|
|
249764
|
+
}
|
|
249765
|
+
}
|
|
249766
|
+
async function formatResponse({ status, contentType, body }, output, jsonMode) {
|
|
249767
|
+
if (output) {
|
|
249768
|
+
await writeFile(output, body);
|
|
249769
|
+
return formatJson({ status, contentType, bytes: body.length, output });
|
|
249770
|
+
}
|
|
249771
|
+
if (body.length === 0) {
|
|
249772
|
+
return formatJson({ status });
|
|
249773
|
+
}
|
|
249774
|
+
const text = decodeText(body, contentType);
|
|
249775
|
+
if (text === undefined) {
|
|
249776
|
+
return formatJson({
|
|
249777
|
+
status,
|
|
249778
|
+
contentType,
|
|
249779
|
+
bytes: body.length,
|
|
249780
|
+
note: "Binary body not printed; add --output <file> to save it."
|
|
249781
|
+
});
|
|
249782
|
+
}
|
|
249783
|
+
const asIs = text.endsWith(`
|
|
249784
|
+
`) ? text : `${text}
|
|
249785
|
+
`;
|
|
249786
|
+
try {
|
|
249787
|
+
const parsed = JSON.parse(text);
|
|
249788
|
+
return process.stdout.isTTY ? formatJson(parsed) : asIs;
|
|
249789
|
+
} catch {
|
|
249790
|
+
return jsonMode ? formatJson({ status, contentType, body: text }) : asIs;
|
|
249791
|
+
}
|
|
249792
|
+
}
|
|
249793
|
+
async function fetchAction(ctx, methodArg, path, options, command) {
|
|
249794
|
+
ctx.errorReporter.setContext({
|
|
249795
|
+
command: reportedFetchCommand(methodArg ?? "", path ?? "", { ...options })
|
|
249796
|
+
});
|
|
249797
|
+
if (!methodArg || !path) {
|
|
249798
|
+
if (options.help) {
|
|
249799
|
+
const usage = `${command.helpInformation()}
|
|
249800
|
+
${CONTRACT_HELP}
|
|
249801
|
+
`;
|
|
249802
|
+
return { stdout: ctx.jsonMode ? formatJson({ usage }) : usage };
|
|
249803
|
+
}
|
|
249804
|
+
throw new InvalidInputError("Provide a method and a path, e.g. GET /api/apps.");
|
|
249805
|
+
}
|
|
249806
|
+
const method = methodArg.toUpperCase();
|
|
249807
|
+
if (options.help) {
|
|
249808
|
+
const { spec, op } = await findOperation(ctx, method, normalizePath(path), {
|
|
249809
|
+
refresh: options.refresh,
|
|
249810
|
+
flag: "--help"
|
|
249811
|
+
});
|
|
249812
|
+
const contract = getOperationContract(spec, op);
|
|
249813
|
+
return {
|
|
249814
|
+
stdout: formatJson(contract.requestBodyContentType === "multipart/form-data" ? { ...contract, hint: MULTIPART_HINT } : contract)
|
|
249815
|
+
};
|
|
249816
|
+
}
|
|
249817
|
+
const target = normalizePath(await fillAppId(ctx, path, command));
|
|
249818
|
+
if (options.readOnly) {
|
|
249819
|
+
if (ENCODED_SEPARATOR.test(withoutQuery(target))) {
|
|
249820
|
+
throw new InvalidInputError("Refused under --read-only: the path has an encoded /, \\ or ., so it can't be checked. Nothing was sent.");
|
|
249821
|
+
}
|
|
249822
|
+
const { op } = await findOperation(ctx, method, target, {
|
|
249823
|
+
refresh: options.refresh,
|
|
249824
|
+
flag: "--read-only"
|
|
249825
|
+
});
|
|
249826
|
+
if (!op.readOnly) {
|
|
249827
|
+
throw new InvalidInputError(`Refused under --read-only: ${op.method} ${op.path} is not a read-only operation. Nothing was sent.`);
|
|
249828
|
+
}
|
|
249829
|
+
}
|
|
249830
|
+
if (options.body !== undefined && options.form.length > 0) {
|
|
249831
|
+
throw new InvalidInputError("Use --body or --form, not both.");
|
|
249832
|
+
}
|
|
249833
|
+
await ensureAuth(ctx);
|
|
249834
|
+
const body = options.form.length > 0 ? await readFormBody(options.form) : await readRequestBody(options.body);
|
|
249835
|
+
const response = await ctx.runTask(`Calling ${method} ${target}`, () => sendApiRequest(method, target, body), {
|
|
249836
|
+
successMessage: `Called ${method} ${target}`,
|
|
249837
|
+
errorMessage: "Request failed"
|
|
249838
|
+
});
|
|
249839
|
+
return {
|
|
249840
|
+
stdout: await formatResponse(response, options.output, ctx.jsonMode)
|
|
249841
|
+
};
|
|
249842
|
+
}
|
|
249843
|
+
function getApiFetchCommand() {
|
|
249844
|
+
return new Base44Command("fetch", {
|
|
249845
|
+
requireAuth: false,
|
|
249846
|
+
requireAppContext: false
|
|
249847
|
+
}).description("Call a Base44 API operation; add --help after a path for its contract").helpOption(false).argument("[method]", "HTTP method, e.g. GET or POST").argument("[path]", 'Path with any query string; {app_id} is filled from --app-id or the project, e.g. "/api/apps/{app_id}/workflows/runs?status=failed"').option("--body <json>", "Request body: JSON, @file.json, or @- to read it from stdin").option("--form <field>", "Multipart field: name=value, or name=@file to attach a file (repeatable)", (field, fields) => [...fields, field], []).option("--output <file>", "Save the response body to a file").option("--read-only", "Refuse, before sending, any operation the spec does not mark read-only").option("--refresh", REFRESH_OPTION_HELP).option("-h, --help", "With a method and path, print that operation's contract; otherwise this help").addHelpText("after", `
|
|
249848
|
+
${CONTRACT_HELP}`).action(fetchAction);
|
|
249849
|
+
}
|
|
249850
|
+
|
|
249851
|
+
// src/cli/commands/api/grep.ts
|
|
249852
|
+
function assertValidRegex(pattern) {
|
|
249853
|
+
try {
|
|
249854
|
+
new RegExp(pattern);
|
|
249855
|
+
} catch (error) {
|
|
249856
|
+
throw new InvalidInputError(`Invalid regular expression: ${error instanceof Error ? error.message : pattern}`);
|
|
249857
|
+
}
|
|
249858
|
+
}
|
|
249859
|
+
async function grepAction(ctx, pattern, options) {
|
|
249860
|
+
const limit = parseLimit(options.limit);
|
|
249861
|
+
assertValidRegex(pattern);
|
|
249862
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249863
|
+
let operations = listOperations(spec);
|
|
249864
|
+
if (options.area) {
|
|
249865
|
+
operations = operationsInArea(operations, options.area);
|
|
249866
|
+
}
|
|
249867
|
+
if (options.readOnly) {
|
|
249868
|
+
operations = operations.filter((op) => op.readOnly);
|
|
249869
|
+
}
|
|
249870
|
+
const hits = grepOperations(spec, operations, pattern, {
|
|
249871
|
+
ignoreCase: options.ignoreCase,
|
|
249872
|
+
limit
|
|
249873
|
+
});
|
|
249874
|
+
return { stdout: formatJson(hits) };
|
|
249875
|
+
}
|
|
249876
|
+
function getApiGrepCommand() {
|
|
249877
|
+
return new Base44Command("grep", {
|
|
249878
|
+
requireAuth: false,
|
|
249879
|
+
requireAppContext: false
|
|
249880
|
+
}).description("Search the API spec with a regular expression, for when search misses").argument("<pattern>", `Regular expression over each operation's contract as JSON text (quotes and newlines appear escaped), e.g. "runs.*status"`).option("--area <area>", "Search only one area's operations (see base44 api catalog)").option("-i, --ignore-case", "Case-insensitive match").option("--limit <n>", "Most operations to return (default 20)").option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(grepAction);
|
|
249881
|
+
}
|
|
249882
|
+
|
|
249883
|
+
// src/cli/commands/api/search.ts
|
|
249884
|
+
async function searchAction(ctx, words, options) {
|
|
249885
|
+
const limit = parseLimit(options.limit);
|
|
249886
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249887
|
+
const results = searchOperations(listOperations(spec), words.join(" "), {
|
|
249888
|
+
limit,
|
|
249889
|
+
readOnly: options.readOnly
|
|
249890
|
+
});
|
|
249891
|
+
return { stdout: formatJson(results) };
|
|
249892
|
+
}
|
|
249893
|
+
function getApiSearchCommand() {
|
|
249894
|
+
return new Base44Command("search", {
|
|
249895
|
+
requireAuth: false,
|
|
249896
|
+
requireAppContext: false
|
|
249897
|
+
}).description("Search every Base44 API operation by what it does").argument("<text...>", 'What you are looking for, e.g. "failed workflow runs"').option("--limit <n>", "Most results to return (default 5)").option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(searchAction);
|
|
249898
|
+
}
|
|
249899
|
+
|
|
249900
|
+
// src/cli/commands/api/index.ts
|
|
249901
|
+
function getApiCommand() {
|
|
249902
|
+
return new Command2("api").description("Search and call any public Base44 API operation").addCommand(getApiCatalogCommand()).addCommand(getApiSearchCommand()).addCommand(getApiGrepCommand()).addCommand(getApiFetchCommand());
|
|
249903
|
+
}
|
|
249904
|
+
|
|
248044
249905
|
// src/cli/commands/auth/password-login.ts
|
|
248045
|
-
import { dirname as dirname16, join as
|
|
249906
|
+
import { dirname as dirname16, join as join23 } from "node:path";
|
|
248046
249907
|
async function passwordLoginAction({ log, runTask }, action) {
|
|
248047
249908
|
const shouldEnable = action === "enable";
|
|
248048
249909
|
const { project } = await readProjectConfig();
|
|
248049
249910
|
const configDir = dirname16(project.configPath);
|
|
248050
|
-
const authDir =
|
|
249911
|
+
const authDir = join23(configDir, project.authDir);
|
|
248051
249912
|
const updated = await runTask("Updating local auth config", async () => {
|
|
248052
249913
|
const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
|
|
248053
249914
|
const merged = { ...current, enableUsernamePassword: shouldEnable };
|
|
@@ -248067,14 +249928,14 @@ function getPasswordLoginCommand() {
|
|
|
248067
249928
|
}
|
|
248068
249929
|
|
|
248069
249930
|
// src/cli/commands/auth/pull.ts
|
|
248070
|
-
import { dirname as dirname17, join as
|
|
249931
|
+
import { dirname as dirname17, join as join24 } from "node:path";
|
|
248071
249932
|
async function pullAuthAction({
|
|
248072
249933
|
log,
|
|
248073
249934
|
runTask
|
|
248074
249935
|
}) {
|
|
248075
249936
|
const { project } = await readProjectConfig();
|
|
248076
249937
|
const configDir = dirname17(project.configPath);
|
|
248077
|
-
const authDir =
|
|
249938
|
+
const authDir = join24(configDir, project.authDir);
|
|
248078
249939
|
const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
|
|
248079
249940
|
return await pullAuthConfig();
|
|
248080
249941
|
}, {
|
|
@@ -248138,7 +249999,7 @@ function getAuthPushCommand() {
|
|
|
248138
249999
|
}
|
|
248139
250000
|
|
|
248140
250001
|
// src/cli/commands/auth/social-login.ts
|
|
248141
|
-
import { dirname as dirname18, join as
|
|
250002
|
+
import { dirname as dirname18, join as join25, resolve as resolve7 } from "node:path";
|
|
248142
250003
|
var PROVIDER_LABELS = {
|
|
248143
250004
|
google: "Google",
|
|
248144
250005
|
microsoft: "Microsoft",
|
|
@@ -248209,7 +250070,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
|
|
|
248209
250070
|
}
|
|
248210
250071
|
const { project } = await readProjectConfig();
|
|
248211
250072
|
const configDir = dirname18(project.configPath);
|
|
248212
|
-
const authDir =
|
|
250073
|
+
const authDir = join25(configDir, project.authDir);
|
|
248213
250074
|
const { config: updated } = await runTask("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
|
|
248214
250075
|
if (clientSecret) {
|
|
248215
250076
|
await runTask("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
|
|
@@ -248234,7 +250095,7 @@ function getSocialLoginCommand() {
|
|
|
248234
250095
|
}
|
|
248235
250096
|
|
|
248236
250097
|
// src/cli/commands/auth/sso.ts
|
|
248237
|
-
import { dirname as dirname19, join as
|
|
250098
|
+
import { dirname as dirname19, join as join26, resolve as resolve8 } from "node:path";
|
|
248238
250099
|
var SSOConfigFileSchema = object({
|
|
248239
250100
|
provider: _enum(Object.values(KNOWN_SSO_PROVIDERS)),
|
|
248240
250101
|
clientId: string2(),
|
|
@@ -248398,7 +250259,7 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
|
|
|
248398
250259
|
}
|
|
248399
250260
|
const { project } = await readProjectConfig();
|
|
248400
250261
|
const configDir = dirname19(project.configPath);
|
|
248401
|
-
const authDir =
|
|
250262
|
+
const authDir = join26(configDir, project.authDir);
|
|
248402
250263
|
await runTask("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
|
|
248403
250264
|
await runTask("Saving SSO credentials", async () => pushSSOSecrets(secrets));
|
|
248404
250265
|
return {
|
|
@@ -248414,7 +250275,7 @@ async function ssoDisableAction({ log, runTask }, options) {
|
|
|
248414
250275
|
}
|
|
248415
250276
|
const { project } = await readProjectConfig();
|
|
248416
250277
|
const configDir = dirname19(project.configPath);
|
|
248417
|
-
const authDir =
|
|
250278
|
+
const authDir = join26(configDir, project.authDir);
|
|
248418
250279
|
const updated = await runTask("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
|
|
248419
250280
|
await runTask("Removing SSO credentials", async () => deleteSSOSecrets());
|
|
248420
250281
|
if (!hasAnyLoginMethod(updated)) {
|
|
@@ -249296,13 +251157,13 @@ function getConnectorsListAvailableCommand() {
|
|
|
249296
251157
|
}
|
|
249297
251158
|
|
|
249298
251159
|
// src/cli/commands/connectors/pull.ts
|
|
249299
|
-
import { dirname as dirname20, join as
|
|
251160
|
+
import { dirname as dirname20, join as join27, resolve as resolve9 } from "node:path";
|
|
249300
251161
|
async function resolveConnectorsDir(options) {
|
|
249301
251162
|
if (!getAppContext().projectRoot) {
|
|
249302
251163
|
return resolve9(options.dir ?? "connectors");
|
|
249303
251164
|
}
|
|
249304
251165
|
const { project } = await readProjectConfig();
|
|
249305
|
-
return
|
|
251166
|
+
return join27(dirname20(project.configPath), project.connectorsDir);
|
|
249306
251167
|
}
|
|
249307
251168
|
async function pullConnectorsAction({ log, runTask, jsonMode }, options) {
|
|
249308
251169
|
const connectorsDir = await resolveConnectorsDir(options);
|
|
@@ -249689,11 +251550,11 @@ function getListCommand() {
|
|
|
249689
251550
|
}
|
|
249690
251551
|
|
|
249691
251552
|
// src/cli/commands/functions/pull.ts
|
|
249692
|
-
import { dirname as dirname21, join as
|
|
251553
|
+
import { dirname as dirname21, join as join28 } from "node:path";
|
|
249693
251554
|
async function pullFunctionsAction({ log, runTask }, name) {
|
|
249694
251555
|
const { project, functions } = await readProjectConfig();
|
|
249695
251556
|
const configDir = dirname21(project.configPath);
|
|
249696
|
-
const functionsDir =
|
|
251557
|
+
const functionsDir = join28(configDir, project.functionsDir);
|
|
249697
251558
|
const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
|
|
249698
251559
|
const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
|
|
249699
251560
|
const { functions } = await listDeployedFunctions();
|
|
@@ -249803,11 +251664,11 @@ function getBuildCommand() {
|
|
|
249803
251664
|
}
|
|
249804
251665
|
|
|
249805
251666
|
// src/cli/commands/project/create.ts
|
|
249806
|
-
import { basename as
|
|
251667
|
+
import { basename as basename7, resolve as resolve11 } from "node:path";
|
|
249807
251668
|
var import_kebabCase = __toESM(require_kebabCase(), 1);
|
|
249808
251669
|
|
|
249809
251670
|
// src/cli/commands/project/scaffold-shared.ts
|
|
249810
|
-
import { join as
|
|
251671
|
+
import { join as join29 } from "node:path";
|
|
249811
251672
|
var DEFAULT_TEMPLATE_ID = "backend-only";
|
|
249812
251673
|
async function getTemplateById(templateId) {
|
|
249813
251674
|
const templates = await listTemplates();
|
|
@@ -249870,7 +251731,7 @@ async function completeProjectSetup({
|
|
|
249870
251731
|
env: { VITE_BASE44_APP_ID: projectId }
|
|
249871
251732
|
})`${buildCommand}`;
|
|
249872
251733
|
updateMessage("Deploying site...");
|
|
249873
|
-
return await deploySite(
|
|
251734
|
+
return await deploySite(join29(resolvedPath, outputDirectory));
|
|
249874
251735
|
}, {
|
|
249875
251736
|
successMessage: theme.colors.base44Orange("Site deployed successfully"),
|
|
249876
251737
|
errorMessage: "Failed to deploy site"
|
|
@@ -249968,8 +251829,8 @@ async function createInteractive(options, ctx) {
|
|
|
249968
251829
|
name: () => {
|
|
249969
251830
|
return options.name ? Promise.resolve(options.name) : Ze({
|
|
249970
251831
|
message: "What is the name of your project?",
|
|
249971
|
-
placeholder:
|
|
249972
|
-
initialValue:
|
|
251832
|
+
placeholder: basename7(process.cwd()),
|
|
251833
|
+
initialValue: basename7(process.cwd()),
|
|
249973
251834
|
validate: (value) => {
|
|
249974
251835
|
if (!value || value.trim().length === 0) {
|
|
249975
251836
|
return "Every project deserves a name";
|
|
@@ -250664,7 +252525,7 @@ function getLogsCommand() {
|
|
|
250664
252525
|
}
|
|
250665
252526
|
|
|
250666
252527
|
// src/cli/commands/project/scaffold.ts
|
|
250667
|
-
import { basename as
|
|
252528
|
+
import { basename as basename8, resolve as resolve12 } from "node:path";
|
|
250668
252529
|
function resolveAppId(options) {
|
|
250669
252530
|
const appId = options.appId;
|
|
250670
252531
|
if (!appId) {
|
|
@@ -250681,7 +252542,7 @@ async function scaffoldAction(ctx, name, options, command) {
|
|
|
250681
252542
|
const { log, runTask } = ctx;
|
|
250682
252543
|
const appId = resolveAppId(command.optsWithGlobals());
|
|
250683
252544
|
const resolvedPath = resolve12("./");
|
|
250684
|
-
const projectName = (name ??
|
|
252545
|
+
const projectName = (name ?? basename8(resolvedPath)).trim();
|
|
250685
252546
|
const template = await getTemplateById("backend-only");
|
|
250686
252547
|
log.info(`Scaffolding project at ${resolvedPath}`);
|
|
250687
252548
|
const { projectId } = await runTask("Setting up your project...", async () => {
|
|
@@ -250886,7 +252747,7 @@ async function setEnvironmentVersion(environment, versionId, options = {}) {
|
|
|
250886
252747
|
}
|
|
250887
252748
|
// src/core/version/artifacts.ts
|
|
250888
252749
|
import { createHash as createHash3 } from "node:crypto";
|
|
250889
|
-
import { join as
|
|
252750
|
+
import { join as join30, resolve as resolve13 } from "node:path";
|
|
250890
252751
|
|
|
250891
252752
|
// src/core/version/functions.ts
|
|
250892
252753
|
import { createHash as createHash2 } from "node:crypto";
|
|
@@ -253161,10 +255022,6 @@ var STATIC_EGRESS_ENABLED_ENV = "BASE44_STATIC_EGRESS_ENABLED";
|
|
|
253161
255022
|
var STATIC_EGRESS_DIAGNOSTIC_LIMIT = 5;
|
|
253162
255023
|
var staticEgressFetchInstalled = false;
|
|
253163
255024
|
var staticEgressDiagnosticCount = 0;
|
|
253164
|
-
var dedicatedEgressResponses = /* @__PURE__ */ new WeakSet();
|
|
253165
|
-
function isDedicatedEgressResponse(response) {
|
|
253166
|
-
return dedicatedEgressResponses.has(response);
|
|
253167
|
-
}
|
|
253168
255025
|
function inputKind(input) {
|
|
253169
255026
|
if (typeof input === "string") return "string";
|
|
253170
255027
|
return input instanceof URL ? "url" : "request";
|
|
@@ -253266,10 +255123,7 @@ function createRequestScopedStaticEgressFetch(originalFetch, readEnvironment) {
|
|
|
253266
255123
|
return originalFetch(input, init);
|
|
253267
255124
|
}
|
|
253268
255125
|
logStaticEgressDecision("dedicated", input, binding, enableSecret);
|
|
253269
|
-
return binding.fetch(input, init)
|
|
253270
|
-
dedicatedEgressResponses.add(response);
|
|
253271
|
-
return response;
|
|
253272
|
-
});
|
|
255126
|
+
return binding.fetch(input, init);
|
|
253273
255127
|
};
|
|
253274
255128
|
}
|
|
253275
255129
|
function installStaticEgressFetch() {
|
|
@@ -253281,128 +255135,6 @@ function installStaticEgressFetch() {
|
|
|
253281
255135
|
staticEgressFetchInstalled = true;
|
|
253282
255136
|
}
|
|
253283
255137
|
|
|
253284
|
-
// src/edge-errors.ts
|
|
253285
|
-
var EDGE_ERRORS_HEADER = "X-B44-Edge-Errors";
|
|
253286
|
-
var MAX_EDGE_ERRORS = 5;
|
|
253287
|
-
var MAX_INSPECTED_BODY_BYTES = 8192;
|
|
253288
|
-
var BODY_READ_TIMEOUT_MS = 500;
|
|
253289
|
-
var PLAIN_TEXT_EDGE_ERROR = /^error code: (\\d{3,4})\\s*$/;
|
|
253290
|
-
var UNBRANDED_5XX_PAGE = /<center>cloudflare<\\/center>/i;
|
|
253291
|
-
var SAFE_VALUE = /^[\\x20-\\x7e]{1,253}$/;
|
|
253292
|
-
function safe(value) {
|
|
253293
|
-
return typeof value === "string" && SAFE_VALUE.test(value) ? value : void 0;
|
|
253294
|
-
}
|
|
253295
|
-
function parseEdgeErrorBody(body, status) {
|
|
253296
|
-
const plain = PLAIN_TEXT_EDGE_ERROR.exec(body);
|
|
253297
|
-
if (plain) return { code: Number(plain[1]) };
|
|
253298
|
-
if (status >= 500 && UNBRANDED_5XX_PAGE.test(body)) return { code: status };
|
|
253299
|
-
try {
|
|
253300
|
-
const json = JSON.parse(body);
|
|
253301
|
-
if (json === null || typeof json !== "object") return null;
|
|
253302
|
-
const fields = json;
|
|
253303
|
-
if (fields.cloudflare_error !== true || !Number.isInteger(fields.error_code)) return null;
|
|
253304
|
-
return {
|
|
253305
|
-
code: fields.error_code,
|
|
253306
|
-
name: safe(fields.error_name),
|
|
253307
|
-
category: safe(fields.error_category),
|
|
253308
|
-
zone: safe(fields.zone)
|
|
253309
|
-
};
|
|
253310
|
-
} catch {
|
|
253311
|
-
return null;
|
|
253312
|
-
}
|
|
253313
|
-
}
|
|
253314
|
-
async function readBodyPrefix(response) {
|
|
253315
|
-
if (Number(response.headers.get("content-length")) > MAX_INSPECTED_BODY_BYTES) return null;
|
|
253316
|
-
const reader = response.clone().body?.getReader();
|
|
253317
|
-
if (!reader) return "";
|
|
253318
|
-
const timer = setTimeout(() => reader.cancel().catch(() => {
|
|
253319
|
-
}), BODY_READ_TIMEOUT_MS);
|
|
253320
|
-
const decoder = new TextDecoder();
|
|
253321
|
-
let text = "";
|
|
253322
|
-
let size = 0;
|
|
253323
|
-
try {
|
|
253324
|
-
for (; ; ) {
|
|
253325
|
-
const { done, value } = await reader.read();
|
|
253326
|
-
if (done) break;
|
|
253327
|
-
size += value.byteLength;
|
|
253328
|
-
if (size > MAX_INSPECTED_BODY_BYTES) return null;
|
|
253329
|
-
text += decoder.decode(value, { stream: true });
|
|
253330
|
-
}
|
|
253331
|
-
} catch {
|
|
253332
|
-
return null;
|
|
253333
|
-
} finally {
|
|
253334
|
-
clearTimeout(timer);
|
|
253335
|
-
reader.cancel().catch(() => {
|
|
253336
|
-
});
|
|
253337
|
-
}
|
|
253338
|
-
return text + decoder.decode();
|
|
253339
|
-
}
|
|
253340
|
-
async function readEdgeError(response) {
|
|
253341
|
-
if (response.status < 400 || !response.headers.get("cf-ray")) return null;
|
|
253342
|
-
if (response.headers.get("cf-mitigated") === "challenge") {
|
|
253343
|
-
return { code: response.status, name: "challenge" };
|
|
253344
|
-
}
|
|
253345
|
-
const body = await readBodyPrefix(response);
|
|
253346
|
-
return body === null ? null : parseEdgeErrorBody(body, response.status);
|
|
253347
|
-
}
|
|
253348
|
-
function targetOrigin(input) {
|
|
253349
|
-
try {
|
|
253350
|
-
const raw = input instanceof URL ? input.href : typeof input === "string" ? input : input.url;
|
|
253351
|
-
return new URL(raw).origin;
|
|
253352
|
-
} catch {
|
|
253353
|
-
return null;
|
|
253354
|
-
}
|
|
253355
|
-
}
|
|
253356
|
-
async function recordEdgeError(input, response, startedAt) {
|
|
253357
|
-
const store = currentWorkerRuntimeContext();
|
|
253358
|
-
if (!store) return;
|
|
253359
|
-
const body = await readEdgeError(response);
|
|
253360
|
-
const target = targetOrigin(input);
|
|
253361
|
-
if (!body || !target) return;
|
|
253362
|
-
const record = store.edgeErrors ??= { errors: [], dropped: 0 };
|
|
253363
|
-
if (record.errors.length >= MAX_EDGE_ERRORS) {
|
|
253364
|
-
record.dropped += 1;
|
|
253365
|
-
return;
|
|
253366
|
-
}
|
|
253367
|
-
record.errors.push({
|
|
253368
|
-
...body,
|
|
253369
|
-
target,
|
|
253370
|
-
status: response.status,
|
|
253371
|
-
ray: safe(response.headers.get("cf-ray")) ?? "",
|
|
253372
|
-
egress: isDedicatedEgressResponse(response) ? "dedicated" : "shared",
|
|
253373
|
-
elapsed_ms: Date.now() - startedAt
|
|
253374
|
-
});
|
|
253375
|
-
}
|
|
253376
|
-
function createEdgeErrorFetch(innerFetch) {
|
|
253377
|
-
return async (input, init) => {
|
|
253378
|
-
const startedAt = Date.now();
|
|
253379
|
-
const response = await innerFetch(input, init);
|
|
253380
|
-
try {
|
|
253381
|
-
await recordEdgeError(input, response, startedAt);
|
|
253382
|
-
} catch {
|
|
253383
|
-
}
|
|
253384
|
-
return response;
|
|
253385
|
-
};
|
|
253386
|
-
}
|
|
253387
|
-
var edgeErrorFetchInstalled = false;
|
|
253388
|
-
function installEdgeErrorFetch() {
|
|
253389
|
-
if (edgeErrorFetchInstalled) return;
|
|
253390
|
-
globalThis.fetch = createEdgeErrorFetch(globalThis.fetch.bind(globalThis));
|
|
253391
|
-
edgeErrorFetchInstalled = true;
|
|
253392
|
-
}
|
|
253393
|
-
function attachEdgeErrors(response) {
|
|
253394
|
-
const record = currentWorkerRuntimeContext()?.edgeErrors;
|
|
253395
|
-
if (!record || !(response instanceof Response)) return response;
|
|
253396
|
-
if (response.status === 101 || response.webSocket) return response;
|
|
253397
|
-
try {
|
|
253398
|
-
const wrapped = new Response(response.body, response);
|
|
253399
|
-
wrapped.headers.set(EDGE_ERRORS_HEADER, JSON.stringify(record));
|
|
253400
|
-
return wrapped;
|
|
253401
|
-
} catch {
|
|
253402
|
-
return response;
|
|
253403
|
-
}
|
|
253404
|
-
}
|
|
253405
|
-
|
|
253406
255138
|
// src/static-egress-tcp-core.mjs
|
|
253407
255139
|
function normalizeHost(host) {
|
|
253408
255140
|
return host.toLowerCase().replace(/^\\[(.*)\\]$/, "$1").replace(/\\.$/, "");
|
|
@@ -253531,6 +255263,12 @@ var deno2 = Object.freeze({
|
|
|
253531
255263
|
});
|
|
253532
255264
|
globalThis.Deno = deno2;
|
|
253533
255265
|
globalThis.Buffer = Buffer2;
|
|
255266
|
+
try {
|
|
255267
|
+
new AsyncLocalStorage().enterWith(void 0);
|
|
255268
|
+
} catch {
|
|
255269
|
+
AsyncLocalStorage.prototype.enterWith = () => {
|
|
255270
|
+
};
|
|
255271
|
+
}
|
|
253534
255272
|
function getRegisteredHandler() {
|
|
253535
255273
|
return registeredHandler;
|
|
253536
255274
|
}
|
|
@@ -253556,9 +255294,7 @@ function resolveHandler(functionName) {
|
|
|
253556
255294
|
return handler;
|
|
253557
255295
|
}
|
|
253558
255296
|
export {
|
|
253559
|
-
attachEdgeErrors,
|
|
253560
255297
|
getRegisteredHandler,
|
|
253561
|
-
installEdgeErrorFetch,
|
|
253562
255298
|
installStaticEgressFetch,
|
|
253563
255299
|
registerLazy,
|
|
253564
255300
|
resolveHandler
|
|
@@ -256498,7 +258234,7 @@ var TELEMETRY_PATCH = [
|
|
|
256498
258234
|
var TELEMETRY_STORE_FIELDS = "reqId: crypto.randomUUID(), respondedAt: null, inflight: new Map(), inflightTotal: 0, hadRejection: false, hadNonOk: false, logBudget: 5";
|
|
256499
258235
|
|
|
256500
258236
|
// ../functions-compiler/src/version.ts
|
|
256501
|
-
var COMPILER_VERSION = "0.1.
|
|
258237
|
+
var COMPILER_VERSION = "0.1.8";
|
|
256502
258238
|
|
|
256503
258239
|
// ../functions-compiler/src/worker-entry.ts
|
|
256504
258240
|
function denoShimSource() {
|
|
@@ -256603,22 +258339,20 @@ registerLazy(${JSON.stringify(functionName)}, () => import(${JSON.stringify(user
|
|
|
256603
258339
|
function buildAppEntrySource(functionModules, telemetry, runtimeSecrets = false) {
|
|
256604
258340
|
const moduleImports = functionModules.map((file) => `import "./${file}";`).join(`
|
|
256605
258341
|
`);
|
|
256606
|
-
const handlerExpr = `_b44AttachInvocationLogs(
|
|
258342
|
+
const handlerExpr = `_b44AttachInvocationLogs(${telemetry ? "_b44AttachTelemetry(await handler(request, info))" : "await handler(request, info)"})`;
|
|
256607
258343
|
const guard = activationGuard(runtimeSecrets);
|
|
256608
258344
|
const returnExpr = guard(handlerExpr);
|
|
256609
258345
|
return `// Auto-generated by the base44 bundler. Do not edit.
|
|
256610
258346
|
|
|
256611
258347
|
import { currentWorkerRuntimeContext as _b44Context, runWithWorkerEnvironment as _b44Run } from ${JSON.stringify(RUNTIME_CONTEXT_SPECIFIER)};
|
|
256612
|
-
import {
|
|
258348
|
+
import { installStaticEgressFetch, resolveHandler } from "./${SHIM_FILENAME}";${activationImport(runtimeSecrets)}
|
|
256613
258349
|
${moduleImports}
|
|
256614
258350
|
|
|
256615
258351
|
${consolePatch(runtimeSecrets)}
|
|
256616
258352
|
${INVOCATION_LOGS_PATCH}
|
|
256617
|
-
// Static egress reads workerEnv from the active request store. Install it
|
|
256618
|
-
//
|
|
256619
|
-
// fetch wrapper.
|
|
258353
|
+
// Static egress reads workerEnv from the active request store. Install it
|
|
258354
|
+
// before telemetry so telemetry remains the outermost fetch wrapper.
|
|
256620
258355
|
installStaticEgressFetch();
|
|
256621
|
-
installEdgeErrorFetch();
|
|
256622
258356
|
${telemetry ? TELEMETRY_PATCH : ""}
|
|
256623
258357
|
|
|
256624
258358
|
export default {
|
|
@@ -260703,7 +262437,7 @@ var nativeEnumType = ZodNativeEnum.create;
|
|
|
260703
262437
|
var promiseType = ZodPromise.create;
|
|
260704
262438
|
var effectsType = ZodEffects.create;
|
|
260705
262439
|
var optionalType = ZodOptional2.create;
|
|
260706
|
-
var
|
|
262440
|
+
var nullableType2 = ZodNullable2.create;
|
|
260707
262441
|
var preprocessType = ZodEffects.createWithPreprocess;
|
|
260708
262442
|
var pipelineType = ZodPipeline.create;
|
|
260709
262443
|
// ../functions-compiler/src/contracts.ts
|
|
@@ -260733,7 +262467,7 @@ var bundleAppRequestSchema = objectType({
|
|
|
260733
262467
|
var ACTIVATION_MODE = "pull";
|
|
260734
262468
|
|
|
260735
262469
|
// ../functions-compiler/src/deno-bundle.ts
|
|
260736
|
-
import { mkdtemp, rm, writeFile as writeFile2 } from "node:fs/promises";
|
|
262470
|
+
import { mkdtemp, rm as rm2, writeFile as writeFile2 } from "node:fs/promises";
|
|
260737
262471
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
260738
262472
|
import path21 from "node:path";
|
|
260739
262473
|
|
|
@@ -261124,6 +262858,174 @@ function runtimeVirtualPlugin() {
|
|
|
261124
262858
|
};
|
|
261125
262859
|
}
|
|
261126
262860
|
|
|
262861
|
+
// ../functions-compiler/src/esbuild/ws-native-virtual.ts
|
|
262862
|
+
var NAMESPACE4 = "base44-ws-native";
|
|
262863
|
+
var WS_SPECIFIER = /^(npm:)?ws(@[^/]+)?$/;
|
|
262864
|
+
var ADAPTER = `"use strict";
|
|
262865
|
+
const toBuffer = (value) => (globalThis.Buffer ? globalThis.Buffer.from(value) : value);
|
|
262866
|
+
const READY_STATES = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
|
|
262867
|
+
const later = (fn, ...args) => queueMicrotask(() => fn(...args));
|
|
262868
|
+
const upgradeHeaders = (options) => {
|
|
262869
|
+
const headers = new Headers(options?.headers);
|
|
262870
|
+
for (const name of headers.keys()) if (name !== "user-agent") return headers;
|
|
262871
|
+
return null;
|
|
262872
|
+
};
|
|
262873
|
+
class WebSocket {
|
|
262874
|
+
static CONNECTING = 0;
|
|
262875
|
+
static OPEN = 1;
|
|
262876
|
+
static CLOSING = 2;
|
|
262877
|
+
static CLOSED = 3;
|
|
262878
|
+
#socket = null;
|
|
262879
|
+
#state = 0;
|
|
262880
|
+
#url;
|
|
262881
|
+
#closeRequested = null;
|
|
262882
|
+
#terminated = false;
|
|
262883
|
+
#listeners = new Map();
|
|
262884
|
+
constructor(address, protocols, options) {
|
|
262885
|
+
if (protocols && typeof protocols === "object" && !Array.isArray(protocols)) {
|
|
262886
|
+
options = protocols;
|
|
262887
|
+
protocols = undefined;
|
|
262888
|
+
}
|
|
262889
|
+
this.#url = String(address);
|
|
262890
|
+
const headers = upgradeHeaders(options);
|
|
262891
|
+
if (headers) {
|
|
262892
|
+
this.#upgrade(headers, protocols);
|
|
262893
|
+
} else {
|
|
262894
|
+
this.#attach(new globalThis.WebSocket(this.#url, protocols));
|
|
262895
|
+
}
|
|
262896
|
+
}
|
|
262897
|
+
get readyState() {
|
|
262898
|
+
if (this.#terminated) return 3;
|
|
262899
|
+
return this.#socket ? this.#socket.readyState : this.#state;
|
|
262900
|
+
}
|
|
262901
|
+
get url() { return this.#url; }
|
|
262902
|
+
get protocol() { return this.#socket ? this.#socket.protocol ?? "" : ""; }
|
|
262903
|
+
on(name, listener) { return this.#add(name, listener, false); }
|
|
262904
|
+
addListener(name, listener) { return this.#add(name, listener, false); }
|
|
262905
|
+
once(name, listener) { return this.#add(name, listener, true); }
|
|
262906
|
+
off(name, listener) { return this.removeListener(name, listener); }
|
|
262907
|
+
removeListener(name, listener) {
|
|
262908
|
+
const listeners = this.#listeners.get(name);
|
|
262909
|
+
if (listeners) this.#listeners.set(name, listeners.filter((entry) => entry.listener !== listener));
|
|
262910
|
+
return this;
|
|
262911
|
+
}
|
|
262912
|
+
removeAllListeners(name) {
|
|
262913
|
+
if (name === undefined) this.#listeners.clear();
|
|
262914
|
+
else this.#listeners.delete(name);
|
|
262915
|
+
return this;
|
|
262916
|
+
}
|
|
262917
|
+
emit(name, ...args) {
|
|
262918
|
+
const listeners = this.#listeners.get(name) ?? [];
|
|
262919
|
+
this.#listeners.set(name, listeners.filter((entry) => !entry.once));
|
|
262920
|
+
for (const entry of listeners) entry.listener.apply(this, args);
|
|
262921
|
+
return listeners.length > 0;
|
|
262922
|
+
}
|
|
262923
|
+
send(data, options, callback) {
|
|
262924
|
+
const done = typeof options === "function" ? options : callback;
|
|
262925
|
+
try {
|
|
262926
|
+
if (!this.#socket) {
|
|
262927
|
+
throw new Error("WebSocket is not open: readyState " + this.#state + " (" + READY_STATES[this.#state] + ")");
|
|
262928
|
+
}
|
|
262929
|
+
this.#socket.send(data);
|
|
262930
|
+
done?.();
|
|
262931
|
+
} catch (error) {
|
|
262932
|
+
if (!done) throw error;
|
|
262933
|
+
done(error);
|
|
262934
|
+
}
|
|
262935
|
+
}
|
|
262936
|
+
close(code, reason) {
|
|
262937
|
+
if (this.#socket) this.#socket.close(code, reason);
|
|
262938
|
+
else if (this.#state === 0) {
|
|
262939
|
+
// Upgrade still in flight: close as soon as it lands.
|
|
262940
|
+
this.#closeRequested = [code, reason];
|
|
262941
|
+
this.#state = 2;
|
|
262942
|
+
}
|
|
262943
|
+
}
|
|
262944
|
+
// \`ws\` tears the connection down at once. workerd has no abrupt close, so the
|
|
262945
|
+
// socket is closed normally and "close" is reported now, not on the reply.
|
|
262946
|
+
terminate() {
|
|
262947
|
+
if (this.#terminated || this.readyState === 3) return;
|
|
262948
|
+
this.#terminated = true;
|
|
262949
|
+
if (this.#socket) {
|
|
262950
|
+
try { this.#socket.close(); } catch {}
|
|
262951
|
+
} else {
|
|
262952
|
+
// Upgrade still in flight: close it on arrival, without an "open".
|
|
262953
|
+
this.#closeRequested = [];
|
|
262954
|
+
this.#state = 3;
|
|
262955
|
+
}
|
|
262956
|
+
later(() => this.emit("close", 1006, toBuffer("")));
|
|
262957
|
+
}
|
|
262958
|
+
#attach(socket) {
|
|
262959
|
+
this.#socket = socket;
|
|
262960
|
+
try { socket.binaryType = "arraybuffer"; } catch {}
|
|
262961
|
+
socket.addEventListener("open", () => this.emit("open"));
|
|
262962
|
+
socket.addEventListener("message", (event) => {
|
|
262963
|
+
const isBinary = typeof event.data !== "string";
|
|
262964
|
+
this.emit("message", toBuffer(isBinary ? new Uint8Array(event.data) : event.data), isBinary);
|
|
262965
|
+
});
|
|
262966
|
+
socket.addEventListener("error", (event) => this.emit("error", event.error ?? new Error(event.message || "WebSocket error")));
|
|
262967
|
+
socket.addEventListener("close", (event) => {
|
|
262968
|
+
if (!this.#terminated) this.emit("close", event.code, toBuffer(event.reason ?? ""));
|
|
262969
|
+
});
|
|
262970
|
+
}
|
|
262971
|
+
#upgrade(headers, protocols) {
|
|
262972
|
+
headers.set("Upgrade", "websocket");
|
|
262973
|
+
if (protocols) headers.set("Sec-WebSocket-Protocol", [].concat(protocols).join(", "));
|
|
262974
|
+
const httpUrl = this.#url.replace(/^ws(s?):/i, "http$1:");
|
|
262975
|
+
const fail = (error) => {
|
|
262976
|
+
this.#state = 3;
|
|
262977
|
+
if (this.#terminated) return;
|
|
262978
|
+
this.emit("error", error);
|
|
262979
|
+
this.emit("close", 1006, toBuffer(""));
|
|
262980
|
+
};
|
|
262981
|
+
// Two-argument then(): an exception from an "open" listener must not be
|
|
262982
|
+
// reported as a failed upgrade.
|
|
262983
|
+
fetch(httpUrl, { headers }).then((response) => {
|
|
262984
|
+
const socket = response.webSocket;
|
|
262985
|
+
if (!socket) {
|
|
262986
|
+
response.body?.cancel();
|
|
262987
|
+
return fail(new Error("Unexpected server response: " + response.status));
|
|
262988
|
+
}
|
|
262989
|
+
socket.accept();
|
|
262990
|
+
this.#attach(socket);
|
|
262991
|
+
if (this.#closeRequested) return socket.close(...this.#closeRequested);
|
|
262992
|
+
// accept() opens the socket without dispatching an "open" event.
|
|
262993
|
+
this.emit("open");
|
|
262994
|
+
}, fail);
|
|
262995
|
+
}
|
|
262996
|
+
#add(name, listener, once) {
|
|
262997
|
+
const listeners = this.#listeners.get(name) ?? [];
|
|
262998
|
+
listeners.push({ listener, once });
|
|
262999
|
+
this.#listeners.set(name, listeners);
|
|
263000
|
+
return this;
|
|
263001
|
+
}
|
|
263002
|
+
}
|
|
263003
|
+
class WebSocketServer {
|
|
263004
|
+
constructor() {
|
|
263005
|
+
throw new Error("ws WebSocketServer is not available in Base44 functions: a function can open WebSocket connections but cannot listen for them.");
|
|
263006
|
+
}
|
|
263007
|
+
}
|
|
263008
|
+
module.exports = WebSocket;
|
|
263009
|
+
module.exports.WebSocket = WebSocket;
|
|
263010
|
+
module.exports.WebSocketServer = WebSocketServer;
|
|
263011
|
+
module.exports.default = WebSocket;
|
|
263012
|
+
`;
|
|
263013
|
+
function wsNativeVirtualPlugin() {
|
|
263014
|
+
return {
|
|
263015
|
+
name: "base44-ws-native",
|
|
263016
|
+
setup(build) {
|
|
263017
|
+
build.onResolve({ filter: WS_SPECIFIER }, () => ({
|
|
263018
|
+
path: "ws",
|
|
263019
|
+
namespace: NAMESPACE4
|
|
263020
|
+
}));
|
|
263021
|
+
build.onLoad({ filter: /.*/, namespace: NAMESPACE4 }, () => ({
|
|
263022
|
+
contents: ADAPTER,
|
|
263023
|
+
loader: "js"
|
|
263024
|
+
}));
|
|
263025
|
+
}
|
|
263026
|
+
};
|
|
263027
|
+
}
|
|
263028
|
+
|
|
261127
263029
|
// ../functions-compiler/src/deno-bundle.ts
|
|
261128
263030
|
async function bundleToModule(prepared, nodeModulesDir = "none") {
|
|
261129
263031
|
const dir = await mkdtemp(path21.join(tmpdir2(), "b44-bundle-"));
|
|
@@ -261147,6 +263049,7 @@ async function bundleToModule(prepared, nodeModulesDir = "none") {
|
|
|
261147
263049
|
sourcemap: false,
|
|
261148
263050
|
logLevel: "silent",
|
|
261149
263051
|
plugins: [
|
|
263052
|
+
wsNativeVirtualPlugin(),
|
|
261150
263053
|
nodeBuiltinRequirePlugin(),
|
|
261151
263054
|
userFilesPlugin(prepared.files, prepared.entry),
|
|
261152
263055
|
privateDataSourcesVirtualPlugin(),
|
|
@@ -261171,7 +263074,7 @@ async function bundleToModule(prepared, nodeModulesDir = "none") {
|
|
|
261171
263074
|
warnings: result.warnings.map((w) => w.text)
|
|
261172
263075
|
};
|
|
261173
263076
|
} finally {
|
|
261174
|
-
await
|
|
263077
|
+
await rm2(dir, { recursive: true, force: true });
|
|
261175
263078
|
}
|
|
261176
263079
|
}
|
|
261177
263080
|
function buildFailureErrors(e, dir) {
|
|
@@ -261771,14 +263674,14 @@ async function readRawResources(dir) {
|
|
|
261771
263674
|
const payloads = {};
|
|
261772
263675
|
for (const relativePath of files.sort()) {
|
|
261773
263676
|
const name = relativePath.replace(/\.jsonc?$/, "");
|
|
261774
|
-
payloads[name] = await readJsonFile(
|
|
263677
|
+
payloads[name] = await readJsonFile(join30(dir, ...relativePath.split("/")));
|
|
261775
263678
|
}
|
|
261776
263679
|
return payloads;
|
|
261777
263680
|
}
|
|
261778
263681
|
async function collectResources(configDir, dirs) {
|
|
261779
263682
|
const [entities, agents] = await Promise.all([
|
|
261780
|
-
readRawResources(
|
|
261781
|
-
readRawResources(
|
|
263683
|
+
readRawResources(join30(configDir, dirs.entitiesDir)),
|
|
263684
|
+
readRawResources(join30(configDir, dirs.agentsDir))
|
|
261782
263685
|
]);
|
|
261783
263686
|
return { entities, agents };
|
|
261784
263687
|
}
|
|
@@ -261790,7 +263693,7 @@ async function collectArtifacts(target) {
|
|
|
261790
263693
|
entryFile: ENTRY2
|
|
261791
263694
|
}),
|
|
261792
263695
|
...siteWorker ? { siteWorker } : {},
|
|
261793
|
-
backendBundles: await tagStep2("build", () => compileBackendBundles(target.root,
|
|
263696
|
+
backendBundles: await tagStep2("build", () => compileBackendBundles(target.root, join30(target.configDir, target.functionsDir))),
|
|
261794
263697
|
...await collectResources(target.configDir, target)
|
|
261795
263698
|
};
|
|
261796
263699
|
}
|
|
@@ -262007,7 +263910,7 @@ function writeFile3(appId, params) {
|
|
|
262007
263910
|
function editFile(appId, params) {
|
|
262008
263911
|
return callTool(appId, "edit_file", { ...params }, EditFileResponseSchema, `editing file "${params.path}"`);
|
|
262009
263912
|
}
|
|
262010
|
-
function
|
|
263913
|
+
function grep2(appId, params) {
|
|
262011
263914
|
return callTool(appId, "grep", { ...params }, GrepResponseSchema, "searching files");
|
|
262012
263915
|
}
|
|
262013
263916
|
function runCommand(appId, params) {
|
|
@@ -262111,10 +264014,10 @@ Examples:
|
|
|
262111
264014
|
}
|
|
262112
264015
|
|
|
262113
264016
|
// src/cli/commands/sandbox/grep.ts
|
|
262114
|
-
async function
|
|
264017
|
+
async function grepAction2({ runTask, branchId }, pattern, options) {
|
|
262115
264018
|
const { id: appId } = getAppContext();
|
|
262116
264019
|
const maxResults = parsePositiveInt(options.maxResults, "--max-results");
|
|
262117
|
-
const result = await runTask("Searching files", () =>
|
|
264020
|
+
const result = await runTask("Searching files", () => grep2(appId, {
|
|
262118
264021
|
pattern,
|
|
262119
264022
|
path: options.path,
|
|
262120
264023
|
is_regex: options.regex,
|
|
@@ -262126,7 +264029,7 @@ async function grepAction({ runTask, branchId }, pattern, options) {
|
|
|
262126
264029
|
return { outroMessage: "Searched files", stdout: toJsonStdout(result) };
|
|
262127
264030
|
}
|
|
262128
264031
|
function getSandboxGrepCommand() {
|
|
262129
|
-
return new Base44Command("grep", { supportsBranch: true }).description("Search files for a pattern in an app's remote sandbox").argument("<pattern>", "Search pattern").option("--path <path>", "Subtree to search, relative to the app root").option("--no-regex", "Treat the pattern as a literal string, not a regex").option("--case-sensitive", "Case-sensitive match").option("--glob <glob>", 'File glob filter, e.g. "*.tsx"').option("--max-results <n>", "Maximum number of match lines to return").action(
|
|
264032
|
+
return new Base44Command("grep", { supportsBranch: true }).description("Search files for a pattern in an app's remote sandbox").argument("<pattern>", "Search pattern").option("--path <path>", "Subtree to search, relative to the app root").option("--no-regex", "Treat the pattern as a literal string, not a regex").option("--case-sensitive", "Case-sensitive match").option("--glob <glob>", 'File glob filter, e.g. "*.tsx"').option("--max-results <n>", "Maximum number of match lines to return").action(grepAction2);
|
|
262130
264033
|
}
|
|
262131
264034
|
|
|
262132
264035
|
// src/cli/commands/sandbox/list-directory.ts
|
|
@@ -262721,10 +264624,10 @@ function toPascalCase(name) {
|
|
|
262721
264624
|
return name.split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join("");
|
|
262722
264625
|
}
|
|
262723
264626
|
// src/core/types/update-project.ts
|
|
262724
|
-
import { join as
|
|
264627
|
+
import { join as join34 } from "node:path";
|
|
262725
264628
|
var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
|
|
262726
264629
|
async function updateProjectConfig(projectRoot) {
|
|
262727
|
-
const tsconfigPath =
|
|
264630
|
+
const tsconfigPath = join34(projectRoot, "tsconfig.json");
|
|
262728
264631
|
if (!await pathExists(tsconfigPath)) {
|
|
262729
264632
|
return false;
|
|
262730
264633
|
}
|
|
@@ -262943,7 +264846,7 @@ function rethrowLegacyAppAsExplanation(error) {
|
|
|
262943
264846
|
|
|
262944
264847
|
// src/cli/commands/workflows/limit.ts
|
|
262945
264848
|
var MAX_LIMIT = 200;
|
|
262946
|
-
function
|
|
264849
|
+
function parseLimit2(limit) {
|
|
262947
264850
|
if (limit === undefined)
|
|
262948
264851
|
return;
|
|
262949
264852
|
const parsed = Number.parseInt(limit, 10);
|
|
@@ -262960,7 +264863,7 @@ function formatWorkflowLine(workflow) {
|
|
|
262960
264863
|
return `${workflow.name} [${workflow.status}] runs: ${workflow.totalRuns}, ${lastRun}${failures}`;
|
|
262961
264864
|
}
|
|
262962
264865
|
async function listAction({ log, runTask, jsonMode }, options) {
|
|
262963
|
-
const limit =
|
|
264866
|
+
const limit = parseLimit2(options.limit);
|
|
262964
264867
|
const workflows = await runTask("Fetching workflows from Base44", async () => listWorkflows(limit).catch(rethrowLegacyAppAsExplanation), {
|
|
262965
264868
|
successMessage: "Workflows fetched successfully",
|
|
262966
264869
|
errorMessage: "Failed to fetch workflows"
|
|
@@ -263019,7 +264922,7 @@ async function describeEmptyResult(hasFilters) {
|
|
|
263019
264922
|
return hasFilters ? `No runs match your filters. Workflows in this app: ${names}.` : `No runs yet. Workflows in this app: ${names}.`;
|
|
263020
264923
|
}
|
|
263021
264924
|
async function runsAction(ctx, options) {
|
|
263022
|
-
const limit =
|
|
264925
|
+
const limit = parseLimit2(options.limit);
|
|
263023
264926
|
const runs = await ctx.runTask("Fetching workflow runs from Base44", async () => listWorkflowRuns({
|
|
263024
264927
|
status: options.status,
|
|
263025
264928
|
since: options.since,
|
|
@@ -263205,7 +265108,7 @@ function getWorkspaceCommand() {
|
|
|
263205
265108
|
// src/cli/dev/dev-server/main.ts
|
|
263206
265109
|
var import_cors = __toESM(require_lib4(), 1);
|
|
263207
265110
|
var import_express6 = __toESM(require_express(), 1);
|
|
263208
|
-
import { dirname as dirname27, join as
|
|
265111
|
+
import { dirname as dirname27, join as join39 } from "node:path";
|
|
263209
265112
|
|
|
263210
265113
|
// ../../node_modules/get-port/index.js
|
|
263211
265114
|
import net from "node:net";
|
|
@@ -263335,7 +265238,7 @@ var $tmpName = promisify12(tmp.tmpName);
|
|
|
263335
265238
|
|
|
263336
265239
|
// src/cli/dev/dev-server/function-manager.ts
|
|
263337
265240
|
import { spawn as spawn3 } from "node:child_process";
|
|
263338
|
-
import { dirname as dirname24, join as
|
|
265241
|
+
import { dirname as dirname24, join as join35 } from "node:path";
|
|
263339
265242
|
import { pathToFileURL as pathToFileURL6 } from "node:url";
|
|
263340
265243
|
|
|
263341
265244
|
// src/cli/dev/dev-server/base-function-manager.ts
|
|
@@ -263440,7 +265343,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
263440
265343
|
}
|
|
263441
265344
|
spawnFunction(func, port) {
|
|
263442
265345
|
this.logger.log(`Spawning function "${func.name}" on port ${port}`);
|
|
263443
|
-
const importMapPath =
|
|
265346
|
+
const importMapPath = join35(dirname24(this.wrapperPath), "import-map.json");
|
|
263444
265347
|
const process2 = spawn3("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
|
|
263445
265348
|
env: {
|
|
263446
265349
|
...globalThis.process.env,
|
|
@@ -263514,7 +265417,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
263514
265417
|
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
263515
265418
|
import { isBuiltin as isBuiltin3 } from "node:module";
|
|
263516
265419
|
import { homedir as homedir4 } from "node:os";
|
|
263517
|
-
import { join as
|
|
265420
|
+
import { join as join36 } from "node:path";
|
|
263518
265421
|
import { pathToFileURL as pathToFileURL7 } from "node:url";
|
|
263519
265422
|
var depsPromise;
|
|
263520
265423
|
function loadDeps() {
|
|
@@ -263635,9 +265538,9 @@ export default {
|
|
|
263635
265538
|
};
|
|
263636
265539
|
`;
|
|
263637
265540
|
function ensureBundlerConfig() {
|
|
263638
|
-
const dir =
|
|
265541
|
+
const dir = join36(homedir4(), ".base44", "function-bundler");
|
|
263639
265542
|
mkdirSync2(dir, { recursive: true });
|
|
263640
|
-
const configPath =
|
|
265543
|
+
const configPath = join36(dir, "deno.json");
|
|
263641
265544
|
writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
|
|
263642
265545
|
`);
|
|
263643
265546
|
return configPath;
|
|
@@ -265174,11 +267077,11 @@ import { relative as relative10 } from "node:path";
|
|
|
265174
267077
|
// ../../node_modules/chokidar/index.js
|
|
265175
267078
|
import { EventEmitter as EventEmitter3 } from "node:events";
|
|
265176
267079
|
import { stat as statcb, Stats } from "node:fs";
|
|
265177
|
-
import { readdir as readdir3, stat as
|
|
267080
|
+
import { readdir as readdir3, stat as stat7 } from "node:fs/promises";
|
|
265178
267081
|
import * as sp3 from "node:path";
|
|
265179
267082
|
|
|
265180
267083
|
// ../../node_modules/readdirp/index.js
|
|
265181
|
-
import { lstat as lstat2, readdir as readdir2, realpath, stat as
|
|
267084
|
+
import { lstat as lstat2, readdir as readdir2, realpath, stat as stat5 } from "node:fs/promises";
|
|
265182
267085
|
import { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from "node:path";
|
|
265183
267086
|
import { Readable as Readable6 } from "node:stream";
|
|
265184
267087
|
var EntryTypes = {
|
|
@@ -265187,7 +267090,7 @@ var EntryTypes = {
|
|
|
265187
267090
|
FILE_DIR_TYPE: "files_directories",
|
|
265188
267091
|
EVERYTHING_TYPE: "all"
|
|
265189
267092
|
};
|
|
265190
|
-
var
|
|
267093
|
+
var defaultOptions2 = {
|
|
265191
267094
|
root: ".",
|
|
265192
267095
|
fileFilter: (_entryInfo) => true,
|
|
265193
267096
|
directoryFilter: (_entryInfo) => true,
|
|
@@ -265197,7 +267100,7 @@ var defaultOptions = {
|
|
|
265197
267100
|
alwaysStat: false,
|
|
265198
267101
|
highWaterMark: 4096
|
|
265199
267102
|
};
|
|
265200
|
-
Object.freeze(
|
|
267103
|
+
Object.freeze(defaultOptions2);
|
|
265201
267104
|
var RECURSIVE_ERROR_CODE = "READDIRP_RECURSIVE_ERROR";
|
|
265202
267105
|
var NORMAL_FLOW_ERRORS = new Set(["ENOENT", "EPERM", "EACCES", "ELOOP", RECURSIVE_ERROR_CODE]);
|
|
265203
267106
|
var ALL_TYPES = [
|
|
@@ -265256,17 +267159,17 @@ class ReaddirpStream extends Readable6 {
|
|
|
265256
267159
|
autoDestroy: true,
|
|
265257
267160
|
highWaterMark: options.highWaterMark
|
|
265258
267161
|
});
|
|
265259
|
-
const opts = { ...
|
|
267162
|
+
const opts = { ...defaultOptions2, ...options };
|
|
265260
267163
|
const { root, type } = opts;
|
|
265261
267164
|
this._fileFilter = normalizeFilter(opts.fileFilter);
|
|
265262
267165
|
this._directoryFilter = normalizeFilter(opts.directoryFilter);
|
|
265263
|
-
const statMethod = opts.lstat ? lstat2 :
|
|
267166
|
+
const statMethod = opts.lstat ? lstat2 : stat5;
|
|
265264
267167
|
if (wantBigintFsStats) {
|
|
265265
267168
|
this._stat = (path) => statMethod(path, { bigint: true });
|
|
265266
267169
|
} else {
|
|
265267
267170
|
this._stat = statMethod;
|
|
265268
267171
|
}
|
|
265269
|
-
this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth :
|
|
267172
|
+
this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions2.depth;
|
|
265270
267173
|
this._wantsDir = type ? DIR_TYPES.has(type) : false;
|
|
265271
267174
|
this._wantsFile = type ? FILE_TYPES2.has(type) : false;
|
|
265272
267175
|
this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
|
|
@@ -265413,7 +267316,7 @@ function readdirp(root, options = {}) {
|
|
|
265413
267316
|
|
|
265414
267317
|
// ../../node_modules/chokidar/handler.js
|
|
265415
267318
|
import { watch as fs_watch, unwatchFile, watchFile } from "node:fs";
|
|
265416
|
-
import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as
|
|
267319
|
+
import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat6 } from "node:fs/promises";
|
|
265417
267320
|
import { type as osType } from "node:os";
|
|
265418
267321
|
import * as sp2 from "node:path";
|
|
265419
267322
|
var STR_DATA = "data";
|
|
@@ -265439,7 +267342,7 @@ var EVENTS = {
|
|
|
265439
267342
|
};
|
|
265440
267343
|
var EV = EVENTS;
|
|
265441
267344
|
var THROTTLE_MODE_WATCH = "watch";
|
|
265442
|
-
var statMethods = { lstat: lstat3, stat:
|
|
267345
|
+
var statMethods = { lstat: lstat3, stat: stat6 };
|
|
265443
267346
|
var KEY_LISTENERS = "listeners";
|
|
265444
267347
|
var KEY_ERR = "errHandlers";
|
|
265445
267348
|
var KEY_RAW = "rawEmitters";
|
|
@@ -265910,7 +267813,7 @@ class NodeFsHandler {
|
|
|
265910
267813
|
return;
|
|
265911
267814
|
if (!newStats || newStats.mtimeMs === 0) {
|
|
265912
267815
|
try {
|
|
265913
|
-
const newStats = await
|
|
267816
|
+
const newStats = await stat6(file);
|
|
265914
267817
|
if (this.fsw.closed)
|
|
265915
267818
|
return;
|
|
265916
267819
|
const at = newStats.atimeMs;
|
|
@@ -266162,7 +268065,7 @@ function createPattern(matcher) {
|
|
|
266162
268065
|
}
|
|
266163
268066
|
return () => false;
|
|
266164
268067
|
}
|
|
266165
|
-
function
|
|
268068
|
+
function normalizePath2(path) {
|
|
266166
268069
|
if (typeof path !== "string")
|
|
266167
268070
|
throw new Error("string expected");
|
|
266168
268071
|
path = sp3.normalize(path);
|
|
@@ -266176,7 +268079,7 @@ function normalizePath(path) {
|
|
|
266176
268079
|
return path;
|
|
266177
268080
|
}
|
|
266178
268081
|
function matchPatterns(patterns, testString, stats) {
|
|
266179
|
-
const path =
|
|
268082
|
+
const path = normalizePath2(testString);
|
|
266180
268083
|
for (let index = 0;index < patterns.length; index++) {
|
|
266181
268084
|
const pattern = patterns[index];
|
|
266182
268085
|
if (pattern(path, stats)) {
|
|
@@ -266582,7 +268485,7 @@ class FSWatcher extends EventEmitter3 {
|
|
|
266582
268485
|
const fullPath = opts.cwd ? sp3.join(opts.cwd, path) : path;
|
|
266583
268486
|
let stats;
|
|
266584
268487
|
try {
|
|
266585
|
-
stats = await
|
|
268488
|
+
stats = await stat7(fullPath);
|
|
266586
268489
|
} catch (err) {}
|
|
266587
268490
|
if (!stats || this.closed)
|
|
266588
268491
|
return;
|
|
@@ -266966,8 +268869,8 @@ async function createDevServer(options) {
|
|
|
266966
268869
|
broadcastEntityEvent(io, appId, entityName, event);
|
|
266967
268870
|
};
|
|
266968
268871
|
const base44ConfigWatcher = new WatchBase44({
|
|
266969
|
-
functions:
|
|
266970
|
-
entities:
|
|
268872
|
+
functions: join39(dirname27(project.configPath), project.functionsDir),
|
|
268873
|
+
entities: join39(dirname27(project.configPath), project.entitiesDir)
|
|
266971
268874
|
}, devLogger);
|
|
266972
268875
|
base44ConfigWatcher.on("change", async (name) => {
|
|
266973
268876
|
try {
|
|
@@ -267170,7 +269073,7 @@ function readExecEnvTarget(env = process.env) {
|
|
|
267170
269073
|
// src/core/exec/run-script.ts
|
|
267171
269074
|
import { spawn as spawn4 } from "node:child_process";
|
|
267172
269075
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
|
|
267173
|
-
import { join as
|
|
269076
|
+
import { join as join40 } from "node:path";
|
|
267174
269077
|
var SDK_SPECIFIER = '"npm:@base44/sdk"';
|
|
267175
269078
|
function wrapperSource(sdkVersion) {
|
|
267176
269079
|
const source = readFileSync4(getExecWrapperPath(), "utf-8");
|
|
@@ -267206,7 +269109,7 @@ async function runScript(options) {
|
|
|
267206
269109
|
writeFileSync3(tempWrapper.path, wrapperSource(sdkVersion), "utf-8");
|
|
267207
269110
|
const configDir = await $dir({ unsafeCleanup: true });
|
|
267208
269111
|
cleanupFns.push(configDir.cleanup);
|
|
267209
|
-
const configPath =
|
|
269112
|
+
const configPath = join40(configDir.path, "deno.json");
|
|
267210
269113
|
writeFileSync3(configPath, JSON.stringify(DENO_CONFIG), "utf-8");
|
|
267211
269114
|
try {
|
|
267212
269115
|
const exitCode = await new Promise((resolvePromise) => {
|
|
@@ -267478,6 +269381,7 @@ function createProgram(context) {
|
|
|
267478
269381
|
program.addCommand(getSecretsCommand());
|
|
267479
269382
|
program.addCommand(getSandboxCommand());
|
|
267480
269383
|
program.addCommand(getBranchesCommand());
|
|
269384
|
+
program.addCommand(getApiCommand());
|
|
267481
269385
|
program.addCommand(getAuthCommand());
|
|
267482
269386
|
program.addCommand(getSiteCommand());
|
|
267483
269387
|
if (versionsApiEnabled()) {
|
|
@@ -271496,7 +273400,7 @@ function addCommandInfoToErrorReporter(program, errorReporter) {
|
|
|
271496
273400
|
// src/cli/index.ts
|
|
271497
273401
|
var __dirname4 = dirname29(fileURLToPath7(import.meta.url));
|
|
271498
273402
|
async function runCLI(options) {
|
|
271499
|
-
ensureNpmAssets(
|
|
273403
|
+
ensureNpmAssets(join41(__dirname4, "../assets"));
|
|
271500
273404
|
const errorReporter = new ErrorReporter;
|
|
271501
273405
|
errorReporter.registerProcessErrorHandlers();
|
|
271502
273406
|
const jsonMode = process.argv.includes("--json");
|
|
@@ -271535,4 +273439,4 @@ export {
|
|
|
271535
273439
|
runCLI
|
|
271536
273440
|
};
|
|
271537
273441
|
|
|
271538
|
-
//# debugId=
|
|
273442
|
+
//# debugId=4213AA6F0A5C795F64756E2164756E21
|