@next-core/easyops-runtime 0.12.46 → 0.13.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,7 +35,6 @@ function onResponseOrError(hasError, responseOrError, config) {
35
35
  url
36
36
  } = config;
37
37
  if (meta && !(hasError && responseOrError instanceof _http.HttpAbortError)) {
38
- var _code, _message, _traceId;
39
38
  delete config[symbolHttpAnalytics];
40
39
  const {
41
40
  st,
@@ -92,10 +91,10 @@ function onResponseOrError(hasError, responseOrError, config) {
92
91
  duration: perfEndTime - perfStartTime,
93
92
  api: url,
94
93
  type: "api",
95
- code: (_code = code) !== null && _code !== void 0 ? _code : -1,
96
- msg: (_message = message) !== null && _message !== void 0 ? _message : "",
94
+ code: code ?? -1,
95
+ msg: message ?? "",
97
96
  status,
98
- traceId: (_traceId = traceId) !== null && _traceId !== void 0 ? _traceId : "",
97
+ traceId: traceId ?? "",
99
98
  size: size ? Number(size) : -1
100
99
  });
101
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":["_http","require","_general","_auth","_analytics","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","HttpAbortError","_code","_message","_traceId","userInstanceId","uid","username","getAuth","code","message","traceId","size","status","headers","data","isHttpResponseError","HttpResponseError","HttpParseError","responseJson","isObject","Headers","get","pushApiMetric","_ver","page","location","href","duration","api","type","msg","Number","Promise","reject"],"sources":["../../../src/analytics/http.ts"],"sourcesContent":["import {\n HttpResponseError,\n HttpParseError,\n HttpAbortError,\n type HttpError,\n type HttpRequestConfig,\n type HttpResponse,\n} from \"@next-core/http\";\nimport { isObject } from \"@next-core/utils/general\";\nimport { getAuth } from \"../auth.js\";\nimport type { HttpAnalyticsMeta } from \"./interfaces.js\";\nimport { pushApiMetric } from \"./analytics.js\";\n\nconst symbolHttpAnalytics = Symbol(\"HttpAnalytics\");\n\ninterface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {\n [symbolHttpAnalytics]?: HttpAnalyticsMeta;\n}\n\nexport function onRequest(\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpRequestConfig {\n const perfStartTime = Math.round(performance.now());\n const st = Date.now();\n config[symbolHttpAnalytics] = {\n st,\n time: Math.round(st / 1000),\n perfStartTime,\n };\n return config;\n}\n\nexport function onResponse(\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse {\n return onResponseOrError(false, response, config);\n}\n\nexport function onResponseError(\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError> {\n return onResponseOrError(true, error, config);\n}\n\nfunction onResponseOrError(\n hasError: false,\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse;\nfunction onResponseOrError(\n hasError: true,\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError>;\nfunction onResponseOrError(\n hasError: boolean,\n responseOrError: HttpResponse | HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse | Promise<HttpError> {\n const perfEndTime = Math.round(performance.now());\n const et = Date.now();\n const { [symbolHttpAnalytics]: meta, url } = config;\n if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {\n delete config[symbolHttpAnalytics];\n const { st, time, perfStartTime } = meta;\n const { userInstanceId: uid, username } = getAuth();\n\n let code: number | undefined;\n let message: string | undefined;\n let traceId: string | null | undefined;\n let size: string | null | undefined;\n let status: number | undefined;\n\n let headers: Headers | undefined;\n let data: unknown;\n\n if (hasError) {\n const isHttpResponseError = responseOrError instanceof HttpResponseError;\n if (isHttpResponseError || responseOrError instanceof HttpParseError) {\n ({ status, headers } = responseOrError.response);\n if (isHttpResponseError) {\n data = responseOrError.responseJson;\n }\n }\n } else {\n ({ status, data, headers } = responseOrError as HttpResponse);\n }\n\n if (isObject(data)) {\n ({ code, message } = data as { code?: number; message?: string });\n }\n\n if (headers instanceof Headers) {\n traceId = headers.get(\"x-b3-traceid\");\n size = headers.get(\"content-length\");\n }\n\n pushApiMetric({\n st,\n _ver: st,\n uid,\n username,\n time,\n et,\n page: location.href,\n duration: perfEndTime - perfStartTime,\n api: url,\n type: \"api\",\n code: code ?? -1,\n msg: message ?? \"\",\n status,\n traceId: traceId ?? \"\",\n size: size ? Number(size) : -1,\n });\n }\n\n return hasError\n ? Promise.reject(responseOrError)\n : (responseOrError as HttpResponse);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"http.js","names":["_http","require","_general","_auth","_analytics","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","HttpAbortError","userInstanceId","uid","username","getAuth","code","message","traceId","size","status","headers","data","isHttpResponseError","HttpResponseError","HttpParseError","responseJson","isObject","Headers","get","pushApiMetric","_ver","page","location","href","duration","api","type","msg","Number","Promise","reject"],"sources":["../../../src/analytics/http.ts"],"sourcesContent":["import {\n HttpResponseError,\n HttpParseError,\n HttpAbortError,\n type HttpError,\n type HttpRequestConfig,\n type HttpResponse,\n} from \"@next-core/http\";\nimport { isObject } from \"@next-core/utils/general\";\nimport { getAuth } from \"../auth.js\";\nimport type { HttpAnalyticsMeta } from \"./interfaces.js\";\nimport { pushApiMetric } from \"./analytics.js\";\n\nconst symbolHttpAnalytics = Symbol(\"HttpAnalytics\");\n\ninterface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {\n [symbolHttpAnalytics]?: HttpAnalyticsMeta;\n}\n\nexport function onRequest(\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpRequestConfig {\n const perfStartTime = Math.round(performance.now());\n const st = Date.now();\n config[symbolHttpAnalytics] = {\n st,\n time: Math.round(st / 1000),\n perfStartTime,\n };\n return config;\n}\n\nexport function onResponse(\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse {\n return onResponseOrError(false, response, config);\n}\n\nexport function onResponseError(\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError> {\n return onResponseOrError(true, error, config);\n}\n\nfunction onResponseOrError(\n hasError: false,\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse;\nfunction onResponseOrError(\n hasError: true,\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError>;\nfunction onResponseOrError(\n hasError: boolean,\n responseOrError: HttpResponse | HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse | Promise<HttpError> {\n const perfEndTime = Math.round(performance.now());\n const et = Date.now();\n const { [symbolHttpAnalytics]: meta, url } = config;\n if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {\n delete config[symbolHttpAnalytics];\n const { st, time, perfStartTime } = meta;\n const { userInstanceId: uid, username } = getAuth();\n\n let code: number | undefined;\n let message: string | undefined;\n let traceId: string | null | undefined;\n let size: string | null | undefined;\n let status: number | undefined;\n\n let headers: Headers | undefined;\n let data: unknown;\n\n if (hasError) {\n const isHttpResponseError = responseOrError instanceof HttpResponseError;\n if (isHttpResponseError || responseOrError instanceof HttpParseError) {\n ({ status, headers } = responseOrError.response);\n if (isHttpResponseError) {\n data = responseOrError.responseJson;\n }\n }\n } else {\n ({ status, data, headers } = responseOrError as HttpResponse);\n }\n\n if (isObject(data)) {\n ({ code, message } = data as { code?: number; message?: string });\n }\n\n if (headers instanceof Headers) {\n traceId = headers.get(\"x-b3-traceid\");\n size = headers.get(\"content-length\");\n }\n\n pushApiMetric({\n st,\n _ver: st,\n uid,\n username,\n time,\n et,\n page: location.href,\n duration: perfEndTime - perfStartTime,\n api: url,\n type: \"api\",\n code: code ?? -1,\n msg: message ?? \"\",\n status,\n traceId: traceId ?? \"\",\n size: size ? Number(size) : -1,\n });\n }\n\n return hasError\n ? Promise.reject(responseOrError)\n : (responseOrError as HttpResponse);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -11,7 +11,7 @@ var _lodash = require("lodash");
11
11
  function authV2Factory() {
12
12
  const v2Kit = (0, _runtime.getV2RuntimeFromDll)();
13
13
  if (v2Kit) {
14
- return Object.freeze((0, _lodash.pick)(v2Kit, ["authenticate", "getAuth", "isLoggedIn", "logout"]));
14
+ return Object.freeze((0, _lodash.pick)(v2Kit, ["authenticate", "getAuth", "isLoggedIn", "logout", "isBlockedPath", "isBlockedUrl", "isBlockedHref"]));
15
15
  }
16
16
  }
17
17
  //# sourceMappingURL=auth-v2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-v2.js","names":["_runtime","require","_lodash","authV2Factory","v2Kit","getV2RuntimeFromDll","Object","freeze","pick"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAFA;;AAKO,SAASE,aAAaA,CAAA,EAAG;EAC9B,MAAMC,KAAK,GAAG,IAAAC,4BAAmB,EAAC,CAAC;EACnC,IAAID,KAAK,EAAE;IACT,OAAOE,MAAM,CAACC,MAAM,CAClB,IAAAC,YAAI,EAACJ,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACjE,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"auth-v2.js","names":["_runtime","require","_lodash","authV2Factory","v2Kit","getV2RuntimeFromDll","Object","freeze","pick"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\n \"authenticate\",\n \"getAuth\",\n \"isLoggedIn\",\n \"logout\",\n \"isBlockedPath\",\n \"isBlockedUrl\",\n \"isBlockedHref\",\n ])\n ) as typeof auth;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAFA;;AAKO,SAASE,aAAaA,CAAA,EAAG;EAC9B,MAAMC,KAAK,GAAG,IAAAC,4BAAmB,EAAC,CAAC;EACnC,IAAID,KAAK,EAAE;IACT,OAAOE,MAAM,CAACC,MAAM,CAClB,IAAAC,YAAI,EAACJ,KAAK,EAAE,CACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,cAAc,EACd,eAAe,CAChB,CACH,CAAC;EACH;AACF","ignoreList":[]}
package/dist/cjs/auth.js CHANGED
@@ -5,8 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.authenticate = authenticate;
7
7
  exports.getAuth = getAuth;
8
+ exports.isBlockedHref = isBlockedHref;
9
+ exports.isBlockedPath = isBlockedPath;
10
+ exports.isBlockedUrl = isBlockedUrl;
8
11
  exports.isLoggedIn = isLoggedIn;
9
12
  exports.logout = logout;
13
+ var _runtime = require("@next-core/runtime");
14
+ var _history = require("history");
10
15
  var _checkPermissions = require("./checkPermissions.js");
11
16
  const auth = {};
12
17
 
@@ -55,4 +60,39 @@ function logout() {
55
60
  function isLoggedIn() {
56
61
  return auth.username !== undefined;
57
62
  }
63
+
64
+ /**
65
+ * 判断一个内部 URL 路径是否被屏蔽。
66
+ */
67
+ function isBlockedPath(pathname) {
68
+ var _auth$license;
69
+ return !!((_auth$license = auth.license) !== null && _auth$license !== void 0 && (_auth$license = _auth$license.blackList) !== null && _auth$license !== void 0 && _auth$license.some(path => (0, _runtime.matchPath)(pathname, {
70
+ path
71
+ })));
72
+ }
73
+
74
+ /**
75
+ * 判断一个内部 URL 是否被屏蔽。
76
+ */
77
+ function isBlockedUrl(url) {
78
+ const pathname = (typeof url === "string" ? (0, _history.createLocation)(url) : url).pathname;
79
+ if (typeof pathname !== "string") {
80
+ return false;
81
+ }
82
+ return isBlockedPath(pathname);
83
+ }
84
+
85
+ /**
86
+ * 判断一个 href 是否被屏蔽。
87
+ */
88
+ function isBlockedHref(href) {
89
+ const basePath = (0, _runtime.getBasePath)();
90
+ const url = new URL(href, `${location.origin}${basePath}`);
91
+ // 忽略外链地址
92
+ if (url.origin !== location.origin || !url.pathname.startsWith(basePath)) {
93
+ return false;
94
+ }
95
+ // 转换为内部路径
96
+ return isBlockedPath(url.pathname.substring(basePath.length - 1));
97
+ }
58
98
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":["_checkPermissions","require","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","logout","key","keys","undefined","resetPermissionPreChecks","isLoggedIn"],"sources":["../../src/auth.ts"],"sourcesContent":["import type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n accessToken: newAuth.accessToken,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n"],"mappings":";;;;;;;;;AACA,IAAAA,iBAAA,GAAAC,OAAA;AAEA,MAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,aAAa,EAAEZ,OAAO,CAACY;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAO;IACL,GAAGf;EACL,CAAC;AACH;;AAEA;AACO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,MAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACA,IAAAC,0CAAwB,EAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOrB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC","ignoreList":[]}
1
+ {"version":3,"file":"auth.js","names":["_runtime","require","_history","_checkPermissions","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","logout","key","keys","undefined","resetPermissionPreChecks","isLoggedIn","isBlockedPath","pathname","_auth$license","blackList","some","path","matchPath","isBlockedUrl","url","createLocation","isBlockedHref","href","basePath","getBasePath","URL","location","origin","startsWith","substring","length"],"sources":["../../src/auth.ts"],"sourcesContent":["import { getBasePath, matchPath } from \"@next-core/runtime\";\nimport type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { createLocation, type LocationDescriptor } from \"history\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n accessToken: newAuth.accessToken,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n\n/**\n * 判断一个内部 URL 路径是否被屏蔽。\n */\nexport function isBlockedPath(pathname: string): boolean {\n return !!auth.license?.blackList?.some((path) =>\n matchPath(pathname, { path })\n );\n}\n\n/**\n * 判断一个内部 URL 是否被屏蔽。\n */\nexport function isBlockedUrl(url: string | LocationDescriptor): boolean {\n const pathname = (typeof url === \"string\" ? createLocation(url) : url)\n .pathname;\n if (typeof pathname !== \"string\") {\n return false;\n }\n return isBlockedPath(pathname);\n}\n\n/**\n * 判断一个 href 是否被屏蔽。\n */\nexport function isBlockedHref(href: string): boolean {\n const basePath = getBasePath();\n const url = new URL(href, `${location.origin}${basePath}`);\n // 忽略外链地址\n if (url.origin !== location.origin || !url.pathname.startsWith(basePath)) {\n return false;\n }\n // 转换为内部路径\n return isBlockedPath(url.pathname.substring(basePath.length - 1));\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AAEA,MAAMG,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,aAAa,EAAEZ,OAAO,CAACY;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAO;IACL,GAAGf;EACL,CAAC;AACH;;AAEA;AACO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,MAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACA,IAAAC,0CAAwB,EAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOrB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC;;AAEA;AACA;AACA;AACO,SAASG,aAAaA,CAACC,QAAgB,EAAW;EAAA,IAAAC,aAAA;EACvD,OAAO,CAAC,GAAAA,aAAA,GAACxB,IAAI,CAACY,OAAO,cAAAY,aAAA,gBAAAA,aAAA,GAAZA,aAAA,CAAcC,SAAS,cAAAD,aAAA,eAAvBA,aAAA,CAAyBE,IAAI,CAAEC,IAAI,IAC1C,IAAAC,kBAAS,EAACL,QAAQ,EAAE;IAAEI;EAAK,CAAC,CAC9B,CAAC;AACH;;AAEA;AACA;AACA;AACO,SAASE,YAAYA,CAACC,GAAgC,EAAW;EACtE,MAAMP,QAAQ,GAAG,CAAC,OAAOO,GAAG,KAAK,QAAQ,GAAG,IAAAC,uBAAc,EAACD,GAAG,CAAC,GAAGA,GAAG,EAClEP,QAAQ;EACX,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;IAChC,OAAO,KAAK;EACd;EACA,OAAOD,aAAa,CAACC,QAAQ,CAAC;AAChC;;AAEA;AACA;AACA;AACO,SAASS,aAAaA,CAACC,IAAY,EAAW;EACnD,MAAMC,QAAQ,GAAG,IAAAC,oBAAW,EAAC,CAAC;EAC9B,MAAML,GAAG,GAAG,IAAIM,GAAG,CAACH,IAAI,EAAE,GAAGI,QAAQ,CAACC,MAAM,GAAGJ,QAAQ,EAAE,CAAC;EAC1D;EACA,IAAIJ,GAAG,CAACQ,MAAM,KAAKD,QAAQ,CAACC,MAAM,IAAI,CAACR,GAAG,CAACP,QAAQ,CAACgB,UAAU,CAACL,QAAQ,CAAC,EAAE;IACxE,OAAO,KAAK;EACd;EACA;EACA,OAAOZ,aAAa,CAACQ,GAAG,CAACP,QAAQ,CAACiB,SAAS,CAACN,QAAQ,CAACO,MAAM,GAAG,CAAC,CAAC,CAAC;AACnE","ignoreList":[]}
@@ -59,7 +59,6 @@ function getCheckedApp(appId) {
59
59
  }
60
60
  }
61
61
  function scanInstalledAppsUsage(storyboard) {
62
- var _storyboard$meta;
63
62
  const usage = {
64
63
  usedArgs: new Set()
65
64
  };
@@ -67,7 +66,7 @@ function scanInstalledAppsUsage(storyboard) {
67
66
  const {
68
67
  customTemplates,
69
68
  menus
70
- } = (_storyboard$meta = storyboard.meta) !== null && _storyboard$meta !== void 0 ? _storyboard$meta : {};
69
+ } = storyboard.meta ?? {};
71
70
  (0, _storyboard.traverseStoryboardExpressions)([storyboard.routes, customTemplates, menus], (node, parent) => {
72
71
  (0, _storyboard.collectInstalledAppsHasUsage)(usage, node, parent);
73
72
  }, "INSTALLED_APPS");
@@ -1 +1 @@
1
- {"version":3,"file":"checkInstalledApps.js","names":["_storyboard","require","_microAppStandaloneSdk","checkingApps","Map","checkedApps","preCheckInstalledApps","storyboard","hasAppInBootstrap","window","STANDALONE_MICRO_APPS","NO_AUTH_GUARD","appIds","scanInstalledAppsUsage","searchIds","appId","has","push","length","promise","RuntimeApi_searchMicroAppStandalone","query","$in","fields","catch","error","console","set","then","result","_result$list","app","list","find","item","checkedApp","id","undefined","waitForCheckingApps","Promise","all","map","get","getCheckedApp","_storyboard$meta","usage","usedArgs","Set","customTemplates","menus","meta","traverseStoryboardExpressions","routes","node","parent","collectInstalledAppsHasUsage"],"sources":["../../src/checkInstalledApps.ts"],"sourcesContent":["import type { MicroApp, Storyboard } from \"@next-core/types\";\nimport {\n traverseStoryboardExpressions,\n collectInstalledAppsHasUsage,\n type MemberCallUsage,\n} from \"@next-core/utils/storyboard\";\nimport { RuntimeApi_searchMicroAppStandalone } from \"@next-api-sdk/micro-app-standalone-sdk\";\n\ntype AppForCheck = Pick<MicroApp, \"id\" | \"currentVersion\" | \"installStatus\">;\n\nconst checkingApps = new Map<string, Promise<AppForCheck | undefined>>();\nconst checkedApps = new Map<string, AppForCheck | undefined>();\n\nexport function preCheckInstalledApps(\n storyboard: Storyboard,\n hasAppInBootstrap: (appId: string) => boolean\n) {\n if (window.STANDALONE_MICRO_APPS && !window.NO_AUTH_GUARD) {\n const appIds = scanInstalledAppsUsage(storyboard);\n const searchIds: string[] = [];\n for (const appId of appIds) {\n // Do not check these apps already checking or in bootstrap.\n if (!checkingApps.has(appId) && !hasAppInBootstrap(appId)) {\n searchIds.push(appId);\n }\n }\n if (searchIds.length === 0) {\n return;\n }\n const promise = RuntimeApi_searchMicroAppStandalone({\n query: { appId: { $in: searchIds } },\n fields: [\"appId\", \"currentVersion\", \"installStatus\"],\n }).catch((error) => {\n // Allow search micro app to fail, and\n // make it not crash when the backend service is not updated.\n // eslint-disable-next-line no-console\n console.error(\"Get off site standalone micro-apps failed\", error);\n });\n for (const appId of searchIds) {\n checkingApps.set(\n appId,\n promise.then((result) => {\n const app = result?.list?.find((item) => item.appId === appId);\n const checkedApp = app\n ? {\n ...app,\n id: appId,\n }\n : undefined;\n checkedApps.set(appId, checkedApp);\n return checkedApp;\n })\n );\n }\n }\n}\n\nexport async function waitForCheckingApps(appIds: string[]) {\n await Promise.all(appIds.map((appId) => checkingApps.get(appId)));\n}\n\nexport function getCheckedApp(appId: string) {\n if (window.STANDALONE_MICRO_APPS) {\n return checkedApps.get(appId);\n }\n}\n\nfunction scanInstalledAppsUsage(storyboard: Storyboard) {\n const usage: MemberCallUsage = {\n usedArgs: new Set(),\n };\n // `INSTALLED_APPS.has(...)` is not available in storyboard functions\n const { customTemplates, menus } = storyboard.meta ?? {};\n traverseStoryboardExpressions(\n [storyboard.routes, customTemplates, menus],\n (node, parent) => {\n collectInstalledAppsHasUsage(usage, node, parent);\n },\n \"INSTALLED_APPS\"\n );\n return [...usage.usedArgs];\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"checkInstalledApps.js","names":["_storyboard","require","_microAppStandaloneSdk","checkingApps","Map","checkedApps","preCheckInstalledApps","storyboard","hasAppInBootstrap","window","STANDALONE_MICRO_APPS","NO_AUTH_GUARD","appIds","scanInstalledAppsUsage","searchIds","appId","has","push","length","promise","RuntimeApi_searchMicroAppStandalone","query","$in","fields","catch","error","console","set","then","result","_result$list","app","list","find","item","checkedApp","id","undefined","waitForCheckingApps","Promise","all","map","get","getCheckedApp","usage","usedArgs","Set","customTemplates","menus","meta","traverseStoryboardExpressions","routes","node","parent","collectInstalledAppsHasUsage"],"sources":["../../src/checkInstalledApps.ts"],"sourcesContent":["import type { MicroApp, Storyboard } from \"@next-core/types\";\nimport {\n traverseStoryboardExpressions,\n collectInstalledAppsHasUsage,\n type MemberCallUsage,\n} from \"@next-core/utils/storyboard\";\nimport { RuntimeApi_searchMicroAppStandalone } from \"@next-api-sdk/micro-app-standalone-sdk\";\n\ntype AppForCheck = Pick<MicroApp, \"id\" | \"currentVersion\" | \"installStatus\">;\n\nconst checkingApps = new Map<string, Promise<AppForCheck | undefined>>();\nconst checkedApps = new Map<string, AppForCheck | undefined>();\n\nexport function preCheckInstalledApps(\n storyboard: Storyboard,\n hasAppInBootstrap: (appId: string) => boolean\n) {\n if (window.STANDALONE_MICRO_APPS && !window.NO_AUTH_GUARD) {\n const appIds = scanInstalledAppsUsage(storyboard);\n const searchIds: string[] = [];\n for (const appId of appIds) {\n // Do not check these apps already checking or in bootstrap.\n if (!checkingApps.has(appId) && !hasAppInBootstrap(appId)) {\n searchIds.push(appId);\n }\n }\n if (searchIds.length === 0) {\n return;\n }\n const promise = RuntimeApi_searchMicroAppStandalone({\n query: { appId: { $in: searchIds } },\n fields: [\"appId\", \"currentVersion\", \"installStatus\"],\n }).catch((error) => {\n // Allow search micro app to fail, and\n // make it not crash when the backend service is not updated.\n // eslint-disable-next-line no-console\n console.error(\"Get off site standalone micro-apps failed\", error);\n });\n for (const appId of searchIds) {\n checkingApps.set(\n appId,\n promise.then((result) => {\n const app = result?.list?.find((item) => item.appId === appId);\n const checkedApp = app\n ? {\n ...app,\n id: appId,\n }\n : undefined;\n checkedApps.set(appId, checkedApp);\n return checkedApp;\n })\n );\n }\n }\n}\n\nexport async function waitForCheckingApps(appIds: string[]) {\n await Promise.all(appIds.map((appId) => checkingApps.get(appId)));\n}\n\nexport function getCheckedApp(appId: string) {\n if (window.STANDALONE_MICRO_APPS) {\n return checkedApps.get(appId);\n }\n}\n\nfunction scanInstalledAppsUsage(storyboard: Storyboard) {\n const usage: MemberCallUsage = {\n usedArgs: new Set(),\n };\n // `INSTALLED_APPS.has(...)` is not available in storyboard functions\n const { customTemplates, menus } = storyboard.meta ?? {};\n traverseStoryboardExpressions(\n [storyboard.routes, customTemplates, menus],\n (node, parent) => {\n collectInstalledAppsHasUsage(usage, node, parent);\n },\n \"INSTALLED_APPS\"\n );\n return [...usage.usedArgs];\n}\n"],"mappings":"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","ignoreList":[]}
@@ -70,7 +70,7 @@ function getTransformedUriAndRestArgs(uri, originalArgs, name, namespace, servic
70
70
  };
71
71
  }
72
72
  function getApiProfileFromApiDefinition(provider, api) {
73
- var _contract$endpoint, _contract$response;
73
+ var _contract$response;
74
74
  const contract = typeof api.contract === "string" ? _jsYaml.default.safeLoad(api.contract, {
75
75
  schema: _jsYaml.default.JSON_SCHEMA,
76
76
  json: true
@@ -79,7 +79,7 @@ function getApiProfileFromApiDefinition(provider, api) {
79
79
  uri,
80
80
  method = "GET",
81
81
  ext_fields
82
- } = (_contract$endpoint = contract === null || contract === void 0 ? void 0 : contract.endpoint) !== null && _contract$endpoint !== void 0 ? _contract$endpoint : {};
82
+ } = (contract === null || contract === void 0 ? void 0 : contract.endpoint) ?? {};
83
83
  const responseWrapper = contract !== null && contract !== void 0 && contract.response ? contract.response.wrapper !== false : false;
84
84
  if (!uri) {
85
85
  throw new Error(`Missing endpoint.uri in contract of provider "${provider}"`);
@@ -1 +1 @@
1
- {"version":3,"file":"FlowApi.js","names":["_jsYaml","_interopRequireDefault","require","_apiGatewaySdk","_CollectContracts","remoteContractCache","Map","isFlowApiProvider","provider","includes","getArgsOfFlowApi","originalArgs","method","stream","Error","apiDefinition","fetchFlowApiDefinition","FlowApiNotFoundError","apiProfile","getApiProfileFromApiDefinition","getApiArgsFromApiProfile","uri","apiMethod","ext_fields","name","namespace","serviceName","responseWrapper","version","isFileType","request","isDownload","fileName","shift","url","args","getTransformedUriAndRestArgs","originalUri","prefix","startsWith","restArgs","slice","transformedUri","replace","api","_contract$endpoint","_contract$response","contract","yaml","safeLoad","schema","JSON_SCHEMA","json","endpoint","response","wrapper","toLowerCase","type","namespaceName","nameWithVersion","split","getContract","namespaceId","promise","get","fetchFlowApiDefinitionFromRemote","set","_contractData$namespa","contractData","ContractApi_searchSingleContract","contractName","constructor","message","captureStackTrace"],"sources":["../../../src/flowApi/FlowApi.ts"],"sourcesContent":["import yaml from \"js-yaml\";\nimport { ContractApi_searchSingleContract } from \"@next-api-sdk/api-gateway-sdk\";\nimport type {\n ContractResponse,\n ExtField,\n ContractRequest,\n} from \"@next-core/types\";\nimport { getContract } from \"./CollectContracts.js\";\n\nexport type MinimalContractRequest = Pick<ContractRequest, \"type\"> & {\n fields?: MinimalContractField[];\n};\nexport type MinimalContractField =\n | {\n type: string;\n fields?: MinimalContractField[];\n }\n | {\n ref: string;\n };\nexport type MinimalContractResponse = Pick<\n ContractResponse,\n \"type\" | \"wrapper\"\n>;\n\nconst remoteContractCache = new Map<\n string,\n Promise<CustomApiDefinition | null>\n>();\n\n// Legacy Custom API: `${namespace}@${name}`\n// Flow API: `${namespace}@${name}:${version}`\nexport function isFlowApiProvider(provider: string): boolean {\n return provider.includes(\"@\");\n}\n\nexport async function getArgsOfFlowApi(\n provider: string,\n originalArgs: unknown[],\n method?: string,\n stream?: boolean\n): Promise<unknown[]> {\n if (!provider.includes(\":\")) {\n throw new Error(\n `You're using legacy Custom API \"${provider}\" which is dropped in v3, please use Flow API instead`\n );\n }\n\n const apiDefinition = await fetchFlowApiDefinition(provider);\n\n if (!apiDefinition) {\n throw new FlowApiNotFoundError(`Flow API not found: \"${provider}\"`);\n }\n\n const apiProfile = getApiProfileFromApiDefinition(provider, apiDefinition);\n\n return getApiArgsFromApiProfile(apiProfile, originalArgs, method, stream);\n}\n\nfunction getApiArgsFromApiProfile(\n {\n uri,\n method: apiMethod,\n ext_fields,\n name,\n namespace,\n serviceName,\n responseWrapper,\n version,\n isFileType,\n request,\n }: CustomApiProfile,\n originalArgs: unknown[],\n method?: string,\n stream?: boolean\n): unknown[] {\n // `saveAs` requires the first argument to be the filename.\n const isDownload = method === \"saveAs\";\n let fileName: string | undefined;\n if (isDownload) {\n fileName = originalArgs.shift() as string;\n }\n\n const { url, args } = getTransformedUriAndRestArgs(\n uri,\n originalArgs,\n name,\n namespace,\n serviceName,\n version\n );\n\n return [\n ...(isDownload ? [fileName] : []),\n {\n url,\n originalUri: uri,\n method: apiMethod,\n ext_fields,\n responseWrapper,\n request,\n isFileType,\n stream,\n },\n ...args,\n ];\n}\n\nfunction getTransformedUriAndRestArgs(\n uri: string,\n originalArgs: unknown[],\n name: string,\n namespace: string,\n serviceName: string | undefined,\n version?: string\n): { url: string; args: unknown[] } {\n const prefix = version\n ? serviceName === \"logic.api.gateway\" ||\n serviceName?.startsWith(\"logic.api.gateway.\")\n ? \"\"\n : serviceName\n ? `api/gateway/${serviceName}`\n : `api/gateway/${namespace}.${name}@${version}`\n : `api/gateway/api_service.${namespace}.${name}`;\n const restArgs = originalArgs.slice();\n const transformedUri = uri.replace(\n /:([^/]+)/g,\n () => restArgs.shift() as string\n );\n return {\n url: prefix ? prefix + transformedUri : transformedUri.replace(/^\\//, \"\"),\n args: restArgs,\n };\n}\n\nfunction getApiProfileFromApiDefinition(\n provider: string,\n api: CustomApiDefinition\n): CustomApiProfile {\n const contract: CustomApiDefinition[\"contract\"] =\n typeof api.contract === \"string\"\n ? (yaml.safeLoad(api.contract, {\n schema: yaml.JSON_SCHEMA,\n json: true,\n }) as CustomApiDefinition[\"contract\"])\n : api.contract;\n const { uri, method = \"GET\", ext_fields } = contract?.endpoint ?? {};\n const responseWrapper = contract?.response\n ? contract.response.wrapper !== false\n : false;\n if (!uri) {\n throw new Error(\n `Missing endpoint.uri in contract of provider \"${provider}\"`\n );\n }\n return {\n uri,\n method: method.toLowerCase() === \"list\" ? \"get\" : method,\n ext_fields,\n name: api.name,\n namespace: api.namespace,\n serviceName: api.serviceName,\n version: api.version,\n isFileType: contract?.response?.type === \"file\",\n responseWrapper,\n request: contract?.request,\n };\n}\n\nasync function fetchFlowApiDefinition(\n provider: string\n): Promise<CustomApiDefinition | null> {\n const [namespaceName, nameWithVersion] = provider.split(\"@\");\n const [name, version] = nameWithVersion.split(\":\");\n\n // Do not cache the result of `geContract`, which will lead to no contract\n // will be found when render twice immediately.\n const contract = getContract(`${namespaceName}.${name}`);\n if (contract) {\n return {\n name: contract.name,\n namespace: contract.namespaceId,\n serviceName: contract.serviceName,\n version: contract.version,\n contract: {\n endpoint: contract.endpoint,\n response: contract.response,\n request: contract.request,\n },\n };\n }\n let promise = remoteContractCache.get(provider);\n if (!promise) {\n promise = fetchFlowApiDefinitionFromRemote(namespaceName, name, version);\n remoteContractCache.set(provider, promise);\n }\n return promise;\n}\n\nasync function fetchFlowApiDefinitionFromRemote(\n namespace: string,\n name: string,\n version: string\n): Promise<CustomApiDefinition | null> {\n const { contractData } = await ContractApi_searchSingleContract({\n contractName: `${namespace}.${name}`,\n version,\n });\n\n // return undefined if don't found contract\n return contractData\n ? {\n name: contractData.name,\n namespace: contractData.namespace?.[0]?.name,\n serviceName: contractData.serviceName,\n version: contractData.version,\n contract: {\n endpoint: contractData.endpoint,\n response: contractData.response,\n request: contractData.request,\n },\n }\n : null;\n}\n\nexport interface CustomApiDefinition {\n name: string;\n namespace: string;\n version?: string;\n serviceName?: string;\n contract?: {\n endpoint: {\n ext_fields?: ExtField[];\n uri: string;\n method:\n | \"POST\"\n | \"post\"\n | \"PUT\"\n | \"put\"\n | \"GET\"\n | \"get\"\n | \"DELETE\"\n | \"delete\"\n | \"LIST\"\n | \"list\"\n | \"PATCH\"\n | \"patch\"\n | \"HEAD\"\n | \"head\";\n };\n request?: MinimalContractRequest;\n response?: MinimalContractResponse;\n };\n}\n\nexport interface CustomApiProfile {\n uri: string;\n method: string;\n name: string;\n namespace: string;\n serviceName?: string;\n responseWrapper: boolean;\n version?: string;\n isFileType?: boolean;\n ext_fields?: ExtField[];\n request?: MinimalContractRequest;\n}\n\nclass FlowApiNotFoundError extends Error {\n constructor(message: string) {\n // Pass remaining arguments (including vendor specific ones) to parent constructor\n super(message);\n\n this.name = \"FlowApiNotFoundError\";\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n // istanbul ignore else\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FlowApiNotFoundError);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FlowApi.js","names":["_jsYaml","_interopRequireDefault","require","_apiGatewaySdk","_CollectContracts","remoteContractCache","Map","isFlowApiProvider","provider","includes","getArgsOfFlowApi","originalArgs","method","stream","Error","apiDefinition","fetchFlowApiDefinition","FlowApiNotFoundError","apiProfile","getApiProfileFromApiDefinition","getApiArgsFromApiProfile","uri","apiMethod","ext_fields","name","namespace","serviceName","responseWrapper","version","isFileType","request","isDownload","fileName","shift","url","args","getTransformedUriAndRestArgs","originalUri","prefix","startsWith","restArgs","slice","transformedUri","replace","api","_contract$response","contract","yaml","safeLoad","schema","JSON_SCHEMA","json","endpoint","response","wrapper","toLowerCase","type","namespaceName","nameWithVersion","split","getContract","namespaceId","promise","get","fetchFlowApiDefinitionFromRemote","set","_contractData$namespa","contractData","ContractApi_searchSingleContract","contractName","constructor","message","captureStackTrace"],"sources":["../../../src/flowApi/FlowApi.ts"],"sourcesContent":["import yaml from \"js-yaml\";\nimport { ContractApi_searchSingleContract } from \"@next-api-sdk/api-gateway-sdk\";\nimport type {\n ContractResponse,\n ExtField,\n ContractRequest,\n} from \"@next-core/types\";\nimport { getContract } from \"./CollectContracts.js\";\n\nexport type MinimalContractRequest = Pick<ContractRequest, \"type\"> & {\n fields?: MinimalContractField[];\n};\nexport type MinimalContractField =\n | {\n type: string;\n fields?: MinimalContractField[];\n }\n | {\n ref: string;\n };\nexport type MinimalContractResponse = Pick<\n ContractResponse,\n \"type\" | \"wrapper\"\n>;\n\nconst remoteContractCache = new Map<\n string,\n Promise<CustomApiDefinition | null>\n>();\n\n// Legacy Custom API: `${namespace}@${name}`\n// Flow API: `${namespace}@${name}:${version}`\nexport function isFlowApiProvider(provider: string): boolean {\n return provider.includes(\"@\");\n}\n\nexport async function getArgsOfFlowApi(\n provider: string,\n originalArgs: unknown[],\n method?: string,\n stream?: boolean\n): Promise<unknown[]> {\n if (!provider.includes(\":\")) {\n throw new Error(\n `You're using legacy Custom API \"${provider}\" which is dropped in v3, please use Flow API instead`\n );\n }\n\n const apiDefinition = await fetchFlowApiDefinition(provider);\n\n if (!apiDefinition) {\n throw new FlowApiNotFoundError(`Flow API not found: \"${provider}\"`);\n }\n\n const apiProfile = getApiProfileFromApiDefinition(provider, apiDefinition);\n\n return getApiArgsFromApiProfile(apiProfile, originalArgs, method, stream);\n}\n\nfunction getApiArgsFromApiProfile(\n {\n uri,\n method: apiMethod,\n ext_fields,\n name,\n namespace,\n serviceName,\n responseWrapper,\n version,\n isFileType,\n request,\n }: CustomApiProfile,\n originalArgs: unknown[],\n method?: string,\n stream?: boolean\n): unknown[] {\n // `saveAs` requires the first argument to be the filename.\n const isDownload = method === \"saveAs\";\n let fileName: string | undefined;\n if (isDownload) {\n fileName = originalArgs.shift() as string;\n }\n\n const { url, args } = getTransformedUriAndRestArgs(\n uri,\n originalArgs,\n name,\n namespace,\n serviceName,\n version\n );\n\n return [\n ...(isDownload ? [fileName] : []),\n {\n url,\n originalUri: uri,\n method: apiMethod,\n ext_fields,\n responseWrapper,\n request,\n isFileType,\n stream,\n },\n ...args,\n ];\n}\n\nfunction getTransformedUriAndRestArgs(\n uri: string,\n originalArgs: unknown[],\n name: string,\n namespace: string,\n serviceName: string | undefined,\n version?: string\n): { url: string; args: unknown[] } {\n const prefix = version\n ? serviceName === \"logic.api.gateway\" ||\n serviceName?.startsWith(\"logic.api.gateway.\")\n ? \"\"\n : serviceName\n ? `api/gateway/${serviceName}`\n : `api/gateway/${namespace}.${name}@${version}`\n : `api/gateway/api_service.${namespace}.${name}`;\n const restArgs = originalArgs.slice();\n const transformedUri = uri.replace(\n /:([^/]+)/g,\n () => restArgs.shift() as string\n );\n return {\n url: prefix ? prefix + transformedUri : transformedUri.replace(/^\\//, \"\"),\n args: restArgs,\n };\n}\n\nfunction getApiProfileFromApiDefinition(\n provider: string,\n api: CustomApiDefinition\n): CustomApiProfile {\n const contract: CustomApiDefinition[\"contract\"] =\n typeof api.contract === \"string\"\n ? (yaml.safeLoad(api.contract, {\n schema: yaml.JSON_SCHEMA,\n json: true,\n }) as CustomApiDefinition[\"contract\"])\n : api.contract;\n const { uri, method = \"GET\", ext_fields } = contract?.endpoint ?? {};\n const responseWrapper = contract?.response\n ? contract.response.wrapper !== false\n : false;\n if (!uri) {\n throw new Error(\n `Missing endpoint.uri in contract of provider \"${provider}\"`\n );\n }\n return {\n uri,\n method: method.toLowerCase() === \"list\" ? \"get\" : method,\n ext_fields,\n name: api.name,\n namespace: api.namespace,\n serviceName: api.serviceName,\n version: api.version,\n isFileType: contract?.response?.type === \"file\",\n responseWrapper,\n request: contract?.request,\n };\n}\n\nasync function fetchFlowApiDefinition(\n provider: string\n): Promise<CustomApiDefinition | null> {\n const [namespaceName, nameWithVersion] = provider.split(\"@\");\n const [name, version] = nameWithVersion.split(\":\");\n\n // Do not cache the result of `geContract`, which will lead to no contract\n // will be found when render twice immediately.\n const contract = getContract(`${namespaceName}.${name}`);\n if (contract) {\n return {\n name: contract.name,\n namespace: contract.namespaceId,\n serviceName: contract.serviceName,\n version: contract.version,\n contract: {\n endpoint: contract.endpoint,\n response: contract.response,\n request: contract.request,\n },\n };\n }\n let promise = remoteContractCache.get(provider);\n if (!promise) {\n promise = fetchFlowApiDefinitionFromRemote(namespaceName, name, version);\n remoteContractCache.set(provider, promise);\n }\n return promise;\n}\n\nasync function fetchFlowApiDefinitionFromRemote(\n namespace: string,\n name: string,\n version: string\n): Promise<CustomApiDefinition | null> {\n const { contractData } = await ContractApi_searchSingleContract({\n contractName: `${namespace}.${name}`,\n version,\n });\n\n // return undefined if don't found contract\n return contractData\n ? {\n name: contractData.name,\n namespace: contractData.namespace?.[0]?.name,\n serviceName: contractData.serviceName,\n version: contractData.version,\n contract: {\n endpoint: contractData.endpoint,\n response: contractData.response,\n request: contractData.request,\n },\n }\n : null;\n}\n\nexport interface CustomApiDefinition {\n name: string;\n namespace: string;\n version?: string;\n serviceName?: string;\n contract?: {\n endpoint: {\n ext_fields?: ExtField[];\n uri: string;\n method:\n | \"POST\"\n | \"post\"\n | \"PUT\"\n | \"put\"\n | \"GET\"\n | \"get\"\n | \"DELETE\"\n | \"delete\"\n | \"LIST\"\n | \"list\"\n | \"PATCH\"\n | \"patch\"\n | \"HEAD\"\n | \"head\";\n };\n request?: MinimalContractRequest;\n response?: MinimalContractResponse;\n };\n}\n\nexport interface CustomApiProfile {\n uri: string;\n method: string;\n name: string;\n namespace: string;\n serviceName?: string;\n responseWrapper: boolean;\n version?: string;\n isFileType?: boolean;\n ext_fields?: ExtField[];\n request?: MinimalContractRequest;\n}\n\nclass FlowApiNotFoundError extends Error {\n constructor(message: string) {\n // Pass remaining arguments (including vendor specific ones) to parent constructor\n super(message);\n\n this.name = \"FlowApiNotFoundError\";\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n // istanbul ignore else\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FlowApiNotFoundError);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -92,8 +92,8 @@ async function callFlowApi({
92
92
  } : {};
93
93
  let response;
94
94
  if (isSimpleRequest) {
95
- var _originalUri$match$le, _originalUri$match, _request$fields$lengt, _request$fields;
96
- const noParams = originalUri && (request === null || request === void 0 ? void 0 : request.type) === "object" ? ((_originalUri$match$le = (_originalUri$match = originalUri.match(/:([^/]+)/g)) === null || _originalUri$match === void 0 ? void 0 : _originalUri$match.length) !== null && _originalUri$match$le !== void 0 ? _originalUri$match$le : 0) === ((_request$fields$lengt = (_request$fields = request.fields) === null || _request$fields === void 0 ? void 0 : _request$fields.length) !== null && _request$fields$lengt !== void 0 ? _request$fields$lengt : 0) : false;
95
+ var _originalUri$match, _request$fields;
96
+ const noParams = originalUri && (request === null || request === void 0 ? void 0 : request.type) === "object" ? (((_originalUri$match = originalUri.match(/:([^/]+)/g)) === null || _originalUri$match === void 0 ? void 0 : _originalUri$match.length) ?? 0) === (((_request$fields = request.fields) === null || _request$fields === void 0 ? void 0 : _request$fields.length) ?? 0) : false;
97
97
  let params;
98
98
  let options;
99
99
  if (noParams) {
@@ -102,12 +102,12 @@ async function callFlowApi({
102
102
  [params, options] = args;
103
103
  }
104
104
  if (stream) {
105
- var _options$headers, _options;
105
+ var _options;
106
106
  const stream = await (0, _general.createSSEStream)(_http.http.getUrlWithParams(url, params), {
107
107
  ...defaultOptions,
108
108
  ...options,
109
109
  method,
110
- headers: Object.fromEntries([...new Headers((_options$headers = (_options = options) === null || _options === void 0 ? void 0 : _options.headers) !== null && _options$headers !== void 0 ? _options$headers : {}).entries()])
110
+ headers: Object.fromEntries([...new Headers(((_options = options) === null || _options === void 0 ? void 0 : _options.headers) ?? {}).entries()])
111
111
  });
112
112
  return stream;
113
113
  }
@@ -130,7 +130,7 @@ async function callFlowApi({
130
130
  ...defaultOptions,
131
131
  ...result.options,
132
132
  method,
133
- headers: Object.fromEntries([...new Headers(headers !== null && headers !== void 0 ? headers : {}).entries()]),
133
+ headers: Object.fromEntries([...new Headers(headers ?? {}).entries()]),
134
134
  body
135
135
  });
136
136
  return stream;
@@ -1 +1 @@
1
- {"version":3,"file":"FlowApiProvider.js","names":["_general","require","_http","_lodash","FLOW_API_PROVIDER","exports","hasFields","ext_fields","type","some","item","source","processExtFields","args","hasQueryParams","hasBodyParams","data","params","options","hasFileType","request","processFields","fields","isEmpty","field","includes","transformFormData","FormData","formData","key","value","Object","entries","Array","isArray","forEach","v","append","isObject","Blob","Date","k","callFlowApi","url","originalUri","method","responseWrapper","isFileType","stream","isSimpleRequest","toLowerCase","defaultOptions","responseType","response","_originalUri$match$le","_originalUri$match","_request$fields$lengt","_request$fields","noParams","match","length","_options$headers","_options","createSSEStream","http","getUrlWithParams","headers","fromEntries","Headers","simpleRequest","isUploadType","result","_result$options","body","getBodyAndHeaders","requestWithBody","registerFlowApiProvider","customElements","define","createProviderClass"],"sources":["../../../src/flowApi/FlowApiProvider.ts"],"sourcesContent":["import { createProviderClass } from \"@next-core/utils/general\";\nimport { ExtField, ContractFieldItem } from \"@next-core/types\";\nimport { http, HttpOptions, HttpParams } from \"@next-core/http\";\nimport { isEmpty, isObject } from \"lodash\";\nimport { createSSEStream } from \"@next-core/utils/general\";\nimport type {\n MinimalContractField,\n MinimalContractRequest,\n} from \"./FlowApi.js\";\n\nexport const FLOW_API_PROVIDER = \"core.provider-flow-api\";\n\nexport interface CustomApiParams {\n url: string;\n originalUri?: string;\n method?: string;\n responseWrapper?: boolean;\n ext_fields?: ExtField[];\n request?: MinimalContractRequest;\n isFileType?: boolean;\n stream?: boolean;\n}\n\nfunction hasFields(ext_fields: ExtField[], type: \"query\" | \"body\"): boolean {\n return ext_fields.some((item) => item.source === type);\n}\n\nexport function processExtFields(\n ext_fields: ExtField[],\n ...args: unknown[]\n): { data: unknown; options: HttpOptions } {\n const hasQueryParams = hasFields(ext_fields, \"query\");\n const hasBodyParams = hasFields(ext_fields, \"body\");\n\n if (hasQueryParams) {\n if (hasBodyParams) {\n const [data, params, options] = args;\n return {\n data: data,\n options: {\n params: params as HttpParams,\n ...(options as HttpOptions),\n },\n };\n }\n\n const [params, options] = args;\n return {\n data: {},\n options: {\n params: params as HttpParams,\n ...(options as HttpOptions),\n },\n };\n }\n\n // only hasBodyParams or default\n const [data, options] = args;\n return {\n data,\n options: options as HttpOptions,\n };\n}\n\nexport function hasFileType(\n request: MinimalContractRequest | undefined\n): boolean {\n if (request?.type !== \"object\") {\n return false;\n }\n\n const processFields = (\n fields: MinimalContractField[] | undefined\n ): boolean => {\n return (\n !isEmpty(fields) &&\n fields!.some(\n (field) =>\n [\"file\", \"file[]\"].includes((field as ContractFieldItem).type) ||\n processFields((field as ContractFieldItem).fields)\n )\n );\n };\n\n return processFields(request.fields);\n}\n\nexport function transformFormData(\n data: Record<string, unknown> | FormData\n): FormData {\n if (data instanceof FormData) {\n return data;\n }\n\n const formData = new FormData();\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value)) {\n value.forEach((v) => {\n formData.append(key, v);\n });\n } else if (\n isObject(value) &&\n !(value instanceof Blob) &&\n !(value instanceof Date)\n ) {\n Object.entries(value).forEach(([k, v]) => {\n formData.append(`${key}[${k}]`, v);\n });\n } else {\n formData.append(key, value as string);\n }\n }\n\n return formData;\n}\n\nexport async function callFlowApi(\n {\n url,\n originalUri,\n method = \"GET\",\n responseWrapper = true,\n ext_fields = [],\n request,\n isFileType,\n stream,\n }: CustomApiParams,\n ...args: unknown[]\n): Promise<unknown> {\n const isSimpleRequest = [\"get\", \"delete\", \"head\"].includes(\n method.toLowerCase()\n );\n const defaultOptions: HttpOptions = isFileType\n ? { responseType: \"blob\" }\n : {};\n let response: { data?: unknown };\n\n if (isSimpleRequest) {\n const noParams =\n originalUri && request?.type === \"object\"\n ? (originalUri.match(/:([^/]+)/g)?.length ?? 0) ===\n (request.fields?.length ?? 0)\n : false;\n let params: HttpParams | undefined;\n let options: HttpOptions | undefined;\n\n if (noParams) {\n [options] = args as [HttpOptions?];\n } else {\n [params, options] = args as [HttpParams?, HttpOptions?];\n }\n\n if (stream) {\n const stream = await createSSEStream(http.getUrlWithParams(url, params), {\n ...defaultOptions,\n ...options,\n method,\n headers: Object.fromEntries([\n ...new Headers(options?.headers ?? {}).entries(),\n ]),\n });\n return stream;\n }\n\n response = await http.simpleRequest(method, url, {\n params,\n ...defaultOptions,\n ...options,\n });\n } else {\n const isUploadType = hasFileType(request);\n const result = processExtFields(ext_fields, ...args);\n\n const data = isUploadType\n ? transformFormData(result.data as any)\n : result.data;\n\n if (stream) {\n const { body, headers } = http.getBodyAndHeaders(\n data,\n result.options?.headers\n );\n const stream = await createSSEStream(url, {\n ...defaultOptions,\n ...result.options,\n method,\n headers: Object.fromEntries([...new Headers(headers ?? {}).entries()]),\n body,\n });\n return stream;\n }\n\n response = await http.requestWithBody(method, url, data, {\n ...defaultOptions,\n ...result.options,\n });\n }\n\n return (isFileType ? false : responseWrapper) ? response.data : response;\n}\n\nexport function registerFlowApiProvider(): void {\n customElements.define(FLOW_API_PROVIDER, createProviderClass(callFlowApi));\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FlowApiProvider.js","names":["_general","require","_http","_lodash","FLOW_API_PROVIDER","exports","hasFields","ext_fields","type","some","item","source","processExtFields","args","hasQueryParams","hasBodyParams","data","params","options","hasFileType","request","processFields","fields","isEmpty","field","includes","transformFormData","FormData","formData","key","value","Object","entries","Array","isArray","forEach","v","append","isObject","Blob","Date","k","callFlowApi","url","originalUri","method","responseWrapper","isFileType","stream","isSimpleRequest","toLowerCase","defaultOptions","responseType","response","_originalUri$match","_request$fields","noParams","match","length","_options","createSSEStream","http","getUrlWithParams","headers","fromEntries","Headers","simpleRequest","isUploadType","result","_result$options","body","getBodyAndHeaders","requestWithBody","registerFlowApiProvider","customElements","define","createProviderClass"],"sources":["../../../src/flowApi/FlowApiProvider.ts"],"sourcesContent":["import { createProviderClass } from \"@next-core/utils/general\";\nimport { ExtField, ContractFieldItem } from \"@next-core/types\";\nimport { http, HttpOptions, HttpParams } from \"@next-core/http\";\nimport { isEmpty, isObject } from \"lodash\";\nimport { createSSEStream } from \"@next-core/utils/general\";\nimport type {\n MinimalContractField,\n MinimalContractRequest,\n} from \"./FlowApi.js\";\n\nexport const FLOW_API_PROVIDER = \"core.provider-flow-api\";\n\nexport interface CustomApiParams {\n url: string;\n originalUri?: string;\n method?: string;\n responseWrapper?: boolean;\n ext_fields?: ExtField[];\n request?: MinimalContractRequest;\n isFileType?: boolean;\n stream?: boolean;\n}\n\nfunction hasFields(ext_fields: ExtField[], type: \"query\" | \"body\"): boolean {\n return ext_fields.some((item) => item.source === type);\n}\n\nexport function processExtFields(\n ext_fields: ExtField[],\n ...args: unknown[]\n): { data: unknown; options: HttpOptions } {\n const hasQueryParams = hasFields(ext_fields, \"query\");\n const hasBodyParams = hasFields(ext_fields, \"body\");\n\n if (hasQueryParams) {\n if (hasBodyParams) {\n const [data, params, options] = args;\n return {\n data: data,\n options: {\n params: params as HttpParams,\n ...(options as HttpOptions),\n },\n };\n }\n\n const [params, options] = args;\n return {\n data: {},\n options: {\n params: params as HttpParams,\n ...(options as HttpOptions),\n },\n };\n }\n\n // only hasBodyParams or default\n const [data, options] = args;\n return {\n data,\n options: options as HttpOptions,\n };\n}\n\nexport function hasFileType(\n request: MinimalContractRequest | undefined\n): boolean {\n if (request?.type !== \"object\") {\n return false;\n }\n\n const processFields = (\n fields: MinimalContractField[] | undefined\n ): boolean => {\n return (\n !isEmpty(fields) &&\n fields!.some(\n (field) =>\n [\"file\", \"file[]\"].includes((field as ContractFieldItem).type) ||\n processFields((field as ContractFieldItem).fields)\n )\n );\n };\n\n return processFields(request.fields);\n}\n\nexport function transformFormData(\n data: Record<string, unknown> | FormData\n): FormData {\n if (data instanceof FormData) {\n return data;\n }\n\n const formData = new FormData();\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value)) {\n value.forEach((v) => {\n formData.append(key, v);\n });\n } else if (\n isObject(value) &&\n !(value instanceof Blob) &&\n !(value instanceof Date)\n ) {\n Object.entries(value).forEach(([k, v]) => {\n formData.append(`${key}[${k}]`, v);\n });\n } else {\n formData.append(key, value as string);\n }\n }\n\n return formData;\n}\n\nexport async function callFlowApi(\n {\n url,\n originalUri,\n method = \"GET\",\n responseWrapper = true,\n ext_fields = [],\n request,\n isFileType,\n stream,\n }: CustomApiParams,\n ...args: unknown[]\n): Promise<unknown> {\n const isSimpleRequest = [\"get\", \"delete\", \"head\"].includes(\n method.toLowerCase()\n );\n const defaultOptions: HttpOptions = isFileType\n ? { responseType: \"blob\" }\n : {};\n let response: { data?: unknown };\n\n if (isSimpleRequest) {\n const noParams =\n originalUri && request?.type === \"object\"\n ? (originalUri.match(/:([^/]+)/g)?.length ?? 0) ===\n (request.fields?.length ?? 0)\n : false;\n let params: HttpParams | undefined;\n let options: HttpOptions | undefined;\n\n if (noParams) {\n [options] = args as [HttpOptions?];\n } else {\n [params, options] = args as [HttpParams?, HttpOptions?];\n }\n\n if (stream) {\n const stream = await createSSEStream(http.getUrlWithParams(url, params), {\n ...defaultOptions,\n ...options,\n method,\n headers: Object.fromEntries([\n ...new Headers(options?.headers ?? {}).entries(),\n ]),\n });\n return stream;\n }\n\n response = await http.simpleRequest(method, url, {\n params,\n ...defaultOptions,\n ...options,\n });\n } else {\n const isUploadType = hasFileType(request);\n const result = processExtFields(ext_fields, ...args);\n\n const data = isUploadType\n ? transformFormData(result.data as any)\n : result.data;\n\n if (stream) {\n const { body, headers } = http.getBodyAndHeaders(\n data,\n result.options?.headers\n );\n const stream = await createSSEStream(url, {\n ...defaultOptions,\n ...result.options,\n method,\n headers: Object.fromEntries([...new Headers(headers ?? {}).entries()]),\n body,\n });\n return stream;\n }\n\n response = await http.requestWithBody(method, url, data, {\n ...defaultOptions,\n ...result.options,\n });\n }\n\n return (isFileType ? false : responseWrapper) ? response.data : response;\n}\n\nexport function registerFlowApiProvider(): void {\n customElements.define(FLOW_API_PROVIDER, createProviderClass(callFlowApi));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,7 @@ var _computeMenuData = require("./computeMenuData.js");
15
15
  var _fetchMenuTitle = require("./fetchMenuTitle.js");
16
16
  var _getMenusOfStandaloneApp = require("./getMenusOfStandaloneApp.js");
17
17
  var _checkPermissions = require("../checkPermissions.js");
18
+ var _auth = require("../auth.js");
18
19
  const menuPromises = new Map();
19
20
  const menuCache = new Map();
20
21
  function transformMenuItems(menuItems) {
@@ -34,9 +35,12 @@ function transformMenuItems(menuItems) {
34
35
  icon: item.icon,
35
36
  items: children,
36
37
  defaultExpanded: item.defaultExpanded
37
- } : (0, _lodash.omit)(item, ["type", "items", "children"]);
38
+ } : isMenuItemBlocked(item) ? null : (0, _lodash.omit)(item, ["type", "items", "children"]);
38
39
  return transformedMenuItem;
39
- });
40
+ }).filter(Boolean);
41
+ }
42
+ function isMenuItemBlocked(item) {
43
+ return item.href ? (0, _auth.isBlockedHref)(item.href) : item.to ? (0, _auth.isBlockedUrl)(item.to) : false;
40
44
  }
41
45
  function getMenuById(menuId) {
42
46
  return menuCache.get(menuId);
@@ -1 +1 @@
1
- {"version":3,"file":"fetchMenuById.js","names":["_cmdbSdk","require","_microAppSdk","_lodash","_runtime","_mergeMenu","_reorderMenuItems","_computeMenuData","_fetchMenuTitle","_getMenusOfStandaloneApp","_checkPermissions","menuPromises","Map","menuCache","transformMenuItems","menuItems","filter","checkIfOfComputed","map","item","children","transformedMenuItem","type","title","text","childLayout","items","groupId","groupFrom","length","icon","defaultExpanded","omit","getMenuById","menuId","get","fetchMenuById","runtimeContext","helpers","promise","_fetchMenuById","menuList","window","STANDALONE_MICRO_APPS","getMenusOfStandaloneApp","app","id","flags","InstalledMicroAppApi_getMenusInfo","menuObjectId","menus","InstanceApi_postSearch","page","page_size","fields","link","titleDataSource","defaultCollapsed","defaultCollapsedBreakpoint","injectMenuGroupId","dynamicItems","itemsResolve","i18n","query","$eq","$size","$gt","list","menuData","mergeMenu","Error","reorderMenu","restMenuData","newRuntimeContext","pendingPermissionsPreCheck","preCheckPermissionsForAny","tplStateStoreId","forEachItem","forEachIndex","forEachSize","rootAppId","appId","computedMenuData","computedMenuItems","Promise","all","computeMenuData","computeMenuItems","finalMenuData","fetchMenuTitle","pick","set"],"sources":["../../../src/menu/fetchMenuById.ts"],"sourcesContent":["import { InstanceApi_postSearch } from \"@next-api-sdk/cmdb-sdk\";\nimport { InstalledMicroAppApi_getMenusInfo } from \"@next-api-sdk/micro-app-sdk\";\nimport { omit, pick } from \"lodash\";\nimport { checkIfOfComputed } from \"@next-core/runtime\";\nimport { mergeMenu } from \"./mergeMenu.js\";\nimport { reorderMenu } from \"./reorderMenuItems.js\";\nimport type {\n MenuRawData,\n RuntimeContext,\n RuntimeHelpers,\n RuntimeMenuItemRawData,\n SidebarMenu,\n SidebarMenuItem,\n} from \"./interfaces.js\";\nimport { computeMenuItems, computeMenuData } from \"./computeMenuData.js\";\nimport { fetchMenuTitle } from \"./fetchMenuTitle.js\";\nimport { getMenusOfStandaloneApp } from \"./getMenusOfStandaloneApp.js\";\nimport { preCheckPermissionsForAny } from \"../checkPermissions.js\";\n\nconst menuPromises = new Map<string, Promise<void>>();\n\nconst menuCache = new Map<string, SidebarMenu>();\n\nfunction transformMenuItems(\n menuItems: RuntimeMenuItemRawData[] | undefined\n): SidebarMenuItem[] | undefined {\n return menuItems?.filter(checkIfOfComputed).map((item) => {\n const children = transformMenuItems(item.children);\n const transformedMenuItem: SidebarMenuItem =\n item.type === \"group\"\n ? {\n type: \"group\",\n title: item.text,\n childLayout: item.childLayout,\n items: children,\n groupId: item.groupId,\n groupFrom: item.groupFrom,\n }\n : children?.length\n ? {\n type: \"subMenu\",\n childLayout: item.childLayout,\n title: item.text,\n icon: item.icon,\n items: children,\n defaultExpanded: item.defaultExpanded,\n }\n : (omit(item, [\"type\", \"items\", \"children\"]) as SidebarMenuItem);\n return transformedMenuItem;\n });\n}\n\nexport function getMenuById(menuId: string) {\n return menuCache.get(menuId);\n}\n\nexport function fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n let promise = menuPromises.get(menuId);\n if (!promise) {\n promise = _fetchMenuById(menuId, runtimeContext, helpers);\n }\n return promise;\n}\n\nasync function _fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n const menuList = window.STANDALONE_MICRO_APPS\n ? getMenusOfStandaloneApp(menuId, runtimeContext.app.id, helpers)\n : runtimeContext.flags[\"three-level-menu-layout\"]\n ? ((\n await InstalledMicroAppApi_getMenusInfo(menuId, {\n menuObjectId: \"EASYOPS_STORYBOARD_MENU\",\n })\n ).menus as MenuRawData[])\n : ((\n await InstanceApi_postSearch(\"EASYOPS_STORYBOARD_MENU\", {\n page: 1,\n page_size: 200,\n fields: {\n menuId: true,\n title: true,\n icon: true,\n link: true,\n titleDataSource: true,\n defaultCollapsed: true,\n defaultCollapsedBreakpoint: true,\n type: true,\n injectMenuGroupId: true,\n dynamicItems: true,\n itemsResolve: true,\n items: true,\n i18n: true,\n \"items.children\": true,\n \"app.appId\": true,\n },\n query: {\n menuId: {\n $eq: menuId,\n },\n app: {\n $size: {\n $gt: 0,\n },\n },\n },\n })\n ).list as MenuRawData[]);\n\n const menuData = await mergeMenu(menuList, runtimeContext, helpers);\n if (!menuData) {\n throw new Error(`Menu not found: ${menuId}`);\n }\n\n reorderMenu(menuData);\n\n const { items, app, ...restMenuData } = menuData;\n const newRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n pendingPermissionsPreCheck: [\n ...runtimeContext.pendingPermissionsPreCheck,\n preCheckPermissionsForAny([items, restMenuData]),\n ],\n };\n delete newRuntimeContext.tplStateStoreId;\n delete newRuntimeContext.forEachItem;\n delete newRuntimeContext.forEachIndex;\n delete newRuntimeContext.forEachSize;\n const rootAppId = app[0].appId;\n\n const [computedMenuData, computedMenuItems] = await Promise.all([\n computeMenuData(restMenuData, rootAppId, newRuntimeContext, helpers),\n computeMenuItems(items, newRuntimeContext, helpers),\n ]);\n\n const finalMenuData: SidebarMenu = {\n title: await fetchMenuTitle(computedMenuData),\n ...pick(computedMenuData, [\n \"icon\",\n \"link\",\n \"defaultCollapsed\",\n \"defaultCollapsedBreakpoint\",\n ]),\n menuItems: transformMenuItems(computedMenuItems)!,\n };\n\n // Todo(steve): reconsider the menu cache strategy\n menuCache.set(menuId, finalMenuData);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fetchMenuById.js","names":["_cmdbSdk","require","_microAppSdk","_lodash","_runtime","_mergeMenu","_reorderMenuItems","_computeMenuData","_fetchMenuTitle","_getMenusOfStandaloneApp","_checkPermissions","_auth","menuPromises","Map","menuCache","transformMenuItems","menuItems","filter","checkIfOfComputed","map","item","children","transformedMenuItem","type","title","text","childLayout","items","groupId","groupFrom","length","icon","defaultExpanded","isMenuItemBlocked","omit","Boolean","href","isBlockedHref","to","isBlockedUrl","getMenuById","menuId","get","fetchMenuById","runtimeContext","helpers","promise","_fetchMenuById","menuList","window","STANDALONE_MICRO_APPS","getMenusOfStandaloneApp","app","id","flags","InstalledMicroAppApi_getMenusInfo","menuObjectId","menus","InstanceApi_postSearch","page","page_size","fields","link","titleDataSource","defaultCollapsed","defaultCollapsedBreakpoint","injectMenuGroupId","dynamicItems","itemsResolve","i18n","query","$eq","$size","$gt","list","menuData","mergeMenu","Error","reorderMenu","restMenuData","newRuntimeContext","pendingPermissionsPreCheck","preCheckPermissionsForAny","tplStateStoreId","forEachItem","forEachIndex","forEachSize","rootAppId","appId","computedMenuData","computedMenuItems","Promise","all","computeMenuData","computeMenuItems","finalMenuData","fetchMenuTitle","pick","set"],"sources":["../../../src/menu/fetchMenuById.ts"],"sourcesContent":["import { InstanceApi_postSearch } from \"@next-api-sdk/cmdb-sdk\";\nimport { InstalledMicroAppApi_getMenusInfo } from \"@next-api-sdk/micro-app-sdk\";\nimport { omit, pick } from \"lodash\";\nimport { checkIfOfComputed } from \"@next-core/runtime\";\nimport { mergeMenu } from \"./mergeMenu.js\";\nimport { reorderMenu } from \"./reorderMenuItems.js\";\nimport type {\n MenuRawData,\n RuntimeContext,\n RuntimeHelpers,\n RuntimeMenuItemRawData,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuSimpleItem,\n} from \"./interfaces.js\";\nimport { computeMenuItems, computeMenuData } from \"./computeMenuData.js\";\nimport { fetchMenuTitle } from \"./fetchMenuTitle.js\";\nimport { getMenusOfStandaloneApp } from \"./getMenusOfStandaloneApp.js\";\nimport { preCheckPermissionsForAny } from \"../checkPermissions.js\";\nimport { isBlockedHref, isBlockedUrl } from \"../auth.js\";\n\nconst menuPromises = new Map<string, Promise<void>>();\n\nconst menuCache = new Map<string, SidebarMenu>();\n\nfunction transformMenuItems(\n menuItems: RuntimeMenuItemRawData[] | undefined\n): SidebarMenuItem[] | undefined {\n return menuItems\n ?.filter(checkIfOfComputed)\n .map((item) => {\n const children = transformMenuItems(item.children);\n const transformedMenuItem: SidebarMenuItem | null =\n item.type === \"group\"\n ? {\n type: \"group\",\n title: item.text,\n childLayout: item.childLayout,\n items: children,\n groupId: item.groupId,\n groupFrom: item.groupFrom,\n }\n : children?.length\n ? {\n type: \"subMenu\",\n childLayout: item.childLayout,\n title: item.text,\n icon: item.icon,\n items: children,\n defaultExpanded: item.defaultExpanded,\n }\n : isMenuItemBlocked(item as SidebarMenuSimpleItem)\n ? null\n : (omit(item, [\"type\", \"items\", \"children\"]) as SidebarMenuItem);\n return transformedMenuItem;\n })\n .filter(Boolean) as SidebarMenuItem[];\n}\n\nfunction isMenuItemBlocked(item: SidebarMenuSimpleItem) {\n return item.href\n ? isBlockedHref(item.href)\n : item.to\n ? isBlockedUrl(item.to)\n : false;\n}\n\nexport function getMenuById(menuId: string) {\n return menuCache.get(menuId);\n}\n\nexport function fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n let promise = menuPromises.get(menuId);\n if (!promise) {\n promise = _fetchMenuById(menuId, runtimeContext, helpers);\n }\n return promise;\n}\n\nasync function _fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n const menuList = window.STANDALONE_MICRO_APPS\n ? getMenusOfStandaloneApp(menuId, runtimeContext.app.id, helpers)\n : runtimeContext.flags[\"three-level-menu-layout\"]\n ? ((\n await InstalledMicroAppApi_getMenusInfo(menuId, {\n menuObjectId: \"EASYOPS_STORYBOARD_MENU\",\n })\n ).menus as MenuRawData[])\n : ((\n await InstanceApi_postSearch(\"EASYOPS_STORYBOARD_MENU\", {\n page: 1,\n page_size: 200,\n fields: {\n menuId: true,\n title: true,\n icon: true,\n link: true,\n titleDataSource: true,\n defaultCollapsed: true,\n defaultCollapsedBreakpoint: true,\n type: true,\n injectMenuGroupId: true,\n dynamicItems: true,\n itemsResolve: true,\n items: true,\n i18n: true,\n \"items.children\": true,\n \"app.appId\": true,\n },\n query: {\n menuId: {\n $eq: menuId,\n },\n app: {\n $size: {\n $gt: 0,\n },\n },\n },\n })\n ).list as MenuRawData[]);\n\n const menuData = await mergeMenu(menuList, runtimeContext, helpers);\n if (!menuData) {\n throw new Error(`Menu not found: ${menuId}`);\n }\n\n reorderMenu(menuData);\n\n const { items, app, ...restMenuData } = menuData;\n const newRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n pendingPermissionsPreCheck: [\n ...runtimeContext.pendingPermissionsPreCheck,\n preCheckPermissionsForAny([items, restMenuData]),\n ],\n };\n delete newRuntimeContext.tplStateStoreId;\n delete newRuntimeContext.forEachItem;\n delete newRuntimeContext.forEachIndex;\n delete newRuntimeContext.forEachSize;\n const rootAppId = app[0].appId;\n\n const [computedMenuData, computedMenuItems] = await Promise.all([\n computeMenuData(restMenuData, rootAppId, newRuntimeContext, helpers),\n computeMenuItems(items, newRuntimeContext, helpers),\n ]);\n\n const finalMenuData: SidebarMenu = {\n title: await fetchMenuTitle(computedMenuData),\n ...pick(computedMenuData, [\n \"icon\",\n \"link\",\n \"defaultCollapsed\",\n \"defaultCollapsedBreakpoint\",\n ]),\n menuItems: transformMenuItems(computedMenuItems)!,\n };\n\n // Todo(steve): reconsider the menu cache strategy\n menuCache.set(menuId, finalMenuData);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -21,7 +21,7 @@ async function fetchMenuTitle(menuData) {
21
21
  instanceId,
22
22
  attributeId
23
23
  } = menuData.titleDataSource;
24
- const attr = attributeId !== null && attributeId !== void 0 ? attributeId : "name";
24
+ const attr = attributeId ?? "name";
25
25
  const instanceData = await (0, _cmdbSdk.InstanceApi_getDetail)(objectId, instanceId, {
26
26
  fields: attr
27
27
  });
@@ -1 +1 @@
1
- {"version":3,"file":"fetchMenuTitle.js","names":["_lodash","require","_cmdbSdk","menuTitleCache","Map","fetchMenuTitle","menuData","title","isEmpty","titleDataSource","cacheKey","JSON","stringify","cachedTitle","get","undefined","objectId","instanceId","attributeId","attr","instanceData","InstanceApi_getDetail","fields","Array","isArray","primary","rest","length","join","String","set"],"sources":["../../../src/menu/fetchMenuTitle.ts"],"sourcesContent":["import { isEmpty } from \"lodash\";\nimport { InstanceApi_getDetail } from \"@next-api-sdk/cmdb-sdk\";\nimport type { MenuRawData } from \"./interfaces.js\";\n\nconst menuTitleCache = new Map<string, string>();\n\nexport async function fetchMenuTitle(\n menuData: Pick<MenuRawData, \"title\" | \"titleDataSource\">\n): Promise<string> {\n if (menuData.title || isEmpty(menuData.titleDataSource)) {\n return menuData.title;\n }\n const cacheKey = JSON.stringify(menuData.titleDataSource);\n const cachedTitle = menuTitleCache.get(cacheKey);\n if (cachedTitle !== undefined) {\n return cachedTitle;\n }\n const { objectId, instanceId, attributeId } = menuData.titleDataSource;\n const attr = attributeId ?? \"name\";\n const instanceData = await InstanceApi_getDetail(objectId, instanceId, {\n fields: attr,\n });\n let title: string;\n if (attributeId === \"#showKey\" && Array.isArray(instanceData[attr])) {\n const [primary, ...rest] = instanceData[attr];\n title = rest.length > 0 ? `${primary}(${rest.join(\",\")})` : String(primary);\n } else {\n title = String(instanceData[attr]);\n }\n menuTitleCache.set(cacheKey, title);\n return title;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAGA,MAAME,cAAc,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAEzC,eAAeC,cAAcA,CAClCC,QAAwD,EACvC;EACjB,IAAIA,QAAQ,CAACC,KAAK,IAAI,IAAAC,eAAO,EAACF,QAAQ,CAACG,eAAe,CAAC,EAAE;IACvD,OAAOH,QAAQ,CAACC,KAAK;EACvB;EACA,MAAMG,QAAQ,GAAGC,IAAI,CAACC,SAAS,CAACN,QAAQ,CAACG,eAAe,CAAC;EACzD,MAAMI,WAAW,GAAGV,cAAc,CAACW,GAAG,CAACJ,QAAQ,CAAC;EAChD,IAAIG,WAAW,KAAKE,SAAS,EAAE;IAC7B,OAAOF,WAAW;EACpB;EACA,MAAM;IAAEG,QAAQ;IAAEC,UAAU;IAAEC;EAAY,CAAC,GAAGZ,QAAQ,CAACG,eAAe;EACtE,MAAMU,IAAI,GAAGD,WAAW,aAAXA,WAAW,cAAXA,WAAW,GAAI,MAAM;EAClC,MAAME,YAAY,GAAG,MAAM,IAAAC,8BAAqB,EAACL,QAAQ,EAAEC,UAAU,EAAE;IACrEK,MAAM,EAAEH;EACV,CAAC,CAAC;EACF,IAAIZ,KAAa;EACjB,IAAIW,WAAW,KAAK,UAAU,IAAIK,KAAK,CAACC,OAAO,CAACJ,YAAY,CAACD,IAAI,CAAC,CAAC,EAAE;IACnE,MAAM,CAACM,OAAO,EAAE,GAAGC,IAAI,CAAC,GAAGN,YAAY,CAACD,IAAI,CAAC;IAC7CZ,KAAK,GAAGmB,IAAI,CAACC,MAAM,GAAG,CAAC,GAAG,GAAGF,OAAO,IAAIC,IAAI,CAACE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAGC,MAAM,CAACJ,OAAO,CAAC;EAC7E,CAAC,MAAM;IACLlB,KAAK,GAAGsB,MAAM,CAACT,YAAY,CAACD,IAAI,CAAC,CAAC;EACpC;EACAhB,cAAc,CAAC2B,GAAG,CAACpB,QAAQ,EAAEH,KAAK,CAAC;EACnC,OAAOA,KAAK;AACd","ignoreList":[]}
1
+ {"version":3,"file":"fetchMenuTitle.js","names":["_lodash","require","_cmdbSdk","menuTitleCache","Map","fetchMenuTitle","menuData","title","isEmpty","titleDataSource","cacheKey","JSON","stringify","cachedTitle","get","undefined","objectId","instanceId","attributeId","attr","instanceData","InstanceApi_getDetail","fields","Array","isArray","primary","rest","length","join","String","set"],"sources":["../../../src/menu/fetchMenuTitle.ts"],"sourcesContent":["import { isEmpty } from \"lodash\";\nimport { InstanceApi_getDetail } from \"@next-api-sdk/cmdb-sdk\";\nimport type { MenuRawData } from \"./interfaces.js\";\n\nconst menuTitleCache = new Map<string, string>();\n\nexport async function fetchMenuTitle(\n menuData: Pick<MenuRawData, \"title\" | \"titleDataSource\">\n): Promise<string> {\n if (menuData.title || isEmpty(menuData.titleDataSource)) {\n return menuData.title;\n }\n const cacheKey = JSON.stringify(menuData.titleDataSource);\n const cachedTitle = menuTitleCache.get(cacheKey);\n if (cachedTitle !== undefined) {\n return cachedTitle;\n }\n const { objectId, instanceId, attributeId } = menuData.titleDataSource;\n const attr = attributeId ?? \"name\";\n const instanceData = await InstanceApi_getDetail(objectId, instanceId, {\n fields: attr,\n });\n let title: string;\n if (attributeId === \"#showKey\" && Array.isArray(instanceData[attr])) {\n const [primary, ...rest] = instanceData[attr];\n title = rest.length > 0 ? `${primary}(${rest.join(\",\")})` : String(primary);\n } else {\n title = String(instanceData[attr]);\n }\n menuTitleCache.set(cacheKey, title);\n return title;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAGA,MAAME,cAAc,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAEzC,eAAeC,cAAcA,CAClCC,QAAwD,EACvC;EACjB,IAAIA,QAAQ,CAACC,KAAK,IAAI,IAAAC,eAAO,EAACF,QAAQ,CAACG,eAAe,CAAC,EAAE;IACvD,OAAOH,QAAQ,CAACC,KAAK;EACvB;EACA,MAAMG,QAAQ,GAAGC,IAAI,CAACC,SAAS,CAACN,QAAQ,CAACG,eAAe,CAAC;EACzD,MAAMI,WAAW,GAAGV,cAAc,CAACW,GAAG,CAACJ,QAAQ,CAAC;EAChD,IAAIG,WAAW,KAAKE,SAAS,EAAE;IAC7B,OAAOF,WAAW;EACpB;EACA,MAAM;IAAEG,QAAQ;IAAEC,UAAU;IAAEC;EAAY,CAAC,GAAGZ,QAAQ,CAACG,eAAe;EACtE,MAAMU,IAAI,GAAGD,WAAW,IAAI,MAAM;EAClC,MAAME,YAAY,GAAG,MAAM,IAAAC,8BAAqB,EAACL,QAAQ,EAAEC,UAAU,EAAE;IACrEK,MAAM,EAAEH;EACV,CAAC,CAAC;EACF,IAAIZ,KAAa;EACjB,IAAIW,WAAW,KAAK,UAAU,IAAIK,KAAK,CAACC,OAAO,CAACJ,YAAY,CAACD,IAAI,CAAC,CAAC,EAAE;IACnE,MAAM,CAACM,OAAO,EAAE,GAAGC,IAAI,CAAC,GAAGN,YAAY,CAACD,IAAI,CAAC;IAC7CZ,KAAK,GAAGmB,IAAI,CAACC,MAAM,GAAG,CAAC,GAAG,GAAGF,OAAO,IAAIC,IAAI,CAACE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAGC,MAAM,CAACJ,OAAO,CAAC;EAC7E,CAAC,MAAM;IACLlB,KAAK,GAAGsB,MAAM,CAACT,YAAY,CAACD,IAAI,CAAC,CAAC;EACpC;EACAhB,cAAc,CAAC2B,GAAG,CAACpB,QAAQ,EAAEH,KAAK,CAAC;EACnC,OAAOA,KAAK;AACd","ignoreList":[]}
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getMenusOfStandaloneApp = getMenusOfStandaloneApp;
7
7
  function getMenusOfStandaloneApp(menuId, appId, helpers) {
8
- var _ref, _storyboard$meta$inje, _storyboard$meta, _storyboard$meta2;
8
+ var _storyboard$meta, _storyboard$meta2;
9
9
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
10
10
  const storyboard = helpers.getStoryboardByAppId(appId);
11
- const menus = (_ref = (_storyboard$meta$inje = (_storyboard$meta = storyboard.meta) === null || _storyboard$meta === void 0 ? void 0 : _storyboard$meta.injectMenus) !== null && _storyboard$meta$inje !== void 0 ? _storyboard$meta$inje : (_storyboard$meta2 = storyboard.meta) === null || _storyboard$meta2 === void 0 ? void 0 : _storyboard$meta2.menus) !== null && _ref !== void 0 ? _ref : [];
11
+ const menus = ((_storyboard$meta = storyboard.meta) === null || _storyboard$meta === void 0 ? void 0 : _storyboard$meta.injectMenus) ?? ((_storyboard$meta2 = storyboard.meta) === null || _storyboard$meta2 === void 0 ? void 0 : _storyboard$meta2.menus) ?? [];
12
12
  return menus.filter(menu => menu.menuId === menuId).map(menu => {
13
13
  var _menu$app;
14
14
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"getMenusOfStandaloneApp.js","names":["getMenusOfStandaloneApp","menuId","appId","helpers","_ref","_storyboard$meta$inje","_storyboard$meta","_storyboard$meta2","storyboard","getStoryboardByAppId","menus","meta","injectMenus","filter","menu","map","_menu$app","app"],"sources":["../../../src/menu/getMenusOfStandaloneApp.ts"],"sourcesContent":["import { MenuRawData, RuntimeHelpers } from \"./interfaces.js\";\n\nexport function getMenusOfStandaloneApp(\n menuId: string,\n appId: string,\n helpers: RuntimeHelpers\n): MenuRawData[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const storyboard = helpers.getStoryboardByAppId(appId)!;\n const menus = (storyboard.meta?.injectMenus ??\n storyboard.meta?.menus ??\n []) as MenuRawData[];\n\n return menus\n .filter((menu) => menu.menuId === menuId)\n .map((menu) => ({\n ...menu,\n ...(menu.app?.[0]?.appId ? {} : { app: [{ appId }] }),\n }));\n\n // Todo: maybe: fetch menus from STANDALONE_MENU@EASYOPS\n}\n"],"mappings":";;;;;;AAEO,SAASA,uBAAuBA,CACrCC,MAAc,EACdC,KAAa,EACbC,OAAuB,EACR;EAAA,IAAAC,IAAA,EAAAC,qBAAA,EAAAC,gBAAA,EAAAC,iBAAA;EACf;EACA,MAAMC,UAAU,GAAGL,OAAO,CAACM,oBAAoB,CAACP,KAAK,CAAE;EACvD,MAAMQ,KAAK,IAAAN,IAAA,IAAAC,qBAAA,IAAAC,gBAAA,GAAIE,UAAU,CAACG,IAAI,cAAAL,gBAAA,uBAAfA,gBAAA,CAAiBM,WAAW,cAAAP,qBAAA,cAAAA,qBAAA,IAAAE,iBAAA,GACzCC,UAAU,CAACG,IAAI,cAAAJ,iBAAA,uBAAfA,iBAAA,CAAiBG,KAAK,cAAAN,IAAA,cAAAA,IAAA,GACtB,EAAoB;EAEtB,OAAOM,KAAK,CACTG,MAAM,CAAEC,IAAI,IAAKA,IAAI,CAACb,MAAM,KAAKA,MAAM,CAAC,CACxCc,GAAG,CAAED,IAAI;IAAA,IAAAE,SAAA;IAAA,OAAM;MACd,GAAGF,IAAI;MACP,IAAI,CAAAE,SAAA,GAAAF,IAAI,CAACG,GAAG,cAAAD,SAAA,gBAAAA,SAAA,GAARA,SAAA,CAAW,CAAC,CAAC,cAAAA,SAAA,eAAbA,SAAA,CAAed,KAAK,GAAG,CAAC,CAAC,GAAG;QAAEe,GAAG,EAAE,CAAC;UAAEf;QAAM,CAAC;MAAE,CAAC;IACtD,CAAC;EAAA,CAAC,CAAC;;EAEL;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getMenusOfStandaloneApp.js","names":["getMenusOfStandaloneApp","menuId","appId","helpers","_storyboard$meta","_storyboard$meta2","storyboard","getStoryboardByAppId","menus","meta","injectMenus","filter","menu","map","_menu$app","app"],"sources":["../../../src/menu/getMenusOfStandaloneApp.ts"],"sourcesContent":["import { MenuRawData, RuntimeHelpers } from \"./interfaces.js\";\n\nexport function getMenusOfStandaloneApp(\n menuId: string,\n appId: string,\n helpers: RuntimeHelpers\n): MenuRawData[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const storyboard = helpers.getStoryboardByAppId(appId)!;\n const menus = (storyboard.meta?.injectMenus ??\n storyboard.meta?.menus ??\n []) as MenuRawData[];\n\n return menus\n .filter((menu) => menu.menuId === menuId)\n .map((menu) => ({\n ...menu,\n ...(menu.app?.[0]?.appId ? {} : { app: [{ appId }] }),\n }));\n\n // Todo: maybe: fetch menus from STANDALONE_MENU@EASYOPS\n}\n"],"mappings":";;;;;;AAEO,SAASA,uBAAuBA,CACrCC,MAAc,EACdC,KAAa,EACbC,OAAuB,EACR;EAAA,IAAAC,gBAAA,EAAAC,iBAAA;EACf;EACA,MAAMC,UAAU,GAAGH,OAAO,CAACI,oBAAoB,CAACL,KAAK,CAAE;EACvD,MAAMM,KAAK,GAAI,EAAAJ,gBAAA,GAAAE,UAAU,CAACG,IAAI,cAAAL,gBAAA,uBAAfA,gBAAA,CAAiBM,WAAW,OAAAL,iBAAA,GACzCC,UAAU,CAACG,IAAI,cAAAJ,iBAAA,uBAAfA,iBAAA,CAAiBG,KAAK,KACtB,EAAoB;EAEtB,OAAOA,KAAK,CACTG,MAAM,CAAEC,IAAI,IAAKA,IAAI,CAACX,MAAM,KAAKA,MAAM,CAAC,CACxCY,GAAG,CAAED,IAAI;IAAA,IAAAE,SAAA;IAAA,OAAM;MACd,GAAGF,IAAI;MACP,IAAI,CAAAE,SAAA,GAAAF,IAAI,CAACG,GAAG,cAAAD,SAAA,gBAAAA,SAAA,GAARA,SAAA,CAAW,CAAC,CAAC,cAAAA,SAAA,eAAbA,SAAA,CAAeZ,KAAK,GAAG,CAAC,CAAC,GAAG;QAAEa,GAAG,EAAE,CAAC;UAAEb;QAAM,CAAC;MAAE,CAAC;IACtD,CAAC;EAAA,CAAC,CAAC;;EAEL;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","names":["_constants","require"],"sources":["../../../src/menu/interfaces.ts"],"sourcesContent":["import type { MetaI18n, MicroApp, ResolveConf } from \"@next-core/types\";\nimport type {\n RuntimeHooksMenuHelpers,\n __secret_internals,\n MatchOptions,\n} from \"@next-core/runtime\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\n\nexport type RuntimeContext = __secret_internals.RuntimeContext;\n\nexport type RuntimeHelpers = RuntimeHooksMenuHelpers;\n\n/** 原始菜单数据。 */\nexport interface MenuRawData {\n menuId: string;\n title: string;\n app: [\n {\n appId: string;\n },\n ];\n icon?: unknown;\n link?: string;\n titleDataSource?: TitleDataSource;\n items?: MenuItemRawData[];\n type?: \"main\" | \"inject\";\n injectMenuGroupId?: string;\n defaultCollapsed?: boolean;\n defaultCollapsedBreakpoint?: number;\n dynamicItems?: boolean;\n itemsResolve?: ResolveConf;\n i18n?: MetaI18n;\n overrideApp?: MicroApp;\n}\n\n/** 原始菜单项数据。 */\nexport type MenuItemRawData = Omit<SidebarMenuSimpleItem, \"type\"> & {\n children?: MenuItemRawData[];\n type?: \"default\" | \"group\";\n childLayout?: \"default\" | \"category\";\n sort?: number;\n if?: string | boolean;\n defaultExpanded?: boolean;\n groupId?: string;\n groupFrom?: string;\n};\n\ninterface TitleDataSource {\n objectId: string;\n instanceId: string;\n attributeId?: string;\n}\n\n/** 侧边栏基本菜单项的配置。 */\nexport interface SidebarMenuSimpleItem {\n /** 菜单项文本。 */\n text: string;\n\n /** 菜单项对应的系统内地址。 */\n // to?: LocationDescriptor;\n to?: unknown;\n\n /** 菜单项对应的外部链接地址。 */\n href?: string;\n\n /** 菜单项的图标。 */\n // icon?: MenuIcon;\n icon?: unknown;\n\n /** 菜单项链接打开的目标。 */\n target?: string;\n\n type?: \"default\";\n\n /** 高亮菜单项时是否使用精确匹配来对比当前地址和菜单项地址。 */\n exact?: boolean;\n\n /** 设置额外包含的匹配高亮菜单项的地址列表。 */\n activeIncludes?: (string | MatchOptions)[];\n\n /** 设置需要被排除的匹配高亮菜单项的地址列表。 */\n activeExcludes?: (string | MatchOptions)[];\n\n /** 设置匹配高亮菜单项时是否还对 search 参数进行比较。 */\n activeMatchSearch?: boolean;\n\n /** @internal */\n key?: string;\n}\n\nexport interface RuntimeMenuItemRawData extends MenuItemRawData {\n children?: RuntimeMenuItemRawData[];\n [symbolAppId]: string;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface RuntimeMenuRawData extends MenuRawData {\n items: RuntimeMenuItemRawData[];\n // [symbolShouldCache]?: boolean;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface SidebarMenu {\n /** 菜单标题。 */\n title: string;\n /** 菜单标题对应的图标。 */\n icon?: unknown;\n /** 菜单标题对应的链接地址。 */\n link?: unknown;\n /** 是否默认折叠。 */\n defaultCollapsed?: boolean;\n /** 针对小于特定尺寸的屏幕(例如 1600px),是否默认折叠。 */\n defaultCollapsedBreakpoint?: number;\n /** 菜单项列表。 */\n menuItems: SidebarMenuItem[];\n}\n\n/** 侧边栏菜单项配置。 */\nexport type SidebarMenuItem = SidebarMenuSimpleItem | SidebarMenuGroup;\n\n/** 侧边栏分组菜单项的配置。 */\nexport interface SidebarMenuGroup {\n /** 分组 Id。 */\n groupId?: string;\n\n /** 分组来源。 */\n groupFrom?: string;\n\n /** 分组类型。 */\n type: \"group\" | \"subMenu\";\n\n /** 分组标题。 */\n title: string;\n\n /** {@inheritDoc SidebarMenuSimpleItem.icon } */\n icon?: unknown;\n\n /** 该分组下的子菜单项列表。 */\n items?: SidebarMenuItem[];\n\n /** @internal */\n key?: string;\n\n /** 该分组下的子菜单是否默认展开。 */\n defaultExpanded?: boolean;\n\n /** 子菜单项的布局方式。 */\n childLayout?: \"default\" | \"category\" | \"siteMap\";\n}\n"],"mappings":";;AAMA,IAAAA,UAAA,GAAAC,OAAA","ignoreList":[]}
1
+ {"version":3,"file":"interfaces.js","names":["_constants","require"],"sources":["../../../src/menu/interfaces.ts"],"sourcesContent":["import type { MetaI18n, MicroApp, ResolveConf } from \"@next-core/types\";\nimport type {\n RuntimeHooksMenuHelpers,\n __secret_internals,\n MatchOptions,\n} from \"@next-core/runtime\";\nimport type { LocationDescriptor } from \"history\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\n\nexport type RuntimeContext = __secret_internals.RuntimeContext;\n\nexport type RuntimeHelpers = RuntimeHooksMenuHelpers;\n\n/** 原始菜单数据。 */\nexport interface MenuRawData {\n menuId: string;\n title: string;\n app: [\n {\n appId: string;\n },\n ];\n icon?: unknown;\n link?: string;\n titleDataSource?: TitleDataSource;\n items?: MenuItemRawData[];\n type?: \"main\" | \"inject\";\n injectMenuGroupId?: string;\n defaultCollapsed?: boolean;\n defaultCollapsedBreakpoint?: number;\n dynamicItems?: boolean;\n itemsResolve?: ResolveConf;\n i18n?: MetaI18n;\n overrideApp?: MicroApp;\n}\n\n/** 原始菜单项数据。 */\nexport type MenuItemRawData = Omit<SidebarMenuSimpleItem, \"type\"> & {\n children?: MenuItemRawData[];\n type?: \"default\" | \"group\";\n childLayout?: \"default\" | \"category\";\n sort?: number;\n if?: string | boolean;\n defaultExpanded?: boolean;\n groupId?: string;\n groupFrom?: string;\n};\n\ninterface TitleDataSource {\n objectId: string;\n instanceId: string;\n attributeId?: string;\n}\n\n/** 侧边栏基本菜单项的配置。 */\nexport interface SidebarMenuSimpleItem {\n /** 菜单项文本。 */\n text: string;\n\n /** 菜单项对应的系统内地址。 */\n to?: LocationDescriptor;\n\n /** 菜单项对应的外部链接地址。 */\n href?: string;\n\n /** 菜单项的图标。 */\n // icon?: MenuIcon;\n icon?: unknown;\n\n /** 菜单项链接打开的目标。 */\n target?: string;\n\n type?: \"default\";\n\n /** 高亮菜单项时是否使用精确匹配来对比当前地址和菜单项地址。 */\n exact?: boolean;\n\n /** 设置额外包含的匹配高亮菜单项的地址列表。 */\n activeIncludes?: (string | MatchOptions)[];\n\n /** 设置需要被排除的匹配高亮菜单项的地址列表。 */\n activeExcludes?: (string | MatchOptions)[];\n\n /** 设置匹配高亮菜单项时是否还对 search 参数进行比较。 */\n activeMatchSearch?: boolean;\n\n /** @internal */\n key?: string;\n}\n\nexport interface RuntimeMenuItemRawData extends MenuItemRawData {\n children?: RuntimeMenuItemRawData[];\n [symbolAppId]: string;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface RuntimeMenuRawData extends MenuRawData {\n items: RuntimeMenuItemRawData[];\n // [symbolShouldCache]?: boolean;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface SidebarMenu {\n /** 菜单标题。 */\n title: string;\n /** 菜单标题对应的图标。 */\n icon?: unknown;\n /** 菜单标题对应的链接地址。 */\n link?: unknown;\n /** 是否默认折叠。 */\n defaultCollapsed?: boolean;\n /** 针对小于特定尺寸的屏幕(例如 1600px),是否默认折叠。 */\n defaultCollapsedBreakpoint?: number;\n /** 菜单项列表。 */\n menuItems: SidebarMenuItem[];\n}\n\n/** 侧边栏菜单项配置。 */\nexport type SidebarMenuItem = SidebarMenuSimpleItem | SidebarMenuGroup;\n\n/** 侧边栏分组菜单项的配置。 */\nexport interface SidebarMenuGroup {\n /** 分组 Id。 */\n groupId?: string;\n\n /** 分组来源。 */\n groupFrom?: string;\n\n /** 分组类型。 */\n type: \"group\" | \"subMenu\";\n\n /** 分组标题。 */\n title: string;\n\n /** {@inheritDoc SidebarMenuSimpleItem.icon } */\n icon?: unknown;\n\n /** 该分组下的子菜单项列表。 */\n items?: SidebarMenuItem[];\n\n /** @internal */\n key?: string;\n\n /** 该分组下的子菜单是否默认展开。 */\n defaultExpanded?: boolean;\n\n /** 子菜单项的布局方式。 */\n childLayout?: \"default\" | \"category\" | \"siteMap\";\n}\n"],"mappings":";;AAOA,IAAAA,UAAA,GAAAC,OAAA","ignoreList":[]}
@@ -52,7 +52,6 @@ async function mergeMenu(menuList, runtimeContext, helpers) {
52
52
  }
53
53
  function processGroupInject(items, menu, injectWithMenus, menuWithI18n) {
54
54
  return items === null || items === void 0 ? void 0 : items.map(item => {
55
- var _processGroupInject;
56
55
  const foundInjectingMenus = item.groupId && injectWithMenus.get(item.groupId);
57
56
  if (foundInjectingMenus) {
58
57
  // Each menu to be injected with should be injected only once.
@@ -61,7 +60,7 @@ function processGroupInject(items, menu, injectWithMenus, menuWithI18n) {
61
60
  }
62
61
  return {
63
62
  ...item,
64
- children: ((_processGroupInject = processGroupInject(item.children, menu, injectWithMenus, menuWithI18n)) !== null && _processGroupInject !== void 0 ? _processGroupInject : []).concat(foundInjectingMenus ? foundInjectingMenus.flatMap(injectingMenu =>
63
+ children: (processGroupInject(item.children, menu, injectWithMenus, menuWithI18n) ?? []).concat(foundInjectingMenus ? foundInjectingMenus.flatMap(injectingMenu =>
65
64
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
66
65
  processGroupInject(injectingMenu.items, injectingMenu, injectWithMenus, menuWithI18n)) : []),
67
66
  [_constants.symbolAppId]: menu.app[0].appId,
@@ -1 +1 @@
1
- {"version":3,"file":"mergeMenu.js","names":["_i18n","require","_constants","_loadDynamicMenuItems","mergeMenu","menuList","runtimeContext","helpers","mainMenu","find","menu","type","undefined","validMenuList","injectWithMenus","Map","menuWithI18n","WeakMap","i18n","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","forEach","lang","resources","addResourceBundle","set","Promise","all","map","loadDynamicMenuItems","_menu$items","items","length","injectMenuGroupId","injectingMenus","get","push","flatMap","processGroupInject","symbolMenuI18nNamespace","symbolOverrideApp","overrideApp","item","_processGroupInject","foundInjectingMenus","groupId","delete","children","concat","injectingMenu","symbolAppId"],"sources":["../../../src/menu/mergeMenu.ts"],"sourcesContent":["import { i18n } from \"@next-core/i18n\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\nimport type {\n RuntimeContext,\n MenuItemRawData,\n MenuRawData,\n RuntimeMenuItemRawData,\n RuntimeMenuRawData,\n RuntimeHelpers,\n} from \"./interfaces.js\";\nimport { loadDynamicMenuItems } from \"./loadDynamicMenuItems.js\";\n\nexport async function mergeMenu(\n menuList: MenuRawData[],\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n): Promise<RuntimeMenuRawData | undefined> {\n const mainMenu = menuList.find((menu) => menu.type !== \"inject\");\n if (!mainMenu) {\n return undefined;\n }\n const validMenuList: MenuRawData[] = [];\n const injectWithMenus = new Map<string, MenuRawData[]>();\n const menuWithI18n = new WeakMap<MenuRawData, string>();\n\n for (const menu of menuList) {\n if (menu.i18n) {\n const menuI18nNamespace = `menu/${menu.menuId}~${menu.app[0].appId}+${\n (menu as { instanceId?: string }).instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n menuWithI18n.set(menu, menuI18nNamespace);\n }\n }\n\n await Promise.all(\n menuList.map((menu) =>\n loadDynamicMenuItems(menu, runtimeContext, menuWithI18n, helpers)\n )\n );\n\n for (const menu of menuList) {\n if (menu.items?.length) {\n if (menu.type === \"inject\" && menu.injectMenuGroupId) {\n let injectingMenus = injectWithMenus.get(menu.injectMenuGroupId);\n if (!injectingMenus) {\n injectingMenus = [];\n injectWithMenus.set(menu.injectMenuGroupId, injectingMenus);\n }\n injectingMenus.push(menu);\n } else {\n validMenuList.push(menu);\n }\n }\n }\n\n return {\n ...mainMenu,\n items: validMenuList.flatMap(\n (menu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(menu.items, menu, injectWithMenus, menuWithI18n)!\n ),\n [symbolMenuI18nNamespace]: menuWithI18n.get(mainMenu),\n [symbolOverrideApp]: mainMenu.overrideApp,\n };\n}\n\nfunction processGroupInject(\n items: MenuItemRawData[] | undefined,\n menu: MenuRawData,\n injectWithMenus: Map<string, MenuRawData[]>,\n menuWithI18n: WeakMap<MenuRawData, string>\n): RuntimeMenuItemRawData[] | undefined {\n return items?.map((item) => {\n const foundInjectingMenus =\n item.groupId && injectWithMenus.get(item.groupId);\n if (foundInjectingMenus) {\n // Each menu to be injected with should be injected only once.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n injectWithMenus.delete(item.groupId!);\n }\n return {\n ...item,\n children: (\n processGroupInject(\n item.children,\n menu,\n injectWithMenus,\n menuWithI18n\n ) ?? ([] as RuntimeMenuItemRawData[])\n ).concat(\n foundInjectingMenus\n ? foundInjectingMenus.flatMap(\n (injectingMenu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(\n injectingMenu.items,\n injectingMenu,\n injectWithMenus,\n menuWithI18n\n )!\n )\n : ([] as RuntimeMenuItemRawData[])\n ),\n [symbolAppId]: menu.app[0].appId,\n [symbolMenuI18nNamespace]: menuWithI18n.get(menu),\n [symbolOverrideApp]: menu.overrideApp,\n };\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeMenu.js","names":["_i18n","require","_constants","_loadDynamicMenuItems","mergeMenu","menuList","runtimeContext","helpers","mainMenu","find","menu","type","undefined","validMenuList","injectWithMenus","Map","menuWithI18n","WeakMap","i18n","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","forEach","lang","resources","addResourceBundle","set","Promise","all","map","loadDynamicMenuItems","_menu$items","items","length","injectMenuGroupId","injectingMenus","get","push","flatMap","processGroupInject","symbolMenuI18nNamespace","symbolOverrideApp","overrideApp","item","foundInjectingMenus","groupId","delete","children","concat","injectingMenu","symbolAppId"],"sources":["../../../src/menu/mergeMenu.ts"],"sourcesContent":["import { i18n } from \"@next-core/i18n\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\nimport type {\n RuntimeContext,\n MenuItemRawData,\n MenuRawData,\n RuntimeMenuItemRawData,\n RuntimeMenuRawData,\n RuntimeHelpers,\n} from \"./interfaces.js\";\nimport { loadDynamicMenuItems } from \"./loadDynamicMenuItems.js\";\n\nexport async function mergeMenu(\n menuList: MenuRawData[],\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n): Promise<RuntimeMenuRawData | undefined> {\n const mainMenu = menuList.find((menu) => menu.type !== \"inject\");\n if (!mainMenu) {\n return undefined;\n }\n const validMenuList: MenuRawData[] = [];\n const injectWithMenus = new Map<string, MenuRawData[]>();\n const menuWithI18n = new WeakMap<MenuRawData, string>();\n\n for (const menu of menuList) {\n if (menu.i18n) {\n const menuI18nNamespace = `menu/${menu.menuId}~${menu.app[0].appId}+${\n (menu as { instanceId?: string }).instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n menuWithI18n.set(menu, menuI18nNamespace);\n }\n }\n\n await Promise.all(\n menuList.map((menu) =>\n loadDynamicMenuItems(menu, runtimeContext, menuWithI18n, helpers)\n )\n );\n\n for (const menu of menuList) {\n if (menu.items?.length) {\n if (menu.type === \"inject\" && menu.injectMenuGroupId) {\n let injectingMenus = injectWithMenus.get(menu.injectMenuGroupId);\n if (!injectingMenus) {\n injectingMenus = [];\n injectWithMenus.set(menu.injectMenuGroupId, injectingMenus);\n }\n injectingMenus.push(menu);\n } else {\n validMenuList.push(menu);\n }\n }\n }\n\n return {\n ...mainMenu,\n items: validMenuList.flatMap(\n (menu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(menu.items, menu, injectWithMenus, menuWithI18n)!\n ),\n [symbolMenuI18nNamespace]: menuWithI18n.get(mainMenu),\n [symbolOverrideApp]: mainMenu.overrideApp,\n };\n}\n\nfunction processGroupInject(\n items: MenuItemRawData[] | undefined,\n menu: MenuRawData,\n injectWithMenus: Map<string, MenuRawData[]>,\n menuWithI18n: WeakMap<MenuRawData, string>\n): RuntimeMenuItemRawData[] | undefined {\n return items?.map((item) => {\n const foundInjectingMenus =\n item.groupId && injectWithMenus.get(item.groupId);\n if (foundInjectingMenus) {\n // Each menu to be injected with should be injected only once.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n injectWithMenus.delete(item.groupId!);\n }\n return {\n ...item,\n children: (\n processGroupInject(\n item.children,\n menu,\n injectWithMenus,\n menuWithI18n\n ) ?? ([] as RuntimeMenuItemRawData[])\n ).concat(\n foundInjectingMenus\n ? foundInjectingMenus.flatMap(\n (injectingMenu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(\n injectingMenu.items,\n injectingMenu,\n injectWithMenus,\n menuWithI18n\n )!\n )\n : ([] as RuntimeMenuItemRawData[])\n ),\n [symbolAppId]: menu.app[0].appId,\n [symbolMenuI18nNamespace]: menuWithI18n.get(menu),\n [symbolOverrideApp]: menu.overrideApp,\n };\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,9 +15,6 @@ function reorderMenuItems(list) {
15
15
  }));
16
16
  }
17
17
  function sortMenuItems(list) {
18
- return (0, _lodash.sortBy)(list, item => {
19
- var _item$sort;
20
- return (_item$sort = item.sort) !== null && _item$sort !== void 0 ? _item$sort : -Infinity;
21
- });
18
+ return (0, _lodash.sortBy)(list, item => item.sort ?? -Infinity);
22
19
  }
23
20
  //# sourceMappingURL=reorderMenuItems.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reorderMenuItems.js","names":["_lodash","require","reorderMenu","menuData","items","reorderMenuItems","list","sortMenuItems","map","item","children","sortBy","_item$sort","sort","Infinity"],"sources":["../../../src/menu/reorderMenuItems.ts"],"sourcesContent":["import { sortBy } from \"lodash\";\nimport { MenuItemRawData, MenuRawData } from \"./interfaces.js\";\n\nexport function reorderMenu(menuData: MenuRawData): void {\n menuData.items = reorderMenuItems(menuData.items);\n}\n\nfunction reorderMenuItems(\n list: MenuItemRawData[] | undefined\n): MenuItemRawData[] {\n return sortMenuItems(list).map((item) => ({\n ...item,\n children: reorderMenuItems(item.children),\n }));\n}\n\nfunction sortMenuItems(list: MenuItemRawData[] | undefined): MenuItemRawData[] {\n return sortBy(list, (item) => item.sort ?? -Infinity);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGO,SAASC,WAAWA,CAACC,QAAqB,EAAQ;EACvDA,QAAQ,CAACC,KAAK,GAAGC,gBAAgB,CAACF,QAAQ,CAACC,KAAK,CAAC;AACnD;AAEA,SAASC,gBAAgBA,CACvBC,IAAmC,EAChB;EACnB,OAAOC,aAAa,CAACD,IAAI,CAAC,CAACE,GAAG,CAAEC,IAAI,KAAM;IACxC,GAAGA,IAAI;IACPC,QAAQ,EAAEL,gBAAgB,CAACI,IAAI,CAACC,QAAQ;EAC1C,CAAC,CAAC,CAAC;AACL;AAEA,SAASH,aAAaA,CAACD,IAAmC,EAAqB;EAC7E,OAAO,IAAAK,cAAM,EAACL,IAAI,EAAGG,IAAI;IAAA,IAAAG,UAAA;IAAA,QAAAA,UAAA,GAAKH,IAAI,CAACI,IAAI,cAAAD,UAAA,cAAAA,UAAA,GAAI,CAACE,QAAQ;EAAA,EAAC;AACvD","ignoreList":[]}
1
+ {"version":3,"file":"reorderMenuItems.js","names":["_lodash","require","reorderMenu","menuData","items","reorderMenuItems","list","sortMenuItems","map","item","children","sortBy","sort","Infinity"],"sources":["../../../src/menu/reorderMenuItems.ts"],"sourcesContent":["import { sortBy } from \"lodash\";\nimport { MenuItemRawData, MenuRawData } from \"./interfaces.js\";\n\nexport function reorderMenu(menuData: MenuRawData): void {\n menuData.items = reorderMenuItems(menuData.items);\n}\n\nfunction reorderMenuItems(\n list: MenuItemRawData[] | undefined\n): MenuItemRawData[] {\n return sortMenuItems(list).map((item) => ({\n ...item,\n children: reorderMenuItems(item.children),\n }));\n}\n\nfunction sortMenuItems(list: MenuItemRawData[] | undefined): MenuItemRawData[] {\n return sortBy(list, (item) => item.sort ?? -Infinity);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGO,SAASC,WAAWA,CAACC,QAAqB,EAAQ;EACvDA,QAAQ,CAACC,KAAK,GAAGC,gBAAgB,CAACF,QAAQ,CAACC,KAAK,CAAC;AACnD;AAEA,SAASC,gBAAgBA,CACvBC,IAAmC,EAChB;EACnB,OAAOC,aAAa,CAACD,IAAI,CAAC,CAACE,GAAG,CAAEC,IAAI,KAAM;IACxC,GAAGA,IAAI;IACPC,QAAQ,EAAEL,gBAAgB,CAACI,IAAI,CAACC,QAAQ;EAC1C,CAAC,CAAC,CAAC;AACL;AAEA,SAASH,aAAaA,CAACD,IAAmC,EAAqB;EAC7E,OAAO,IAAAK,cAAM,EAACL,IAAI,EAAGG,IAAI,IAAKA,IAAI,CAACG,IAAI,IAAI,CAACC,QAAQ,CAAC;AACvD","ignoreList":[]}
@@ -4,7 +4,7 @@ import { pick } from "lodash";
4
4
  export function authV2Factory() {
5
5
  const v2Kit = getV2RuntimeFromDll();
6
6
  if (v2Kit) {
7
- return Object.freeze(pick(v2Kit, ["authenticate", "getAuth", "isLoggedIn", "logout"]));
7
+ return Object.freeze(pick(v2Kit, ["authenticate", "getAuth", "isLoggedIn", "logout", "isBlockedPath", "isBlockedUrl", "isBlockedHref"]));
8
8
  }
9
9
  }
10
10
  //# sourceMappingURL=auth-v2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,MAAMC,KAAK,GAAGH,mBAAmB,CAAC,CAAC;EACnC,IAAIG,KAAK,EAAE;IACT,OAAOC,MAAM,CAACC,MAAM,CAClBJ,IAAI,CAACE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACjE,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\n \"authenticate\",\n \"getAuth\",\n \"isLoggedIn\",\n \"logout\",\n \"isBlockedPath\",\n \"isBlockedUrl\",\n \"isBlockedHref\",\n ])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,MAAMC,KAAK,GAAGH,mBAAmB,CAAC,CAAC;EACnC,IAAIG,KAAK,EAAE;IACT,OAAOC,MAAM,CAACC,MAAM,CAClBJ,IAAI,CAACE,KAAK,EAAE,CACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,cAAc,EACd,eAAe,CAChB,CACH,CAAC;EACH;AACF","ignoreList":[]}
package/dist/esm/auth.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { getBasePath, matchPath } from "@next-core/runtime";
2
+ import { createLocation } from "history";
1
3
  import { resetPermissionPreChecks } from "./checkPermissions.js";
2
4
  const auth = {};
3
5
 
@@ -46,4 +48,39 @@ export function logout() {
46
48
  export function isLoggedIn() {
47
49
  return auth.username !== undefined;
48
50
  }
51
+
52
+ /**
53
+ * 判断一个内部 URL 路径是否被屏蔽。
54
+ */
55
+ export function isBlockedPath(pathname) {
56
+ var _auth$license;
57
+ return !!((_auth$license = auth.license) !== null && _auth$license !== void 0 && (_auth$license = _auth$license.blackList) !== null && _auth$license !== void 0 && _auth$license.some(path => matchPath(pathname, {
58
+ path
59
+ })));
60
+ }
61
+
62
+ /**
63
+ * 判断一个内部 URL 是否被屏蔽。
64
+ */
65
+ export function isBlockedUrl(url) {
66
+ const pathname = (typeof url === "string" ? createLocation(url) : url).pathname;
67
+ if (typeof pathname !== "string") {
68
+ return false;
69
+ }
70
+ return isBlockedPath(pathname);
71
+ }
72
+
73
+ /**
74
+ * 判断一个 href 是否被屏蔽。
75
+ */
76
+ export function isBlockedHref(href) {
77
+ const basePath = getBasePath();
78
+ const url = new URL(href, `${location.origin}${basePath}`);
79
+ // 忽略外链地址
80
+ if (url.origin !== location.origin || !url.pathname.startsWith(basePath)) {
81
+ return false;
82
+ }
83
+ // 转换为内部路径
84
+ return isBlockedPath(url.pathname.substring(basePath.length - 1));
85
+ }
49
86
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":["resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","logout","key","keys","undefined","isLoggedIn"],"sources":["../../src/auth.ts"],"sourcesContent":["import type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n accessToken: newAuth.accessToken,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n"],"mappings":"AACA,SAASA,wBAAwB,QAAQ,uBAAuB;AAEhE,MAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACA,OAAO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,aAAa,EAAEZ,OAAO,CAACY;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAO;IACL,GAAGf;EACL,CAAC;AACH;;AAEA;AACA,OAAO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,MAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACApB,wBAAwB,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASqB,UAAUA,CAAA,EAAY;EACpC,OAAOpB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC","ignoreList":[]}
1
+ {"version":3,"file":"auth.js","names":["getBasePath","matchPath","createLocation","resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","logout","key","keys","undefined","isLoggedIn","isBlockedPath","pathname","_auth$license","blackList","some","path","isBlockedUrl","url","isBlockedHref","href","basePath","URL","location","origin","startsWith","substring","length"],"sources":["../../src/auth.ts"],"sourcesContent":["import { getBasePath, matchPath } from \"@next-core/runtime\";\nimport type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { createLocation, type LocationDescriptor } from \"history\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n accessToken: newAuth.accessToken,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n\n/**\n * 判断一个内部 URL 路径是否被屏蔽。\n */\nexport function isBlockedPath(pathname: string): boolean {\n return !!auth.license?.blackList?.some((path) =>\n matchPath(pathname, { path })\n );\n}\n\n/**\n * 判断一个内部 URL 是否被屏蔽。\n */\nexport function isBlockedUrl(url: string | LocationDescriptor): boolean {\n const pathname = (typeof url === \"string\" ? createLocation(url) : url)\n .pathname;\n if (typeof pathname !== \"string\") {\n return false;\n }\n return isBlockedPath(pathname);\n}\n\n/**\n * 判断一个 href 是否被屏蔽。\n */\nexport function isBlockedHref(href: string): boolean {\n const basePath = getBasePath();\n const url = new URL(href, `${location.origin}${basePath}`);\n // 忽略外链地址\n if (url.origin !== location.origin || !url.pathname.startsWith(basePath)) {\n return false;\n }\n // 转换为内部路径\n return isBlockedPath(url.pathname.substring(basePath.length - 1));\n}\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,SAAS,QAAQ,oBAAoB;AAE3D,SAASC,cAAc,QAAiC,SAAS;AACjE,SAASC,wBAAwB,QAAQ,uBAAuB;AAEhE,MAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACA,OAAO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,aAAa,EAAEZ,OAAO,CAACY;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAO;IACL,GAAGf;EACL,CAAC;AACH;;AAEA;AACA,OAAO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,MAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACApB,wBAAwB,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASqB,UAAUA,CAAA,EAAY;EACpC,OAAOpB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC;;AAEA;AACA;AACA;AACA,OAAO,SAASE,aAAaA,CAACC,QAAgB,EAAW;EAAA,IAAAC,aAAA;EACvD,OAAO,CAAC,GAAAA,aAAA,GAACvB,IAAI,CAACY,OAAO,cAAAW,aAAA,gBAAAA,aAAA,GAAZA,aAAA,CAAcC,SAAS,cAAAD,aAAA,eAAvBA,aAAA,CAAyBE,IAAI,CAAEC,IAAI,IAC1C7B,SAAS,CAACyB,QAAQ,EAAE;IAAEI;EAAK,CAAC,CAC9B,CAAC;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,GAAgC,EAAW;EACtE,MAAMN,QAAQ,GAAG,CAAC,OAAOM,GAAG,KAAK,QAAQ,GAAG9B,cAAc,CAAC8B,GAAG,CAAC,GAAGA,GAAG,EAClEN,QAAQ;EACX,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;IAChC,OAAO,KAAK;EACd;EACA,OAAOD,aAAa,CAACC,QAAQ,CAAC;AAChC;;AAEA;AACA;AACA;AACA,OAAO,SAASO,aAAaA,CAACC,IAAY,EAAW;EACnD,MAAMC,QAAQ,GAAGnC,WAAW,CAAC,CAAC;EAC9B,MAAMgC,GAAG,GAAG,IAAII,GAAG,CAACF,IAAI,EAAE,GAAGG,QAAQ,CAACC,MAAM,GAAGH,QAAQ,EAAE,CAAC;EAC1D;EACA,IAAIH,GAAG,CAACM,MAAM,KAAKD,QAAQ,CAACC,MAAM,IAAI,CAACN,GAAG,CAACN,QAAQ,CAACa,UAAU,CAACJ,QAAQ,CAAC,EAAE;IACxE,OAAO,KAAK;EACd;EACA;EACA,OAAOV,aAAa,CAACO,GAAG,CAACN,QAAQ,CAACc,SAAS,CAACL,QAAQ,CAACM,MAAM,GAAG,CAAC,CAAC,CAAC;AACnE","ignoreList":[]}
@@ -8,6 +8,7 @@ import { computeMenuItems, computeMenuData } from "./computeMenuData.js";
8
8
  import { fetchMenuTitle } from "./fetchMenuTitle.js";
9
9
  import { getMenusOfStandaloneApp } from "./getMenusOfStandaloneApp.js";
10
10
  import { preCheckPermissionsForAny } from "../checkPermissions.js";
11
+ import { isBlockedHref, isBlockedUrl } from "../auth.js";
11
12
  const menuPromises = new Map();
12
13
  const menuCache = new Map();
13
14
  function transformMenuItems(menuItems) {
@@ -27,9 +28,12 @@ function transformMenuItems(menuItems) {
27
28
  icon: item.icon,
28
29
  items: children,
29
30
  defaultExpanded: item.defaultExpanded
30
- } : omit(item, ["type", "items", "children"]);
31
+ } : isMenuItemBlocked(item) ? null : omit(item, ["type", "items", "children"]);
31
32
  return transformedMenuItem;
32
- });
33
+ }).filter(Boolean);
34
+ }
35
+ function isMenuItemBlocked(item) {
36
+ return item.href ? isBlockedHref(item.href) : item.to ? isBlockedUrl(item.to) : false;
33
37
  }
34
38
  export function getMenuById(menuId) {
35
39
  return menuCache.get(menuId);
@@ -1 +1 @@
1
- {"version":3,"file":"fetchMenuById.js","names":["InstanceApi_postSearch","InstalledMicroAppApi_getMenusInfo","omit","pick","checkIfOfComputed","mergeMenu","reorderMenu","computeMenuItems","computeMenuData","fetchMenuTitle","getMenusOfStandaloneApp","preCheckPermissionsForAny","menuPromises","Map","menuCache","transformMenuItems","menuItems","filter","map","item","children","transformedMenuItem","type","title","text","childLayout","items","groupId","groupFrom","length","icon","defaultExpanded","getMenuById","menuId","get","fetchMenuById","runtimeContext","helpers","promise","_fetchMenuById","menuList","window","STANDALONE_MICRO_APPS","app","id","flags","menuObjectId","menus","page","page_size","fields","link","titleDataSource","defaultCollapsed","defaultCollapsedBreakpoint","injectMenuGroupId","dynamicItems","itemsResolve","i18n","query","$eq","$size","$gt","list","menuData","Error","restMenuData","newRuntimeContext","pendingPermissionsPreCheck","tplStateStoreId","forEachItem","forEachIndex","forEachSize","rootAppId","appId","computedMenuData","computedMenuItems","Promise","all","finalMenuData","set"],"sources":["../../../src/menu/fetchMenuById.ts"],"sourcesContent":["import { InstanceApi_postSearch } from \"@next-api-sdk/cmdb-sdk\";\nimport { InstalledMicroAppApi_getMenusInfo } from \"@next-api-sdk/micro-app-sdk\";\nimport { omit, pick } from \"lodash\";\nimport { checkIfOfComputed } from \"@next-core/runtime\";\nimport { mergeMenu } from \"./mergeMenu.js\";\nimport { reorderMenu } from \"./reorderMenuItems.js\";\nimport type {\n MenuRawData,\n RuntimeContext,\n RuntimeHelpers,\n RuntimeMenuItemRawData,\n SidebarMenu,\n SidebarMenuItem,\n} from \"./interfaces.js\";\nimport { computeMenuItems, computeMenuData } from \"./computeMenuData.js\";\nimport { fetchMenuTitle } from \"./fetchMenuTitle.js\";\nimport { getMenusOfStandaloneApp } from \"./getMenusOfStandaloneApp.js\";\nimport { preCheckPermissionsForAny } from \"../checkPermissions.js\";\n\nconst menuPromises = new Map<string, Promise<void>>();\n\nconst menuCache = new Map<string, SidebarMenu>();\n\nfunction transformMenuItems(\n menuItems: RuntimeMenuItemRawData[] | undefined\n): SidebarMenuItem[] | undefined {\n return menuItems?.filter(checkIfOfComputed).map((item) => {\n const children = transformMenuItems(item.children);\n const transformedMenuItem: SidebarMenuItem =\n item.type === \"group\"\n ? {\n type: \"group\",\n title: item.text,\n childLayout: item.childLayout,\n items: children,\n groupId: item.groupId,\n groupFrom: item.groupFrom,\n }\n : children?.length\n ? {\n type: \"subMenu\",\n childLayout: item.childLayout,\n title: item.text,\n icon: item.icon,\n items: children,\n defaultExpanded: item.defaultExpanded,\n }\n : (omit(item, [\"type\", \"items\", \"children\"]) as SidebarMenuItem);\n return transformedMenuItem;\n });\n}\n\nexport function getMenuById(menuId: string) {\n return menuCache.get(menuId);\n}\n\nexport function fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n let promise = menuPromises.get(menuId);\n if (!promise) {\n promise = _fetchMenuById(menuId, runtimeContext, helpers);\n }\n return promise;\n}\n\nasync function _fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n const menuList = window.STANDALONE_MICRO_APPS\n ? getMenusOfStandaloneApp(menuId, runtimeContext.app.id, helpers)\n : runtimeContext.flags[\"three-level-menu-layout\"]\n ? ((\n await InstalledMicroAppApi_getMenusInfo(menuId, {\n menuObjectId: \"EASYOPS_STORYBOARD_MENU\",\n })\n ).menus as MenuRawData[])\n : ((\n await InstanceApi_postSearch(\"EASYOPS_STORYBOARD_MENU\", {\n page: 1,\n page_size: 200,\n fields: {\n menuId: true,\n title: true,\n icon: true,\n link: true,\n titleDataSource: true,\n defaultCollapsed: true,\n defaultCollapsedBreakpoint: true,\n type: true,\n injectMenuGroupId: true,\n dynamicItems: true,\n itemsResolve: true,\n items: true,\n i18n: true,\n \"items.children\": true,\n \"app.appId\": true,\n },\n query: {\n menuId: {\n $eq: menuId,\n },\n app: {\n $size: {\n $gt: 0,\n },\n },\n },\n })\n ).list as MenuRawData[]);\n\n const menuData = await mergeMenu(menuList, runtimeContext, helpers);\n if (!menuData) {\n throw new Error(`Menu not found: ${menuId}`);\n }\n\n reorderMenu(menuData);\n\n const { items, app, ...restMenuData } = menuData;\n const newRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n pendingPermissionsPreCheck: [\n ...runtimeContext.pendingPermissionsPreCheck,\n preCheckPermissionsForAny([items, restMenuData]),\n ],\n };\n delete newRuntimeContext.tplStateStoreId;\n delete newRuntimeContext.forEachItem;\n delete newRuntimeContext.forEachIndex;\n delete newRuntimeContext.forEachSize;\n const rootAppId = app[0].appId;\n\n const [computedMenuData, computedMenuItems] = await Promise.all([\n computeMenuData(restMenuData, rootAppId, newRuntimeContext, helpers),\n computeMenuItems(items, newRuntimeContext, helpers),\n ]);\n\n const finalMenuData: SidebarMenu = {\n title: await fetchMenuTitle(computedMenuData),\n ...pick(computedMenuData, [\n \"icon\",\n \"link\",\n \"defaultCollapsed\",\n \"defaultCollapsedBreakpoint\",\n ]),\n menuItems: transformMenuItems(computedMenuItems)!,\n };\n\n // Todo(steve): reconsider the menu cache strategy\n menuCache.set(menuId, finalMenuData);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fetchMenuById.js","names":["InstanceApi_postSearch","InstalledMicroAppApi_getMenusInfo","omit","pick","checkIfOfComputed","mergeMenu","reorderMenu","computeMenuItems","computeMenuData","fetchMenuTitle","getMenusOfStandaloneApp","preCheckPermissionsForAny","isBlockedHref","isBlockedUrl","menuPromises","Map","menuCache","transformMenuItems","menuItems","filter","map","item","children","transformedMenuItem","type","title","text","childLayout","items","groupId","groupFrom","length","icon","defaultExpanded","isMenuItemBlocked","Boolean","href","to","getMenuById","menuId","get","fetchMenuById","runtimeContext","helpers","promise","_fetchMenuById","menuList","window","STANDALONE_MICRO_APPS","app","id","flags","menuObjectId","menus","page","page_size","fields","link","titleDataSource","defaultCollapsed","defaultCollapsedBreakpoint","injectMenuGroupId","dynamicItems","itemsResolve","i18n","query","$eq","$size","$gt","list","menuData","Error","restMenuData","newRuntimeContext","pendingPermissionsPreCheck","tplStateStoreId","forEachItem","forEachIndex","forEachSize","rootAppId","appId","computedMenuData","computedMenuItems","Promise","all","finalMenuData","set"],"sources":["../../../src/menu/fetchMenuById.ts"],"sourcesContent":["import { InstanceApi_postSearch } from \"@next-api-sdk/cmdb-sdk\";\nimport { InstalledMicroAppApi_getMenusInfo } from \"@next-api-sdk/micro-app-sdk\";\nimport { omit, pick } from \"lodash\";\nimport { checkIfOfComputed } from \"@next-core/runtime\";\nimport { mergeMenu } from \"./mergeMenu.js\";\nimport { reorderMenu } from \"./reorderMenuItems.js\";\nimport type {\n MenuRawData,\n RuntimeContext,\n RuntimeHelpers,\n RuntimeMenuItemRawData,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuSimpleItem,\n} from \"./interfaces.js\";\nimport { computeMenuItems, computeMenuData } from \"./computeMenuData.js\";\nimport { fetchMenuTitle } from \"./fetchMenuTitle.js\";\nimport { getMenusOfStandaloneApp } from \"./getMenusOfStandaloneApp.js\";\nimport { preCheckPermissionsForAny } from \"../checkPermissions.js\";\nimport { isBlockedHref, isBlockedUrl } from \"../auth.js\";\n\nconst menuPromises = new Map<string, Promise<void>>();\n\nconst menuCache = new Map<string, SidebarMenu>();\n\nfunction transformMenuItems(\n menuItems: RuntimeMenuItemRawData[] | undefined\n): SidebarMenuItem[] | undefined {\n return menuItems\n ?.filter(checkIfOfComputed)\n .map((item) => {\n const children = transformMenuItems(item.children);\n const transformedMenuItem: SidebarMenuItem | null =\n item.type === \"group\"\n ? {\n type: \"group\",\n title: item.text,\n childLayout: item.childLayout,\n items: children,\n groupId: item.groupId,\n groupFrom: item.groupFrom,\n }\n : children?.length\n ? {\n type: \"subMenu\",\n childLayout: item.childLayout,\n title: item.text,\n icon: item.icon,\n items: children,\n defaultExpanded: item.defaultExpanded,\n }\n : isMenuItemBlocked(item as SidebarMenuSimpleItem)\n ? null\n : (omit(item, [\"type\", \"items\", \"children\"]) as SidebarMenuItem);\n return transformedMenuItem;\n })\n .filter(Boolean) as SidebarMenuItem[];\n}\n\nfunction isMenuItemBlocked(item: SidebarMenuSimpleItem) {\n return item.href\n ? isBlockedHref(item.href)\n : item.to\n ? isBlockedUrl(item.to)\n : false;\n}\n\nexport function getMenuById(menuId: string) {\n return menuCache.get(menuId);\n}\n\nexport function fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n let promise = menuPromises.get(menuId);\n if (!promise) {\n promise = _fetchMenuById(menuId, runtimeContext, helpers);\n }\n return promise;\n}\n\nasync function _fetchMenuById(\n menuId: string,\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n) {\n const menuList = window.STANDALONE_MICRO_APPS\n ? getMenusOfStandaloneApp(menuId, runtimeContext.app.id, helpers)\n : runtimeContext.flags[\"three-level-menu-layout\"]\n ? ((\n await InstalledMicroAppApi_getMenusInfo(menuId, {\n menuObjectId: \"EASYOPS_STORYBOARD_MENU\",\n })\n ).menus as MenuRawData[])\n : ((\n await InstanceApi_postSearch(\"EASYOPS_STORYBOARD_MENU\", {\n page: 1,\n page_size: 200,\n fields: {\n menuId: true,\n title: true,\n icon: true,\n link: true,\n titleDataSource: true,\n defaultCollapsed: true,\n defaultCollapsedBreakpoint: true,\n type: true,\n injectMenuGroupId: true,\n dynamicItems: true,\n itemsResolve: true,\n items: true,\n i18n: true,\n \"items.children\": true,\n \"app.appId\": true,\n },\n query: {\n menuId: {\n $eq: menuId,\n },\n app: {\n $size: {\n $gt: 0,\n },\n },\n },\n })\n ).list as MenuRawData[]);\n\n const menuData = await mergeMenu(menuList, runtimeContext, helpers);\n if (!menuData) {\n throw new Error(`Menu not found: ${menuId}`);\n }\n\n reorderMenu(menuData);\n\n const { items, app, ...restMenuData } = menuData;\n const newRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n pendingPermissionsPreCheck: [\n ...runtimeContext.pendingPermissionsPreCheck,\n preCheckPermissionsForAny([items, restMenuData]),\n ],\n };\n delete newRuntimeContext.tplStateStoreId;\n delete newRuntimeContext.forEachItem;\n delete newRuntimeContext.forEachIndex;\n delete newRuntimeContext.forEachSize;\n const rootAppId = app[0].appId;\n\n const [computedMenuData, computedMenuItems] = await Promise.all([\n computeMenuData(restMenuData, rootAppId, newRuntimeContext, helpers),\n computeMenuItems(items, newRuntimeContext, helpers),\n ]);\n\n const finalMenuData: SidebarMenu = {\n title: await fetchMenuTitle(computedMenuData),\n ...pick(computedMenuData, [\n \"icon\",\n \"link\",\n \"defaultCollapsed\",\n \"defaultCollapsedBreakpoint\",\n ]),\n menuItems: transformMenuItems(computedMenuItems)!,\n };\n\n // Todo(steve): reconsider the menu cache strategy\n menuCache.set(menuId, finalMenuData);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","names":["symbolAppId","symbolMenuI18nNamespace","symbolOverrideApp"],"sources":["../../../src/menu/interfaces.ts"],"sourcesContent":["import type { MetaI18n, MicroApp, ResolveConf } from \"@next-core/types\";\nimport type {\n RuntimeHooksMenuHelpers,\n __secret_internals,\n MatchOptions,\n} from \"@next-core/runtime\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\n\nexport type RuntimeContext = __secret_internals.RuntimeContext;\n\nexport type RuntimeHelpers = RuntimeHooksMenuHelpers;\n\n/** 原始菜单数据。 */\nexport interface MenuRawData {\n menuId: string;\n title: string;\n app: [\n {\n appId: string;\n },\n ];\n icon?: unknown;\n link?: string;\n titleDataSource?: TitleDataSource;\n items?: MenuItemRawData[];\n type?: \"main\" | \"inject\";\n injectMenuGroupId?: string;\n defaultCollapsed?: boolean;\n defaultCollapsedBreakpoint?: number;\n dynamicItems?: boolean;\n itemsResolve?: ResolveConf;\n i18n?: MetaI18n;\n overrideApp?: MicroApp;\n}\n\n/** 原始菜单项数据。 */\nexport type MenuItemRawData = Omit<SidebarMenuSimpleItem, \"type\"> & {\n children?: MenuItemRawData[];\n type?: \"default\" | \"group\";\n childLayout?: \"default\" | \"category\";\n sort?: number;\n if?: string | boolean;\n defaultExpanded?: boolean;\n groupId?: string;\n groupFrom?: string;\n};\n\ninterface TitleDataSource {\n objectId: string;\n instanceId: string;\n attributeId?: string;\n}\n\n/** 侧边栏基本菜单项的配置。 */\nexport interface SidebarMenuSimpleItem {\n /** 菜单项文本。 */\n text: string;\n\n /** 菜单项对应的系统内地址。 */\n // to?: LocationDescriptor;\n to?: unknown;\n\n /** 菜单项对应的外部链接地址。 */\n href?: string;\n\n /** 菜单项的图标。 */\n // icon?: MenuIcon;\n icon?: unknown;\n\n /** 菜单项链接打开的目标。 */\n target?: string;\n\n type?: \"default\";\n\n /** 高亮菜单项时是否使用精确匹配来对比当前地址和菜单项地址。 */\n exact?: boolean;\n\n /** 设置额外包含的匹配高亮菜单项的地址列表。 */\n activeIncludes?: (string | MatchOptions)[];\n\n /** 设置需要被排除的匹配高亮菜单项的地址列表。 */\n activeExcludes?: (string | MatchOptions)[];\n\n /** 设置匹配高亮菜单项时是否还对 search 参数进行比较。 */\n activeMatchSearch?: boolean;\n\n /** @internal */\n key?: string;\n}\n\nexport interface RuntimeMenuItemRawData extends MenuItemRawData {\n children?: RuntimeMenuItemRawData[];\n [symbolAppId]: string;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface RuntimeMenuRawData extends MenuRawData {\n items: RuntimeMenuItemRawData[];\n // [symbolShouldCache]?: boolean;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface SidebarMenu {\n /** 菜单标题。 */\n title: string;\n /** 菜单标题对应的图标。 */\n icon?: unknown;\n /** 菜单标题对应的链接地址。 */\n link?: unknown;\n /** 是否默认折叠。 */\n defaultCollapsed?: boolean;\n /** 针对小于特定尺寸的屏幕(例如 1600px),是否默认折叠。 */\n defaultCollapsedBreakpoint?: number;\n /** 菜单项列表。 */\n menuItems: SidebarMenuItem[];\n}\n\n/** 侧边栏菜单项配置。 */\nexport type SidebarMenuItem = SidebarMenuSimpleItem | SidebarMenuGroup;\n\n/** 侧边栏分组菜单项的配置。 */\nexport interface SidebarMenuGroup {\n /** 分组 Id。 */\n groupId?: string;\n\n /** 分组来源。 */\n groupFrom?: string;\n\n /** 分组类型。 */\n type: \"group\" | \"subMenu\";\n\n /** 分组标题。 */\n title: string;\n\n /** {@inheritDoc SidebarMenuSimpleItem.icon } */\n icon?: unknown;\n\n /** 该分组下的子菜单项列表。 */\n items?: SidebarMenuItem[];\n\n /** @internal */\n key?: string;\n\n /** 该分组下的子菜单是否默认展开。 */\n defaultExpanded?: boolean;\n\n /** 子菜单项的布局方式。 */\n childLayout?: \"default\" | \"category\" | \"siteMap\";\n}\n"],"mappings":"AAMA,SACEA,WAAW,EACXC,uBAAuB,EACvBC,iBAAiB,QACZ,gBAAgB;;AAMvB;;AAuBA;;AAkBA;;AAkEA;;AAGA","ignoreList":[]}
1
+ {"version":3,"file":"interfaces.js","names":["symbolAppId","symbolMenuI18nNamespace","symbolOverrideApp"],"sources":["../../../src/menu/interfaces.ts"],"sourcesContent":["import type { MetaI18n, MicroApp, ResolveConf } from \"@next-core/types\";\nimport type {\n RuntimeHooksMenuHelpers,\n __secret_internals,\n MatchOptions,\n} from \"@next-core/runtime\";\nimport type { LocationDescriptor } from \"history\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\n\nexport type RuntimeContext = __secret_internals.RuntimeContext;\n\nexport type RuntimeHelpers = RuntimeHooksMenuHelpers;\n\n/** 原始菜单数据。 */\nexport interface MenuRawData {\n menuId: string;\n title: string;\n app: [\n {\n appId: string;\n },\n ];\n icon?: unknown;\n link?: string;\n titleDataSource?: TitleDataSource;\n items?: MenuItemRawData[];\n type?: \"main\" | \"inject\";\n injectMenuGroupId?: string;\n defaultCollapsed?: boolean;\n defaultCollapsedBreakpoint?: number;\n dynamicItems?: boolean;\n itemsResolve?: ResolveConf;\n i18n?: MetaI18n;\n overrideApp?: MicroApp;\n}\n\n/** 原始菜单项数据。 */\nexport type MenuItemRawData = Omit<SidebarMenuSimpleItem, \"type\"> & {\n children?: MenuItemRawData[];\n type?: \"default\" | \"group\";\n childLayout?: \"default\" | \"category\";\n sort?: number;\n if?: string | boolean;\n defaultExpanded?: boolean;\n groupId?: string;\n groupFrom?: string;\n};\n\ninterface TitleDataSource {\n objectId: string;\n instanceId: string;\n attributeId?: string;\n}\n\n/** 侧边栏基本菜单项的配置。 */\nexport interface SidebarMenuSimpleItem {\n /** 菜单项文本。 */\n text: string;\n\n /** 菜单项对应的系统内地址。 */\n to?: LocationDescriptor;\n\n /** 菜单项对应的外部链接地址。 */\n href?: string;\n\n /** 菜单项的图标。 */\n // icon?: MenuIcon;\n icon?: unknown;\n\n /** 菜单项链接打开的目标。 */\n target?: string;\n\n type?: \"default\";\n\n /** 高亮菜单项时是否使用精确匹配来对比当前地址和菜单项地址。 */\n exact?: boolean;\n\n /** 设置额外包含的匹配高亮菜单项的地址列表。 */\n activeIncludes?: (string | MatchOptions)[];\n\n /** 设置需要被排除的匹配高亮菜单项的地址列表。 */\n activeExcludes?: (string | MatchOptions)[];\n\n /** 设置匹配高亮菜单项时是否还对 search 参数进行比较。 */\n activeMatchSearch?: boolean;\n\n /** @internal */\n key?: string;\n}\n\nexport interface RuntimeMenuItemRawData extends MenuItemRawData {\n children?: RuntimeMenuItemRawData[];\n [symbolAppId]: string;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface RuntimeMenuRawData extends MenuRawData {\n items: RuntimeMenuItemRawData[];\n // [symbolShouldCache]?: boolean;\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface SidebarMenu {\n /** 菜单标题。 */\n title: string;\n /** 菜单标题对应的图标。 */\n icon?: unknown;\n /** 菜单标题对应的链接地址。 */\n link?: unknown;\n /** 是否默认折叠。 */\n defaultCollapsed?: boolean;\n /** 针对小于特定尺寸的屏幕(例如 1600px),是否默认折叠。 */\n defaultCollapsedBreakpoint?: number;\n /** 菜单项列表。 */\n menuItems: SidebarMenuItem[];\n}\n\n/** 侧边栏菜单项配置。 */\nexport type SidebarMenuItem = SidebarMenuSimpleItem | SidebarMenuGroup;\n\n/** 侧边栏分组菜单项的配置。 */\nexport interface SidebarMenuGroup {\n /** 分组 Id。 */\n groupId?: string;\n\n /** 分组来源。 */\n groupFrom?: string;\n\n /** 分组类型。 */\n type: \"group\" | \"subMenu\";\n\n /** 分组标题。 */\n title: string;\n\n /** {@inheritDoc SidebarMenuSimpleItem.icon } */\n icon?: unknown;\n\n /** 该分组下的子菜单项列表。 */\n items?: SidebarMenuItem[];\n\n /** @internal */\n key?: string;\n\n /** 该分组下的子菜单是否默认展开。 */\n defaultExpanded?: boolean;\n\n /** 子菜单项的布局方式。 */\n childLayout?: \"default\" | \"category\" | \"siteMap\";\n}\n"],"mappings":"AAOA,SACEA,WAAW,EACXC,uBAAuB,EACvBC,iBAAiB,QACZ,gBAAgB;;AAMvB;;AAuBA;;AAkBA;;AAiEA;;AAGA","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import type { AuthApi_CheckLoginResponseBody } from "@next-api-sdk/api-gateway-sdk";
2
+ import { type LocationDescriptor } from "history";
2
3
  /** @internal */
3
4
  export type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, "loggedIn">;
4
5
  /** @internal */
@@ -17,3 +18,15 @@ export declare function logout(): void;
17
18
  * @returns 当前是否已登录。
18
19
  */
19
20
  export declare function isLoggedIn(): boolean;
21
+ /**
22
+ * 判断一个内部 URL 路径是否被屏蔽。
23
+ */
24
+ export declare function isBlockedPath(pathname: string): boolean;
25
+ /**
26
+ * 判断一个内部 URL 是否被屏蔽。
27
+ */
28
+ export declare function isBlockedUrl(url: string | LocationDescriptor): boolean;
29
+ /**
30
+ * 判断一个 href 是否被屏蔽。
31
+ */
32
+ export declare function isBlockedHref(href: string): boolean;
@@ -1,5 +1,6 @@
1
1
  import type { MetaI18n, MicroApp, ResolveConf } from "@next-core/types";
2
2
  import type { RuntimeHooksMenuHelpers, __secret_internals, MatchOptions } from "@next-core/runtime";
3
+ import type { LocationDescriptor } from "history";
3
4
  import { symbolAppId, symbolMenuI18nNamespace, symbolOverrideApp } from "./constants.js";
4
5
  export type RuntimeContext = __secret_internals.RuntimeContext;
5
6
  export type RuntimeHelpers = RuntimeHooksMenuHelpers;
@@ -46,7 +47,7 @@ export interface SidebarMenuSimpleItem {
46
47
  /** 菜单项文本。 */
47
48
  text: string;
48
49
  /** 菜单项对应的系统内地址。 */
49
- to?: unknown;
50
+ to?: LocationDescriptor;
50
51
  /** 菜单项对应的外部链接地址。 */
51
52
  href?: string;
52
53
  /** 菜单项的图标。 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-core/easyops-runtime",
3
- "version": "0.12.46",
3
+ "version": "0.13.1-alpha.0",
4
4
  "homepage": "https://github.com/easyops-cn/next-core/tree/v3/packages/easyops-runtime",
5
5
  "license": "GPL-3.0",
6
6
  "repository": {
@@ -41,24 +41,24 @@
41
41
  "test:ci": "cross-env NODE_ENV='test' CI=true test-next"
42
42
  },
43
43
  "dependencies": {
44
- "@next-api-sdk/api-gateway-sdk": "^1.2.0",
44
+ "@next-api-sdk/api-gateway-sdk": "^1.2.2",
45
45
  "@next-api-sdk/cmdb-sdk": "^1.1.0",
46
46
  "@next-api-sdk/micro-app-sdk": "^1.2.1",
47
47
  "@next-api-sdk/micro-app-standalone-sdk": "^1.1.0",
48
- "@next-core/cook": "^2.5.4",
49
- "@next-core/http": "^1.2.9",
50
- "@next-core/pipes": "^2.0.28",
51
- "@next-core/runtime": "^1.58.4",
48
+ "@next-core/cook": "^2.5.5",
49
+ "@next-core/http": "^1.2.10",
50
+ "@next-core/pipes": "^2.0.29",
51
+ "@next-core/runtime": "^1.59.1-alpha.0",
52
52
  "@next-core/types": "^1.14.0",
53
53
  "@next-core/utils": "^1.7.28",
54
54
  "js-yaml": "^3.14.1",
55
55
  "lodash": "^4.17.21"
56
56
  },
57
57
  "devDependencies": {
58
- "@next-core/build-next-libs": "^1.0.21",
58
+ "@next-core/build-next-libs": "^1.0.22",
59
59
  "@next-core/test-next": "^1.1.7",
60
60
  "jest-websocket-mock": "^2.5.0",
61
61
  "whatwg-fetch": "^3.6.20"
62
62
  },
63
- "gitHead": "feb95796f5382da9f7a6b5b46a674ed3d646c01c"
63
+ "gitHead": "cceaea3cf518d6d706bb23efe664bd65253f9726"
64
64
  }