@base44-preview/cli 0.1.32-pr.662.66693f8 → 0.1.32-pr.663.447e6da
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 +1998 -187
- package/dist/cli/index.js.map +26 -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,
|
|
@@ -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,1763 @@ 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 = { path: 8, summary: 5, description: 2, parameters: 0.5 };
|
|
249106
|
+
var MIN_RELATIVE_SCORE = 0.2;
|
|
249107
|
+
var TOKEN_SEPARATOR = /[\n\r\p{Z}\p{P}\p{S}]+/u;
|
|
249108
|
+
var STOPWORDS = new Set("a an and are at be by do does for from how i in is it its me my of on or our that the this to we what who with you your".split(" "));
|
|
249109
|
+
function tokenize(text) {
|
|
249110
|
+
return text.split(TOKEN_SEPARATOR).filter((word) => word && !STOPWORDS.has(word.toLowerCase()));
|
|
249111
|
+
}
|
|
249112
|
+
function toOperationSummary(op) {
|
|
249113
|
+
return { endpoint: op.endpoint, summary: op.summary };
|
|
249114
|
+
}
|
|
249115
|
+
function buildSearchIndex(operations) {
|
|
249116
|
+
const index = new MiniSearch({
|
|
249117
|
+
fields: ["path", "summary", "description", "parameters"],
|
|
249118
|
+
tokenize
|
|
249119
|
+
});
|
|
249120
|
+
index.addAll(operations.map((op, id) => ({
|
|
249121
|
+
id,
|
|
249122
|
+
path: op.path.replace(/\{[^}]*\}/g, ""),
|
|
249123
|
+
summary: op.summary,
|
|
249124
|
+
description: op.description,
|
|
249125
|
+
parameters: op.parameterText
|
|
249126
|
+
})));
|
|
249127
|
+
return index;
|
|
249128
|
+
}
|
|
249129
|
+
function summaryCoverage(query, op) {
|
|
249130
|
+
const terms = tokenize(query.toLowerCase());
|
|
249131
|
+
if (!op || terms.length === 0) {
|
|
249132
|
+
return 0;
|
|
249133
|
+
}
|
|
249134
|
+
const words = tokenize(op.summary.toLowerCase());
|
|
249135
|
+
return terms.filter((term) => words.some((word) => word.startsWith(term))).length / terms.length;
|
|
249136
|
+
}
|
|
249137
|
+
function searchOperations(operations, query, options = {}) {
|
|
249138
|
+
const index = buildSearchIndex(operations);
|
|
249139
|
+
const hits = index.search(query, {
|
|
249140
|
+
prefix: (term) => term.length >= 3,
|
|
249141
|
+
fuzzy: (term) => term.length >= 4 ? 0.2 : false,
|
|
249142
|
+
boost: BOOST,
|
|
249143
|
+
filter: options.readOnly ? (hit) => operations[hit.id]?.readOnly === true : undefined
|
|
249144
|
+
}).map((hit) => ({
|
|
249145
|
+
...hit,
|
|
249146
|
+
score: hit.score * (1 + summaryCoverage(query, operations[hit.id]))
|
|
249147
|
+
})).sort((a, b) => b.score - a.score);
|
|
249148
|
+
const baseline = (hits[0]?.score ?? 0) * MIN_RELATIVE_SCORE;
|
|
249149
|
+
return hits.filter((hit) => hit.score >= baseline).slice(0, options.limit ?? 5).flatMap((hit) => {
|
|
249150
|
+
const op = operations[hit.id];
|
|
249151
|
+
return op ? [toOperationSummary(op)] : [];
|
|
249152
|
+
});
|
|
249153
|
+
}
|
|
249154
|
+
|
|
249155
|
+
// src/core/api-spec/catalog.ts
|
|
249156
|
+
var INLINE_AREA_MAX = 2;
|
|
249157
|
+
var AREA_SAMPLE_MAX = 3;
|
|
249158
|
+
var AREA_OPERATIONS_MAX = 200;
|
|
249159
|
+
var byCodePoint = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
249160
|
+
function areaOf(path) {
|
|
249161
|
+
const parts = path.split("/").filter(Boolean);
|
|
249162
|
+
const appIdIndex = parts.indexOf("{app_id}");
|
|
249163
|
+
if (appIdIndex !== -1 && appIdIndex + 1 < parts.length) {
|
|
249164
|
+
return parts[appIdIndex + 1] ?? "other";
|
|
249165
|
+
}
|
|
249166
|
+
if (parts[0] === "api" && parts.length > 1) {
|
|
249167
|
+
return parts[1] ?? "other";
|
|
249168
|
+
}
|
|
249169
|
+
return parts[0] ?? "other";
|
|
249170
|
+
}
|
|
249171
|
+
function groupByArea(operations) {
|
|
249172
|
+
const sorted = [...operations].sort((a, b) => byCodePoint(`${a.method} ${a.path}`, `${b.method} ${b.path}`));
|
|
249173
|
+
const areas = new Map;
|
|
249174
|
+
for (const op of sorted) {
|
|
249175
|
+
const area = areaOf(op.path);
|
|
249176
|
+
areas.set(area, [...areas.get(area) ?? [], op]);
|
|
249177
|
+
}
|
|
249178
|
+
return new Map([...areas].sort(([a], [b]) => byCodePoint(a, b)));
|
|
249179
|
+
}
|
|
249180
|
+
function readsFirst(ops) {
|
|
249181
|
+
const isRead = (op) => op.method === "GET" ? 0 : 1;
|
|
249182
|
+
return [...ops].sort((a, b) => isRead(a) - isRead(b));
|
|
249183
|
+
}
|
|
249184
|
+
function catalogIndex(operations) {
|
|
249185
|
+
const areas = [...groupByArea(operations)].map(([area, ops]) => ops.length <= INLINE_AREA_MAX ? { area, operations: ops.map(toOperationSummary) } : {
|
|
249186
|
+
area,
|
|
249187
|
+
operationCount: ops.length,
|
|
249188
|
+
sample: readsFirst(ops).slice(0, AREA_SAMPLE_MAX).map((op) => op.summary)
|
|
249189
|
+
});
|
|
249190
|
+
return { areas, total: operations.length };
|
|
249191
|
+
}
|
|
249192
|
+
function areaListing(area, operations, max = AREA_OPERATIONS_MAX) {
|
|
249193
|
+
return {
|
|
249194
|
+
area,
|
|
249195
|
+
operations: operations.slice(0, max).map(toOperationSummary),
|
|
249196
|
+
total: operations.length,
|
|
249197
|
+
truncated: operations.length > max
|
|
249198
|
+
};
|
|
249199
|
+
}
|
|
249200
|
+
// src/core/api-spec/grep.ts
|
|
249201
|
+
var CONTEXT_CHARS = 40;
|
|
249202
|
+
var MAX_SNIPPETS = 3;
|
|
249203
|
+
var MAX_SNIPPET_CHARS = 200;
|
|
249204
|
+
function unescapeJson(snippet) {
|
|
249205
|
+
return snippet.replace(/\\[nrt]/g, " ").replace(/\\"/g, '"');
|
|
249206
|
+
}
|
|
249207
|
+
function snippets(text, pattern) {
|
|
249208
|
+
const found = [];
|
|
249209
|
+
for (const match of text.matchAll(pattern)) {
|
|
249210
|
+
const start = Math.max(0, match.index - CONTEXT_CHARS);
|
|
249211
|
+
const end = match.index + match[0].length + CONTEXT_CHARS;
|
|
249212
|
+
found.push(unescapeJson(text.slice(start, Math.min(end, start + MAX_SNIPPET_CHARS))));
|
|
249213
|
+
if (found.length === MAX_SNIPPETS || match[0].length === 0) {
|
|
249214
|
+
break;
|
|
249215
|
+
}
|
|
249216
|
+
}
|
|
249217
|
+
return found;
|
|
249218
|
+
}
|
|
249219
|
+
function grepSpec(spec, operations, pattern, options = {}) {
|
|
249220
|
+
const regex = new RegExp(pattern, options.ignoreCase ? "gi" : "g");
|
|
249221
|
+
const hits = [];
|
|
249222
|
+
for (const op of operations) {
|
|
249223
|
+
const { summary, description, parameters, requestBody, responses } = op.operation;
|
|
249224
|
+
const matches = snippets(`${op.endpoint} ${JSON.stringify({ summary, description, parameters, requestBody, responses })}`, regex);
|
|
249225
|
+
if (matches.length > 0) {
|
|
249226
|
+
hits.push({ ...toOperationSummary(op), matches });
|
|
249227
|
+
}
|
|
249228
|
+
}
|
|
249229
|
+
const schemas = options.schemas === false ? {} : spec.components?.schemas;
|
|
249230
|
+
for (const [schema, definition] of Object.entries(schemas ?? {})) {
|
|
249231
|
+
const matches = snippets(JSON.stringify(definition), regex);
|
|
249232
|
+
if (matches.length > 0) {
|
|
249233
|
+
hits.push({ schema, matches });
|
|
249234
|
+
}
|
|
249235
|
+
}
|
|
249236
|
+
return hits.slice(0, options.limit ?? 20);
|
|
249237
|
+
}
|
|
249238
|
+
// src/core/api-spec/schema.ts
|
|
249239
|
+
var HTTP_METHODS = [
|
|
249240
|
+
"get",
|
|
249241
|
+
"put",
|
|
249242
|
+
"post",
|
|
249243
|
+
"delete",
|
|
249244
|
+
"patch",
|
|
249245
|
+
"head",
|
|
249246
|
+
"options",
|
|
249247
|
+
"trace"
|
|
249248
|
+
];
|
|
249249
|
+
var ParameterSchema = looseObject({
|
|
249250
|
+
name: string2(),
|
|
249251
|
+
in: string2(),
|
|
249252
|
+
required: boolean2().optional(),
|
|
249253
|
+
description: string2().optional(),
|
|
249254
|
+
schema: unknown().optional(),
|
|
249255
|
+
example: unknown().optional()
|
|
249256
|
+
});
|
|
249257
|
+
var MediaTypesSchema = record(string2(), looseObject({ schema: unknown().optional() }));
|
|
249258
|
+
var RequestBodySchema = looseObject({
|
|
249259
|
+
content: MediaTypesSchema.optional()
|
|
249260
|
+
});
|
|
249261
|
+
var ResponseObjectSchema = looseObject({
|
|
249262
|
+
description: string2().optional(),
|
|
249263
|
+
content: MediaTypesSchema.optional()
|
|
249264
|
+
});
|
|
249265
|
+
var SecurityRequirementSchema = record(string2(), array(string2()));
|
|
249266
|
+
var OperationSchema = looseObject({
|
|
249267
|
+
summary: string2().optional(),
|
|
249268
|
+
description: string2().optional(),
|
|
249269
|
+
operationId: string2().optional(),
|
|
249270
|
+
parameters: array(unknown()).optional(),
|
|
249271
|
+
requestBody: unknown().optional(),
|
|
249272
|
+
responses: record(string2(), unknown()).optional(),
|
|
249273
|
+
security: array(SecurityRequirementSchema).optional()
|
|
249274
|
+
});
|
|
249275
|
+
var PathItemSchema = looseObject({
|
|
249276
|
+
...Object.fromEntries(HTTP_METHODS.map((method) => [method, OperationSchema.optional()])),
|
|
249277
|
+
parameters: array(unknown()).optional()
|
|
249278
|
+
});
|
|
249279
|
+
var OpenApiSpecSchema = looseObject({
|
|
249280
|
+
openapi: string2(),
|
|
249281
|
+
paths: record(string2(), PathItemSchema),
|
|
249282
|
+
components: looseObject({
|
|
249283
|
+
schemas: record(string2(), unknown()).optional()
|
|
249284
|
+
}).optional(),
|
|
249285
|
+
security: array(SecurityRequirementSchema).optional()
|
|
249286
|
+
});
|
|
249287
|
+
|
|
249288
|
+
// src/core/api-spec/operations.ts
|
|
249289
|
+
var PERSONAL_ACCESS_TOKEN_SCHEME = "PersonalAccessTokenAuth";
|
|
249290
|
+
var READ_ONLY_SCOPE = "read_only";
|
|
249291
|
+
function isReadOnly(operation, spec) {
|
|
249292
|
+
const security = operation.security ?? spec.security ?? [];
|
|
249293
|
+
return security.some((requirement) => requirement[PERSONAL_ACCESS_TOKEN_SCHEME]?.includes(READ_ONLY_SCOPE));
|
|
249294
|
+
}
|
|
249295
|
+
function parameterText(operation) {
|
|
249296
|
+
return (operation.parameters ?? []).flatMap((parameter) => {
|
|
249297
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249298
|
+
return parsed.success ? [parsed.data.name, parsed.data.description ?? ""] : [];
|
|
249299
|
+
}).join(" ");
|
|
249300
|
+
}
|
|
249301
|
+
function mergeParameters(shared, own) {
|
|
249302
|
+
if (!shared?.length) {
|
|
249303
|
+
return own;
|
|
249304
|
+
}
|
|
249305
|
+
const key = (parameter) => {
|
|
249306
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249307
|
+
return parsed.success ? `${parsed.data.in}:${parsed.data.name}` : undefined;
|
|
249308
|
+
};
|
|
249309
|
+
const ownKeys = new Set((own ?? []).map(key));
|
|
249310
|
+
return [
|
|
249311
|
+
...shared.filter((parameter) => !ownKeys.has(key(parameter))),
|
|
249312
|
+
...own ?? []
|
|
249313
|
+
];
|
|
249314
|
+
}
|
|
249315
|
+
function listOperations(spec) {
|
|
249316
|
+
return Object.entries(spec.paths).flatMap(([path, item]) => HTTP_METHODS.flatMap((method) => {
|
|
249317
|
+
const declared = item[method];
|
|
249318
|
+
if (!declared) {
|
|
249319
|
+
return [];
|
|
249320
|
+
}
|
|
249321
|
+
const operation = {
|
|
249322
|
+
...declared,
|
|
249323
|
+
parameters: mergeParameters(item.parameters, declared.parameters)
|
|
249324
|
+
};
|
|
249325
|
+
return [
|
|
249326
|
+
{
|
|
249327
|
+
endpoint: `${method.toUpperCase()} ${path}`,
|
|
249328
|
+
method: method.toUpperCase(),
|
|
249329
|
+
path,
|
|
249330
|
+
summary: operation.summary ?? "",
|
|
249331
|
+
description: operation.description ?? "",
|
|
249332
|
+
parameterText: parameterText(operation),
|
|
249333
|
+
readOnly: isReadOnly(operation, spec),
|
|
249334
|
+
operation
|
|
249335
|
+
}
|
|
249336
|
+
];
|
|
249337
|
+
}));
|
|
249338
|
+
}
|
|
249339
|
+
function pathSegments(path) {
|
|
249340
|
+
const pathname = path.split(/[?#]/, 1)[0] ?? "";
|
|
249341
|
+
return pathname.split("/").filter(Boolean);
|
|
249342
|
+
}
|
|
249343
|
+
function segmentPattern(segment) {
|
|
249344
|
+
const source = segment.split(/(\{[^}]+\})/).map((part) => part.startsWith("{") ? "[^/]+" : part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("");
|
|
249345
|
+
return new RegExp(`^${source}$`);
|
|
249346
|
+
}
|
|
249347
|
+
function specificity(templateSegments) {
|
|
249348
|
+
return templateSegments.map((segment) => segment.includes("{") ? 0 : 1);
|
|
249349
|
+
}
|
|
249350
|
+
function compareSpecificity(a, b) {
|
|
249351
|
+
for (let i = 0;i < a.length; i++) {
|
|
249352
|
+
if (a[i] !== b[i]) {
|
|
249353
|
+
return (b[i] ?? 0) - (a[i] ?? 0);
|
|
249354
|
+
}
|
|
249355
|
+
}
|
|
249356
|
+
return 0;
|
|
249357
|
+
}
|
|
249358
|
+
function matchOperation(operations, method, concretePath) {
|
|
249359
|
+
const upperMethod = method.toUpperCase();
|
|
249360
|
+
const segments = pathSegments(concretePath);
|
|
249361
|
+
const candidates = operations.filter((op) => {
|
|
249362
|
+
if (op.method !== upperMethod) {
|
|
249363
|
+
return false;
|
|
249364
|
+
}
|
|
249365
|
+
const template = pathSegments(op.path);
|
|
249366
|
+
return template.length === segments.length && template.every((part, i) => segmentPattern(part).test(segments[i] ?? ""));
|
|
249367
|
+
});
|
|
249368
|
+
return candidates.sort((a, b) => compareSpecificity(specificity(pathSegments(a.path)), specificity(pathSegments(b.path))))[0];
|
|
249369
|
+
}
|
|
249370
|
+
var SCHEMA_REF_PREFIX = "#/components/schemas/";
|
|
249371
|
+
var MAX_REF_DEPTH = 4;
|
|
249372
|
+
var FRAMEWORK_VALIDATION_ERROR = "Validation Error";
|
|
249373
|
+
function inlineRefs(node, schemas, seen = new Set, depth = 0) {
|
|
249374
|
+
if (depth > MAX_REF_DEPTH) {
|
|
249375
|
+
return node;
|
|
249376
|
+
}
|
|
249377
|
+
if (Array.isArray(node)) {
|
|
249378
|
+
return node.map((item) => inlineRefs(item, schemas, seen, depth));
|
|
249379
|
+
}
|
|
249380
|
+
if (node === null || typeof node !== "object") {
|
|
249381
|
+
return node;
|
|
249382
|
+
}
|
|
249383
|
+
const { $ref, ...siblings } = node;
|
|
249384
|
+
if (typeof $ref === "string" && $ref.startsWith(SCHEMA_REF_PREFIX)) {
|
|
249385
|
+
const name = $ref.slice(SCHEMA_REF_PREFIX.length);
|
|
249386
|
+
if (seen.has(name) || !(name in schemas)) {
|
|
249387
|
+
return node;
|
|
249388
|
+
}
|
|
249389
|
+
const resolved = inlineRefs(schemas[name], schemas, new Set([...seen, name]), depth + 1);
|
|
249390
|
+
return resolved !== null && typeof resolved === "object" ? { ...resolved, ...siblings } : resolved;
|
|
249391
|
+
}
|
|
249392
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [
|
|
249393
|
+
key,
|
|
249394
|
+
inlineRefs(value, schemas, seen, depth)
|
|
249395
|
+
]));
|
|
249396
|
+
}
|
|
249397
|
+
function jsonSchemaOf(value) {
|
|
249398
|
+
const parsed = RequestBodySchema.safeParse(value);
|
|
249399
|
+
return parsed.success ? parsed.data.content?.["application/json"]?.schema : undefined;
|
|
249400
|
+
}
|
|
249401
|
+
function requestBodyOf(value) {
|
|
249402
|
+
const parsed = RequestBodySchema.safeParse(value);
|
|
249403
|
+
const content = parsed.success ? parsed.data.content ?? {} : {};
|
|
249404
|
+
const contentType = "application/json" in content ? "application/json" : Object.keys(content)[0];
|
|
249405
|
+
return contentType ? { contentType, schema: content[contentType]?.schema } : {};
|
|
249406
|
+
}
|
|
249407
|
+
function leftoverRefs(node, schemas, found = new Map) {
|
|
249408
|
+
if (Array.isArray(node)) {
|
|
249409
|
+
for (const item of node) {
|
|
249410
|
+
leftoverRefs(item, schemas, found);
|
|
249411
|
+
}
|
|
249412
|
+
} else if (node !== null && typeof node === "object") {
|
|
249413
|
+
for (const [key, value] of Object.entries(node)) {
|
|
249414
|
+
if (key === "$ref" && typeof value === "string" && value.startsWith(SCHEMA_REF_PREFIX) && !found.has(value)) {
|
|
249415
|
+
const schema = schemas[value.slice(SCHEMA_REF_PREFIX.length)];
|
|
249416
|
+
found.set(value, schema);
|
|
249417
|
+
leftoverRefs(schema, schemas, found);
|
|
249418
|
+
} else {
|
|
249419
|
+
leftoverRefs(value, schemas, found);
|
|
249420
|
+
}
|
|
249421
|
+
}
|
|
249422
|
+
}
|
|
249423
|
+
return found;
|
|
249424
|
+
}
|
|
249425
|
+
function getOperationContract(spec, op) {
|
|
249426
|
+
const schemas = spec.components?.schemas ?? {};
|
|
249427
|
+
const inline = (node) => node === undefined ? null : inlineRefs(node, schemas);
|
|
249428
|
+
const responses = Object.entries(op.operation.responses ?? {}).flatMap(([status, response]) => {
|
|
249429
|
+
const parsed = ResponseObjectSchema.safeParse(response);
|
|
249430
|
+
return parsed.success ? [[status, parsed.data]] : [];
|
|
249431
|
+
});
|
|
249432
|
+
const success = responses.filter(([status]) => status.startsWith("2")).sort(([a], [b]) => a.localeCompare(b)).map(([, response]) => jsonSchemaOf(response)).find(Boolean);
|
|
249433
|
+
const errors = responses.filter(([status, response]) => !status.startsWith("2") && response.description !== FRAMEWORK_VALIDATION_ERROR);
|
|
249434
|
+
const requestBody = requestBodyOf(op.operation.requestBody);
|
|
249435
|
+
const contract = {
|
|
249436
|
+
endpoint: op.endpoint,
|
|
249437
|
+
method: op.method,
|
|
249438
|
+
path: op.path,
|
|
249439
|
+
summary: op.summary,
|
|
249440
|
+
description: op.description,
|
|
249441
|
+
parameters: (op.operation.parameters ?? []).flatMap((parameter) => {
|
|
249442
|
+
const parsed = ParameterSchema.safeParse(parameter);
|
|
249443
|
+
if (!parsed.success) {
|
|
249444
|
+
return [];
|
|
249445
|
+
}
|
|
249446
|
+
const { name, in: location2, required, schema, description } = parsed.data;
|
|
249447
|
+
const inSchema = schema !== null && typeof schema === "object" && "description" in schema;
|
|
249448
|
+
return [
|
|
249449
|
+
{
|
|
249450
|
+
name,
|
|
249451
|
+
in: location2,
|
|
249452
|
+
required: required ?? false,
|
|
249453
|
+
schema: inline(schema ?? {}),
|
|
249454
|
+
...description && !inSchema ? { description } : {},
|
|
249455
|
+
..."example" in parsed.data ? { example: parsed.data.example } : {}
|
|
249456
|
+
}
|
|
249457
|
+
];
|
|
249458
|
+
}),
|
|
249459
|
+
...requestBody.contentType && requestBody.contentType !== "application/json" ? { requestBodyContentType: requestBody.contentType } : {},
|
|
249460
|
+
requestBodySchema: inline(requestBody.schema),
|
|
249461
|
+
responseSchema: inline(success),
|
|
249462
|
+
errors: Object.fromEntries(errors.map(([status, response]) => [status, response.description ?? ""]))
|
|
249463
|
+
};
|
|
249464
|
+
const refs = leftoverRefs(contract, schemas);
|
|
249465
|
+
return {
|
|
249466
|
+
...contract,
|
|
249467
|
+
...refs.size > 0 ? { refs: Object.fromEntries(refs) } : {}
|
|
249468
|
+
};
|
|
249469
|
+
}
|
|
249470
|
+
// src/core/api-spec/request.ts
|
|
249471
|
+
var MAX_ERROR_BODY_CHARS = 4000;
|
|
249472
|
+
async function readBody(response) {
|
|
249473
|
+
try {
|
|
249474
|
+
const text = (await response.clone().text()).trim();
|
|
249475
|
+
return text.length > MAX_ERROR_BODY_CHARS ? `${text.slice(0, MAX_ERROR_BODY_CHARS)}…` : text || undefined;
|
|
249476
|
+
} catch {
|
|
249477
|
+
return;
|
|
249478
|
+
}
|
|
249479
|
+
}
|
|
249480
|
+
async function sendApiRequest(method, path, body) {
|
|
249481
|
+
try {
|
|
249482
|
+
const response = await base44Client(path.replace(/^\/+/, ""), {
|
|
249483
|
+
method,
|
|
249484
|
+
body,
|
|
249485
|
+
headers: body === undefined ? {} : { "Content-Type": "application/json" },
|
|
249486
|
+
timeout: false
|
|
249487
|
+
});
|
|
249488
|
+
return {
|
|
249489
|
+
status: response.status,
|
|
249490
|
+
contentType: response.headers.get("content-type") ?? "",
|
|
249491
|
+
body: new Uint8Array(await response.arrayBuffer())
|
|
249492
|
+
};
|
|
249493
|
+
} catch (error) {
|
|
249494
|
+
const apiError = await ApiError.fromHttpError(error, `calling ${method} ${path}`);
|
|
249495
|
+
const raw = error instanceof HTTPError ? await readBody(error.response) : undefined;
|
|
249496
|
+
throw new ApiError(apiError.message, {
|
|
249497
|
+
statusCode: apiError.statusCode,
|
|
249498
|
+
requestUrl: apiError.requestUrl,
|
|
249499
|
+
requestMethod: apiError.requestMethod,
|
|
249500
|
+
requestId: apiError.requestId,
|
|
249501
|
+
hints: apiError.hints,
|
|
249502
|
+
details: raw ? [`Response body: ${raw}`] : apiError.details
|
|
249503
|
+
});
|
|
249504
|
+
}
|
|
249505
|
+
}
|
|
249506
|
+
// src/core/api-spec/spec.ts
|
|
249507
|
+
import { rename, stat as stat3 } from "node:fs/promises";
|
|
249508
|
+
import { join as join22 } from "node:path";
|
|
249509
|
+
var SPEC_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
249510
|
+
function getSpecCachePath(apiUrl = getBase44ApiUrl()) {
|
|
249511
|
+
const server = new URL(apiUrl).host.replace(/[^a-zA-Z0-9.-]/g, "_");
|
|
249512
|
+
return join22(getBase44GlobalDir(), "cache", server, "openapi.json");
|
|
249513
|
+
}
|
|
249514
|
+
function isSpecCacheFresh(mtimeMs, now = Date.now()) {
|
|
249515
|
+
return now - mtimeMs < SPEC_CACHE_TTL_MS;
|
|
249516
|
+
}
|
|
249517
|
+
function parseSpec(text) {
|
|
249518
|
+
let json;
|
|
249519
|
+
try {
|
|
249520
|
+
json = JSON.parse(text);
|
|
249521
|
+
} catch {
|
|
249522
|
+
throw new ApiError("The API spec from the server is not valid JSON");
|
|
249523
|
+
}
|
|
249524
|
+
const result = OpenApiSpecSchema.safeParse(json);
|
|
249525
|
+
if (!result.success) {
|
|
249526
|
+
throw new SchemaValidationError("Invalid API spec", result.error);
|
|
249527
|
+
}
|
|
249528
|
+
return result.data;
|
|
249529
|
+
}
|
|
249530
|
+
var SPEC_DOWNLOAD_TIMEOUT_MS = 60000;
|
|
249531
|
+
async function readFreshCache(path) {
|
|
249532
|
+
try {
|
|
249533
|
+
const { mtimeMs } = await stat3(path);
|
|
249534
|
+
if (!isSpecCacheFresh(mtimeMs)) {
|
|
249535
|
+
return null;
|
|
249536
|
+
}
|
|
249537
|
+
const text = await readTextFile(path);
|
|
249538
|
+
return { text, spec: parseSpec(text) };
|
|
249539
|
+
} catch {
|
|
249540
|
+
return null;
|
|
249541
|
+
}
|
|
249542
|
+
}
|
|
249543
|
+
async function downloadSpec() {
|
|
249544
|
+
try {
|
|
249545
|
+
const response = await base44Client.get("api/openapi.json", {
|
|
249546
|
+
timeout: SPEC_DOWNLOAD_TIMEOUT_MS
|
|
249547
|
+
});
|
|
249548
|
+
return await response.text();
|
|
249549
|
+
} catch (error) {
|
|
249550
|
+
throw await ApiError.fromHttpError(error, "fetching the API spec");
|
|
249551
|
+
}
|
|
249552
|
+
}
|
|
249553
|
+
async function loadSpec(options = {}) {
|
|
249554
|
+
const path = getSpecCachePath();
|
|
249555
|
+
const cached = options.refresh ? null : await readFreshCache(path);
|
|
249556
|
+
if (cached !== null) {
|
|
249557
|
+
return cached;
|
|
249558
|
+
}
|
|
249559
|
+
const text = await downloadSpec();
|
|
249560
|
+
const spec = parseSpec(text);
|
|
249561
|
+
const partial = `${path}.${process.pid}.tmp`;
|
|
249562
|
+
await writeFile(partial, text);
|
|
249563
|
+
await rename(partial, path);
|
|
249564
|
+
return { text, spec };
|
|
249565
|
+
}
|
|
249566
|
+
// src/cli/commands/api/shared.ts
|
|
249567
|
+
import { fstatSync } from "node:fs";
|
|
249568
|
+
function formatJson(value) {
|
|
249569
|
+
return toJsonStdout(value, { compact: !process.stdout.isTTY });
|
|
249570
|
+
}
|
|
249571
|
+
function parseLimit(value) {
|
|
249572
|
+
if (value === undefined) {
|
|
249573
|
+
return;
|
|
249574
|
+
}
|
|
249575
|
+
const n = Number.parseInt(value, 10);
|
|
249576
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
249577
|
+
throw new InvalidInputError("--limit must be a positive integer.");
|
|
249578
|
+
}
|
|
249579
|
+
return n;
|
|
249580
|
+
}
|
|
249581
|
+
var READ_ONLY_FILTER_HELP = "Only read-only operations";
|
|
249582
|
+
var REFRESH_OPTION_HELP = "Fetch the API spec again instead of using the cached copy (kept 1 hour)";
|
|
249583
|
+
function loadSpecTask({ runTask }, refresh) {
|
|
249584
|
+
return runTask("Loading the API spec", () => loadSpec({ refresh }), {
|
|
249585
|
+
successMessage: "Loaded the API spec"
|
|
249586
|
+
});
|
|
249587
|
+
}
|
|
249588
|
+
function operationsInArea(operations, area) {
|
|
249589
|
+
const areas = groupByArea(operations);
|
|
249590
|
+
const inArea = areas.get(area);
|
|
249591
|
+
if (!inArea) {
|
|
249592
|
+
throw new InvalidInputError(`Unknown API area: ${area}`, {
|
|
249593
|
+
details: [`Areas: ${[...areas.keys()].join(", ")}`],
|
|
249594
|
+
hints: [{ message: "List the areas", command: "base44 api catalog" }]
|
|
249595
|
+
});
|
|
249596
|
+
}
|
|
249597
|
+
return inArea;
|
|
249598
|
+
}
|
|
249599
|
+
function isPipedStdin() {
|
|
249600
|
+
try {
|
|
249601
|
+
const stats = fstatSync(0);
|
|
249602
|
+
return stats.isFIFO() || stats.isFile();
|
|
249603
|
+
} catch {
|
|
249604
|
+
return false;
|
|
249605
|
+
}
|
|
249606
|
+
}
|
|
249607
|
+
async function readRequestBody(flag, log) {
|
|
249608
|
+
if (flag === "@-") {
|
|
249609
|
+
return readStdin("--body @-", { trim: false });
|
|
249610
|
+
}
|
|
249611
|
+
if (flag?.startsWith("@")) {
|
|
249612
|
+
return readTextFile(flag.slice(1));
|
|
249613
|
+
}
|
|
249614
|
+
if (flag === undefined && isPipedStdin()) {
|
|
249615
|
+
log.warn("stdin is ignored; pass --body @- to send it as the body.");
|
|
249616
|
+
}
|
|
249617
|
+
return flag;
|
|
249618
|
+
}
|
|
249619
|
+
|
|
249620
|
+
// src/cli/commands/api/catalog.ts
|
|
249621
|
+
async function catalogAction(ctx, area, options) {
|
|
249622
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249623
|
+
const operations = listOperations(spec);
|
|
249624
|
+
const readOnly = (ops) => options.readOnly ? ops.filter((op) => op.readOnly) : ops;
|
|
249625
|
+
if (area === undefined) {
|
|
249626
|
+
return { stdout: formatJson(catalogIndex(readOnly(operations))) };
|
|
249627
|
+
}
|
|
249628
|
+
const inArea = readOnly(operationsInArea(operations, area));
|
|
249629
|
+
return { stdout: formatJson(areaListing(area, inArea)) };
|
|
249630
|
+
}
|
|
249631
|
+
function getApiCatalogCommand() {
|
|
249632
|
+
return new Base44Command("catalog", {
|
|
249633
|
+
requireAuth: false,
|
|
249634
|
+
requireAppContext: false
|
|
249635
|
+
}).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);
|
|
249636
|
+
}
|
|
249637
|
+
|
|
249638
|
+
// src/cli/commands/api/fetch.ts
|
|
249639
|
+
async function findOperation(ctx, method, path, refresh) {
|
|
249640
|
+
const { spec } = await loadSpecTask(ctx, refresh);
|
|
249641
|
+
const op = matchOperation(listOperations(spec), method, path);
|
|
249642
|
+
if (!op) {
|
|
249643
|
+
throw new InvalidInputError(`No operation in the API spec matches ${method} ${path}.`, {
|
|
249644
|
+
hints: [
|
|
249645
|
+
{
|
|
249646
|
+
message: "The cached spec may predate this route; fetch it again",
|
|
249647
|
+
command: "base44 api fetch <METHOD> <path> --help --refresh"
|
|
249648
|
+
},
|
|
249649
|
+
{
|
|
249650
|
+
message: "Find the operation and its path template",
|
|
249651
|
+
command: 'base44 api search "<what you want to do>"'
|
|
249652
|
+
}
|
|
249653
|
+
]
|
|
249654
|
+
});
|
|
249655
|
+
}
|
|
249656
|
+
return { spec, op };
|
|
249657
|
+
}
|
|
249658
|
+
var TEXT_CONTENT_TYPES = [
|
|
249659
|
+
"json",
|
|
249660
|
+
"text/",
|
|
249661
|
+
"xml",
|
|
249662
|
+
"javascript",
|
|
249663
|
+
"x-www-form-urlencoded"
|
|
249664
|
+
];
|
|
249665
|
+
function isText(contentType) {
|
|
249666
|
+
return !contentType || TEXT_CONTENT_TYPES.some((hint) => contentType.toLowerCase().includes(hint));
|
|
249667
|
+
}
|
|
249668
|
+
async function formatResponse({ status, contentType, body }, output, jsonMode) {
|
|
249669
|
+
if (output !== undefined) {
|
|
249670
|
+
await writeFile(output, body);
|
|
249671
|
+
return formatJson({ status, contentType, bytes: body.length, output });
|
|
249672
|
+
}
|
|
249673
|
+
if (body.length === 0) {
|
|
249674
|
+
return formatJson({ status });
|
|
249675
|
+
}
|
|
249676
|
+
if (!isText(contentType)) {
|
|
249677
|
+
return formatJson({
|
|
249678
|
+
status,
|
|
249679
|
+
contentType,
|
|
249680
|
+
bytes: body.length,
|
|
249681
|
+
note: "Binary body not printed; add --output <file> to save it."
|
|
249682
|
+
});
|
|
249683
|
+
}
|
|
249684
|
+
const text = new TextDecoder().decode(body);
|
|
249685
|
+
try {
|
|
249686
|
+
return formatJson(JSON.parse(text));
|
|
249687
|
+
} catch {
|
|
249688
|
+
if (jsonMode) {
|
|
249689
|
+
return formatJson({ status, contentType, body: text });
|
|
249690
|
+
}
|
|
249691
|
+
return text.endsWith(`
|
|
249692
|
+
`) ? text : `${text}
|
|
249693
|
+
`;
|
|
249694
|
+
}
|
|
249695
|
+
}
|
|
249696
|
+
async function fetchAction(ctx, methodArg, path, options, command) {
|
|
249697
|
+
if (!methodArg || !path) {
|
|
249698
|
+
if (options.help) {
|
|
249699
|
+
const usage = command.helpInformation();
|
|
249700
|
+
return { stdout: ctx.jsonMode ? formatJson({ usage }) : usage };
|
|
249701
|
+
}
|
|
249702
|
+
throw new InvalidInputError("Provide a method and a path, e.g. GET /api/apps.");
|
|
249703
|
+
}
|
|
249704
|
+
const method = methodArg.toUpperCase();
|
|
249705
|
+
if (options.help) {
|
|
249706
|
+
const { spec, op } = await findOperation(ctx, method, path, options.refresh);
|
|
249707
|
+
return { stdout: formatJson(getOperationContract(spec, op)) };
|
|
249708
|
+
}
|
|
249709
|
+
if (options.readOnly) {
|
|
249710
|
+
const { op } = await findOperation(ctx, method, path, options.refresh);
|
|
249711
|
+
if (!op.readOnly) {
|
|
249712
|
+
throw new InvalidInputError(`Refused under --read-only: ${op.method} ${op.path} is not a read-only operation. Nothing was sent.`);
|
|
249713
|
+
}
|
|
249714
|
+
}
|
|
249715
|
+
ctx.errorReporter.setContext({
|
|
249716
|
+
command: {
|
|
249717
|
+
name: "api fetch",
|
|
249718
|
+
args: [method, path.split("?", 1)[0] ?? ""],
|
|
249719
|
+
options: { ...options, body: options.body && "[not reported]" }
|
|
249720
|
+
}
|
|
249721
|
+
});
|
|
249722
|
+
await ensureAuth(ctx);
|
|
249723
|
+
const body = await readRequestBody(options.body, ctx.log);
|
|
249724
|
+
const response = await ctx.runTask(`Calling ${method} ${path}`, () => sendApiRequest(method, path, body), {
|
|
249725
|
+
successMessage: `Called ${method} ${path}`,
|
|
249726
|
+
errorMessage: "Request failed"
|
|
249727
|
+
});
|
|
249728
|
+
return {
|
|
249729
|
+
stdout: await formatResponse(response, options.output, ctx.jsonMode)
|
|
249730
|
+
};
|
|
249731
|
+
}
|
|
249732
|
+
function getApiFetchCommand() {
|
|
249733
|
+
return new Base44Command("fetch", {
|
|
249734
|
+
requireAuth: false,
|
|
249735
|
+
requireAppContext: false
|
|
249736
|
+
}).description("Call a Base44 API operation, like curl; add --help after a path for its contract").helpOption(false).argument("[method]", "HTTP method, e.g. GET or POST").argument("[path]", 'Concrete path with any query string, 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("--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").action(fetchAction);
|
|
249737
|
+
}
|
|
249738
|
+
|
|
249739
|
+
// src/cli/commands/api/grep.ts
|
|
249740
|
+
function assertValidRegex(pattern) {
|
|
249741
|
+
try {
|
|
249742
|
+
new RegExp(pattern);
|
|
249743
|
+
} catch (error) {
|
|
249744
|
+
throw new InvalidInputError(`Invalid regular expression: ${error instanceof Error ? error.message : pattern}`);
|
|
249745
|
+
}
|
|
249746
|
+
}
|
|
249747
|
+
async function grepAction(ctx, pattern, options) {
|
|
249748
|
+
const limit = parseLimit(options.limit);
|
|
249749
|
+
assertValidRegex(pattern);
|
|
249750
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249751
|
+
let operations = listOperations(spec);
|
|
249752
|
+
if (options.area !== undefined) {
|
|
249753
|
+
operations = operationsInArea(operations, options.area);
|
|
249754
|
+
}
|
|
249755
|
+
if (options.readOnly) {
|
|
249756
|
+
operations = operations.filter((op) => op.readOnly);
|
|
249757
|
+
}
|
|
249758
|
+
const narrowed = options.area !== undefined || options.readOnly === true;
|
|
249759
|
+
const hits = grepSpec(spec, operations, pattern, {
|
|
249760
|
+
ignoreCase: options.ignoreCase,
|
|
249761
|
+
limit,
|
|
249762
|
+
schemas: !narrowed
|
|
249763
|
+
});
|
|
249764
|
+
return { stdout: formatJson(hits) };
|
|
249765
|
+
}
|
|
249766
|
+
function getApiGrepCommand() {
|
|
249767
|
+
return new Base44Command("grep", {
|
|
249768
|
+
requireAuth: false,
|
|
249769
|
+
requireAppContext: false
|
|
249770
|
+
}).description("Search the raw API spec with a regular expression, for when search misses").argument("<pattern>", 'Regular expression, 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 or schemas to return (default 20)").option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(grepAction);
|
|
249771
|
+
}
|
|
249772
|
+
|
|
249773
|
+
// src/cli/commands/api/search.ts
|
|
249774
|
+
async function searchAction(ctx, words, options) {
|
|
249775
|
+
const limit = parseLimit(options.limit);
|
|
249776
|
+
const { spec } = await loadSpecTask(ctx, options.refresh);
|
|
249777
|
+
const results = searchOperations(listOperations(spec), words.join(" "), {
|
|
249778
|
+
limit,
|
|
249779
|
+
readOnly: options.readOnly
|
|
249780
|
+
});
|
|
249781
|
+
return { stdout: formatJson(results) };
|
|
249782
|
+
}
|
|
249783
|
+
function getApiSearchCommand() {
|
|
249784
|
+
return new Base44Command("search", {
|
|
249785
|
+
requireAuth: false,
|
|
249786
|
+
requireAppContext: false
|
|
249787
|
+
}).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);
|
|
249788
|
+
}
|
|
249789
|
+
|
|
249790
|
+
// src/cli/commands/api/index.ts
|
|
249791
|
+
function getApiCommand() {
|
|
249792
|
+
return new Command2("api").description("Search and call any public Base44 API operation").addCommand(getApiCatalogCommand()).addCommand(getApiSearchCommand()).addCommand(getApiGrepCommand()).addCommand(getApiFetchCommand());
|
|
249793
|
+
}
|
|
249794
|
+
|
|
248044
249795
|
// src/cli/commands/auth/password-login.ts
|
|
248045
|
-
import { dirname as dirname16, join as
|
|
249796
|
+
import { dirname as dirname16, join as join23 } from "node:path";
|
|
248046
249797
|
async function passwordLoginAction({ log, runTask }, action) {
|
|
248047
249798
|
const shouldEnable = action === "enable";
|
|
248048
249799
|
const { project } = await readProjectConfig();
|
|
248049
249800
|
const configDir = dirname16(project.configPath);
|
|
248050
|
-
const authDir =
|
|
249801
|
+
const authDir = join23(configDir, project.authDir);
|
|
248051
249802
|
const updated = await runTask("Updating local auth config", async () => {
|
|
248052
249803
|
const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
|
|
248053
249804
|
const merged = { ...current, enableUsernamePassword: shouldEnable };
|
|
@@ -248067,14 +249818,14 @@ function getPasswordLoginCommand() {
|
|
|
248067
249818
|
}
|
|
248068
249819
|
|
|
248069
249820
|
// src/cli/commands/auth/pull.ts
|
|
248070
|
-
import { dirname as dirname17, join as
|
|
249821
|
+
import { dirname as dirname17, join as join24 } from "node:path";
|
|
248071
249822
|
async function pullAuthAction({
|
|
248072
249823
|
log,
|
|
248073
249824
|
runTask
|
|
248074
249825
|
}) {
|
|
248075
249826
|
const { project } = await readProjectConfig();
|
|
248076
249827
|
const configDir = dirname17(project.configPath);
|
|
248077
|
-
const authDir =
|
|
249828
|
+
const authDir = join24(configDir, project.authDir);
|
|
248078
249829
|
const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
|
|
248079
249830
|
return await pullAuthConfig();
|
|
248080
249831
|
}, {
|
|
@@ -248138,7 +249889,7 @@ function getAuthPushCommand() {
|
|
|
248138
249889
|
}
|
|
248139
249890
|
|
|
248140
249891
|
// src/cli/commands/auth/social-login.ts
|
|
248141
|
-
import { dirname as dirname18, join as
|
|
249892
|
+
import { dirname as dirname18, join as join25, resolve as resolve7 } from "node:path";
|
|
248142
249893
|
var PROVIDER_LABELS = {
|
|
248143
249894
|
google: "Google",
|
|
248144
249895
|
microsoft: "Microsoft",
|
|
@@ -248209,7 +249960,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
|
|
|
248209
249960
|
}
|
|
248210
249961
|
const { project } = await readProjectConfig();
|
|
248211
249962
|
const configDir = dirname18(project.configPath);
|
|
248212
|
-
const authDir =
|
|
249963
|
+
const authDir = join25(configDir, project.authDir);
|
|
248213
249964
|
const { config: updated } = await runTask("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
|
|
248214
249965
|
if (clientSecret) {
|
|
248215
249966
|
await runTask("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
|
|
@@ -248234,7 +249985,7 @@ function getSocialLoginCommand() {
|
|
|
248234
249985
|
}
|
|
248235
249986
|
|
|
248236
249987
|
// src/cli/commands/auth/sso.ts
|
|
248237
|
-
import { dirname as dirname19, join as
|
|
249988
|
+
import { dirname as dirname19, join as join26, resolve as resolve8 } from "node:path";
|
|
248238
249989
|
var SSOConfigFileSchema = object({
|
|
248239
249990
|
provider: _enum(Object.values(KNOWN_SSO_PROVIDERS)),
|
|
248240
249991
|
clientId: string2(),
|
|
@@ -248398,7 +250149,7 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
|
|
|
248398
250149
|
}
|
|
248399
250150
|
const { project } = await readProjectConfig();
|
|
248400
250151
|
const configDir = dirname19(project.configPath);
|
|
248401
|
-
const authDir =
|
|
250152
|
+
const authDir = join26(configDir, project.authDir);
|
|
248402
250153
|
await runTask("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
|
|
248403
250154
|
await runTask("Saving SSO credentials", async () => pushSSOSecrets(secrets));
|
|
248404
250155
|
return {
|
|
@@ -248414,7 +250165,7 @@ async function ssoDisableAction({ log, runTask }, options) {
|
|
|
248414
250165
|
}
|
|
248415
250166
|
const { project } = await readProjectConfig();
|
|
248416
250167
|
const configDir = dirname19(project.configPath);
|
|
248417
|
-
const authDir =
|
|
250168
|
+
const authDir = join26(configDir, project.authDir);
|
|
248418
250169
|
const updated = await runTask("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
|
|
248419
250170
|
await runTask("Removing SSO credentials", async () => deleteSSOSecrets());
|
|
248420
250171
|
if (!hasAnyLoginMethod(updated)) {
|
|
@@ -249296,13 +251047,13 @@ function getConnectorsListAvailableCommand() {
|
|
|
249296
251047
|
}
|
|
249297
251048
|
|
|
249298
251049
|
// src/cli/commands/connectors/pull.ts
|
|
249299
|
-
import { dirname as dirname20, join as
|
|
251050
|
+
import { dirname as dirname20, join as join27, resolve as resolve9 } from "node:path";
|
|
249300
251051
|
async function resolveConnectorsDir(options) {
|
|
249301
251052
|
if (!getAppContext().projectRoot) {
|
|
249302
251053
|
return resolve9(options.dir ?? "connectors");
|
|
249303
251054
|
}
|
|
249304
251055
|
const { project } = await readProjectConfig();
|
|
249305
|
-
return
|
|
251056
|
+
return join27(dirname20(project.configPath), project.connectorsDir);
|
|
249306
251057
|
}
|
|
249307
251058
|
async function pullConnectorsAction({ log, runTask, jsonMode }, options) {
|
|
249308
251059
|
const connectorsDir = await resolveConnectorsDir(options);
|
|
@@ -249689,11 +251440,11 @@ function getListCommand() {
|
|
|
249689
251440
|
}
|
|
249690
251441
|
|
|
249691
251442
|
// src/cli/commands/functions/pull.ts
|
|
249692
|
-
import { dirname as dirname21, join as
|
|
251443
|
+
import { dirname as dirname21, join as join28 } from "node:path";
|
|
249693
251444
|
async function pullFunctionsAction({ log, runTask }, name) {
|
|
249694
251445
|
const { project, functions } = await readProjectConfig();
|
|
249695
251446
|
const configDir = dirname21(project.configPath);
|
|
249696
|
-
const functionsDir =
|
|
251447
|
+
const functionsDir = join28(configDir, project.functionsDir);
|
|
249697
251448
|
const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
|
|
249698
251449
|
const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
|
|
249699
251450
|
const { functions } = await listDeployedFunctions();
|
|
@@ -249807,7 +251558,7 @@ import { basename as basename6, resolve as resolve11 } from "node:path";
|
|
|
249807
251558
|
var import_kebabCase = __toESM(require_kebabCase(), 1);
|
|
249808
251559
|
|
|
249809
251560
|
// src/cli/commands/project/scaffold-shared.ts
|
|
249810
|
-
import { join as
|
|
251561
|
+
import { join as join29 } from "node:path";
|
|
249811
251562
|
var DEFAULT_TEMPLATE_ID = "backend-only";
|
|
249812
251563
|
async function getTemplateById(templateId) {
|
|
249813
251564
|
const templates = await listTemplates();
|
|
@@ -249870,7 +251621,7 @@ async function completeProjectSetup({
|
|
|
249870
251621
|
env: { VITE_BASE44_APP_ID: projectId }
|
|
249871
251622
|
})`${buildCommand}`;
|
|
249872
251623
|
updateMessage("Deploying site...");
|
|
249873
|
-
return await deploySite(
|
|
251624
|
+
return await deploySite(join29(resolvedPath, outputDirectory));
|
|
249874
251625
|
}, {
|
|
249875
251626
|
successMessage: theme.colors.base44Orange("Site deployed successfully"),
|
|
249876
251627
|
errorMessage: "Failed to deploy site"
|
|
@@ -250886,7 +252637,7 @@ async function setEnvironmentVersion(environment, versionId, options = {}) {
|
|
|
250886
252637
|
}
|
|
250887
252638
|
// src/core/version/artifacts.ts
|
|
250888
252639
|
import { createHash as createHash3 } from "node:crypto";
|
|
250889
|
-
import { join as
|
|
252640
|
+
import { join as join30, resolve as resolve13 } from "node:path";
|
|
250890
252641
|
|
|
250891
252642
|
// src/core/version/functions.ts
|
|
250892
252643
|
import { createHash as createHash2 } from "node:crypto";
|
|
@@ -253161,10 +254912,6 @@ var STATIC_EGRESS_ENABLED_ENV = "BASE44_STATIC_EGRESS_ENABLED";
|
|
|
253161
254912
|
var STATIC_EGRESS_DIAGNOSTIC_LIMIT = 5;
|
|
253162
254913
|
var staticEgressFetchInstalled = false;
|
|
253163
254914
|
var staticEgressDiagnosticCount = 0;
|
|
253164
|
-
var dedicatedEgressResponses = /* @__PURE__ */ new WeakSet();
|
|
253165
|
-
function isDedicatedEgressResponse(response) {
|
|
253166
|
-
return dedicatedEgressResponses.has(response);
|
|
253167
|
-
}
|
|
253168
254915
|
function inputKind(input) {
|
|
253169
254916
|
if (typeof input === "string") return "string";
|
|
253170
254917
|
return input instanceof URL ? "url" : "request";
|
|
@@ -253266,10 +255013,7 @@ function createRequestScopedStaticEgressFetch(originalFetch, readEnvironment) {
|
|
|
253266
255013
|
return originalFetch(input, init);
|
|
253267
255014
|
}
|
|
253268
255015
|
logStaticEgressDecision("dedicated", input, binding, enableSecret);
|
|
253269
|
-
return binding.fetch(input, init)
|
|
253270
|
-
dedicatedEgressResponses.add(response);
|
|
253271
|
-
return response;
|
|
253272
|
-
});
|
|
255016
|
+
return binding.fetch(input, init);
|
|
253273
255017
|
};
|
|
253274
255018
|
}
|
|
253275
255019
|
function installStaticEgressFetch() {
|
|
@@ -253281,111 +255025,6 @@ function installStaticEgressFetch() {
|
|
|
253281
255025
|
staticEgressFetchInstalled = true;
|
|
253282
255026
|
}
|
|
253283
255027
|
|
|
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 SAFE_VALUE = /^[\\x20-\\x7e]{1,253}$/;
|
|
253291
|
-
function safe(value) {
|
|
253292
|
-
return typeof value === "string" && SAFE_VALUE.test(value) ? value : void 0;
|
|
253293
|
-
}
|
|
253294
|
-
function parseEdgeErrorBody(body) {
|
|
253295
|
-
const plain = PLAIN_TEXT_EDGE_ERROR.exec(body);
|
|
253296
|
-
if (plain) return { code: Number(plain[1]) };
|
|
253297
|
-
try {
|
|
253298
|
-
const json = JSON.parse(body);
|
|
253299
|
-
if (json === null || typeof json !== "object") return null;
|
|
253300
|
-
const fields = json;
|
|
253301
|
-
if (fields.cloudflare_error !== true || !Number.isInteger(fields.error_code)) return null;
|
|
253302
|
-
return {
|
|
253303
|
-
code: fields.error_code,
|
|
253304
|
-
name: safe(fields.error_name),
|
|
253305
|
-
category: safe(fields.error_category),
|
|
253306
|
-
zone: safe(fields.zone)
|
|
253307
|
-
};
|
|
253308
|
-
} catch {
|
|
253309
|
-
return null;
|
|
253310
|
-
}
|
|
253311
|
-
}
|
|
253312
|
-
async function readEdgeError(response) {
|
|
253313
|
-
if (response.status < 400) return null;
|
|
253314
|
-
const length = Number(response.headers.get("content-length"));
|
|
253315
|
-
if (!response.headers.get("cf-ray") || !(length > 0 && length <= MAX_INSPECTED_BODY_BYTES)) {
|
|
253316
|
-
return null;
|
|
253317
|
-
}
|
|
253318
|
-
let timer;
|
|
253319
|
-
try {
|
|
253320
|
-
const body = await Promise.race([
|
|
253321
|
-
response.clone().text(),
|
|
253322
|
-
new Promise((resolve2) => {
|
|
253323
|
-
timer = setTimeout(() => resolve2(null), BODY_READ_TIMEOUT_MS);
|
|
253324
|
-
})
|
|
253325
|
-
]);
|
|
253326
|
-
return body === null ? null : parseEdgeErrorBody(body);
|
|
253327
|
-
} finally {
|
|
253328
|
-
clearTimeout(timer);
|
|
253329
|
-
}
|
|
253330
|
-
}
|
|
253331
|
-
function targetOrigin(input) {
|
|
253332
|
-
try {
|
|
253333
|
-
const raw = input instanceof URL ? input.href : typeof input === "string" ? input : input.url;
|
|
253334
|
-
return new URL(raw).origin;
|
|
253335
|
-
} catch {
|
|
253336
|
-
return null;
|
|
253337
|
-
}
|
|
253338
|
-
}
|
|
253339
|
-
async function recordEdgeError(input, response, startedAt) {
|
|
253340
|
-
const store = currentWorkerRuntimeContext();
|
|
253341
|
-
if (!store) return;
|
|
253342
|
-
const body = await readEdgeError(response);
|
|
253343
|
-
const target = targetOrigin(input);
|
|
253344
|
-
if (!body || !target) return;
|
|
253345
|
-
const record = store.edgeErrors ??= { errors: [], dropped: 0 };
|
|
253346
|
-
if (record.errors.length >= MAX_EDGE_ERRORS) {
|
|
253347
|
-
record.dropped += 1;
|
|
253348
|
-
return;
|
|
253349
|
-
}
|
|
253350
|
-
record.errors.push({
|
|
253351
|
-
...body,
|
|
253352
|
-
target,
|
|
253353
|
-
status: response.status,
|
|
253354
|
-
ray: safe(response.headers.get("cf-ray")) ?? "",
|
|
253355
|
-
egress: isDedicatedEgressResponse(response) ? "dedicated" : "shared",
|
|
253356
|
-
elapsed_ms: Date.now() - startedAt
|
|
253357
|
-
});
|
|
253358
|
-
}
|
|
253359
|
-
function createEdgeErrorFetch(innerFetch) {
|
|
253360
|
-
return async (input, init) => {
|
|
253361
|
-
const startedAt = Date.now();
|
|
253362
|
-
const response = await innerFetch(input, init);
|
|
253363
|
-
try {
|
|
253364
|
-
await recordEdgeError(input, response, startedAt);
|
|
253365
|
-
} catch {
|
|
253366
|
-
}
|
|
253367
|
-
return response;
|
|
253368
|
-
};
|
|
253369
|
-
}
|
|
253370
|
-
var edgeErrorFetchInstalled = false;
|
|
253371
|
-
function installEdgeErrorFetch() {
|
|
253372
|
-
if (edgeErrorFetchInstalled) return;
|
|
253373
|
-
globalThis.fetch = createEdgeErrorFetch(globalThis.fetch.bind(globalThis));
|
|
253374
|
-
edgeErrorFetchInstalled = true;
|
|
253375
|
-
}
|
|
253376
|
-
function attachEdgeErrors(response) {
|
|
253377
|
-
const record = currentWorkerRuntimeContext()?.edgeErrors;
|
|
253378
|
-
if (!record || !(response instanceof Response)) return response;
|
|
253379
|
-
if (response.status === 101 || response.webSocket) return response;
|
|
253380
|
-
try {
|
|
253381
|
-
const wrapped = new Response(response.body, response);
|
|
253382
|
-
wrapped.headers.set(EDGE_ERRORS_HEADER, JSON.stringify(record));
|
|
253383
|
-
return wrapped;
|
|
253384
|
-
} catch {
|
|
253385
|
-
return response;
|
|
253386
|
-
}
|
|
253387
|
-
}
|
|
253388
|
-
|
|
253389
255028
|
// src/static-egress-tcp-core.mjs
|
|
253390
255029
|
function normalizeHost(host) {
|
|
253391
255030
|
return host.toLowerCase().replace(/^\\[(.*)\\]$/, "$1").replace(/\\.$/, "");
|
|
@@ -253514,6 +255153,12 @@ var deno2 = Object.freeze({
|
|
|
253514
255153
|
});
|
|
253515
255154
|
globalThis.Deno = deno2;
|
|
253516
255155
|
globalThis.Buffer = Buffer2;
|
|
255156
|
+
try {
|
|
255157
|
+
new AsyncLocalStorage().enterWith(void 0);
|
|
255158
|
+
} catch {
|
|
255159
|
+
AsyncLocalStorage.prototype.enterWith = () => {
|
|
255160
|
+
};
|
|
255161
|
+
}
|
|
253517
255162
|
function getRegisteredHandler() {
|
|
253518
255163
|
return registeredHandler;
|
|
253519
255164
|
}
|
|
@@ -253539,9 +255184,7 @@ function resolveHandler(functionName) {
|
|
|
253539
255184
|
return handler;
|
|
253540
255185
|
}
|
|
253541
255186
|
export {
|
|
253542
|
-
attachEdgeErrors,
|
|
253543
255187
|
getRegisteredHandler,
|
|
253544
|
-
installEdgeErrorFetch,
|
|
253545
255188
|
installStaticEgressFetch,
|
|
253546
255189
|
registerLazy,
|
|
253547
255190
|
resolveHandler
|
|
@@ -256481,7 +258124,7 @@ var TELEMETRY_PATCH = [
|
|
|
256481
258124
|
var TELEMETRY_STORE_FIELDS = "reqId: crypto.randomUUID(), respondedAt: null, inflight: new Map(), inflightTotal: 0, hadRejection: false, hadNonOk: false, logBudget: 5";
|
|
256482
258125
|
|
|
256483
258126
|
// ../functions-compiler/src/version.ts
|
|
256484
|
-
var COMPILER_VERSION = "0.1.
|
|
258127
|
+
var COMPILER_VERSION = "0.1.8";
|
|
256485
258128
|
|
|
256486
258129
|
// ../functions-compiler/src/worker-entry.ts
|
|
256487
258130
|
function denoShimSource() {
|
|
@@ -256586,22 +258229,20 @@ registerLazy(${JSON.stringify(functionName)}, () => import(${JSON.stringify(user
|
|
|
256586
258229
|
function buildAppEntrySource(functionModules, telemetry, runtimeSecrets = false) {
|
|
256587
258230
|
const moduleImports = functionModules.map((file) => `import "./${file}";`).join(`
|
|
256588
258231
|
`);
|
|
256589
|
-
const handlerExpr = `_b44AttachInvocationLogs(
|
|
258232
|
+
const handlerExpr = `_b44AttachInvocationLogs(${telemetry ? "_b44AttachTelemetry(await handler(request, info))" : "await handler(request, info)"})`;
|
|
256590
258233
|
const guard = activationGuard(runtimeSecrets);
|
|
256591
258234
|
const returnExpr = guard(handlerExpr);
|
|
256592
258235
|
return `// Auto-generated by the base44 bundler. Do not edit.
|
|
256593
258236
|
|
|
256594
258237
|
import { currentWorkerRuntimeContext as _b44Context, runWithWorkerEnvironment as _b44Run } from ${JSON.stringify(RUNTIME_CONTEXT_SPECIFIER)};
|
|
256595
|
-
import {
|
|
258238
|
+
import { installStaticEgressFetch, resolveHandler } from "./${SHIM_FILENAME}";${activationImport(runtimeSecrets)}
|
|
256596
258239
|
${moduleImports}
|
|
256597
258240
|
|
|
256598
258241
|
${consolePatch(runtimeSecrets)}
|
|
256599
258242
|
${INVOCATION_LOGS_PATCH}
|
|
256600
|
-
// Static egress reads workerEnv from the active request store. Install it
|
|
256601
|
-
//
|
|
256602
|
-
// fetch wrapper.
|
|
258243
|
+
// Static egress reads workerEnv from the active request store. Install it
|
|
258244
|
+
// before telemetry so telemetry remains the outermost fetch wrapper.
|
|
256603
258245
|
installStaticEgressFetch();
|
|
256604
|
-
installEdgeErrorFetch();
|
|
256605
258246
|
${telemetry ? TELEMETRY_PATCH : ""}
|
|
256606
258247
|
|
|
256607
258248
|
export default {
|
|
@@ -261107,6 +262748,174 @@ function runtimeVirtualPlugin() {
|
|
|
261107
262748
|
};
|
|
261108
262749
|
}
|
|
261109
262750
|
|
|
262751
|
+
// ../functions-compiler/src/esbuild/ws-native-virtual.ts
|
|
262752
|
+
var NAMESPACE4 = "base44-ws-native";
|
|
262753
|
+
var WS_SPECIFIER = /^(npm:)?ws(@[^/]+)?$/;
|
|
262754
|
+
var ADAPTER = `"use strict";
|
|
262755
|
+
const toBuffer = (value) => (globalThis.Buffer ? globalThis.Buffer.from(value) : value);
|
|
262756
|
+
const READY_STATES = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
|
|
262757
|
+
const later = (fn, ...args) => queueMicrotask(() => fn(...args));
|
|
262758
|
+
const upgradeHeaders = (options) => {
|
|
262759
|
+
const headers = new Headers(options?.headers);
|
|
262760
|
+
for (const name of headers.keys()) if (name !== "user-agent") return headers;
|
|
262761
|
+
return null;
|
|
262762
|
+
};
|
|
262763
|
+
class WebSocket {
|
|
262764
|
+
static CONNECTING = 0;
|
|
262765
|
+
static OPEN = 1;
|
|
262766
|
+
static CLOSING = 2;
|
|
262767
|
+
static CLOSED = 3;
|
|
262768
|
+
#socket = null;
|
|
262769
|
+
#state = 0;
|
|
262770
|
+
#url;
|
|
262771
|
+
#closeRequested = null;
|
|
262772
|
+
#terminated = false;
|
|
262773
|
+
#listeners = new Map();
|
|
262774
|
+
constructor(address, protocols, options) {
|
|
262775
|
+
if (protocols && typeof protocols === "object" && !Array.isArray(protocols)) {
|
|
262776
|
+
options = protocols;
|
|
262777
|
+
protocols = undefined;
|
|
262778
|
+
}
|
|
262779
|
+
this.#url = String(address);
|
|
262780
|
+
const headers = upgradeHeaders(options);
|
|
262781
|
+
if (headers) {
|
|
262782
|
+
this.#upgrade(headers, protocols);
|
|
262783
|
+
} else {
|
|
262784
|
+
this.#attach(new globalThis.WebSocket(this.#url, protocols));
|
|
262785
|
+
}
|
|
262786
|
+
}
|
|
262787
|
+
get readyState() {
|
|
262788
|
+
if (this.#terminated) return 3;
|
|
262789
|
+
return this.#socket ? this.#socket.readyState : this.#state;
|
|
262790
|
+
}
|
|
262791
|
+
get url() { return this.#url; }
|
|
262792
|
+
get protocol() { return this.#socket ? this.#socket.protocol ?? "" : ""; }
|
|
262793
|
+
on(name, listener) { return this.#add(name, listener, false); }
|
|
262794
|
+
addListener(name, listener) { return this.#add(name, listener, false); }
|
|
262795
|
+
once(name, listener) { return this.#add(name, listener, true); }
|
|
262796
|
+
off(name, listener) { return this.removeListener(name, listener); }
|
|
262797
|
+
removeListener(name, listener) {
|
|
262798
|
+
const listeners = this.#listeners.get(name);
|
|
262799
|
+
if (listeners) this.#listeners.set(name, listeners.filter((entry) => entry.listener !== listener));
|
|
262800
|
+
return this;
|
|
262801
|
+
}
|
|
262802
|
+
removeAllListeners(name) {
|
|
262803
|
+
if (name === undefined) this.#listeners.clear();
|
|
262804
|
+
else this.#listeners.delete(name);
|
|
262805
|
+
return this;
|
|
262806
|
+
}
|
|
262807
|
+
emit(name, ...args) {
|
|
262808
|
+
const listeners = this.#listeners.get(name) ?? [];
|
|
262809
|
+
this.#listeners.set(name, listeners.filter((entry) => !entry.once));
|
|
262810
|
+
for (const entry of listeners) entry.listener.apply(this, args);
|
|
262811
|
+
return listeners.length > 0;
|
|
262812
|
+
}
|
|
262813
|
+
send(data, options, callback) {
|
|
262814
|
+
const done = typeof options === "function" ? options : callback;
|
|
262815
|
+
try {
|
|
262816
|
+
if (!this.#socket) {
|
|
262817
|
+
throw new Error("WebSocket is not open: readyState " + this.#state + " (" + READY_STATES[this.#state] + ")");
|
|
262818
|
+
}
|
|
262819
|
+
this.#socket.send(data);
|
|
262820
|
+
done?.();
|
|
262821
|
+
} catch (error) {
|
|
262822
|
+
if (!done) throw error;
|
|
262823
|
+
done(error);
|
|
262824
|
+
}
|
|
262825
|
+
}
|
|
262826
|
+
close(code, reason) {
|
|
262827
|
+
if (this.#socket) this.#socket.close(code, reason);
|
|
262828
|
+
else if (this.#state === 0) {
|
|
262829
|
+
// Upgrade still in flight: close as soon as it lands.
|
|
262830
|
+
this.#closeRequested = [code, reason];
|
|
262831
|
+
this.#state = 2;
|
|
262832
|
+
}
|
|
262833
|
+
}
|
|
262834
|
+
// \`ws\` tears the connection down at once. workerd has no abrupt close, so the
|
|
262835
|
+
// socket is closed normally and "close" is reported now, not on the reply.
|
|
262836
|
+
terminate() {
|
|
262837
|
+
if (this.#terminated || this.readyState === 3) return;
|
|
262838
|
+
this.#terminated = true;
|
|
262839
|
+
if (this.#socket) {
|
|
262840
|
+
try { this.#socket.close(); } catch {}
|
|
262841
|
+
} else {
|
|
262842
|
+
// Upgrade still in flight: close it on arrival, without an "open".
|
|
262843
|
+
this.#closeRequested = [];
|
|
262844
|
+
this.#state = 3;
|
|
262845
|
+
}
|
|
262846
|
+
later(() => this.emit("close", 1006, toBuffer("")));
|
|
262847
|
+
}
|
|
262848
|
+
#attach(socket) {
|
|
262849
|
+
this.#socket = socket;
|
|
262850
|
+
try { socket.binaryType = "arraybuffer"; } catch {}
|
|
262851
|
+
socket.addEventListener("open", () => this.emit("open"));
|
|
262852
|
+
socket.addEventListener("message", (event) => {
|
|
262853
|
+
const isBinary = typeof event.data !== "string";
|
|
262854
|
+
this.emit("message", toBuffer(isBinary ? new Uint8Array(event.data) : event.data), isBinary);
|
|
262855
|
+
});
|
|
262856
|
+
socket.addEventListener("error", (event) => this.emit("error", event.error ?? new Error(event.message || "WebSocket error")));
|
|
262857
|
+
socket.addEventListener("close", (event) => {
|
|
262858
|
+
if (!this.#terminated) this.emit("close", event.code, toBuffer(event.reason ?? ""));
|
|
262859
|
+
});
|
|
262860
|
+
}
|
|
262861
|
+
#upgrade(headers, protocols) {
|
|
262862
|
+
headers.set("Upgrade", "websocket");
|
|
262863
|
+
if (protocols) headers.set("Sec-WebSocket-Protocol", [].concat(protocols).join(", "));
|
|
262864
|
+
const httpUrl = this.#url.replace(/^ws(s?):/i, "http$1:");
|
|
262865
|
+
const fail = (error) => {
|
|
262866
|
+
this.#state = 3;
|
|
262867
|
+
if (this.#terminated) return;
|
|
262868
|
+
this.emit("error", error);
|
|
262869
|
+
this.emit("close", 1006, toBuffer(""));
|
|
262870
|
+
};
|
|
262871
|
+
// Two-argument then(): an exception from an "open" listener must not be
|
|
262872
|
+
// reported as a failed upgrade.
|
|
262873
|
+
fetch(httpUrl, { headers }).then((response) => {
|
|
262874
|
+
const socket = response.webSocket;
|
|
262875
|
+
if (!socket) {
|
|
262876
|
+
response.body?.cancel();
|
|
262877
|
+
return fail(new Error("Unexpected server response: " + response.status));
|
|
262878
|
+
}
|
|
262879
|
+
socket.accept();
|
|
262880
|
+
this.#attach(socket);
|
|
262881
|
+
if (this.#closeRequested) return socket.close(...this.#closeRequested);
|
|
262882
|
+
// accept() opens the socket without dispatching an "open" event.
|
|
262883
|
+
this.emit("open");
|
|
262884
|
+
}, fail);
|
|
262885
|
+
}
|
|
262886
|
+
#add(name, listener, once) {
|
|
262887
|
+
const listeners = this.#listeners.get(name) ?? [];
|
|
262888
|
+
listeners.push({ listener, once });
|
|
262889
|
+
this.#listeners.set(name, listeners);
|
|
262890
|
+
return this;
|
|
262891
|
+
}
|
|
262892
|
+
}
|
|
262893
|
+
class WebSocketServer {
|
|
262894
|
+
constructor() {
|
|
262895
|
+
throw new Error("ws WebSocketServer is not available in Base44 functions: a function can open WebSocket connections but cannot listen for them.");
|
|
262896
|
+
}
|
|
262897
|
+
}
|
|
262898
|
+
module.exports = WebSocket;
|
|
262899
|
+
module.exports.WebSocket = WebSocket;
|
|
262900
|
+
module.exports.WebSocketServer = WebSocketServer;
|
|
262901
|
+
module.exports.default = WebSocket;
|
|
262902
|
+
`;
|
|
262903
|
+
function wsNativeVirtualPlugin() {
|
|
262904
|
+
return {
|
|
262905
|
+
name: "base44-ws-native",
|
|
262906
|
+
setup(build) {
|
|
262907
|
+
build.onResolve({ filter: WS_SPECIFIER }, () => ({
|
|
262908
|
+
path: "ws",
|
|
262909
|
+
namespace: NAMESPACE4
|
|
262910
|
+
}));
|
|
262911
|
+
build.onLoad({ filter: /.*/, namespace: NAMESPACE4 }, () => ({
|
|
262912
|
+
contents: ADAPTER,
|
|
262913
|
+
loader: "js"
|
|
262914
|
+
}));
|
|
262915
|
+
}
|
|
262916
|
+
};
|
|
262917
|
+
}
|
|
262918
|
+
|
|
261110
262919
|
// ../functions-compiler/src/deno-bundle.ts
|
|
261111
262920
|
async function bundleToModule(prepared, nodeModulesDir = "none") {
|
|
261112
262921
|
const dir = await mkdtemp(path21.join(tmpdir2(), "b44-bundle-"));
|
|
@@ -261130,6 +262939,7 @@ async function bundleToModule(prepared, nodeModulesDir = "none") {
|
|
|
261130
262939
|
sourcemap: false,
|
|
261131
262940
|
logLevel: "silent",
|
|
261132
262941
|
plugins: [
|
|
262942
|
+
wsNativeVirtualPlugin(),
|
|
261133
262943
|
nodeBuiltinRequirePlugin(),
|
|
261134
262944
|
userFilesPlugin(prepared.files, prepared.entry),
|
|
261135
262945
|
privateDataSourcesVirtualPlugin(),
|
|
@@ -261754,14 +263564,14 @@ async function readRawResources(dir) {
|
|
|
261754
263564
|
const payloads = {};
|
|
261755
263565
|
for (const relativePath of files.sort()) {
|
|
261756
263566
|
const name = relativePath.replace(/\.jsonc?$/, "");
|
|
261757
|
-
payloads[name] = await readJsonFile(
|
|
263567
|
+
payloads[name] = await readJsonFile(join30(dir, ...relativePath.split("/")));
|
|
261758
263568
|
}
|
|
261759
263569
|
return payloads;
|
|
261760
263570
|
}
|
|
261761
263571
|
async function collectResources(configDir, dirs) {
|
|
261762
263572
|
const [entities, agents] = await Promise.all([
|
|
261763
|
-
readRawResources(
|
|
261764
|
-
readRawResources(
|
|
263573
|
+
readRawResources(join30(configDir, dirs.entitiesDir)),
|
|
263574
|
+
readRawResources(join30(configDir, dirs.agentsDir))
|
|
261765
263575
|
]);
|
|
261766
263576
|
return { entities, agents };
|
|
261767
263577
|
}
|
|
@@ -261773,7 +263583,7 @@ async function collectArtifacts(target) {
|
|
|
261773
263583
|
entryFile: ENTRY2
|
|
261774
263584
|
}),
|
|
261775
263585
|
...siteWorker ? { siteWorker } : {},
|
|
261776
|
-
backendBundles: await tagStep2("build", () => compileBackendBundles(target.root,
|
|
263586
|
+
backendBundles: await tagStep2("build", () => compileBackendBundles(target.root, join30(target.configDir, target.functionsDir))),
|
|
261777
263587
|
...await collectResources(target.configDir, target)
|
|
261778
263588
|
};
|
|
261779
263589
|
}
|
|
@@ -261990,7 +263800,7 @@ function writeFile3(appId, params) {
|
|
|
261990
263800
|
function editFile(appId, params) {
|
|
261991
263801
|
return callTool(appId, "edit_file", { ...params }, EditFileResponseSchema, `editing file "${params.path}"`);
|
|
261992
263802
|
}
|
|
261993
|
-
function
|
|
263803
|
+
function grep2(appId, params) {
|
|
261994
263804
|
return callTool(appId, "grep", { ...params }, GrepResponseSchema, "searching files");
|
|
261995
263805
|
}
|
|
261996
263806
|
function runCommand(appId, params) {
|
|
@@ -262094,10 +263904,10 @@ Examples:
|
|
|
262094
263904
|
}
|
|
262095
263905
|
|
|
262096
263906
|
// src/cli/commands/sandbox/grep.ts
|
|
262097
|
-
async function
|
|
263907
|
+
async function grepAction2({ runTask, branchId }, pattern, options) {
|
|
262098
263908
|
const { id: appId } = getAppContext();
|
|
262099
263909
|
const maxResults = parsePositiveInt(options.maxResults, "--max-results");
|
|
262100
|
-
const result = await runTask("Searching files", () =>
|
|
263910
|
+
const result = await runTask("Searching files", () => grep2(appId, {
|
|
262101
263911
|
pattern,
|
|
262102
263912
|
path: options.path,
|
|
262103
263913
|
is_regex: options.regex,
|
|
@@ -262109,7 +263919,7 @@ async function grepAction({ runTask, branchId }, pattern, options) {
|
|
|
262109
263919
|
return { outroMessage: "Searched files", stdout: toJsonStdout(result) };
|
|
262110
263920
|
}
|
|
262111
263921
|
function getSandboxGrepCommand() {
|
|
262112
|
-
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(
|
|
263922
|
+
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);
|
|
262113
263923
|
}
|
|
262114
263924
|
|
|
262115
263925
|
// src/cli/commands/sandbox/list-directory.ts
|
|
@@ -262704,10 +264514,10 @@ function toPascalCase(name) {
|
|
|
262704
264514
|
return name.split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join("");
|
|
262705
264515
|
}
|
|
262706
264516
|
// src/core/types/update-project.ts
|
|
262707
|
-
import { join as
|
|
264517
|
+
import { join as join34 } from "node:path";
|
|
262708
264518
|
var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
|
|
262709
264519
|
async function updateProjectConfig(projectRoot) {
|
|
262710
|
-
const tsconfigPath =
|
|
264520
|
+
const tsconfigPath = join34(projectRoot, "tsconfig.json");
|
|
262711
264521
|
if (!await pathExists(tsconfigPath)) {
|
|
262712
264522
|
return false;
|
|
262713
264523
|
}
|
|
@@ -262926,7 +264736,7 @@ function rethrowLegacyAppAsExplanation(error) {
|
|
|
262926
264736
|
|
|
262927
264737
|
// src/cli/commands/workflows/limit.ts
|
|
262928
264738
|
var MAX_LIMIT = 200;
|
|
262929
|
-
function
|
|
264739
|
+
function parseLimit2(limit) {
|
|
262930
264740
|
if (limit === undefined)
|
|
262931
264741
|
return;
|
|
262932
264742
|
const parsed = Number.parseInt(limit, 10);
|
|
@@ -262943,7 +264753,7 @@ function formatWorkflowLine(workflow) {
|
|
|
262943
264753
|
return `${workflow.name} [${workflow.status}] runs: ${workflow.totalRuns}, ${lastRun}${failures}`;
|
|
262944
264754
|
}
|
|
262945
264755
|
async function listAction({ log, runTask, jsonMode }, options) {
|
|
262946
|
-
const limit =
|
|
264756
|
+
const limit = parseLimit2(options.limit);
|
|
262947
264757
|
const workflows = await runTask("Fetching workflows from Base44", async () => listWorkflows(limit).catch(rethrowLegacyAppAsExplanation), {
|
|
262948
264758
|
successMessage: "Workflows fetched successfully",
|
|
262949
264759
|
errorMessage: "Failed to fetch workflows"
|
|
@@ -263002,7 +264812,7 @@ async function describeEmptyResult(hasFilters) {
|
|
|
263002
264812
|
return hasFilters ? `No runs match your filters. Workflows in this app: ${names}.` : `No runs yet. Workflows in this app: ${names}.`;
|
|
263003
264813
|
}
|
|
263004
264814
|
async function runsAction(ctx, options) {
|
|
263005
|
-
const limit =
|
|
264815
|
+
const limit = parseLimit2(options.limit);
|
|
263006
264816
|
const runs = await ctx.runTask("Fetching workflow runs from Base44", async () => listWorkflowRuns({
|
|
263007
264817
|
status: options.status,
|
|
263008
264818
|
since: options.since,
|
|
@@ -263188,7 +264998,7 @@ function getWorkspaceCommand() {
|
|
|
263188
264998
|
// src/cli/dev/dev-server/main.ts
|
|
263189
264999
|
var import_cors = __toESM(require_lib4(), 1);
|
|
263190
265000
|
var import_express6 = __toESM(require_express(), 1);
|
|
263191
|
-
import { dirname as dirname27, join as
|
|
265001
|
+
import { dirname as dirname27, join as join39 } from "node:path";
|
|
263192
265002
|
|
|
263193
265003
|
// ../../node_modules/get-port/index.js
|
|
263194
265004
|
import net from "node:net";
|
|
@@ -263318,7 +265128,7 @@ var $tmpName = promisify12(tmp.tmpName);
|
|
|
263318
265128
|
|
|
263319
265129
|
// src/cli/dev/dev-server/function-manager.ts
|
|
263320
265130
|
import { spawn as spawn3 } from "node:child_process";
|
|
263321
|
-
import { dirname as dirname24, join as
|
|
265131
|
+
import { dirname as dirname24, join as join35 } from "node:path";
|
|
263322
265132
|
import { pathToFileURL as pathToFileURL6 } from "node:url";
|
|
263323
265133
|
|
|
263324
265134
|
// src/cli/dev/dev-server/base-function-manager.ts
|
|
@@ -263423,7 +265233,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
263423
265233
|
}
|
|
263424
265234
|
spawnFunction(func, port) {
|
|
263425
265235
|
this.logger.log(`Spawning function "${func.name}" on port ${port}`);
|
|
263426
|
-
const importMapPath =
|
|
265236
|
+
const importMapPath = join35(dirname24(this.wrapperPath), "import-map.json");
|
|
263427
265237
|
const process2 = spawn3("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
|
|
263428
265238
|
env: {
|
|
263429
265239
|
...globalThis.process.env,
|
|
@@ -263497,7 +265307,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
263497
265307
|
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
263498
265308
|
import { isBuiltin as isBuiltin3 } from "node:module";
|
|
263499
265309
|
import { homedir as homedir4 } from "node:os";
|
|
263500
|
-
import { join as
|
|
265310
|
+
import { join as join36 } from "node:path";
|
|
263501
265311
|
import { pathToFileURL as pathToFileURL7 } from "node:url";
|
|
263502
265312
|
var depsPromise;
|
|
263503
265313
|
function loadDeps() {
|
|
@@ -263618,9 +265428,9 @@ export default {
|
|
|
263618
265428
|
};
|
|
263619
265429
|
`;
|
|
263620
265430
|
function ensureBundlerConfig() {
|
|
263621
|
-
const dir =
|
|
265431
|
+
const dir = join36(homedir4(), ".base44", "function-bundler");
|
|
263622
265432
|
mkdirSync2(dir, { recursive: true });
|
|
263623
|
-
const configPath =
|
|
265433
|
+
const configPath = join36(dir, "deno.json");
|
|
263624
265434
|
writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
|
|
263625
265435
|
`);
|
|
263626
265436
|
return configPath;
|
|
@@ -265157,11 +266967,11 @@ import { relative as relative10 } from "node:path";
|
|
|
265157
266967
|
// ../../node_modules/chokidar/index.js
|
|
265158
266968
|
import { EventEmitter as EventEmitter3 } from "node:events";
|
|
265159
266969
|
import { stat as statcb, Stats } from "node:fs";
|
|
265160
|
-
import { readdir as readdir3, stat as
|
|
266970
|
+
import { readdir as readdir3, stat as stat7 } from "node:fs/promises";
|
|
265161
266971
|
import * as sp3 from "node:path";
|
|
265162
266972
|
|
|
265163
266973
|
// ../../node_modules/readdirp/index.js
|
|
265164
|
-
import { lstat as lstat2, readdir as readdir2, realpath, stat as
|
|
266974
|
+
import { lstat as lstat2, readdir as readdir2, realpath, stat as stat5 } from "node:fs/promises";
|
|
265165
266975
|
import { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from "node:path";
|
|
265166
266976
|
import { Readable as Readable6 } from "node:stream";
|
|
265167
266977
|
var EntryTypes = {
|
|
@@ -265170,7 +266980,7 @@ var EntryTypes = {
|
|
|
265170
266980
|
FILE_DIR_TYPE: "files_directories",
|
|
265171
266981
|
EVERYTHING_TYPE: "all"
|
|
265172
266982
|
};
|
|
265173
|
-
var
|
|
266983
|
+
var defaultOptions2 = {
|
|
265174
266984
|
root: ".",
|
|
265175
266985
|
fileFilter: (_entryInfo) => true,
|
|
265176
266986
|
directoryFilter: (_entryInfo) => true,
|
|
@@ -265180,7 +266990,7 @@ var defaultOptions = {
|
|
|
265180
266990
|
alwaysStat: false,
|
|
265181
266991
|
highWaterMark: 4096
|
|
265182
266992
|
};
|
|
265183
|
-
Object.freeze(
|
|
266993
|
+
Object.freeze(defaultOptions2);
|
|
265184
266994
|
var RECURSIVE_ERROR_CODE = "READDIRP_RECURSIVE_ERROR";
|
|
265185
266995
|
var NORMAL_FLOW_ERRORS = new Set(["ENOENT", "EPERM", "EACCES", "ELOOP", RECURSIVE_ERROR_CODE]);
|
|
265186
266996
|
var ALL_TYPES = [
|
|
@@ -265239,17 +267049,17 @@ class ReaddirpStream extends Readable6 {
|
|
|
265239
267049
|
autoDestroy: true,
|
|
265240
267050
|
highWaterMark: options.highWaterMark
|
|
265241
267051
|
});
|
|
265242
|
-
const opts = { ...
|
|
267052
|
+
const opts = { ...defaultOptions2, ...options };
|
|
265243
267053
|
const { root, type } = opts;
|
|
265244
267054
|
this._fileFilter = normalizeFilter(opts.fileFilter);
|
|
265245
267055
|
this._directoryFilter = normalizeFilter(opts.directoryFilter);
|
|
265246
|
-
const statMethod = opts.lstat ? lstat2 :
|
|
267056
|
+
const statMethod = opts.lstat ? lstat2 : stat5;
|
|
265247
267057
|
if (wantBigintFsStats) {
|
|
265248
267058
|
this._stat = (path) => statMethod(path, { bigint: true });
|
|
265249
267059
|
} else {
|
|
265250
267060
|
this._stat = statMethod;
|
|
265251
267061
|
}
|
|
265252
|
-
this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth :
|
|
267062
|
+
this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions2.depth;
|
|
265253
267063
|
this._wantsDir = type ? DIR_TYPES.has(type) : false;
|
|
265254
267064
|
this._wantsFile = type ? FILE_TYPES2.has(type) : false;
|
|
265255
267065
|
this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
|
|
@@ -265396,7 +267206,7 @@ function readdirp(root, options = {}) {
|
|
|
265396
267206
|
|
|
265397
267207
|
// ../../node_modules/chokidar/handler.js
|
|
265398
267208
|
import { watch as fs_watch, unwatchFile, watchFile } from "node:fs";
|
|
265399
|
-
import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as
|
|
267209
|
+
import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat6 } from "node:fs/promises";
|
|
265400
267210
|
import { type as osType } from "node:os";
|
|
265401
267211
|
import * as sp2 from "node:path";
|
|
265402
267212
|
var STR_DATA = "data";
|
|
@@ -265422,7 +267232,7 @@ var EVENTS = {
|
|
|
265422
267232
|
};
|
|
265423
267233
|
var EV = EVENTS;
|
|
265424
267234
|
var THROTTLE_MODE_WATCH = "watch";
|
|
265425
|
-
var statMethods = { lstat: lstat3, stat:
|
|
267235
|
+
var statMethods = { lstat: lstat3, stat: stat6 };
|
|
265426
267236
|
var KEY_LISTENERS = "listeners";
|
|
265427
267237
|
var KEY_ERR = "errHandlers";
|
|
265428
267238
|
var KEY_RAW = "rawEmitters";
|
|
@@ -265893,7 +267703,7 @@ class NodeFsHandler {
|
|
|
265893
267703
|
return;
|
|
265894
267704
|
if (!newStats || newStats.mtimeMs === 0) {
|
|
265895
267705
|
try {
|
|
265896
|
-
const newStats = await
|
|
267706
|
+
const newStats = await stat6(file);
|
|
265897
267707
|
if (this.fsw.closed)
|
|
265898
267708
|
return;
|
|
265899
267709
|
const at = newStats.atimeMs;
|
|
@@ -266565,7 +268375,7 @@ class FSWatcher extends EventEmitter3 {
|
|
|
266565
268375
|
const fullPath = opts.cwd ? sp3.join(opts.cwd, path) : path;
|
|
266566
268376
|
let stats;
|
|
266567
268377
|
try {
|
|
266568
|
-
stats = await
|
|
268378
|
+
stats = await stat7(fullPath);
|
|
266569
268379
|
} catch (err) {}
|
|
266570
268380
|
if (!stats || this.closed)
|
|
266571
268381
|
return;
|
|
@@ -266949,8 +268759,8 @@ async function createDevServer(options) {
|
|
|
266949
268759
|
broadcastEntityEvent(io, appId, entityName, event);
|
|
266950
268760
|
};
|
|
266951
268761
|
const base44ConfigWatcher = new WatchBase44({
|
|
266952
|
-
functions:
|
|
266953
|
-
entities:
|
|
268762
|
+
functions: join39(dirname27(project.configPath), project.functionsDir),
|
|
268763
|
+
entities: join39(dirname27(project.configPath), project.entitiesDir)
|
|
266954
268764
|
}, devLogger);
|
|
266955
268765
|
base44ConfigWatcher.on("change", async (name) => {
|
|
266956
268766
|
try {
|
|
@@ -267153,7 +268963,7 @@ function readExecEnvTarget(env = process.env) {
|
|
|
267153
268963
|
// src/core/exec/run-script.ts
|
|
267154
268964
|
import { spawn as spawn4 } from "node:child_process";
|
|
267155
268965
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
|
|
267156
|
-
import { join as
|
|
268966
|
+
import { join as join40 } from "node:path";
|
|
267157
268967
|
var SDK_SPECIFIER = '"npm:@base44/sdk"';
|
|
267158
268968
|
function wrapperSource(sdkVersion) {
|
|
267159
268969
|
const source = readFileSync4(getExecWrapperPath(), "utf-8");
|
|
@@ -267189,7 +268999,7 @@ async function runScript(options) {
|
|
|
267189
268999
|
writeFileSync3(tempWrapper.path, wrapperSource(sdkVersion), "utf-8");
|
|
267190
269000
|
const configDir = await $dir({ unsafeCleanup: true });
|
|
267191
269001
|
cleanupFns.push(configDir.cleanup);
|
|
267192
|
-
const configPath =
|
|
269002
|
+
const configPath = join40(configDir.path, "deno.json");
|
|
267193
269003
|
writeFileSync3(configPath, JSON.stringify(DENO_CONFIG), "utf-8");
|
|
267194
269004
|
try {
|
|
267195
269005
|
const exitCode = await new Promise((resolvePromise) => {
|
|
@@ -267461,6 +269271,7 @@ function createProgram(context) {
|
|
|
267461
269271
|
program.addCommand(getSecretsCommand());
|
|
267462
269272
|
program.addCommand(getSandboxCommand());
|
|
267463
269273
|
program.addCommand(getBranchesCommand());
|
|
269274
|
+
program.addCommand(getApiCommand());
|
|
267464
269275
|
program.addCommand(getAuthCommand());
|
|
267465
269276
|
program.addCommand(getSiteCommand());
|
|
267466
269277
|
if (versionsApiEnabled()) {
|
|
@@ -271479,7 +273290,7 @@ function addCommandInfoToErrorReporter(program, errorReporter) {
|
|
|
271479
273290
|
// src/cli/index.ts
|
|
271480
273291
|
var __dirname4 = dirname29(fileURLToPath7(import.meta.url));
|
|
271481
273292
|
async function runCLI(options) {
|
|
271482
|
-
ensureNpmAssets(
|
|
273293
|
+
ensureNpmAssets(join41(__dirname4, "../assets"));
|
|
271483
273294
|
const errorReporter = new ErrorReporter;
|
|
271484
273295
|
errorReporter.registerProcessErrorHandlers();
|
|
271485
273296
|
const jsonMode = process.argv.includes("--json");
|
|
@@ -271518,4 +273329,4 @@ export {
|
|
|
271518
273329
|
runCLI
|
|
271519
273330
|
};
|
|
271520
273331
|
|
|
271521
|
-
//# debugId=
|
|
273332
|
+
//# debugId=4F218AD4EF632ED564756E2164756E21
|