@next-core/runtime 1.10.0 → 1.11.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.
- package/dist/cjs/internal/CustomTemplates/expandCustomTemplate.js +3 -2
- package/dist/cjs/internal/CustomTemplates/expandCustomTemplate.js.map +1 -1
- package/dist/cjs/internal/Router.js +5 -7
- package/dist/cjs/internal/Router.js.map +1 -1
- package/dist/cjs/internal/Runtime.js.map +1 -1
- package/dist/cjs/internal/bindListeners.js +5 -4
- package/dist/cjs/internal/bindListeners.js.map +1 -1
- package/dist/cjs/internal/checkPermissions.js +5 -5
- package/dist/cjs/internal/checkPermissions.js.map +1 -1
- package/dist/cjs/internal/compute/evaluate.js +6 -6
- package/dist/cjs/internal/compute/evaluate.js.map +1 -1
- package/dist/cjs/internal/data/getProviderBrick.js +6 -6
- package/dist/cjs/internal/data/getProviderBrick.js.map +1 -1
- package/dist/cjs/internal/data/resolveData.js +3 -2
- package/dist/cjs/internal/data/resolveData.js.map +1 -1
- package/dist/cjs/internal/hasInstalledApp.js +40 -0
- package/dist/cjs/internal/hasInstalledApp.js.map +1 -0
- package/dist/esm/internal/CustomTemplates/expandCustomTemplate.js +3 -2
- package/dist/esm/internal/CustomTemplates/expandCustomTemplate.js.map +1 -1
- package/dist/esm/internal/Router.js +6 -8
- package/dist/esm/internal/Router.js.map +1 -1
- package/dist/esm/internal/Runtime.js.map +1 -1
- package/dist/esm/internal/bindListeners.js +5 -4
- package/dist/esm/internal/bindListeners.js.map +1 -1
- package/dist/esm/internal/checkPermissions.js +5 -5
- package/dist/esm/internal/checkPermissions.js.map +1 -1
- package/dist/esm/internal/compute/evaluate.js +5 -5
- package/dist/esm/internal/compute/evaluate.js.map +1 -1
- package/dist/esm/internal/data/getProviderBrick.js +7 -7
- package/dist/esm/internal/data/getProviderBrick.js.map +1 -1
- package/dist/esm/internal/data/resolveData.js +3 -2
- package/dist/esm/internal/data/resolveData.js.map +1 -1
- package/dist/esm/internal/hasInstalledApp.js +34 -0
- package/dist/esm/internal/hasInstalledApp.js.map +1 -0
- package/dist/types/internal/Runtime.d.ts +19 -2
- package/dist/types/internal/hasInstalledApp.d.ts +3 -0
- package/package.json +8 -9
- package/dist/cjs/internal/checkInstalledApps.js +0 -105
- package/dist/cjs/internal/checkInstalledApps.js.map +0 -1
- package/dist/cjs/internal/compute/collectMemberCallUsage.js +0 -30
- package/dist/cjs/internal/compute/collectMemberCallUsage.js.map +0 -1
- package/dist/cjs/internal/data/CollectContracts.js +0 -29
- package/dist/cjs/internal/data/CollectContracts.js.map +0 -1
- package/dist/cjs/internal/data/FlowApi.js +0 -150
- package/dist/cjs/internal/data/FlowApi.js.map +0 -1
- package/dist/cjs/internal/data/FlowApiProvider.js +0 -122
- package/dist/cjs/internal/data/FlowApiProvider.js.map +0 -1
- package/dist/esm/internal/checkInstalledApps.js +0 -100
- package/dist/esm/internal/checkInstalledApps.js.map +0 -1
- package/dist/esm/internal/compute/collectMemberCallUsage.js +0 -22
- package/dist/esm/internal/compute/collectMemberCallUsage.js.map +0 -1
- package/dist/esm/internal/data/CollectContracts.js +0 -20
- package/dist/esm/internal/data/CollectContracts.js.map +0 -1
- package/dist/esm/internal/data/FlowApi.js +0 -156
- package/dist/esm/internal/data/FlowApi.js.map +0 -1
- package/dist/esm/internal/data/FlowApiProvider.js +0 -122
- package/dist/esm/internal/data/FlowApiProvider.js.map +0 -1
- package/dist/types/internal/checkInstalledApps.d.ts +0 -6
- package/dist/types/internal/compute/collectMemberCallUsage.d.ts +0 -8
- package/dist/types/internal/data/CollectContracts.d.ts +0 -5
- package/dist/types/internal/data/FlowApi.d.ts +0 -30
- package/dist/types/internal/data/FlowApiProvider.d.ts +0 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveData.js","names":["asyncComputeRealValue","getProviderBrick","
|
|
1
|
+
{"version":3,"file":"resolveData.js","names":["asyncComputeRealValue","getProviderBrick","hooks","cache","Map","resolveData","_x","_x2","_x3","_resolveData","apply","arguments","_asyncToGenerator","resolveConf","runtimeContext","options","useProvider","method","args","onReject","legacyProvider","provider","Error","concat","providerBrick","actualArgs","Promise","all","promise","resolveByProvider","transform","data","error","isHandleRejectByTransform","_objectSpread","clearResolveCache","clear","_x4","_x5","_x6","_x7","_x8","_x9","_resolveByProvider","brick","originalArgs","cacheKey","JSON","stringify","e","get","_hooks$flowApi","finalArgs","flowApi","isFlowApiProvider","getArgsOfFlowApi","resolve","set"],"sources":["../../../../src/internal/data/resolveData.ts"],"sourcesContent":["import type {\n HandleReject,\n HandleRejectByTransform,\n ResolveConf,\n} from \"@next-core/types\";\nimport { asyncComputeRealValue } from \"../compute/computeRealValue.js\";\nimport { getProviderBrick } from \"./getProviderBrick.js\";\nimport type { RuntimeContext } from \"../interfaces.js\";\nimport { hooks } from \"../Runtime.js\";\n\nconst cache = new Map<string, Promise<unknown>>();\n\nexport interface ResolveOptions {\n /**\n * Cache mode of resolve.\n *\n * See https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n *\n * - `default`: Looks for a matching cache.\n * - `reload`: Without looking for a matching cache.\n */\n cache?: \"default\" | \"reload\";\n}\n\nexport async function resolveData(\n resolveConf: ResolveConf,\n runtimeContext: RuntimeContext,\n options?: ResolveOptions\n) {\n const { useProvider, method = \"resolve\", args = [], onReject } = resolveConf;\n\n const legacyProvider = (resolveConf as { provider?: string }).provider;\n if (legacyProvider && !useProvider) {\n throw new Error(\n `You're using \"provider: ${legacyProvider}\" which is dropped in v3, please use \"useProvider\" instead`\n );\n }\n\n const [providerBrick, actualArgs] = await Promise.all([\n getProviderBrick(useProvider) as unknown as Promise<\n Record<string, Function>\n >,\n asyncComputeRealValue(args, runtimeContext) as Promise<unknown[]>,\n ]);\n\n const promise = resolveByProvider(\n providerBrick,\n useProvider,\n method,\n actualArgs,\n options,\n args\n );\n\n let { transform } = resolveConf;\n let data: unknown;\n\n try {\n data = await promise;\n // The fetched data and its inner objects should never be *injected* again.\n // recursiveMarkAsInjected(data);\n } catch (error) {\n if (isHandleRejectByTransform(onReject)) {\n transform = onReject.transform;\n data = error;\n } else {\n throw error;\n }\n }\n\n if (!transform) {\n return data;\n }\n\n // Keep backward compatibility of string transform.\n if (typeof transform === \"string\") {\n return { [transform]: data };\n }\n\n return asyncComputeRealValue(transform, { ...runtimeContext, data });\n}\n\nexport function clearResolveCache() {\n cache.clear();\n}\n\nexport async function resolveByProvider(\n brick: Record<string, Function>,\n useProvider: string,\n method: string,\n args: unknown[],\n options?: ResolveOptions,\n originalArgs?: unknown[]\n) {\n let cacheKey: string;\n try {\n // `args` may contain circular references, which makes\n // JSON stringify failed, thus we fallback to original args.\n cacheKey = JSON.stringify({\n useProvider,\n method,\n args,\n });\n } catch (e) {\n if (!originalArgs) {\n throw e;\n }\n cacheKey = JSON.stringify({\n useProvider,\n method,\n originalArgs,\n });\n }\n\n let promise: Promise<unknown> | undefined;\n if (options?.cache !== \"reload\") {\n promise = cache.get(cacheKey);\n }\n if (!promise) {\n promise = (async () => {\n const finalArgs = hooks?.flowApi?.isFlowApiProvider(useProvider)\n ? await hooks.flowApi.getArgsOfFlowApi(useProvider, args, method)\n : args;\n return brick.resolve(...finalArgs);\n })();\n\n cache.set(cacheKey, promise);\n }\n\n return promise;\n}\n\nfunction isHandleRejectByTransform(\n onReject: HandleReject | undefined\n): onReject is HandleRejectByTransform {\n return !!(onReject as HandleRejectByTransform)?.transform;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { compare } from "compare-versions";
|
|
2
|
+
import { _internalApiGetAppInBootstrapData, hooks } from "./Runtime.js";
|
|
3
|
+
export function hasInstalledApp(appId, matchVersion) {
|
|
4
|
+
// First, check whether the app is in bootstrap already.
|
|
5
|
+
var app = _internalApiGetAppInBootstrapData(appId);
|
|
6
|
+
if (!app && hooks !== null && hooks !== void 0 && hooks.checkInstalledApps) {
|
|
7
|
+
app = hooks.checkInstalledApps.getCheckedApp(appId);
|
|
8
|
+
}
|
|
9
|
+
if (!app || app.installStatus === "running") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
// Todo: `currentVersion` maybe `""`
|
|
13
|
+
if (!matchVersion || !app.currentVersion) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Valid `matchVersion`:
|
|
17
|
+
// >=1.2.3
|
|
18
|
+
// >1.2.3
|
|
19
|
+
// =1.2.3
|
|
20
|
+
// <=1.2.3
|
|
21
|
+
// <1.2.3
|
|
22
|
+
var matches = matchVersion.match(/^([><]=?|=)(.*)$/);
|
|
23
|
+
try {
|
|
24
|
+
if (!matches) {
|
|
25
|
+
throw new TypeError("Invalid match version: ".concat(matchVersion));
|
|
26
|
+
}
|
|
27
|
+
return compare(app.currentVersion, matches[2], matches[1]);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
// eslint-disable-next-line no-console
|
|
30
|
+
console.error(error);
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=hasInstalledApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasInstalledApp.js","names":["compare","_internalApiGetAppInBootstrapData","hooks","hasInstalledApp","appId","matchVersion","app","checkInstalledApps","getCheckedApp","installStatus","currentVersion","matches","match","TypeError","concat","error","console"],"sources":["../../../src/internal/hasInstalledApp.ts"],"sourcesContent":["import type { MicroApp } from \"@next-core/types\";\nimport { type CompareOperator, compare } from \"compare-versions\";\nimport { _internalApiGetAppInBootstrapData, hooks } from \"./Runtime.js\";\n\nexport type AppForCheck = Pick<\n MicroApp,\n \"id\" | \"currentVersion\" | \"installStatus\"\n>;\n\nexport function hasInstalledApp(appId: string, matchVersion?: string): boolean {\n // First, check whether the app is in bootstrap already.\n let app = _internalApiGetAppInBootstrapData(appId) as AppForCheck | undefined;\n if (!app && hooks?.checkInstalledApps) {\n app = hooks.checkInstalledApps.getCheckedApp(appId);\n }\n if (!app || app.installStatus === \"running\") {\n return false;\n }\n // Todo: `currentVersion` maybe `\"\"`\n if (!matchVersion || !app.currentVersion) {\n return true;\n }\n // Valid `matchVersion`:\n // >=1.2.3\n // >1.2.3\n // =1.2.3\n // <=1.2.3\n // <1.2.3\n const matches = matchVersion.match(/^([><]=?|=)(.*)$/);\n try {\n if (!matches) {\n throw new TypeError(`Invalid match version: ${matchVersion}`);\n }\n return compare(\n app.currentVersion,\n matches[2],\n matches[1] as CompareOperator\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n return false;\n}\n"],"mappings":"AACA,SAA+BA,OAAO,QAAQ,kBAAkB;AAChE,SAASC,iCAAiC,EAAEC,KAAK,QAAQ,cAAc;AAOvE,OAAO,SAASC,eAAeA,CAACC,KAAa,EAAEC,YAAqB,EAAW;EAC7E;EACA,IAAIC,GAAG,GAAGL,iCAAiC,CAACG,KAAK,CAA4B;EAC7E,IAAI,CAACE,GAAG,IAAIJ,KAAK,aAALA,KAAK,eAALA,KAAK,CAAEK,kBAAkB,EAAE;IACrCD,GAAG,GAAGJ,KAAK,CAACK,kBAAkB,CAACC,aAAa,CAACJ,KAAK,CAAC;EACrD;EACA,IAAI,CAACE,GAAG,IAAIA,GAAG,CAACG,aAAa,KAAK,SAAS,EAAE;IAC3C,OAAO,KAAK;EACd;EACA;EACA,IAAI,CAACJ,YAAY,IAAI,CAACC,GAAG,CAACI,cAAc,EAAE;IACxC,OAAO,IAAI;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAMC,OAAO,GAAGN,YAAY,CAACO,KAAK,CAAC,kBAAkB,CAAC;EACtD,IAAI;IACF,IAAI,CAACD,OAAO,EAAE;MACZ,MAAM,IAAIE,SAAS,2BAAAC,MAAA,CAA2BT,YAAY,EAAG;IAC/D;IACA,OAAOL,OAAO,CACZM,GAAG,CAACI,cAAc,EAClBC,OAAO,CAAC,CAAC,CAAC,EACVA,OAAO,CAAC,CAAC,CAAC,CACX;EACH,CAAC,CAAC,OAAOI,KAAK,EAAE;IACd;IACAC,OAAO,CAACD,KAAK,CAACA,KAAK,CAAC;EACtB;EACA,OAAO,KAAK;AACd"}
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
import type { RuntimeStoryboard, FeatureFlags, BootstrapData } from "@next-core/types";
|
|
1
|
+
import type { RuntimeStoryboard, FeatureFlags, BootstrapData, Contract, Storyboard } from "@next-core/types";
|
|
2
|
+
import type { PermissionApi_validatePermissions } from "@next-api-sdk/micro-app-sdk";
|
|
2
3
|
import "moment/locale/zh-cn.js";
|
|
4
|
+
import type { AppForCheck } from "./hasInstalledApp.js";
|
|
3
5
|
export interface RuntimeOptions {
|
|
4
6
|
hooks?: RuntimeHooks;
|
|
5
7
|
}
|
|
6
8
|
export interface RuntimeHooks {
|
|
7
9
|
fulfilStoryboard?: (storyboard: RuntimeStoryboard) => Promise<void>;
|
|
10
|
+
validatePermissions?: typeof PermissionApi_validatePermissions;
|
|
11
|
+
checkInstalledApps?: {
|
|
12
|
+
preCheckInstalledApps(storyboard: Storyboard, hasAppInBootstrap: (appId: string) => boolean): void;
|
|
13
|
+
waitForCheckingApps(appIds: string[]): Promise<void>;
|
|
14
|
+
getCheckedApp(appId: string): AppForCheck | undefined;
|
|
15
|
+
};
|
|
16
|
+
flowApi?: {
|
|
17
|
+
FLOW_API_PROVIDER: string;
|
|
18
|
+
registerFlowApiProvider(): void;
|
|
19
|
+
isFlowApiProvider(provider: string): boolean;
|
|
20
|
+
getArgsOfFlowApi(provider: string, originalArgs: unknown[], method?: string): Promise<unknown[]>;
|
|
21
|
+
collectContract(contracts: Contract[] | undefined): void;
|
|
22
|
+
collectWidgetContract(contracts: Contract[] | undefined): void;
|
|
23
|
+
clearCollectWidgetContract(): void;
|
|
24
|
+
};
|
|
8
25
|
}
|
|
9
26
|
export declare let hooks: RuntimeHooks | undefined;
|
|
10
27
|
export declare function createRuntime(options?: RuntimeOptions): Runtime;
|
|
@@ -38,6 +55,6 @@ export declare function _internalApiLoadBricks(bricks: string[] | Set<string>):
|
|
|
38
55
|
export declare function _internalApiGetRenderId(): string | undefined;
|
|
39
56
|
export declare function _internalApiMatchStoryboard(pathname: string): RuntimeStoryboard | undefined;
|
|
40
57
|
export declare function _internalApiGetRuntimeContext(): import("./interfaces.js").RuntimeContext | undefined;
|
|
41
|
-
export declare function _internalApiGetStoryboardInBootstrapData(appId: string):
|
|
58
|
+
export declare function _internalApiGetStoryboardInBootstrapData(appId: string): Storyboard | undefined;
|
|
42
59
|
export declare function _internalApiGetAppInBootstrapData(appId: string): import("@next-core/types").MicroApp | undefined;
|
|
43
60
|
export declare let _test_only_setBootstrapData: (data: BootstrapData) => void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@next-core/runtime",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"homepage": "https://github.com/easyops-cn/next-core/tree/v3/packages/runtime",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"repository": {
|
|
@@ -43,18 +43,15 @@
|
|
|
43
43
|
"test:ci": "cross-env NODE_ENV='test' CI=true test-next"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@next-api-sdk/api-gateway-sdk": "^1.1.0",
|
|
47
46
|
"@next-api-sdk/cmdb-sdk": "^1.1.0",
|
|
48
|
-
"@next-
|
|
49
|
-
"@next-api-sdk/micro-app-standalone-sdk": "^1.1.0",
|
|
50
|
-
"@next-core/cook": "^2.1.1",
|
|
47
|
+
"@next-core/cook": "^2.2.0",
|
|
51
48
|
"@next-core/http": "^1.0.5",
|
|
52
|
-
"@next-core/i18n": "^1.0.
|
|
49
|
+
"@next-core/i18n": "^1.0.17",
|
|
53
50
|
"@next-core/inject": "^1.0.11",
|
|
54
51
|
"@next-core/loader": "^1.3.1",
|
|
55
|
-
"@next-core/supply": "^2.0
|
|
52
|
+
"@next-core/supply": "^2.1.0",
|
|
56
53
|
"@next-core/types": "^1.3.0",
|
|
57
|
-
"@next-core/utils": "^1.
|
|
54
|
+
"@next-core/utils": "^1.5.0",
|
|
58
55
|
"@ungap/event-target": "^0.2.3",
|
|
59
56
|
"compare-versions": "^5.0.3",
|
|
60
57
|
"history": "^4.10.1",
|
|
@@ -64,8 +61,10 @@
|
|
|
64
61
|
},
|
|
65
62
|
"devDependencies": {
|
|
66
63
|
"@microsoft/api-extractor": "^7.34.4",
|
|
64
|
+
"@next-api-sdk/api-gateway-sdk": "^1.1.0",
|
|
65
|
+
"@next-api-sdk/micro-app-sdk": "^1.1.0",
|
|
67
66
|
"@next-core/build-next-libs": "^1.0.4",
|
|
68
67
|
"@next-core/test-next": "^1.0.5"
|
|
69
68
|
},
|
|
70
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "4befd0b5435dd8701ca18962905e0b27ff58e94f"
|
|
71
70
|
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.hasInstalledApp = hasInstalledApp;
|
|
7
|
-
exports.preCheckInstalledApps = preCheckInstalledApps;
|
|
8
|
-
exports.waitForCheckingApps = waitForCheckingApps;
|
|
9
|
-
var _storyboard = require("@next-core/utils/storyboard");
|
|
10
|
-
var _microAppStandaloneSdk = require("@next-api-sdk/micro-app-standalone-sdk");
|
|
11
|
-
var _compareVersions = require("compare-versions");
|
|
12
|
-
var _collectMemberCallUsage = require("./compute/collectMemberCallUsage.js");
|
|
13
|
-
var _Runtime = require("./Runtime.js");
|
|
14
|
-
const checkingApps = new Map();
|
|
15
|
-
const checkedApps = new Map();
|
|
16
|
-
function preCheckInstalledApps(storyboard) {
|
|
17
|
-
if (window.STANDALONE_MICRO_APPS && !window.NO_AUTH_GUARD) {
|
|
18
|
-
const appIds = scanInstalledAppsUsage(storyboard);
|
|
19
|
-
const searchIds = [];
|
|
20
|
-
for (const appId of appIds) {
|
|
21
|
-
// Do not check these apps already checking or in bootstrap.
|
|
22
|
-
if (!checkingApps.has(appId) && !(0, _Runtime._internalApiGetAppInBootstrapData)(appId)) {
|
|
23
|
-
searchIds.push(appId);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
if (searchIds.length === 0) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const promise = (0, _microAppStandaloneSdk.RuntimeApi_searchMicroAppStandalone)({
|
|
30
|
-
query: {
|
|
31
|
-
appId: {
|
|
32
|
-
$in: searchIds
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
fields: ["appId", "currentVersion", "installStatus"]
|
|
36
|
-
}).catch(error => {
|
|
37
|
-
// Allow search micro app to fail, and
|
|
38
|
-
// make it not crash when the backend service is not updated.
|
|
39
|
-
// eslint-disable-next-line no-console
|
|
40
|
-
console.error("Get off site standalone micro-apps failed", error);
|
|
41
|
-
});
|
|
42
|
-
for (const appId of searchIds) {
|
|
43
|
-
checkingApps.set(appId, promise.then(result => {
|
|
44
|
-
var _result$list;
|
|
45
|
-
const app = result === null || result === void 0 ? void 0 : (_result$list = result.list) === null || _result$list === void 0 ? void 0 : _result$list.find(item => item.appId === appId);
|
|
46
|
-
const checkedApp = app ? {
|
|
47
|
-
...app,
|
|
48
|
-
id: appId
|
|
49
|
-
} : undefined;
|
|
50
|
-
checkedApps.set(appId, checkedApp);
|
|
51
|
-
return checkedApp;
|
|
52
|
-
}));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function waitForCheckingApps(appIds) {
|
|
57
|
-
return Promise.all(appIds.map(appId => checkingApps.get(appId)));
|
|
58
|
-
}
|
|
59
|
-
function hasInstalledApp(appId, matchVersion) {
|
|
60
|
-
// First, check whether the app is in bootstrap already.
|
|
61
|
-
let app = (0, _Runtime._internalApiGetAppInBootstrapData)(appId);
|
|
62
|
-
if (!app && window.STANDALONE_MICRO_APPS) {
|
|
63
|
-
app = checkedApps.get(appId);
|
|
64
|
-
}
|
|
65
|
-
if (!app || app.installStatus === "running") {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
// Todo: `currentVersion` maybe `""`
|
|
69
|
-
if (!matchVersion || !app.currentVersion) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
// Valid `matchVersion`:
|
|
73
|
-
// >=1.2.3
|
|
74
|
-
// >1.2.3
|
|
75
|
-
// =1.2.3
|
|
76
|
-
// <=1.2.3
|
|
77
|
-
// <1.2.3
|
|
78
|
-
const matches = matchVersion.match(/^([><]=?|=)(.*)$/);
|
|
79
|
-
try {
|
|
80
|
-
if (!matches) {
|
|
81
|
-
throw new TypeError(`Invalid match version: ${matchVersion}`);
|
|
82
|
-
}
|
|
83
|
-
return (0, _compareVersions.compare)(app.currentVersion, matches[2], matches[1]);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
// eslint-disable-next-line no-console
|
|
86
|
-
console.error(error);
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
function scanInstalledAppsUsage(storyboard) {
|
|
91
|
-
var _storyboard$meta;
|
|
92
|
-
const usage = {
|
|
93
|
-
usedArgs: new Set()
|
|
94
|
-
};
|
|
95
|
-
// `INSTALLED_APPS.has(...)` is not available in storyboard functions
|
|
96
|
-
const {
|
|
97
|
-
customTemplates,
|
|
98
|
-
menus
|
|
99
|
-
} = (_storyboard$meta = storyboard.meta) !== null && _storyboard$meta !== void 0 ? _storyboard$meta : {};
|
|
100
|
-
(0, _storyboard.traverseStoryboardExpressions)([storyboard.routes, customTemplates, menus], (node, parent) => {
|
|
101
|
-
(0, _collectMemberCallUsage.collectInstalledAppsHasUsage)(usage, node, parent);
|
|
102
|
-
}, "INSTALLED_APPS");
|
|
103
|
-
return [...usage.usedArgs];
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=checkInstalledApps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkInstalledApps.js","names":["_storyboard","require","_microAppStandaloneSdk","_compareVersions","_collectMemberCallUsage","_Runtime","checkingApps","Map","checkedApps","preCheckInstalledApps","storyboard","window","STANDALONE_MICRO_APPS","NO_AUTH_GUARD","appIds","scanInstalledAppsUsage","searchIds","appId","has","_internalApiGetAppInBootstrapData","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","hasInstalledApp","matchVersion","installStatus","currentVersion","matches","match","TypeError","compare","_storyboard$meta","usage","usedArgs","Set","customTemplates","menus","meta","traverseStoryboardExpressions","routes","node","parent","collectInstalledAppsHasUsage"],"sources":["../../../src/internal/checkInstalledApps.ts"],"sourcesContent":["import type { MicroApp, Storyboard } from \"@next-core/types\";\nimport { traverseStoryboardExpressions } from \"@next-core/utils/storyboard\";\nimport { RuntimeApi_searchMicroAppStandalone } from \"@next-api-sdk/micro-app-standalone-sdk\";\nimport { type CompareOperator, compare } from \"compare-versions\";\nimport {\n MemberCallUsage,\n collectInstalledAppsHasUsage,\n} from \"./compute/collectMemberCallUsage.js\";\nimport { _internalApiGetAppInBootstrapData } from \"./Runtime.js\";\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(storyboard: Storyboard) {\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 (\n !checkingApps.has(appId) &&\n !_internalApiGetAppInBootstrapData(appId)\n ) {\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 function waitForCheckingApps(appIds: string[]) {\n return Promise.all(appIds.map((appId) => checkingApps.get(appId)));\n}\n\nexport function hasInstalledApp(appId: string, matchVersion?: string): boolean {\n // First, check whether the app is in bootstrap already.\n let app = _internalApiGetAppInBootstrapData(appId) as AppForCheck | undefined;\n if (!app && window.STANDALONE_MICRO_APPS) {\n app = checkedApps.get(appId);\n }\n if (!app || app.installStatus === \"running\") {\n return false;\n }\n // Todo: `currentVersion` maybe `\"\"`\n if (!matchVersion || !app.currentVersion) {\n return true;\n }\n // Valid `matchVersion`:\n // >=1.2.3\n // >1.2.3\n // =1.2.3\n // <=1.2.3\n // <1.2.3\n const matches = matchVersion.match(/^([><]=?|=)(.*)$/);\n try {\n if (!matches) {\n throw new TypeError(`Invalid match version: ${matchVersion}`);\n }\n return compare(\n app.currentVersion,\n matches[2],\n matches[1] as CompareOperator\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n return false;\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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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.collectInstalledAppsHasUsage = exports.collectAppGetMenuUsage = void 0;
|
|
7
|
-
function collectMemberCallUsageFactory(object, property) {
|
|
8
|
-
return function collectMemberCallUsage(usage, node, parent) {
|
|
9
|
-
if (node.name === object) {
|
|
10
|
-
const memberParent = parent[parent.length - 1];
|
|
11
|
-
const callParent = parent[parent.length - 2];
|
|
12
|
-
if ((callParent === null || callParent === void 0 ? void 0 : callParent.node.type) === "CallExpression" && (callParent === null || callParent === void 0 ? void 0 : callParent.key) === "callee" && (memberParent === null || memberParent === void 0 ? void 0 : memberParent.node.type) === "MemberExpression" && memberParent.key === "object" && (memberParent.node.computed ? memberParent.node.property.type === "Literal" && memberParent.node.property.value === property : memberParent.node.property.type === "Identifier" && memberParent.node.property.name === property)) {
|
|
13
|
-
const args = callParent.node.arguments;
|
|
14
|
-
if (args.length > 0) {
|
|
15
|
-
const firstArg = args[0];
|
|
16
|
-
if (firstArg.type === "Literal" && typeof firstArg.value === "string") {
|
|
17
|
-
usage.usedArgs.add(firstArg.value);
|
|
18
|
-
} else {
|
|
19
|
-
usage.hasNonStaticUsage = true;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
const collectAppGetMenuUsage = collectMemberCallUsageFactory("APP", "getMenu");
|
|
27
|
-
exports.collectAppGetMenuUsage = collectAppGetMenuUsage;
|
|
28
|
-
const collectInstalledAppsHasUsage = collectMemberCallUsageFactory("INSTALLED_APPS", "has");
|
|
29
|
-
exports.collectInstalledAppsHasUsage = collectInstalledAppsHasUsage;
|
|
30
|
-
//# sourceMappingURL=collectMemberCallUsage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collectMemberCallUsage.js","names":["collectMemberCallUsageFactory","object","property","collectMemberCallUsage","usage","node","parent","name","memberParent","length","callParent","type","key","computed","value","args","arguments","firstArg","usedArgs","add","hasNonStaticUsage","collectAppGetMenuUsage","exports","collectInstalledAppsHasUsage"],"sources":["../../../../src/internal/compute/collectMemberCallUsage.ts"],"sourcesContent":["import type { Identifier } from \"@babel/types\";\nimport type { EstreeLiteral, EstreeParent } from \"@next-core/cook\";\n\nexport interface MemberCallUsage {\n usedArgs: Set<string>;\n hasNonStaticUsage?: boolean;\n}\n\nfunction collectMemberCallUsageFactory(object: string, property: string) {\n return function collectMemberCallUsage(\n usage: MemberCallUsage,\n node: Identifier,\n parent: EstreeParent\n ) {\n if (node.name === object) {\n const memberParent = parent[parent.length - 1];\n const callParent = parent[parent.length - 2];\n if (\n callParent?.node.type === \"CallExpression\" &&\n callParent?.key === \"callee\" &&\n memberParent?.node.type === \"MemberExpression\" &&\n memberParent.key === \"object\" &&\n (memberParent.node.computed\n ? (memberParent.node.property as any).type === \"Literal\" &&\n (memberParent.node.property as any).value === property\n : memberParent.node.property.type === \"Identifier\" &&\n memberParent.node.property.name === property)\n ) {\n const args = callParent.node.arguments as unknown as EstreeLiteral[];\n if (args.length > 0) {\n const firstArg = args[0];\n if (\n firstArg.type === \"Literal\" &&\n typeof firstArg.value === \"string\"\n ) {\n usage.usedArgs.add(firstArg.value);\n } else {\n usage.hasNonStaticUsage = true;\n }\n }\n }\n }\n };\n}\n\nexport const collectAppGetMenuUsage = collectMemberCallUsageFactory(\n \"APP\",\n \"getMenu\"\n);\n\nexport const collectInstalledAppsHasUsage = collectMemberCallUsageFactory(\n \"INSTALLED_APPS\",\n \"has\"\n);\n"],"mappings":";;;;;;AAQA,SAASA,6BAA6BA,CAACC,MAAc,EAAEC,QAAgB,EAAE;EACvE,OAAO,SAASC,sBAAsBA,CACpCC,KAAsB,EACtBC,IAAgB,EAChBC,MAAoB,EACpB;IACA,IAAID,IAAI,CAACE,IAAI,KAAKN,MAAM,EAAE;MACxB,MAAMO,YAAY,GAAGF,MAAM,CAACA,MAAM,CAACG,MAAM,GAAG,CAAC,CAAC;MAC9C,MAAMC,UAAU,GAAGJ,MAAM,CAACA,MAAM,CAACG,MAAM,GAAG,CAAC,CAAC;MAC5C,IACE,CAAAC,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEL,IAAI,CAACM,IAAI,MAAK,gBAAgB,IAC1C,CAAAD,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEE,GAAG,MAAK,QAAQ,IAC5B,CAAAJ,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEH,IAAI,CAACM,IAAI,MAAK,kBAAkB,IAC9CH,YAAY,CAACI,GAAG,KAAK,QAAQ,KAC5BJ,YAAY,CAACH,IAAI,CAACQ,QAAQ,GACtBL,YAAY,CAACH,IAAI,CAACH,QAAQ,CAASS,IAAI,KAAK,SAAS,IACrDH,YAAY,CAACH,IAAI,CAACH,QAAQ,CAASY,KAAK,KAAKZ,QAAQ,GACtDM,YAAY,CAACH,IAAI,CAACH,QAAQ,CAACS,IAAI,KAAK,YAAY,IAChDH,YAAY,CAACH,IAAI,CAACH,QAAQ,CAACK,IAAI,KAAKL,QAAQ,CAAC,EACjD;QACA,MAAMa,IAAI,GAAGL,UAAU,CAACL,IAAI,CAACW,SAAuC;QACpE,IAAID,IAAI,CAACN,MAAM,GAAG,CAAC,EAAE;UACnB,MAAMQ,QAAQ,GAAGF,IAAI,CAAC,CAAC,CAAC;UACxB,IACEE,QAAQ,CAACN,IAAI,KAAK,SAAS,IAC3B,OAAOM,QAAQ,CAACH,KAAK,KAAK,QAAQ,EAClC;YACAV,KAAK,CAACc,QAAQ,CAACC,GAAG,CAACF,QAAQ,CAACH,KAAK,CAAC;UACpC,CAAC,MAAM;YACLV,KAAK,CAACgB,iBAAiB,GAAG,IAAI;UAChC;QACF;MACF;IACF;EACF,CAAC;AACH;AAEO,MAAMC,sBAAsB,GAAGrB,6BAA6B,CACjE,KAAK,EACL,SAAS,CACV;AAACsB,OAAA,CAAAD,sBAAA,GAAAA,sBAAA;AAEK,MAAME,4BAA4B,GAAGvB,6BAA6B,CACvE,gBAAgB,EAChB,KAAK,CACN;AAACsB,OAAA,CAAAC,4BAAA,GAAAA,4BAAA"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.clearCollectWidgetContract = clearCollectWidgetContract;
|
|
7
|
-
exports.collectContract = collectContract;
|
|
8
|
-
exports.collectWidgetContract = collectWidgetContract;
|
|
9
|
-
exports.getContract = getContract;
|
|
10
|
-
const contractsMap = new Map();
|
|
11
|
-
const widgetContractMap = new Map();
|
|
12
|
-
const addContract = (contracts, map) => {
|
|
13
|
-
contracts === null || contracts === void 0 ? void 0 : contracts.forEach(contract => {
|
|
14
|
-
map.set(`${contract.namespaceId}.${contract.name}`, contract);
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
function collectContract(contracts) {
|
|
18
|
-
addContract(contracts, contractsMap);
|
|
19
|
-
}
|
|
20
|
-
function collectWidgetContract(contracts) {
|
|
21
|
-
addContract(contracts, widgetContractMap);
|
|
22
|
-
}
|
|
23
|
-
function clearCollectWidgetContract() {
|
|
24
|
-
widgetContractMap.clear();
|
|
25
|
-
}
|
|
26
|
-
function getContract(name) {
|
|
27
|
-
return contractsMap.get(name) || widgetContractMap.get(name);
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=CollectContracts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollectContracts.js","names":["contractsMap","Map","widgetContractMap","addContract","contracts","map","forEach","contract","set","namespaceId","name","collectContract","collectWidgetContract","clearCollectWidgetContract","clear","getContract","get"],"sources":["../../../../src/internal/data/CollectContracts.ts"],"sourcesContent":["import { Contract } from \"@next-core/types\";\n\nconst contractsMap: Map<string, Contract> = new Map();\nconst widgetContractMap: Map<string, Contract> = new Map();\n\nconst addContract = (\n contracts: Contract[] | undefined,\n map: Map<string, Contract>\n): void => {\n contracts?.forEach((contract) => {\n map.set(`${contract.namespaceId}.${contract.name}`, contract);\n });\n};\n\nexport function collectContract(contracts: Contract[] | undefined): void {\n addContract(contracts, contractsMap);\n}\n\nexport function collectWidgetContract(contracts: Contract[] | undefined): void {\n addContract(contracts, widgetContractMap);\n}\n\nexport function clearCollectWidgetContract(): void {\n widgetContractMap.clear();\n}\n\nexport function getContract(name: string): Contract | undefined {\n return contractsMap.get(name) || widgetContractMap.get(name);\n}\n"],"mappings":";;;;;;;;;AAEA,MAAMA,YAAmC,GAAG,IAAIC,GAAG,EAAE;AACrD,MAAMC,iBAAwC,GAAG,IAAID,GAAG,EAAE;AAE1D,MAAME,WAAW,GAAGA,CAClBC,SAAiC,EACjCC,GAA0B,KACjB;EACTD,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEE,OAAO,CAAEC,QAAQ,IAAK;IAC/BF,GAAG,CAACG,GAAG,CAAE,GAAED,QAAQ,CAACE,WAAY,IAAGF,QAAQ,CAACG,IAAK,EAAC,EAAEH,QAAQ,CAAC;EAC/D,CAAC,CAAC;AACJ,CAAC;AAEM,SAASI,eAAeA,CAACP,SAAiC,EAAQ;EACvED,WAAW,CAACC,SAAS,EAAEJ,YAAY,CAAC;AACtC;AAEO,SAASY,qBAAqBA,CAACR,SAAiC,EAAQ;EAC7ED,WAAW,CAACC,SAAS,EAAEF,iBAAiB,CAAC;AAC3C;AAEO,SAASW,0BAA0BA,CAAA,EAAS;EACjDX,iBAAiB,CAACY,KAAK,EAAE;AAC3B;AAEO,SAASC,WAAWA,CAACL,IAAY,EAAwB;EAC9D,OAAOV,YAAY,CAACgB,GAAG,CAACN,IAAI,CAAC,IAAIR,iBAAiB,CAACc,GAAG,CAACN,IAAI,CAAC;AAC9D"}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.getArgsOfFlowApi = getArgsOfFlowApi;
|
|
8
|
-
exports.isFlowApiProvider = isFlowApiProvider;
|
|
9
|
-
var _jsYaml = _interopRequireDefault(require("js-yaml"));
|
|
10
|
-
var _apiGatewaySdk = require("@next-api-sdk/api-gateway-sdk");
|
|
11
|
-
var _CollectContracts = require("./CollectContracts.js");
|
|
12
|
-
const flowApiDefinitionPromiseMap = new Map();
|
|
13
|
-
|
|
14
|
-
// Legacy Custom API: `${namespace}@${name}`
|
|
15
|
-
// Flow API: `${namespace}@${name}:${version}`
|
|
16
|
-
function isFlowApiProvider(provider) {
|
|
17
|
-
return provider.includes("@");
|
|
18
|
-
}
|
|
19
|
-
async function getArgsOfFlowApi(provider, originalArgs, method) {
|
|
20
|
-
if (!isFlowApiProvider(provider)) {
|
|
21
|
-
return originalArgs;
|
|
22
|
-
}
|
|
23
|
-
if (!provider.includes(":")) {
|
|
24
|
-
throw new Error(`You're using legacy Custom API "${provider}" which is dropped in v3, please use Flow API instead`);
|
|
25
|
-
}
|
|
26
|
-
const apiDefinition = await fetchFlowApiDefinition(provider);
|
|
27
|
-
if (!apiDefinition) {
|
|
28
|
-
throw new Error(`Flow API not found: "${provider}"`);
|
|
29
|
-
}
|
|
30
|
-
const apiProfile = getApiProfileFromApiDefinition(provider, apiDefinition);
|
|
31
|
-
return getApiArgsFromApiProfile(apiProfile, originalArgs, method);
|
|
32
|
-
}
|
|
33
|
-
function getApiArgsFromApiProfile({
|
|
34
|
-
uri,
|
|
35
|
-
method: apiMethod,
|
|
36
|
-
ext_fields,
|
|
37
|
-
name,
|
|
38
|
-
namespace,
|
|
39
|
-
serviceName,
|
|
40
|
-
responseWrapper,
|
|
41
|
-
version,
|
|
42
|
-
isFileType,
|
|
43
|
-
request
|
|
44
|
-
}, originalArgs, method) {
|
|
45
|
-
const isDownload = isFileType && method === "saveAs";
|
|
46
|
-
let fileName;
|
|
47
|
-
if (isDownload) {
|
|
48
|
-
fileName = originalArgs.shift();
|
|
49
|
-
}
|
|
50
|
-
const {
|
|
51
|
-
url,
|
|
52
|
-
args
|
|
53
|
-
} = getTransformedUriAndRestArgs(uri, originalArgs, name, namespace, serviceName, version);
|
|
54
|
-
return [...(isDownload ? [fileName] : []), {
|
|
55
|
-
url,
|
|
56
|
-
originalUri: uri,
|
|
57
|
-
method: apiMethod,
|
|
58
|
-
ext_fields,
|
|
59
|
-
responseWrapper,
|
|
60
|
-
request,
|
|
61
|
-
isFileType
|
|
62
|
-
}, ...args];
|
|
63
|
-
}
|
|
64
|
-
function getTransformedUriAndRestArgs(uri, originalArgs, name, namespace, serviceName, version) {
|
|
65
|
-
const prefix = version ? serviceName ? `api/gateway/${serviceName}` : `api/gateway/${namespace}.${name}@${version}` : `api/gateway/api_service.${namespace}.${name}`;
|
|
66
|
-
const restArgs = originalArgs.slice();
|
|
67
|
-
const transformedUri = uri.replace(/:([^/]+)/g, () => restArgs.shift());
|
|
68
|
-
return {
|
|
69
|
-
url: prefix + transformedUri,
|
|
70
|
-
args: restArgs
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
function getApiProfileFromApiDefinition(provider, api) {
|
|
74
|
-
var _contract$endpoint, _contract$response;
|
|
75
|
-
const contract = typeof api.contract === "string" ? _jsYaml.default.safeLoad(api.contract, {
|
|
76
|
-
schema: _jsYaml.default.JSON_SCHEMA,
|
|
77
|
-
json: true
|
|
78
|
-
}) : api.contract;
|
|
79
|
-
const {
|
|
80
|
-
uri,
|
|
81
|
-
method = "GET",
|
|
82
|
-
ext_fields
|
|
83
|
-
} = (_contract$endpoint = contract === null || contract === void 0 ? void 0 : contract.endpoint) !== null && _contract$endpoint !== void 0 ? _contract$endpoint : {};
|
|
84
|
-
const responseWrapper = contract !== null && contract !== void 0 && contract.response ? contract.response.wrapper !== false : false;
|
|
85
|
-
if (!uri) {
|
|
86
|
-
throw new Error(`Missing endpoint.uri in contract of provider "${provider}"`);
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
uri,
|
|
90
|
-
method: method.toLowerCase() === "list" ? "get" : method,
|
|
91
|
-
ext_fields,
|
|
92
|
-
name: api.name,
|
|
93
|
-
namespace: api.namespace,
|
|
94
|
-
serviceName: api.serviceName,
|
|
95
|
-
version: api.version,
|
|
96
|
-
isFileType: (contract === null || contract === void 0 ? void 0 : (_contract$response = contract.response) === null || _contract$response === void 0 ? void 0 : _contract$response.type) === "file",
|
|
97
|
-
responseWrapper,
|
|
98
|
-
request: contract === null || contract === void 0 ? void 0 : contract.request
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function fetchFlowApiDefinition(provider) {
|
|
102
|
-
let promise = flowApiDefinitionPromiseMap.get(provider);
|
|
103
|
-
if (!promise) {
|
|
104
|
-
promise = _fetchFlowApiDefinition(provider);
|
|
105
|
-
flowApiDefinitionPromiseMap.set(provider, promise);
|
|
106
|
-
}
|
|
107
|
-
return promise;
|
|
108
|
-
}
|
|
109
|
-
async function _fetchFlowApiDefinition(provider) {
|
|
110
|
-
const [namespaceName, nameWithVersion] = provider.split("@");
|
|
111
|
-
const [name, version] = nameWithVersion.split(":");
|
|
112
|
-
const contract = (0, _CollectContracts.getContract)(`${namespaceName}.${name}`);
|
|
113
|
-
if (contract) {
|
|
114
|
-
return {
|
|
115
|
-
name: contract.name,
|
|
116
|
-
namespace: contract.namespaceId,
|
|
117
|
-
serviceName: contract.serviceName,
|
|
118
|
-
version: contract.version,
|
|
119
|
-
contract: {
|
|
120
|
-
endpoint: contract.endpoint,
|
|
121
|
-
response: contract.response,
|
|
122
|
-
request: contract.request
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
} else {
|
|
126
|
-
const {
|
|
127
|
-
contractData
|
|
128
|
-
} = await (0, _apiGatewaySdk.ContractApi_searchSingleContract)({
|
|
129
|
-
contractName: `${namespaceName}.${name}`,
|
|
130
|
-
version
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// return undefined if don't found contract
|
|
134
|
-
if (contractData) {
|
|
135
|
-
var _contractData$namespa, _contractData$namespa2;
|
|
136
|
-
return {
|
|
137
|
-
name: contractData.name,
|
|
138
|
-
namespace: (_contractData$namespa = contractData.namespace) === null || _contractData$namespa === void 0 ? void 0 : (_contractData$namespa2 = _contractData$namespa[0]) === null || _contractData$namespa2 === void 0 ? void 0 : _contractData$namespa2.name,
|
|
139
|
-
serviceName: contractData.serviceName,
|
|
140
|
-
version: contractData.version,
|
|
141
|
-
contract: {
|
|
142
|
-
endpoint: contractData.endpoint,
|
|
143
|
-
response: contractData.response,
|
|
144
|
-
request: contractData.request
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=FlowApi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowApi.js","names":["_jsYaml","_interopRequireDefault","require","_apiGatewaySdk","_CollectContracts","flowApiDefinitionPromiseMap","Map","isFlowApiProvider","provider","includes","getArgsOfFlowApi","originalArgs","method","Error","apiDefinition","fetchFlowApiDefinition","apiProfile","getApiProfileFromApiDefinition","getApiArgsFromApiProfile","uri","apiMethod","ext_fields","name","namespace","serviceName","responseWrapper","version","isFileType","request","isDownload","fileName","shift","url","args","getTransformedUriAndRestArgs","originalUri","prefix","restArgs","slice","transformedUri","replace","api","_contract$endpoint","_contract$response","contract","yaml","safeLoad","schema","JSON_SCHEMA","json","endpoint","response","wrapper","toLowerCase","type","promise","get","_fetchFlowApiDefinition","set","namespaceName","nameWithVersion","split","getContract","namespaceId","contractData","ContractApi_searchSingleContract","contractName","_contractData$namespa","_contractData$namespa2"],"sources":["../../../../src/internal/data/FlowApi.ts"],"sourcesContent":["import yaml from \"js-yaml\";\nimport { ContractApi_searchSingleContract } from \"@next-api-sdk/api-gateway-sdk\";\nimport { ContractRequest, ContractResponse, ExtField } from \"@next-core/types\";\nimport { getContract } from \"./CollectContracts.js\";\n\nconst flowApiDefinitionPromiseMap = new Map<\n string,\n Promise<CustomApiDefinition | undefined>\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): Promise<unknown[]> {\n if (!isFlowApiProvider(provider)) {\n return originalArgs;\n }\n\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 Error(`Flow API not found: \"${provider}\"`);\n }\n\n const apiProfile = getApiProfileFromApiDefinition(provider, apiDefinition);\n\n return getApiArgsFromApiProfile(apiProfile, originalArgs, method);\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): unknown[] {\n const isDownload = isFileType && 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 },\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\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 + transformedUri,\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\nfunction fetchFlowApiDefinition(\n provider: string\n): Promise<CustomApiDefinition | undefined> {\n let promise = flowApiDefinitionPromiseMap.get(provider);\n if (!promise) {\n promise = _fetchFlowApiDefinition(provider);\n flowApiDefinitionPromiseMap.set(provider, promise);\n }\n return promise;\n}\n\nasync function _fetchFlowApiDefinition(\n provider: string\n): Promise<CustomApiDefinition | undefined> {\n const [namespaceName, nameWithVersion] = provider.split(\"@\");\n const [name, version] = nameWithVersion.split(\":\");\n\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 } else {\n const { contractData } = await ContractApi_searchSingleContract({\n contractName: `${namespaceName}.${name}`,\n version,\n });\n\n // return undefined if don't found contract\n if (contractData) {\n return {\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 }\n }\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?: ContractRequest;\n response?: ContractResponse;\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?: ContractRequest;\n}\n"],"mappings":"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"}
|