openxiangda 1.0.87 → 1.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/openxiangda-skills/SKILL.md +2 -0
- package/openxiangda-skills/references/architecture-design.md +1 -0
- package/openxiangda-skills/references/openxiangda-api.md +7 -1
- package/openxiangda-skills/references/pages/page-sdk.md +3 -1
- package/openxiangda-skills/references/resource-manifest-cheatsheet.md +5 -1
- package/package.json +1 -1
- package/packages/sdk/dist/components/index.cjs +13 -2
- package/packages/sdk/dist/components/index.cjs.map +1 -1
- package/packages/sdk/dist/components/index.mjs +13 -2
- package/packages/sdk/dist/components/index.mjs.map +1 -1
- package/packages/sdk/dist/runtime/index.cjs +139 -30
- package/packages/sdk/dist/runtime/index.cjs.map +1 -1
- package/packages/sdk/dist/runtime/index.mjs +139 -30
- package/packages/sdk/dist/runtime/index.mjs.map +1 -1
- package/packages/sdk/dist/runtime/react.cjs +107 -20
- package/packages/sdk/dist/runtime/react.cjs.map +1 -1
- package/packages/sdk/dist/runtime/react.d.mts +10 -4
- package/packages/sdk/dist/runtime/react.d.ts +10 -4
- package/packages/sdk/dist/runtime/react.mjs +107 -20
- package/packages/sdk/dist/runtime/react.mjs.map +1 -1
|
@@ -846,18 +846,39 @@ var normalizeDynamicOrder = (value) => {
|
|
|
846
846
|
}
|
|
847
847
|
return `${value.id}:${value.isAsc === "n" ? "-" : "+"}`;
|
|
848
848
|
};
|
|
849
|
+
var hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
850
|
+
var normalizeEnvelopeCode = (value) => {
|
|
851
|
+
if (value === void 0 || value === null || value === "") {
|
|
852
|
+
return 200;
|
|
853
|
+
}
|
|
854
|
+
const normalized = Number(value);
|
|
855
|
+
return Number.isFinite(normalized) ? normalized : String(value);
|
|
856
|
+
};
|
|
857
|
+
var isSuccessCode = (value) => {
|
|
858
|
+
if (value === void 0 || value === null || value === "") {
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
const normalized = Number(value);
|
|
862
|
+
return Number.isFinite(normalized) ? normalized === 0 || normalized >= 200 && normalized < 300 : false;
|
|
863
|
+
};
|
|
864
|
+
var getEnvelopeCode = (rawResponse) => {
|
|
865
|
+
if (isRecord(rawResponse) && hasOwn(rawResponse, "code")) {
|
|
866
|
+
return rawResponse.code;
|
|
867
|
+
}
|
|
868
|
+
const nestedData = rawResponse?.data;
|
|
869
|
+
if (isRecord(nestedData) && hasOwn(nestedData, "code")) {
|
|
870
|
+
return nestedData.code;
|
|
871
|
+
}
|
|
872
|
+
return void 0;
|
|
873
|
+
};
|
|
849
874
|
var normalizeJsonResponse = (rawResponse) => {
|
|
850
|
-
const
|
|
851
|
-
const nestedCode = Number(
|
|
852
|
-
rawResponse?.data?.code
|
|
853
|
-
);
|
|
854
|
-
const code = Number.isFinite(topLevelCode) ? topLevelCode : Number.isFinite(nestedCode) ? nestedCode : 200;
|
|
875
|
+
const code = normalizeEnvelopeCode(getEnvelopeCode(rawResponse));
|
|
855
876
|
const topLevelResult = isRecord(rawResponse) && "result" in rawResponse ? rawResponse.result : void 0;
|
|
856
877
|
const nestedResult = isRecord(rawResponse?.data) && "result" in (rawResponse.data || {}) ? rawResponse.data?.result : void 0;
|
|
857
878
|
const topLevelData = isRecord(rawResponse) && "data" in rawResponse ? rawResponse.data : void 0;
|
|
858
879
|
const result = topLevelResult !== void 0 ? topLevelResult : nestedResult !== void 0 ? nestedResult : topLevelData !== void 0 ? topLevelData : isRecord(rawResponse) ? rawResponse : null;
|
|
859
880
|
const nestedSuccess = typeof rawResponse?.data?.success === "boolean" ? rawResponse.data?.success : void 0;
|
|
860
|
-
const success =
|
|
881
|
+
const success = rawResponse?.success === false || nestedSuccess === false ? false : isSuccessCode(code);
|
|
861
882
|
return {
|
|
862
883
|
code,
|
|
863
884
|
success,
|
|
@@ -902,6 +923,9 @@ var normalizeBinaryResponse = (rawResponse) => {
|
|
|
902
923
|
};
|
|
903
924
|
};
|
|
904
925
|
var toSdkError = (input, payload) => {
|
|
926
|
+
if (input instanceof Error && input.response) {
|
|
927
|
+
return input;
|
|
928
|
+
}
|
|
905
929
|
const normalizedResponse = isRecord(input) ? normalizeJsonResponse(input) : void 0;
|
|
906
930
|
const nextError = input instanceof Error ? input : new Error(
|
|
907
931
|
normalizedResponse?.message || `\u8BF7\u6C42\u5931\u8D25: ${String(payload.method).toUpperCase()} ${payload.path}`
|
|
@@ -2560,7 +2584,8 @@ var createAuthClient = ({
|
|
|
2560
2584
|
});
|
|
2561
2585
|
const payload = await readPayload(response);
|
|
2562
2586
|
const code = getRecordValue(payload, "code");
|
|
2563
|
-
|
|
2587
|
+
const success = getRecordValue(payload, "success");
|
|
2588
|
+
if (!response.ok || success === false || !isSuccessCode2(code)) {
|
|
2564
2589
|
throw new AuthClientError(
|
|
2565
2590
|
String(getRecordValue(payload, "message") || `Auth request failed: ${response.status}`),
|
|
2566
2591
|
{ status: response.status, code, payload }
|
|
@@ -2613,6 +2638,11 @@ var getRecordValue = (value, key) => {
|
|
|
2613
2638
|
if (!value || typeof value !== "object") return void 0;
|
|
2614
2639
|
return value[key];
|
|
2615
2640
|
};
|
|
2641
|
+
var isSuccessCode2 = (code) => {
|
|
2642
|
+
if (code === void 0 || code === null || code === "") return true;
|
|
2643
|
+
const normalized = Number(code);
|
|
2644
|
+
return Number.isFinite(normalized) ? normalized === 0 || normalized >= 200 && normalized < 300 : false;
|
|
2645
|
+
};
|
|
2616
2646
|
var resolveLoginUrl = (appType, {
|
|
2617
2647
|
callbackUrl = getCurrentHref2(),
|
|
2618
2648
|
callbackParamName = "callback",
|
|
@@ -3149,12 +3179,23 @@ var OpenXiangdaProvider = ({
|
|
|
3149
3179
|
() => appType || resolveAppTypeFromLocation(),
|
|
3150
3180
|
[appType]
|
|
3151
3181
|
);
|
|
3182
|
+
const [accessToken, setAccessTokenState] = (0, import_react8.useState)(null);
|
|
3183
|
+
const setAccessToken = (0, import_react8.useCallback)(
|
|
3184
|
+
(nextAccessToken) => {
|
|
3185
|
+
setAccessTokenState(nextAccessToken || null);
|
|
3186
|
+
},
|
|
3187
|
+
[]
|
|
3188
|
+
);
|
|
3189
|
+
const authorizedFetch = (0, import_react8.useMemo)(
|
|
3190
|
+
() => createAuthorizedFetch(resolvedFetch, accessToken),
|
|
3191
|
+
[accessToken, resolvedFetch]
|
|
3192
|
+
);
|
|
3152
3193
|
const [state, setState] = (0, import_react8.useState)({
|
|
3153
3194
|
data: null,
|
|
3154
3195
|
loading: true,
|
|
3155
3196
|
error: null
|
|
3156
3197
|
});
|
|
3157
|
-
const reload = (0, import_react8.useCallback)(async () => {
|
|
3198
|
+
const reload = (0, import_react8.useCallback)(async (options = {}) => {
|
|
3158
3199
|
if (!resolvedAppType) {
|
|
3159
3200
|
setState({
|
|
3160
3201
|
data: null,
|
|
@@ -3167,8 +3208,9 @@ var OpenXiangdaProvider = ({
|
|
|
3167
3208
|
return;
|
|
3168
3209
|
}
|
|
3169
3210
|
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
3211
|
+
const requestFetch = options.accessToken !== void 0 ? createAuthorizedFetch(resolvedFetch, options.accessToken || null) : authorizedFetch;
|
|
3170
3212
|
try {
|
|
3171
|
-
const response = await
|
|
3213
|
+
const response = await requestFetch(
|
|
3172
3214
|
buildServiceUrl2(
|
|
3173
3215
|
servicePrefix,
|
|
3174
3216
|
`/openxiangda-api/v1/apps/${encodeURIComponent(
|
|
@@ -3181,7 +3223,7 @@ var OpenXiangdaProvider = ({
|
|
|
3181
3223
|
}
|
|
3182
3224
|
);
|
|
3183
3225
|
const payload = await readJsonPayload(response);
|
|
3184
|
-
if (
|
|
3226
|
+
if (isRuntimeEnvelopeFailure(response, payload)) {
|
|
3185
3227
|
throw createRuntimeHttpError(
|
|
3186
3228
|
response,
|
|
3187
3229
|
payload,
|
|
@@ -3200,7 +3242,7 @@ var OpenXiangdaProvider = ({
|
|
|
3200
3242
|
error: normalizeRuntimeError(error)
|
|
3201
3243
|
});
|
|
3202
3244
|
}
|
|
3203
|
-
}, [resolvedAppType, resolvedFetch, servicePrefix]);
|
|
3245
|
+
}, [authorizedFetch, resolvedAppType, resolvedFetch, servicePrefix]);
|
|
3204
3246
|
(0, import_react8.useEffect)(() => {
|
|
3205
3247
|
void reload();
|
|
3206
3248
|
}, [reload]);
|
|
@@ -3209,10 +3251,11 @@ var OpenXiangdaProvider = ({
|
|
|
3209
3251
|
...state,
|
|
3210
3252
|
appType: resolvedAppType,
|
|
3211
3253
|
servicePrefix,
|
|
3212
|
-
fetchImpl:
|
|
3213
|
-
reload
|
|
3254
|
+
fetchImpl: authorizedFetch,
|
|
3255
|
+
reload,
|
|
3256
|
+
setAccessToken
|
|
3214
3257
|
}),
|
|
3215
|
-
[reload, resolvedAppType,
|
|
3258
|
+
[authorizedFetch, reload, resolvedAppType, servicePrefix, state]
|
|
3216
3259
|
);
|
|
3217
3260
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(OpenXiangdaRuntimeContext.Provider, { value, children });
|
|
3218
3261
|
};
|
|
@@ -3315,7 +3358,7 @@ var useCanAccessRoute = (input) => {
|
|
|
3315
3358
|
payload
|
|
3316
3359
|
};
|
|
3317
3360
|
if (!disposed) {
|
|
3318
|
-
const shouldTreatAsError = !response.ok ||
|
|
3361
|
+
const shouldTreatAsError = !response.ok || isServerErrorCode(code);
|
|
3319
3362
|
setState({
|
|
3320
3363
|
data,
|
|
3321
3364
|
loading: false,
|
|
@@ -3447,7 +3490,7 @@ var useRuntimeAuth = () => {
|
|
|
3447
3490
|
}
|
|
3448
3491
|
);
|
|
3449
3492
|
const payload = await readJsonPayload(response);
|
|
3450
|
-
if (
|
|
3493
|
+
if (isRuntimeEnvelopeFailure(response, payload)) {
|
|
3451
3494
|
throw createRuntimeHttpError(
|
|
3452
3495
|
response,
|
|
3453
3496
|
payload,
|
|
@@ -3479,6 +3522,19 @@ var buildServiceUrl2 = (servicePrefix, path) => {
|
|
|
3479
3522
|
const suffix = path.startsWith("/") ? path : `/${path}`;
|
|
3480
3523
|
return `${prefix}${suffix}`;
|
|
3481
3524
|
};
|
|
3525
|
+
var createAuthorizedFetch = (baseFetch, accessToken) => {
|
|
3526
|
+
if (!accessToken) return baseFetch;
|
|
3527
|
+
return ((input, init = {}) => {
|
|
3528
|
+
const headers = new Headers(init.headers || {});
|
|
3529
|
+
if (!headers.has("authorization")) {
|
|
3530
|
+
headers.set("authorization", `Bearer ${accessToken}`);
|
|
3531
|
+
}
|
|
3532
|
+
return baseFetch(input, {
|
|
3533
|
+
...init,
|
|
3534
|
+
headers
|
|
3535
|
+
});
|
|
3536
|
+
});
|
|
3537
|
+
};
|
|
3482
3538
|
var readJsonPayload = async (response) => {
|
|
3483
3539
|
try {
|
|
3484
3540
|
return await response.json();
|
|
@@ -3524,6 +3580,15 @@ var classifyRuntimeError = (status, code) => {
|
|
|
3524
3580
|
const normalizedCode = typeof code === "string" ? Number(code) : code;
|
|
3525
3581
|
if (status === 401 || normalizedCode === 401) return "unauthenticated";
|
|
3526
3582
|
if (status === 403 || normalizedCode === 403) return "forbidden";
|
|
3583
|
+
if (typeof code === "string") {
|
|
3584
|
+
const normalizedText = code.toUpperCase();
|
|
3585
|
+
if (normalizedText.includes("DENIED") || normalizedText.includes("FORBIDDEN")) {
|
|
3586
|
+
return "forbidden";
|
|
3587
|
+
}
|
|
3588
|
+
if (normalizedText.includes("UNAUTH") || normalizedText.includes("LOGIN")) {
|
|
3589
|
+
return "unauthenticated";
|
|
3590
|
+
}
|
|
3591
|
+
}
|
|
3527
3592
|
if (!status && !normalizedCode) return "network";
|
|
3528
3593
|
return "unknown";
|
|
3529
3594
|
};
|
|
@@ -3579,6 +3644,20 @@ var getRecordValue2 = (value, key) => {
|
|
|
3579
3644
|
if (!value || typeof value !== "object") return void 0;
|
|
3580
3645
|
return value[key];
|
|
3581
3646
|
};
|
|
3647
|
+
var isSuccessCode3 = (code) => {
|
|
3648
|
+
if (code === void 0 || code === null || code === "") return true;
|
|
3649
|
+
const normalized = Number(code);
|
|
3650
|
+
return Number.isFinite(normalized) ? normalized === 0 || normalized >= 200 && normalized < 300 : false;
|
|
3651
|
+
};
|
|
3652
|
+
var isRuntimeEnvelopeFailure = (response, payload) => {
|
|
3653
|
+
const code = getRecordValue2(payload, "code");
|
|
3654
|
+
const success = getRecordValue2(payload, "success");
|
|
3655
|
+
return !response.ok || success === false || !isSuccessCode3(code);
|
|
3656
|
+
};
|
|
3657
|
+
var isServerErrorCode = (code) => {
|
|
3658
|
+
const normalized = Number(code);
|
|
3659
|
+
return Number.isFinite(normalized) && normalized >= 500;
|
|
3660
|
+
};
|
|
3582
3661
|
var getRecordString = (value, key) => {
|
|
3583
3662
|
const result = getRecordValue2(value, key);
|
|
3584
3663
|
return typeof result === "string" ? result : void 0;
|
|
@@ -3642,7 +3721,8 @@ var createPublicAccessClient = ({
|
|
|
3642
3721
|
);
|
|
3643
3722
|
const payload = await readPayload2(response);
|
|
3644
3723
|
const code = getRecordValue3(payload, "code");
|
|
3645
|
-
|
|
3724
|
+
const success = getRecordValue3(payload, "success");
|
|
3725
|
+
if (!response.ok || success === false || !isSuccessCode4(code)) {
|
|
3646
3726
|
throw new PublicAccessClientError(
|
|
3647
3727
|
String(
|
|
3648
3728
|
getRecordValue3(payload, "message") || `Public access session failed: ${response.status}`
|
|
@@ -3680,6 +3760,11 @@ var getRecordValue3 = (value, key) => {
|
|
|
3680
3760
|
if (!value || typeof value !== "object") return void 0;
|
|
3681
3761
|
return value[key];
|
|
3682
3762
|
};
|
|
3763
|
+
var isSuccessCode4 = (code) => {
|
|
3764
|
+
if (code === void 0 || code === null || code === "") return true;
|
|
3765
|
+
const normalized = Number(code);
|
|
3766
|
+
return Number.isFinite(normalized) ? normalized === 0 || normalized >= 200 && normalized < 300 : false;
|
|
3767
|
+
};
|
|
3683
3768
|
var getCurrentPathname = () => typeof window === "undefined" ? void 0 : window.location.pathname;
|
|
3684
3769
|
var getCurrentDomain = () => typeof window === "undefined" ? void 0 : window.location.host;
|
|
3685
3770
|
var getCurrentUserAgent = () => typeof navigator === "undefined" ? void 0 : navigator.userAgent;
|
|
@@ -3710,7 +3795,8 @@ var usePublicAccess = (options = {}) => {
|
|
|
3710
3795
|
appType: runtimeAppType,
|
|
3711
3796
|
servicePrefix: runtimeServicePrefix,
|
|
3712
3797
|
fetchImpl: runtimeFetchImpl,
|
|
3713
|
-
reload: reloadRuntime
|
|
3798
|
+
reload: reloadRuntime,
|
|
3799
|
+
setAccessToken
|
|
3714
3800
|
} = runtime;
|
|
3715
3801
|
const {
|
|
3716
3802
|
appType = runtimeAppType,
|
|
@@ -3744,7 +3830,8 @@ var usePublicAccess = (options = {}) => {
|
|
|
3744
3830
|
path: input.path || stableSessionInput.path || readPathFromLocation()
|
|
3745
3831
|
});
|
|
3746
3832
|
setSession(data);
|
|
3747
|
-
|
|
3833
|
+
setAccessToken(data.accessToken);
|
|
3834
|
+
await reloadRuntime({ accessToken: data.accessToken });
|
|
3748
3835
|
setLoading(false);
|
|
3749
3836
|
return data;
|
|
3750
3837
|
} catch (caught) {
|
|
@@ -3757,7 +3844,7 @@ var usePublicAccess = (options = {}) => {
|
|
|
3757
3844
|
throw nextError;
|
|
3758
3845
|
}
|
|
3759
3846
|
},
|
|
3760
|
-
[client, reloadRuntime, stableSessionInput]
|
|
3847
|
+
[client, reloadRuntime, setAccessToken, stableSessionInput]
|
|
3761
3848
|
);
|
|
3762
3849
|
(0, import_react9.useEffect)(() => {
|
|
3763
3850
|
if (!autoStart) return;
|