@lakphy/local-router 0.4.1 → 0.4.2
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 -1
- package/config.schema.json +33 -1
- package/dist/cli.js +8903 -8663
- package/dist/entry.js +469 -331
- package/dist/index.js +13699 -0
- package/dist/web/assets/index-Btoi8_O4.js +191 -0
- package/dist/web/assets/{index-BpifDtUQ.css → index-CgmYi3c6.css} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/plugin.ts +10 -7
- package/dist/web/assets/index-Dt7z9ioY.js +0 -191
package/dist/entry.js
CHANGED
|
@@ -4934,7 +4934,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
4934
4934
|
const schOrFunc = root2.refs[ref];
|
|
4935
4935
|
if (schOrFunc)
|
|
4936
4936
|
return schOrFunc;
|
|
4937
|
-
let _sch =
|
|
4937
|
+
let _sch = resolve4.call(this, root2, ref);
|
|
4938
4938
|
if (_sch === undefined) {
|
|
4939
4939
|
const schema = (_a21 = root2.localRefs) === null || _a21 === undefined ? undefined : _a21[ref];
|
|
4940
4940
|
const { schemaId } = this.opts;
|
|
@@ -4961,7 +4961,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
4961
4961
|
function sameSchemaEnv(s1, s2) {
|
|
4962
4962
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
4963
4963
|
}
|
|
4964
|
-
function
|
|
4964
|
+
function resolve4(root2, ref) {
|
|
4965
4965
|
let sch;
|
|
4966
4966
|
while (typeof (sch = this.refs[ref]) == "string")
|
|
4967
4967
|
ref = sch;
|
|
@@ -5491,7 +5491,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
5491
5491
|
}
|
|
5492
5492
|
return uri;
|
|
5493
5493
|
}
|
|
5494
|
-
function
|
|
5494
|
+
function resolve4(baseURI, relativeURI, options) {
|
|
5495
5495
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
5496
5496
|
const resolved = resolveComponent(parse7(baseURI, schemelessOptions), parse7(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
5497
5497
|
schemelessOptions.skipEscape = true;
|
|
@@ -5719,7 +5719,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
5719
5719
|
var fastUri = {
|
|
5720
5720
|
SCHEMES,
|
|
5721
5721
|
normalize,
|
|
5722
|
-
resolve:
|
|
5722
|
+
resolve: resolve4,
|
|
5723
5723
|
resolveComponent,
|
|
5724
5724
|
equal,
|
|
5725
5725
|
serialize,
|
|
@@ -5856,7 +5856,7 @@ var require_core = __commonJS((exports) => {
|
|
|
5856
5856
|
opts = this.opts = { ...opts, ...requiredOptions(opts) };
|
|
5857
5857
|
const { es5, lines } = this.opts.code;
|
|
5858
5858
|
this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines });
|
|
5859
|
-
this.logger =
|
|
5859
|
+
this.logger = getLogger(opts.logger);
|
|
5860
5860
|
const formatOpt = opts.validateFormats;
|
|
5861
5861
|
opts.validateFormats = false;
|
|
5862
5862
|
this.RULES = (0, rules_1.getRules)();
|
|
@@ -6253,7 +6253,7 @@ var require_core = __commonJS((exports) => {
|
|
|
6253
6253
|
return metaOpts;
|
|
6254
6254
|
}
|
|
6255
6255
|
var noLogs = { log() {}, warn() {}, error() {} };
|
|
6256
|
-
function
|
|
6256
|
+
function getLogger(logger) {
|
|
6257
6257
|
if (logger === false)
|
|
6258
6258
|
return noLogs;
|
|
6259
6259
|
if (logger === undefined)
|
|
@@ -40602,6 +40602,267 @@ function createOpenAICompatible(options) {
|
|
|
40602
40602
|
provider.imageModel = createImageModel;
|
|
40603
40603
|
return provider;
|
|
40604
40604
|
}
|
|
40605
|
+
|
|
40606
|
+
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/utils/html.js
|
|
40607
|
+
var HtmlEscapedCallbackPhase = {
|
|
40608
|
+
Stringify: 1,
|
|
40609
|
+
BeforeStream: 2,
|
|
40610
|
+
Stream: 3
|
|
40611
|
+
};
|
|
40612
|
+
var raw = (value, callbacks) => {
|
|
40613
|
+
const escapedString = new String(value);
|
|
40614
|
+
escapedString.isEscaped = true;
|
|
40615
|
+
escapedString.callbacks = callbacks;
|
|
40616
|
+
return escapedString;
|
|
40617
|
+
};
|
|
40618
|
+
var escapeRe = /[&<>'"]/;
|
|
40619
|
+
var stringBufferToString = async (buffer, callbacks) => {
|
|
40620
|
+
let str = "";
|
|
40621
|
+
callbacks ||= [];
|
|
40622
|
+
const resolvedBuffer = await Promise.all(buffer);
|
|
40623
|
+
for (let i = resolvedBuffer.length - 1;; i--) {
|
|
40624
|
+
str += resolvedBuffer[i];
|
|
40625
|
+
i--;
|
|
40626
|
+
if (i < 0) {
|
|
40627
|
+
break;
|
|
40628
|
+
}
|
|
40629
|
+
let r = resolvedBuffer[i];
|
|
40630
|
+
if (typeof r === "object") {
|
|
40631
|
+
callbacks.push(...r.callbacks || []);
|
|
40632
|
+
}
|
|
40633
|
+
const isEscaped = r.isEscaped;
|
|
40634
|
+
r = await (typeof r === "object" ? r.toString() : r);
|
|
40635
|
+
if (typeof r === "object") {
|
|
40636
|
+
callbacks.push(...r.callbacks || []);
|
|
40637
|
+
}
|
|
40638
|
+
if (r.isEscaped ?? isEscaped) {
|
|
40639
|
+
str += r;
|
|
40640
|
+
} else {
|
|
40641
|
+
const buf = [str];
|
|
40642
|
+
escapeToBuffer(r, buf);
|
|
40643
|
+
str = buf[0];
|
|
40644
|
+
}
|
|
40645
|
+
}
|
|
40646
|
+
return raw(str, callbacks);
|
|
40647
|
+
};
|
|
40648
|
+
var escapeToBuffer = (str, buffer) => {
|
|
40649
|
+
const match = str.search(escapeRe);
|
|
40650
|
+
if (match === -1) {
|
|
40651
|
+
buffer[0] += str;
|
|
40652
|
+
return;
|
|
40653
|
+
}
|
|
40654
|
+
let escape2;
|
|
40655
|
+
let index;
|
|
40656
|
+
let lastIndex = 0;
|
|
40657
|
+
for (index = match;index < str.length; index++) {
|
|
40658
|
+
switch (str.charCodeAt(index)) {
|
|
40659
|
+
case 34:
|
|
40660
|
+
escape2 = """;
|
|
40661
|
+
break;
|
|
40662
|
+
case 39:
|
|
40663
|
+
escape2 = "'";
|
|
40664
|
+
break;
|
|
40665
|
+
case 38:
|
|
40666
|
+
escape2 = "&";
|
|
40667
|
+
break;
|
|
40668
|
+
case 60:
|
|
40669
|
+
escape2 = "<";
|
|
40670
|
+
break;
|
|
40671
|
+
case 62:
|
|
40672
|
+
escape2 = ">";
|
|
40673
|
+
break;
|
|
40674
|
+
default:
|
|
40675
|
+
continue;
|
|
40676
|
+
}
|
|
40677
|
+
buffer[0] += str.substring(lastIndex, index) + escape2;
|
|
40678
|
+
lastIndex = index + 1;
|
|
40679
|
+
}
|
|
40680
|
+
buffer[0] += str.substring(lastIndex, index);
|
|
40681
|
+
};
|
|
40682
|
+
var resolveCallbackSync = (str) => {
|
|
40683
|
+
const callbacks = str.callbacks;
|
|
40684
|
+
if (!callbacks?.length) {
|
|
40685
|
+
return str;
|
|
40686
|
+
}
|
|
40687
|
+
const buffer = [str];
|
|
40688
|
+
const context = {};
|
|
40689
|
+
callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));
|
|
40690
|
+
return buffer[0];
|
|
40691
|
+
};
|
|
40692
|
+
var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {
|
|
40693
|
+
if (typeof str === "object" && !(str instanceof String)) {
|
|
40694
|
+
if (!(str instanceof Promise)) {
|
|
40695
|
+
str = str.toString();
|
|
40696
|
+
}
|
|
40697
|
+
if (str instanceof Promise) {
|
|
40698
|
+
str = await str;
|
|
40699
|
+
}
|
|
40700
|
+
}
|
|
40701
|
+
const callbacks = str.callbacks;
|
|
40702
|
+
if (!callbacks?.length) {
|
|
40703
|
+
return Promise.resolve(str);
|
|
40704
|
+
}
|
|
40705
|
+
if (buffer) {
|
|
40706
|
+
buffer[0] += str;
|
|
40707
|
+
} else {
|
|
40708
|
+
buffer = [str];
|
|
40709
|
+
}
|
|
40710
|
+
const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then((res) => Promise.all(res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))).then(() => buffer[0]));
|
|
40711
|
+
if (preserveCallbacks) {
|
|
40712
|
+
return raw(await resStr, callbacks);
|
|
40713
|
+
} else {
|
|
40714
|
+
return resStr;
|
|
40715
|
+
}
|
|
40716
|
+
};
|
|
40717
|
+
|
|
40718
|
+
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/helper/html/index.js
|
|
40719
|
+
var html = (strings, ...values) => {
|
|
40720
|
+
const buffer = [""];
|
|
40721
|
+
for (let i = 0, len = strings.length - 1;i < len; i++) {
|
|
40722
|
+
buffer[0] += strings[i];
|
|
40723
|
+
const children = Array.isArray(values[i]) ? values[i].flat(Infinity) : [values[i]];
|
|
40724
|
+
for (let i2 = 0, len2 = children.length;i2 < len2; i2++) {
|
|
40725
|
+
const child = children[i2];
|
|
40726
|
+
if (typeof child === "string") {
|
|
40727
|
+
escapeToBuffer(child, buffer);
|
|
40728
|
+
} else if (typeof child === "number") {
|
|
40729
|
+
buffer[0] += child;
|
|
40730
|
+
} else if (typeof child === "boolean" || child === null || child === undefined) {
|
|
40731
|
+
continue;
|
|
40732
|
+
} else if (typeof child === "object" && child.isEscaped) {
|
|
40733
|
+
if (child.callbacks) {
|
|
40734
|
+
buffer.unshift("", child);
|
|
40735
|
+
} else {
|
|
40736
|
+
const tmp = child.toString();
|
|
40737
|
+
if (tmp instanceof Promise) {
|
|
40738
|
+
buffer.unshift("", tmp);
|
|
40739
|
+
} else {
|
|
40740
|
+
buffer[0] += tmp;
|
|
40741
|
+
}
|
|
40742
|
+
}
|
|
40743
|
+
} else if (child instanceof Promise) {
|
|
40744
|
+
buffer.unshift("", child);
|
|
40745
|
+
} else {
|
|
40746
|
+
escapeToBuffer(child.toString(), buffer);
|
|
40747
|
+
}
|
|
40748
|
+
}
|
|
40749
|
+
}
|
|
40750
|
+
buffer[0] += strings.at(-1);
|
|
40751
|
+
return buffer.length === 1 ? "callbacks" in buffer ? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks))) : raw(buffer[0]) : stringBufferToString(buffer, buffer.callbacks);
|
|
40752
|
+
};
|
|
40753
|
+
|
|
40754
|
+
// node_modules/.bun/@hono+swagger-ui@0.5.3+bac6debbfb5ded19/node_modules/@hono/swagger-ui/dist/index.js
|
|
40755
|
+
var RENDER_TYPE = {
|
|
40756
|
+
STRING_ARRAY: "string_array",
|
|
40757
|
+
STRING: "string",
|
|
40758
|
+
JSON_STRING: "json_string",
|
|
40759
|
+
RAW: "raw"
|
|
40760
|
+
};
|
|
40761
|
+
var RENDER_TYPE_MAP = {
|
|
40762
|
+
configUrl: RENDER_TYPE.STRING,
|
|
40763
|
+
deepLinking: RENDER_TYPE.RAW,
|
|
40764
|
+
presets: RENDER_TYPE.STRING_ARRAY,
|
|
40765
|
+
plugins: RENDER_TYPE.STRING_ARRAY,
|
|
40766
|
+
spec: RENDER_TYPE.JSON_STRING,
|
|
40767
|
+
url: RENDER_TYPE.STRING,
|
|
40768
|
+
urls: RENDER_TYPE.JSON_STRING,
|
|
40769
|
+
layout: RENDER_TYPE.STRING,
|
|
40770
|
+
docExpansion: RENDER_TYPE.STRING,
|
|
40771
|
+
maxDisplayedTags: RENDER_TYPE.RAW,
|
|
40772
|
+
operationsSorter: RENDER_TYPE.RAW,
|
|
40773
|
+
requestInterceptor: RENDER_TYPE.RAW,
|
|
40774
|
+
responseInterceptor: RENDER_TYPE.RAW,
|
|
40775
|
+
persistAuthorization: RENDER_TYPE.RAW,
|
|
40776
|
+
defaultModelsExpandDepth: RENDER_TYPE.RAW,
|
|
40777
|
+
defaultModelExpandDepth: RENDER_TYPE.RAW,
|
|
40778
|
+
defaultModelRendering: RENDER_TYPE.STRING,
|
|
40779
|
+
displayRequestDuration: RENDER_TYPE.RAW,
|
|
40780
|
+
filter: RENDER_TYPE.RAW,
|
|
40781
|
+
showExtensions: RENDER_TYPE.RAW,
|
|
40782
|
+
showCommonExtensions: RENDER_TYPE.RAW,
|
|
40783
|
+
queryConfigEnabled: RENDER_TYPE.RAW,
|
|
40784
|
+
displayOperationId: RENDER_TYPE.RAW,
|
|
40785
|
+
tagsSorter: RENDER_TYPE.RAW,
|
|
40786
|
+
onComplete: RENDER_TYPE.RAW,
|
|
40787
|
+
syntaxHighlight: RENDER_TYPE.JSON_STRING,
|
|
40788
|
+
tryItOutEnabled: RENDER_TYPE.RAW,
|
|
40789
|
+
requestSnippetsEnabled: RENDER_TYPE.RAW,
|
|
40790
|
+
requestSnippets: RENDER_TYPE.JSON_STRING,
|
|
40791
|
+
oauth2RedirectUrl: RENDER_TYPE.STRING,
|
|
40792
|
+
showMutabledRequest: RENDER_TYPE.RAW,
|
|
40793
|
+
request: RENDER_TYPE.JSON_STRING,
|
|
40794
|
+
supportedSubmitMethods: RENDER_TYPE.JSON_STRING,
|
|
40795
|
+
validatorUrl: RENDER_TYPE.STRING,
|
|
40796
|
+
withCredentials: RENDER_TYPE.RAW,
|
|
40797
|
+
modelPropertyMacro: RENDER_TYPE.RAW,
|
|
40798
|
+
parameterMacro: RENDER_TYPE.RAW
|
|
40799
|
+
};
|
|
40800
|
+
var renderSwaggerUIOptions = (options) => {
|
|
40801
|
+
return Object.entries(options).map(([k, v]) => {
|
|
40802
|
+
const key = k;
|
|
40803
|
+
if (!RENDER_TYPE_MAP[key] || v === undefined)
|
|
40804
|
+
return "";
|
|
40805
|
+
switch (RENDER_TYPE_MAP[key]) {
|
|
40806
|
+
case RENDER_TYPE.STRING:
|
|
40807
|
+
return `${key}: '${v}'`;
|
|
40808
|
+
case RENDER_TYPE.STRING_ARRAY:
|
|
40809
|
+
if (!Array.isArray(v))
|
|
40810
|
+
return "";
|
|
40811
|
+
return `${key}: [${v.map((ve) => `${ve}`).join(",")}]`;
|
|
40812
|
+
case RENDER_TYPE.JSON_STRING:
|
|
40813
|
+
return `${key}: ${JSON.stringify(v)}`;
|
|
40814
|
+
case RENDER_TYPE.RAW:
|
|
40815
|
+
return `${key}: ${v}`;
|
|
40816
|
+
default:
|
|
40817
|
+
return "";
|
|
40818
|
+
}
|
|
40819
|
+
}).filter((item) => item !== "").join(",");
|
|
40820
|
+
};
|
|
40821
|
+
var remoteAssets = ({ version: version2 }) => {
|
|
40822
|
+
const url2 = `https://cdn.jsdelivr.net/npm/swagger-ui-dist${version2 !== undefined ? `@${version2}` : ""}`;
|
|
40823
|
+
return {
|
|
40824
|
+
css: [`${url2}/swagger-ui.css`],
|
|
40825
|
+
js: [`${url2}/swagger-ui-bundle.js`]
|
|
40826
|
+
};
|
|
40827
|
+
};
|
|
40828
|
+
var SwaggerUI = (options) => {
|
|
40829
|
+
const asset = remoteAssets({ version: options?.version });
|
|
40830
|
+
delete options.version;
|
|
40831
|
+
if (options.manuallySwaggerUIHtml)
|
|
40832
|
+
return options.manuallySwaggerUIHtml(asset);
|
|
40833
|
+
const optionsStrings = renderSwaggerUIOptions(options);
|
|
40834
|
+
return `
|
|
40835
|
+
<div>
|
|
40836
|
+
<div id="swagger-ui"></div>
|
|
40837
|
+
${asset.css.map((url2) => html`<link rel="stylesheet" href="${url2}" />`)}
|
|
40838
|
+
${asset.js.map((url2) => html`<script src="${url2}" crossorigin="anonymous"><\/script>`)}
|
|
40839
|
+
<script>
|
|
40840
|
+
window.onload = () => {
|
|
40841
|
+
window.ui = SwaggerUIBundle({
|
|
40842
|
+
dom_id: '#swagger-ui',${optionsStrings},
|
|
40843
|
+
})
|
|
40844
|
+
}
|
|
40845
|
+
</script>
|
|
40846
|
+
</div>
|
|
40847
|
+
`;
|
|
40848
|
+
};
|
|
40849
|
+
var middleware = (options) => async (c) => {
|
|
40850
|
+
const title = options?.title ?? "SwaggerUI";
|
|
40851
|
+
return c.html(`
|
|
40852
|
+
<!doctype html>
|
|
40853
|
+
<html lang="en">
|
|
40854
|
+
<head>
|
|
40855
|
+
<meta charset="utf-8" />
|
|
40856
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
40857
|
+
<meta name="description" content="SwaggerUI" />
|
|
40858
|
+
<title>${title}</title>
|
|
40859
|
+
</head>
|
|
40860
|
+
<body>
|
|
40861
|
+
${SwaggerUI(options)}
|
|
40862
|
+
</body>
|
|
40863
|
+
</html>
|
|
40864
|
+
`);
|
|
40865
|
+
};
|
|
40605
40866
|
// node_modules/.bun/@ai-sdk+gateway@3.0.66+3c5d820c62823f0b/node_modules/@ai-sdk/gateway/dist/index.mjs
|
|
40606
40867
|
var import_oidc = __toESM(require_dist(), 1);
|
|
40607
40868
|
var import_oidc2 = __toESM(require_dist(), 1);
|
|
@@ -48100,267 +48361,6 @@ var _a20;
|
|
|
48100
48361
|
_a20 = symbol20;
|
|
48101
48362
|
var defaultDownload2 = createDownload();
|
|
48102
48363
|
|
|
48103
|
-
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/utils/html.js
|
|
48104
|
-
var HtmlEscapedCallbackPhase = {
|
|
48105
|
-
Stringify: 1,
|
|
48106
|
-
BeforeStream: 2,
|
|
48107
|
-
Stream: 3
|
|
48108
|
-
};
|
|
48109
|
-
var raw = (value, callbacks) => {
|
|
48110
|
-
const escapedString = new String(value);
|
|
48111
|
-
escapedString.isEscaped = true;
|
|
48112
|
-
escapedString.callbacks = callbacks;
|
|
48113
|
-
return escapedString;
|
|
48114
|
-
};
|
|
48115
|
-
var escapeRe = /[&<>'"]/;
|
|
48116
|
-
var stringBufferToString = async (buffer, callbacks) => {
|
|
48117
|
-
let str = "";
|
|
48118
|
-
callbacks ||= [];
|
|
48119
|
-
const resolvedBuffer = await Promise.all(buffer);
|
|
48120
|
-
for (let i = resolvedBuffer.length - 1;; i--) {
|
|
48121
|
-
str += resolvedBuffer[i];
|
|
48122
|
-
i--;
|
|
48123
|
-
if (i < 0) {
|
|
48124
|
-
break;
|
|
48125
|
-
}
|
|
48126
|
-
let r = resolvedBuffer[i];
|
|
48127
|
-
if (typeof r === "object") {
|
|
48128
|
-
callbacks.push(...r.callbacks || []);
|
|
48129
|
-
}
|
|
48130
|
-
const isEscaped = r.isEscaped;
|
|
48131
|
-
r = await (typeof r === "object" ? r.toString() : r);
|
|
48132
|
-
if (typeof r === "object") {
|
|
48133
|
-
callbacks.push(...r.callbacks || []);
|
|
48134
|
-
}
|
|
48135
|
-
if (r.isEscaped ?? isEscaped) {
|
|
48136
|
-
str += r;
|
|
48137
|
-
} else {
|
|
48138
|
-
const buf = [str];
|
|
48139
|
-
escapeToBuffer(r, buf);
|
|
48140
|
-
str = buf[0];
|
|
48141
|
-
}
|
|
48142
|
-
}
|
|
48143
|
-
return raw(str, callbacks);
|
|
48144
|
-
};
|
|
48145
|
-
var escapeToBuffer = (str, buffer) => {
|
|
48146
|
-
const match = str.search(escapeRe);
|
|
48147
|
-
if (match === -1) {
|
|
48148
|
-
buffer[0] += str;
|
|
48149
|
-
return;
|
|
48150
|
-
}
|
|
48151
|
-
let escape2;
|
|
48152
|
-
let index;
|
|
48153
|
-
let lastIndex = 0;
|
|
48154
|
-
for (index = match;index < str.length; index++) {
|
|
48155
|
-
switch (str.charCodeAt(index)) {
|
|
48156
|
-
case 34:
|
|
48157
|
-
escape2 = """;
|
|
48158
|
-
break;
|
|
48159
|
-
case 39:
|
|
48160
|
-
escape2 = "'";
|
|
48161
|
-
break;
|
|
48162
|
-
case 38:
|
|
48163
|
-
escape2 = "&";
|
|
48164
|
-
break;
|
|
48165
|
-
case 60:
|
|
48166
|
-
escape2 = "<";
|
|
48167
|
-
break;
|
|
48168
|
-
case 62:
|
|
48169
|
-
escape2 = ">";
|
|
48170
|
-
break;
|
|
48171
|
-
default:
|
|
48172
|
-
continue;
|
|
48173
|
-
}
|
|
48174
|
-
buffer[0] += str.substring(lastIndex, index) + escape2;
|
|
48175
|
-
lastIndex = index + 1;
|
|
48176
|
-
}
|
|
48177
|
-
buffer[0] += str.substring(lastIndex, index);
|
|
48178
|
-
};
|
|
48179
|
-
var resolveCallbackSync = (str) => {
|
|
48180
|
-
const callbacks = str.callbacks;
|
|
48181
|
-
if (!callbacks?.length) {
|
|
48182
|
-
return str;
|
|
48183
|
-
}
|
|
48184
|
-
const buffer = [str];
|
|
48185
|
-
const context2 = {};
|
|
48186
|
-
callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context: context2 }));
|
|
48187
|
-
return buffer[0];
|
|
48188
|
-
};
|
|
48189
|
-
var resolveCallback = async (str, phase, preserveCallbacks, context2, buffer) => {
|
|
48190
|
-
if (typeof str === "object" && !(str instanceof String)) {
|
|
48191
|
-
if (!(str instanceof Promise)) {
|
|
48192
|
-
str = str.toString();
|
|
48193
|
-
}
|
|
48194
|
-
if (str instanceof Promise) {
|
|
48195
|
-
str = await str;
|
|
48196
|
-
}
|
|
48197
|
-
}
|
|
48198
|
-
const callbacks = str.callbacks;
|
|
48199
|
-
if (!callbacks?.length) {
|
|
48200
|
-
return Promise.resolve(str);
|
|
48201
|
-
}
|
|
48202
|
-
if (buffer) {
|
|
48203
|
-
buffer[0] += str;
|
|
48204
|
-
} else {
|
|
48205
|
-
buffer = [str];
|
|
48206
|
-
}
|
|
48207
|
-
const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context: context2 }))).then((res) => Promise.all(res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context2, buffer))).then(() => buffer[0]));
|
|
48208
|
-
if (preserveCallbacks) {
|
|
48209
|
-
return raw(await resStr, callbacks);
|
|
48210
|
-
} else {
|
|
48211
|
-
return resStr;
|
|
48212
|
-
}
|
|
48213
|
-
};
|
|
48214
|
-
|
|
48215
|
-
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/helper/html/index.js
|
|
48216
|
-
var html = (strings, ...values) => {
|
|
48217
|
-
const buffer = [""];
|
|
48218
|
-
for (let i = 0, len = strings.length - 1;i < len; i++) {
|
|
48219
|
-
buffer[0] += strings[i];
|
|
48220
|
-
const children = Array.isArray(values[i]) ? values[i].flat(Infinity) : [values[i]];
|
|
48221
|
-
for (let i2 = 0, len2 = children.length;i2 < len2; i2++) {
|
|
48222
|
-
const child = children[i2];
|
|
48223
|
-
if (typeof child === "string") {
|
|
48224
|
-
escapeToBuffer(child, buffer);
|
|
48225
|
-
} else if (typeof child === "number") {
|
|
48226
|
-
buffer[0] += child;
|
|
48227
|
-
} else if (typeof child === "boolean" || child === null || child === undefined) {
|
|
48228
|
-
continue;
|
|
48229
|
-
} else if (typeof child === "object" && child.isEscaped) {
|
|
48230
|
-
if (child.callbacks) {
|
|
48231
|
-
buffer.unshift("", child);
|
|
48232
|
-
} else {
|
|
48233
|
-
const tmp = child.toString();
|
|
48234
|
-
if (tmp instanceof Promise) {
|
|
48235
|
-
buffer.unshift("", tmp);
|
|
48236
|
-
} else {
|
|
48237
|
-
buffer[0] += tmp;
|
|
48238
|
-
}
|
|
48239
|
-
}
|
|
48240
|
-
} else if (child instanceof Promise) {
|
|
48241
|
-
buffer.unshift("", child);
|
|
48242
|
-
} else {
|
|
48243
|
-
escapeToBuffer(child.toString(), buffer);
|
|
48244
|
-
}
|
|
48245
|
-
}
|
|
48246
|
-
}
|
|
48247
|
-
buffer[0] += strings.at(-1);
|
|
48248
|
-
return buffer.length === 1 ? "callbacks" in buffer ? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks))) : raw(buffer[0]) : stringBufferToString(buffer, buffer.callbacks);
|
|
48249
|
-
};
|
|
48250
|
-
|
|
48251
|
-
// node_modules/.bun/@hono+swagger-ui@0.5.3+bac6debbfb5ded19/node_modules/@hono/swagger-ui/dist/index.js
|
|
48252
|
-
var RENDER_TYPE = {
|
|
48253
|
-
STRING_ARRAY: "string_array",
|
|
48254
|
-
STRING: "string",
|
|
48255
|
-
JSON_STRING: "json_string",
|
|
48256
|
-
RAW: "raw"
|
|
48257
|
-
};
|
|
48258
|
-
var RENDER_TYPE_MAP = {
|
|
48259
|
-
configUrl: RENDER_TYPE.STRING,
|
|
48260
|
-
deepLinking: RENDER_TYPE.RAW,
|
|
48261
|
-
presets: RENDER_TYPE.STRING_ARRAY,
|
|
48262
|
-
plugins: RENDER_TYPE.STRING_ARRAY,
|
|
48263
|
-
spec: RENDER_TYPE.JSON_STRING,
|
|
48264
|
-
url: RENDER_TYPE.STRING,
|
|
48265
|
-
urls: RENDER_TYPE.JSON_STRING,
|
|
48266
|
-
layout: RENDER_TYPE.STRING,
|
|
48267
|
-
docExpansion: RENDER_TYPE.STRING,
|
|
48268
|
-
maxDisplayedTags: RENDER_TYPE.RAW,
|
|
48269
|
-
operationsSorter: RENDER_TYPE.RAW,
|
|
48270
|
-
requestInterceptor: RENDER_TYPE.RAW,
|
|
48271
|
-
responseInterceptor: RENDER_TYPE.RAW,
|
|
48272
|
-
persistAuthorization: RENDER_TYPE.RAW,
|
|
48273
|
-
defaultModelsExpandDepth: RENDER_TYPE.RAW,
|
|
48274
|
-
defaultModelExpandDepth: RENDER_TYPE.RAW,
|
|
48275
|
-
defaultModelRendering: RENDER_TYPE.STRING,
|
|
48276
|
-
displayRequestDuration: RENDER_TYPE.RAW,
|
|
48277
|
-
filter: RENDER_TYPE.RAW,
|
|
48278
|
-
showExtensions: RENDER_TYPE.RAW,
|
|
48279
|
-
showCommonExtensions: RENDER_TYPE.RAW,
|
|
48280
|
-
queryConfigEnabled: RENDER_TYPE.RAW,
|
|
48281
|
-
displayOperationId: RENDER_TYPE.RAW,
|
|
48282
|
-
tagsSorter: RENDER_TYPE.RAW,
|
|
48283
|
-
onComplete: RENDER_TYPE.RAW,
|
|
48284
|
-
syntaxHighlight: RENDER_TYPE.JSON_STRING,
|
|
48285
|
-
tryItOutEnabled: RENDER_TYPE.RAW,
|
|
48286
|
-
requestSnippetsEnabled: RENDER_TYPE.RAW,
|
|
48287
|
-
requestSnippets: RENDER_TYPE.JSON_STRING,
|
|
48288
|
-
oauth2RedirectUrl: RENDER_TYPE.STRING,
|
|
48289
|
-
showMutabledRequest: RENDER_TYPE.RAW,
|
|
48290
|
-
request: RENDER_TYPE.JSON_STRING,
|
|
48291
|
-
supportedSubmitMethods: RENDER_TYPE.JSON_STRING,
|
|
48292
|
-
validatorUrl: RENDER_TYPE.STRING,
|
|
48293
|
-
withCredentials: RENDER_TYPE.RAW,
|
|
48294
|
-
modelPropertyMacro: RENDER_TYPE.RAW,
|
|
48295
|
-
parameterMacro: RENDER_TYPE.RAW
|
|
48296
|
-
};
|
|
48297
|
-
var renderSwaggerUIOptions = (options) => {
|
|
48298
|
-
return Object.entries(options).map(([k, v]) => {
|
|
48299
|
-
const key = k;
|
|
48300
|
-
if (!RENDER_TYPE_MAP[key] || v === undefined)
|
|
48301
|
-
return "";
|
|
48302
|
-
switch (RENDER_TYPE_MAP[key]) {
|
|
48303
|
-
case RENDER_TYPE.STRING:
|
|
48304
|
-
return `${key}: '${v}'`;
|
|
48305
|
-
case RENDER_TYPE.STRING_ARRAY:
|
|
48306
|
-
if (!Array.isArray(v))
|
|
48307
|
-
return "";
|
|
48308
|
-
return `${key}: [${v.map((ve) => `${ve}`).join(",")}]`;
|
|
48309
|
-
case RENDER_TYPE.JSON_STRING:
|
|
48310
|
-
return `${key}: ${JSON.stringify(v)}`;
|
|
48311
|
-
case RENDER_TYPE.RAW:
|
|
48312
|
-
return `${key}: ${v}`;
|
|
48313
|
-
default:
|
|
48314
|
-
return "";
|
|
48315
|
-
}
|
|
48316
|
-
}).filter((item) => item !== "").join(",");
|
|
48317
|
-
};
|
|
48318
|
-
var remoteAssets = ({ version: version2 }) => {
|
|
48319
|
-
const url2 = `https://cdn.jsdelivr.net/npm/swagger-ui-dist${version2 !== undefined ? `@${version2}` : ""}`;
|
|
48320
|
-
return {
|
|
48321
|
-
css: [`${url2}/swagger-ui.css`],
|
|
48322
|
-
js: [`${url2}/swagger-ui-bundle.js`]
|
|
48323
|
-
};
|
|
48324
|
-
};
|
|
48325
|
-
var SwaggerUI = (options) => {
|
|
48326
|
-
const asset = remoteAssets({ version: options?.version });
|
|
48327
|
-
delete options.version;
|
|
48328
|
-
if (options.manuallySwaggerUIHtml)
|
|
48329
|
-
return options.manuallySwaggerUIHtml(asset);
|
|
48330
|
-
const optionsStrings = renderSwaggerUIOptions(options);
|
|
48331
|
-
return `
|
|
48332
|
-
<div>
|
|
48333
|
-
<div id="swagger-ui"></div>
|
|
48334
|
-
${asset.css.map((url2) => html`<link rel="stylesheet" href="${url2}" />`)}
|
|
48335
|
-
${asset.js.map((url2) => html`<script src="${url2}" crossorigin="anonymous"><\/script>`)}
|
|
48336
|
-
<script>
|
|
48337
|
-
window.onload = () => {
|
|
48338
|
-
window.ui = SwaggerUIBundle({
|
|
48339
|
-
dom_id: '#swagger-ui',${optionsStrings},
|
|
48340
|
-
})
|
|
48341
|
-
}
|
|
48342
|
-
</script>
|
|
48343
|
-
</div>
|
|
48344
|
-
`;
|
|
48345
|
-
};
|
|
48346
|
-
var middleware = (options) => async (c) => {
|
|
48347
|
-
const title = options?.title ?? "SwaggerUI";
|
|
48348
|
-
return c.html(`
|
|
48349
|
-
<!doctype html>
|
|
48350
|
-
<html lang="en">
|
|
48351
|
-
<head>
|
|
48352
|
-
<meta charset="utf-8" />
|
|
48353
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
48354
|
-
<meta name="description" content="SwaggerUI" />
|
|
48355
|
-
<title>${title}</title>
|
|
48356
|
-
</head>
|
|
48357
|
-
<body>
|
|
48358
|
-
${SwaggerUI(options)}
|
|
48359
|
-
</body>
|
|
48360
|
-
</html>
|
|
48361
|
-
`);
|
|
48362
|
-
};
|
|
48363
|
-
|
|
48364
48364
|
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/compose.js
|
|
48365
48365
|
var compose = (middleware2, onError, onNotFound) => {
|
|
48366
48366
|
return (context2, next) => {
|
|
@@ -51277,6 +51277,14 @@ var DEFAULT_CONFIG = `{
|
|
|
51277
51277
|
// },
|
|
51278
51278
|
},
|
|
51279
51279
|
|
|
51280
|
+
// \u901A\u7528\u670D\u52A1\u8BBE\u7F6E
|
|
51281
|
+
server: {
|
|
51282
|
+
// \u9ED8\u8BA4\u5173\u95ED\u5C40\u57DF\u7F51\u8BBF\u95EE\u3002\u5F00\u542F\u540E\uFF0C\u5C40\u57DF\u7F51\u5185\u5176\u4ED6\u8BBE\u5907\u53EF\u8BBF\u95EE\u672C\u670D\u52A1\u3002
|
|
51283
|
+
lanAccess: {
|
|
51284
|
+
enabled: false,
|
|
51285
|
+
},
|
|
51286
|
+
},
|
|
51287
|
+
|
|
51280
51288
|
// \u65E5\u5FD7\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u914D\u7F6E\u5219\u4E0D\u542F\u7528\u65E5\u5FD7\u8BB0\u5F55\uFF09
|
|
51281
51289
|
// log: {
|
|
51282
51290
|
// enabled: true,
|
|
@@ -51347,8 +51355,8 @@ function resolveLogBaseDir(logConfig) {
|
|
|
51347
51355
|
}
|
|
51348
51356
|
|
|
51349
51357
|
// src/config-store.ts
|
|
51350
|
-
import { resolve as resolve3 } from "path";
|
|
51351
51358
|
import { writeFileSync as writeFileSync2 } from "fs";
|
|
51359
|
+
import { resolve as resolve3 } from "path";
|
|
51352
51360
|
class ConfigStore {
|
|
51353
51361
|
config;
|
|
51354
51362
|
absolutePath;
|
|
@@ -51384,6 +51392,51 @@ class ConfigStore {
|
|
|
51384
51392
|
}
|
|
51385
51393
|
}
|
|
51386
51394
|
|
|
51395
|
+
// src/config-validate.ts
|
|
51396
|
+
var import__2020 = __toESM(require_2020(), 1);
|
|
51397
|
+
var import_ajv_formats = __toESM(require_dist2(), 1);
|
|
51398
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
51399
|
+
|
|
51400
|
+
// src/runtime-assets.ts
|
|
51401
|
+
import { fileURLToPath } from "url";
|
|
51402
|
+
function resolveBundledAssetPath(relativePath) {
|
|
51403
|
+
return fileURLToPath(new URL(relativePath, import.meta.url));
|
|
51404
|
+
}
|
|
51405
|
+
function getBundledSchemaPath() {
|
|
51406
|
+
return resolveBundledAssetPath("../config.schema.json");
|
|
51407
|
+
}
|
|
51408
|
+
function getBundledWebRoot() {
|
|
51409
|
+
return resolveBundledAssetPath("../dist/web/");
|
|
51410
|
+
}
|
|
51411
|
+
|
|
51412
|
+
// src/config-validate.ts
|
|
51413
|
+
function validateBusinessRules(config2) {
|
|
51414
|
+
for (const [routeType, modelMap] of Object.entries(config2.routes)) {
|
|
51415
|
+
if (!modelMap["*"]) {
|
|
51416
|
+
throw new Error(`\u8DEF\u7531 "${routeType}" \u7F3A\u5C11 "*" \u515C\u5E95\u89C4\u5219`);
|
|
51417
|
+
}
|
|
51418
|
+
for (const target of Object.values(modelMap)) {
|
|
51419
|
+
if (!config2.providers[target.provider]) {
|
|
51420
|
+
throw new Error(`\u8DEF\u7531 "${routeType}" \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 provider "${target.provider}"`);
|
|
51421
|
+
}
|
|
51422
|
+
}
|
|
51423
|
+
}
|
|
51424
|
+
}
|
|
51425
|
+
function validateConfigOrThrow(config2) {
|
|
51426
|
+
validateBusinessRules(config2);
|
|
51427
|
+
const ajv = new import__2020.default({ allErrors: true, strict: false });
|
|
51428
|
+
import_ajv_formats.default(ajv);
|
|
51429
|
+
const schemaJson = JSON.parse(readFileSync2(getBundledSchemaPath(), "utf-8"));
|
|
51430
|
+
const validateBySchema = ajv.compile(schemaJson);
|
|
51431
|
+
const valid = validateBySchema(config2);
|
|
51432
|
+
if (!valid) {
|
|
51433
|
+
const firstError = validateBySchema.errors?.[0];
|
|
51434
|
+
const path = firstError?.instancePath || "(root)";
|
|
51435
|
+
const message = firstError?.message ?? "unknown schema validation error";
|
|
51436
|
+
throw new Error(`Schema \u6821\u9A8C\u5931\u8D25: ${path} ${message}`);
|
|
51437
|
+
}
|
|
51438
|
+
}
|
|
51439
|
+
|
|
51387
51440
|
// src/crypto.ts
|
|
51388
51441
|
var ECDH_PARAMS = { name: "ECDH", namedCurve: "P-256" };
|
|
51389
51442
|
function base64Encode(buf) {
|
|
@@ -51736,7 +51789,7 @@ async function getLogMetrics(options) {
|
|
|
51736
51789
|
}
|
|
51737
51790
|
|
|
51738
51791
|
// src/log-query.ts
|
|
51739
|
-
import { createReadStream as createReadStream2, existsSync as existsSync3, readFileSync as
|
|
51792
|
+
import { createReadStream as createReadStream2, existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
51740
51793
|
import { join as join4, resolve as resolve4 } from "path";
|
|
51741
51794
|
import { createInterface as createInterface2 } from "readline";
|
|
51742
51795
|
|
|
@@ -52096,7 +52149,7 @@ function readStreamContent(baseDir, streamFile) {
|
|
|
52096
52149
|
return { content: null, warning: "stream_file \u4E0D\u662F .sse.raw \u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7\u8BFB\u53D6\u3002" };
|
|
52097
52150
|
}
|
|
52098
52151
|
if (existsSync3(resolvedFromFile)) {
|
|
52099
|
-
return { content:
|
|
52152
|
+
return { content: readFileSync3(resolvedFromFile, "utf-8"), warning: null };
|
|
52100
52153
|
}
|
|
52101
52154
|
const fallbackPath = resolve4(resolvedBase, streamFile);
|
|
52102
52155
|
if (!fallbackPath.startsWith(`${resolvedBase}/`) && fallbackPath !== resolvedBase) {
|
|
@@ -52105,7 +52158,7 @@ function readStreamContent(baseDir, streamFile) {
|
|
|
52105
52158
|
if (!existsSync3(fallbackPath)) {
|
|
52106
52159
|
return { content: null, warning: "stream_file \u4E0D\u5B58\u5728\uFF0C\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\u3002" };
|
|
52107
52160
|
}
|
|
52108
|
-
return { content:
|
|
52161
|
+
return { content: readFileSync3(fallbackPath, "utf-8"), warning: null };
|
|
52109
52162
|
} catch (err) {
|
|
52110
52163
|
return {
|
|
52111
52164
|
content: null,
|
|
@@ -52994,6 +53047,85 @@ function normalizeUrl(rawUrl) {
|
|
|
52994
53047
|
return rawUrl;
|
|
52995
53048
|
}
|
|
52996
53049
|
|
|
53050
|
+
// src/network-access.ts
|
|
53051
|
+
var REMOTE_ADDRESS_ENV_KEY = "LOCAL_ROUTER_REMOTE_ADDRESS";
|
|
53052
|
+
function parseIpv4(address) {
|
|
53053
|
+
const parts = address.split(".");
|
|
53054
|
+
if (parts.length !== 4)
|
|
53055
|
+
return null;
|
|
53056
|
+
const octets = parts.map((part) => {
|
|
53057
|
+
if (!/^\d{1,3}$/.test(part))
|
|
53058
|
+
return Number.NaN;
|
|
53059
|
+
const value = Number.parseInt(part, 10);
|
|
53060
|
+
return value >= 0 && value <= 255 ? value : Number.NaN;
|
|
53061
|
+
});
|
|
53062
|
+
return octets.every(Number.isFinite) ? octets : null;
|
|
53063
|
+
}
|
|
53064
|
+
function normalizeIpAddress(raw2) {
|
|
53065
|
+
let address = raw2.trim().toLowerCase();
|
|
53066
|
+
if (address.startsWith("[")) {
|
|
53067
|
+
const end = address.indexOf("]");
|
|
53068
|
+
if (end !== -1)
|
|
53069
|
+
address = address.slice(1, end);
|
|
53070
|
+
}
|
|
53071
|
+
const mappedIpv4 = address.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);
|
|
53072
|
+
if (mappedIpv4) {
|
|
53073
|
+
return mappedIpv4[1];
|
|
53074
|
+
}
|
|
53075
|
+
return address;
|
|
53076
|
+
}
|
|
53077
|
+
function isLoopbackAddress(raw2) {
|
|
53078
|
+
if (!raw2)
|
|
53079
|
+
return false;
|
|
53080
|
+
const address = normalizeIpAddress(raw2);
|
|
53081
|
+
const ipv43 = parseIpv4(address);
|
|
53082
|
+
if (ipv43)
|
|
53083
|
+
return ipv43[0] === 127;
|
|
53084
|
+
return address === "::1";
|
|
53085
|
+
}
|
|
53086
|
+
function isLanAddress(raw2) {
|
|
53087
|
+
if (!raw2)
|
|
53088
|
+
return false;
|
|
53089
|
+
const address = normalizeIpAddress(raw2);
|
|
53090
|
+
const ipv43 = parseIpv4(address);
|
|
53091
|
+
if (ipv43) {
|
|
53092
|
+
const [a, b] = ipv43;
|
|
53093
|
+
return a === 10 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168 || a === 169 && b === 254;
|
|
53094
|
+
}
|
|
53095
|
+
return address.startsWith("fc") || address.startsWith("fd") || /^fe[89ab]/.test(address);
|
|
53096
|
+
}
|
|
53097
|
+
function decideNetworkAccess(serverConfig, rawRemoteAddress) {
|
|
53098
|
+
const remoteAddress = rawRemoteAddress ? normalizeIpAddress(rawRemoteAddress) : null;
|
|
53099
|
+
if (!remoteAddress || isLoopbackAddress(remoteAddress)) {
|
|
53100
|
+
return { allowed: true, remoteAddress };
|
|
53101
|
+
}
|
|
53102
|
+
const lanEnabled = serverConfig?.lanAccess?.enabled === true;
|
|
53103
|
+
if (!lanEnabled) {
|
|
53104
|
+
return { allowed: false, remoteAddress, reason: "lan-disabled" };
|
|
53105
|
+
}
|
|
53106
|
+
if (!isLanAddress(remoteAddress)) {
|
|
53107
|
+
return { allowed: false, remoteAddress, reason: "non-lan-address" };
|
|
53108
|
+
}
|
|
53109
|
+
return { allowed: true, remoteAddress };
|
|
53110
|
+
}
|
|
53111
|
+
function getRemoteAddressFromContext(c2) {
|
|
53112
|
+
const env = c2.env;
|
|
53113
|
+
const value = env?.[REMOTE_ADDRESS_ENV_KEY];
|
|
53114
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
53115
|
+
}
|
|
53116
|
+
function createNetworkAccessMiddleware(store) {
|
|
53117
|
+
return async (c2, next) => {
|
|
53118
|
+
const decision = decideNetworkAccess(store.get().server, getRemoteAddressFromContext(c2));
|
|
53119
|
+
if (!decision.allowed) {
|
|
53120
|
+
return c2.json({
|
|
53121
|
+
error: decision.reason === "lan-disabled" ? "\u5C40\u57DF\u7F51\u670D\u52A1\u672A\u5F00\u542F\uFF0C\u5DF2\u62D2\u7EDD\u975E\u672C\u673A\u8BF7\u6C42" : "\u4EC5\u5141\u8BB8\u672C\u673A\u6216\u5C40\u57DF\u7F51\u6765\u6E90\u8BBF\u95EE",
|
|
53122
|
+
remoteAddress: decision.remoteAddress
|
|
53123
|
+
}, 403);
|
|
53124
|
+
}
|
|
53125
|
+
await next();
|
|
53126
|
+
};
|
|
53127
|
+
}
|
|
53128
|
+
|
|
52997
53129
|
// src/openapi.ts
|
|
52998
53130
|
var openAPISpec = {
|
|
52999
53131
|
openapi: "3.0.0",
|
|
@@ -53442,7 +53574,9 @@ var openAPISpec = {
|
|
|
53442
53574
|
type: "object",
|
|
53443
53575
|
additionalProperties: { type: "string" }
|
|
53444
53576
|
},
|
|
53445
|
-
requestBody: {
|
|
53577
|
+
requestBody: {
|
|
53578
|
+
type: ["object", "array", "string", "number", "boolean", "null"]
|
|
53579
|
+
}
|
|
53446
53580
|
}
|
|
53447
53581
|
},
|
|
53448
53582
|
response: {
|
|
@@ -54096,9 +54230,9 @@ var openAPISpec = {
|
|
|
54096
54230
|
};
|
|
54097
54231
|
|
|
54098
54232
|
// src/plugin-loader.ts
|
|
54099
|
-
import {
|
|
54233
|
+
import { mkdtemp, rm, writeFile } from "fs/promises";
|
|
54100
54234
|
import { tmpdir } from "os";
|
|
54101
|
-
import {
|
|
54235
|
+
import { join as join8, resolve as resolve5 } from "path";
|
|
54102
54236
|
function isLocalPath(pkg) {
|
|
54103
54237
|
return pkg.startsWith("./") || pkg.startsWith("../") || pkg.startsWith("/") || /^[A-Za-z]:[\\/]/.test(pkg);
|
|
54104
54238
|
}
|
|
@@ -54173,13 +54307,17 @@ class PluginManager {
|
|
|
54173
54307
|
constructor(configDir) {
|
|
54174
54308
|
this.configDir = configDir;
|
|
54175
54309
|
}
|
|
54176
|
-
async loadPluginsForProvider(providerName, pluginConfigs) {
|
|
54310
|
+
async loadPluginsForProvider(providerName, providerConfig, pluginConfigs) {
|
|
54177
54311
|
const loaded = [];
|
|
54178
54312
|
const failures = [];
|
|
54179
54313
|
for (const config2 of pluginConfigs) {
|
|
54180
54314
|
try {
|
|
54181
54315
|
const definition = await importPlugin(config2.package, this.configDir);
|
|
54182
|
-
const
|
|
54316
|
+
const params = { ...config2.params ?? {} };
|
|
54317
|
+
if (definition.name === "protocol-adapter" && params.targetFormat === undefined) {
|
|
54318
|
+
params.targetFormat = providerConfig.type;
|
|
54319
|
+
}
|
|
54320
|
+
const instance2 = await definition.create(params);
|
|
54183
54321
|
loaded.push({ config: config2, definition, instance: instance2 });
|
|
54184
54322
|
} catch (err) {
|
|
54185
54323
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
@@ -54195,7 +54333,7 @@ class PluginManager {
|
|
|
54195
54333
|
const oldPluginsToDispose = [];
|
|
54196
54334
|
for (const [providerName, providerConfig] of Object.entries(providers)) {
|
|
54197
54335
|
if (providerConfig.plugins && providerConfig.plugins.length > 0) {
|
|
54198
|
-
const { loaded, failures } = await this.loadPluginsForProvider(providerName, providerConfig.plugins);
|
|
54336
|
+
const { loaded, failures } = await this.loadPluginsForProvider(providerName, providerConfig, providerConfig.plugins);
|
|
54199
54337
|
allFailures.push(...failures);
|
|
54200
54338
|
if (failures.length > 0) {
|
|
54201
54339
|
console.warn(`[plugin] provider "${providerName}" \u6709\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559\u65E7\u63D2\u4EF6\u94FE`);
|
|
@@ -54264,19 +54402,12 @@ class PluginManager {
|
|
|
54264
54402
|
}
|
|
54265
54403
|
}
|
|
54266
54404
|
}
|
|
54267
|
-
async disposePluginMap(pluginMap) {
|
|
54268
|
-
const allPlugins = [];
|
|
54269
|
-
for (const [, loadedPlugins] of pluginMap) {
|
|
54270
|
-
allPlugins.push(...loadedPlugins);
|
|
54271
|
-
}
|
|
54272
|
-
await this.disposePluginList(allPlugins);
|
|
54273
|
-
}
|
|
54274
54405
|
}
|
|
54275
54406
|
|
|
54276
54407
|
// src/proxy.ts
|
|
54277
54408
|
import { appendFile, readFile, unlink } from "fs/promises";
|
|
54278
|
-
import { join as join9 } from "path";
|
|
54279
54409
|
import { tmpdir as tmpdir2 } from "os";
|
|
54410
|
+
import { join as join9 } from "path";
|
|
54280
54411
|
|
|
54281
54412
|
// src/plugin-engine.ts
|
|
54282
54413
|
async function executeRequestPlugins(plugins, ctx, url2, headers, body) {
|
|
@@ -54787,47 +54918,34 @@ function createOpenaiResponsesRoutes(routeType, store, pluginManager) {
|
|
|
54787
54918
|
return routes;
|
|
54788
54919
|
}
|
|
54789
54920
|
|
|
54790
|
-
// src/
|
|
54791
|
-
|
|
54792
|
-
|
|
54793
|
-
|
|
54794
|
-
|
|
54795
|
-
function getBundledSchemaPath() {
|
|
54796
|
-
return resolveBundledAssetPath("../config.schema.json");
|
|
54797
|
-
}
|
|
54798
|
-
function getBundledWebRoot() {
|
|
54799
|
-
return resolveBundledAssetPath("../dist/web/");
|
|
54800
|
-
}
|
|
54801
|
-
|
|
54802
|
-
// src/config-validate.ts
|
|
54803
|
-
var import__2020 = __toESM(require_2020(), 1);
|
|
54804
|
-
var import_ajv_formats = __toESM(require_dist2(), 1);
|
|
54805
|
-
import { readFileSync as readFileSync3 } from "fs";
|
|
54806
|
-
function validateBusinessRules(config2) {
|
|
54807
|
-
for (const [routeType, modelMap] of Object.entries(config2.routes)) {
|
|
54808
|
-
if (!modelMap["*"]) {
|
|
54809
|
-
throw new Error(`\u8DEF\u7531 "${routeType}" \u7F3A\u5C11 "*" \u515C\u5E95\u89C4\u5219`);
|
|
54810
|
-
}
|
|
54811
|
-
for (const target of Object.values(modelMap)) {
|
|
54812
|
-
if (!config2.providers[target.provider]) {
|
|
54813
|
-
throw new Error(`\u8DEF\u7531 "${routeType}" \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 provider "${target.provider}"`);
|
|
54814
|
-
}
|
|
54815
|
-
}
|
|
54921
|
+
// src/server-address.ts
|
|
54922
|
+
function formatUrlHost(host) {
|
|
54923
|
+
const trimmed = host.trim();
|
|
54924
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
54925
|
+
return trimmed;
|
|
54816
54926
|
}
|
|
54927
|
+
return trimmed.includes(":") ? `[${trimmed}]` : trimmed;
|
|
54817
54928
|
}
|
|
54818
|
-
function
|
|
54819
|
-
|
|
54820
|
-
|
|
54821
|
-
|
|
54822
|
-
|
|
54823
|
-
|
|
54824
|
-
|
|
54825
|
-
if (!valid) {
|
|
54826
|
-
const firstError = validateBySchema.errors?.[0];
|
|
54827
|
-
const path = firstError?.instancePath || "(root)";
|
|
54828
|
-
const message = firstError?.message ?? "unknown schema validation error";
|
|
54829
|
-
throw new Error(`Schema \u6821\u9A8C\u5931\u8D25: ${path} ${message}`);
|
|
54929
|
+
function resolveLocalAccessHost(listenHost) {
|
|
54930
|
+
const host = listenHost.trim().toLowerCase();
|
|
54931
|
+
if (host === "0.0.0.0" || host === "") {
|
|
54932
|
+
return "127.0.0.1";
|
|
54933
|
+
}
|
|
54934
|
+
if (host === "::" || host === "[::]") {
|
|
54935
|
+
return "::1";
|
|
54830
54936
|
}
|
|
54937
|
+
return listenHost.trim();
|
|
54938
|
+
}
|
|
54939
|
+
function createServerAddressInfo(listenHost, port) {
|
|
54940
|
+
const normalizedListenHost = listenHost.trim() || "0.0.0.0";
|
|
54941
|
+
const localHost = resolveLocalAccessHost(normalizedListenHost);
|
|
54942
|
+
return {
|
|
54943
|
+
listenHost: normalizedListenHost,
|
|
54944
|
+
localHost,
|
|
54945
|
+
port,
|
|
54946
|
+
listenUrl: `http://${formatUrlHost(normalizedListenHost)}:${port}`,
|
|
54947
|
+
localUrl: `http://${formatUrlHost(localHost)}:${port}`
|
|
54948
|
+
};
|
|
54831
54949
|
}
|
|
54832
54950
|
|
|
54833
54951
|
// src/index.ts
|
|
@@ -54869,13 +54987,18 @@ var ROUTE_REGISTRY = {
|
|
|
54869
54987
|
create: createAnthropicMessagesRoutes
|
|
54870
54988
|
}
|
|
54871
54989
|
};
|
|
54872
|
-
function printIntegrationGuide(config2) {
|
|
54873
|
-
const host = process.env.HOST ?? "
|
|
54874
|
-
const
|
|
54875
|
-
const
|
|
54990
|
+
function printIntegrationGuide(config2, listen = {}) {
|
|
54991
|
+
const host = listen.host ?? process.env.HOST ?? "0.0.0.0";
|
|
54992
|
+
const parsedPort = listen.port ?? Number.parseInt(process.env.PORT ?? "4099", 10);
|
|
54993
|
+
const address = createServerAddressInfo(host, Number.isFinite(parsedPort) ? parsedPort : 4099);
|
|
54994
|
+
const baseUrl = address.localUrl;
|
|
54876
54995
|
console.log(`
|
|
54877
54996
|
================ local-router \u63A5\u5165\u6307\u5357 ================`);
|
|
54878
|
-
console.log(`\
|
|
54997
|
+
console.log(`\u670D\u52A1\u76D1\u542C\u5730\u5740: ${address.listenUrl}`);
|
|
54998
|
+
console.log(`\u672C\u673A\u8BBF\u95EE\u5730\u5740: ${address.localUrl}`);
|
|
54999
|
+
if (address.listenHost === "0.0.0.0" || address.listenHost === "::" || address.listenHost === "[::]") {
|
|
55000
|
+
console.log("\u5C40\u57DF\u7F51\u8BBF\u95EE: \u5F00\u542F\u5C40\u57DF\u7F51\u670D\u52A1\u540E\uFF0C\u4F7F\u7528\u672C\u673A\u5C40\u57DF\u7F51 IP \u66FF\u6362\u4E0A\u9762\u7684\u672C\u673A\u5730\u5740\u3002");
|
|
55001
|
+
}
|
|
54879
55002
|
console.log("\u5065\u5EB7\u68C0\u67E5: GET /");
|
|
54880
55003
|
console.log(`API \u6587\u6863: ${baseUrl}/api/docs`);
|
|
54881
55004
|
console.log(`\u7BA1\u7406\u9762\u677F: ${baseUrl}/admin`);
|
|
@@ -55514,8 +55637,9 @@ async function createApp(store, options) {
|
|
|
55514
55637
|
options?.registerCleanup?.(() => {
|
|
55515
55638
|
pluginManager.disposeAll().catch(() => {});
|
|
55516
55639
|
});
|
|
55517
|
-
printIntegrationGuide(config2);
|
|
55640
|
+
printIntegrationGuide(config2, options?.listen);
|
|
55518
55641
|
const app = new Hono2;
|
|
55642
|
+
app.use("*", createNetworkAccessMiddleware(store));
|
|
55519
55643
|
app.get("/", (c2) => c2.text("local-router is running"));
|
|
55520
55644
|
for (const [routeType, entry] of Object.entries(ROUTE_REGISTRY)) {
|
|
55521
55645
|
const subApp = entry.create(routeType, store, pluginManager);
|
|
@@ -55554,12 +55678,26 @@ async function createApp(store, options) {
|
|
|
55554
55678
|
async function createDefaultAppFromProcessArgs() {
|
|
55555
55679
|
const configPath = parseConfigPath();
|
|
55556
55680
|
const store = new ConfigStore(configPath);
|
|
55557
|
-
return createApp(store
|
|
55681
|
+
return createApp(store, {
|
|
55682
|
+
listen: {
|
|
55683
|
+
host: process.env.HOST ?? "0.0.0.0",
|
|
55684
|
+
port: Number.parseInt(process.env.PORT ?? "4099", 10)
|
|
55685
|
+
}
|
|
55686
|
+
});
|
|
55558
55687
|
}
|
|
55559
55688
|
|
|
55560
55689
|
// src/entry.ts
|
|
55561
55690
|
var app = await createDefaultAppFromProcessArgs();
|
|
55562
|
-
var entry_default =
|
|
55691
|
+
var entry_default = {
|
|
55692
|
+
hostname: process.env.HOST ?? "0.0.0.0",
|
|
55693
|
+
port: Number.parseInt(process.env.PORT ?? "4099", 10),
|
|
55694
|
+
fetch(request, server) {
|
|
55695
|
+
const remoteAddress = server.requestIP(request)?.address ?? null;
|
|
55696
|
+
return app.fetch(request, {
|
|
55697
|
+
[REMOTE_ADDRESS_ENV_KEY]: remoteAddress
|
|
55698
|
+
});
|
|
55699
|
+
}
|
|
55700
|
+
};
|
|
55563
55701
|
export {
|
|
55564
55702
|
entry_default as default
|
|
55565
55703
|
};
|