@fctc/interface-logic 1.5.2 → 1.5.4
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/configs.js +107 -96
- package/dist/configs.mjs +108 -96
- package/dist/environment.js +137 -122
- package/dist/environment.mjs +140 -122
- package/dist/hooks.js +1556 -1393
- package/dist/hooks.mjs +1559 -1393
- package/dist/provider.d.mts +4 -3
- package/dist/provider.d.ts +4 -3
- package/dist/provider.js +562 -509
- package/dist/provider.mjs +565 -509
- package/dist/services.js +1529 -1364
- package/dist/services.mjs +1524 -1356
- package/dist/store.js +19 -5
- package/dist/store.mjs +22 -5
- package/dist/utils.js +116 -94
- package/dist/utils.mjs +119 -94
- package/package.json +1 -1
package/dist/configs.js
CHANGED
|
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __pow = Math.pow;
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -26,6 +27,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
27
|
mod
|
|
27
28
|
));
|
|
28
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var __async = (__this, __arguments, generator) => {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
var fulfilled = (value) => {
|
|
33
|
+
try {
|
|
34
|
+
step(generator.next(value));
|
|
35
|
+
} catch (e) {
|
|
36
|
+
reject(e);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var rejected = (value) => {
|
|
40
|
+
try {
|
|
41
|
+
step(generator.throw(value));
|
|
42
|
+
} catch (e) {
|
|
43
|
+
reject(e);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
47
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
48
|
+
});
|
|
49
|
+
};
|
|
29
50
|
|
|
30
51
|
// src/configs.ts
|
|
31
52
|
var configs_exports = {};
|
|
@@ -1118,22 +1139,6 @@ var PyRelativeDelta = class _PyRelativeDelta {
|
|
|
1118
1139
|
this.microsecond = params.microsecond;
|
|
1119
1140
|
this.weekday = params.weekday;
|
|
1120
1141
|
}
|
|
1121
|
-
years;
|
|
1122
|
-
months;
|
|
1123
|
-
days;
|
|
1124
|
-
hours;
|
|
1125
|
-
minutes;
|
|
1126
|
-
seconds;
|
|
1127
|
-
microseconds;
|
|
1128
|
-
leapDays;
|
|
1129
|
-
year;
|
|
1130
|
-
month;
|
|
1131
|
-
day;
|
|
1132
|
-
hour;
|
|
1133
|
-
minute;
|
|
1134
|
-
second;
|
|
1135
|
-
microsecond;
|
|
1136
|
-
weekday;
|
|
1137
1142
|
negate() {
|
|
1138
1143
|
return new _PyRelativeDelta(this, -1);
|
|
1139
1144
|
}
|
|
@@ -1248,7 +1253,7 @@ function execOnIterable(iterable, func) {
|
|
|
1248
1253
|
if (typeof iterable === "object" && !Array.isArray(iterable) && !(iterable instanceof Set)) {
|
|
1249
1254
|
iterable = Object.keys(iterable);
|
|
1250
1255
|
}
|
|
1251
|
-
if (typeof iterable
|
|
1256
|
+
if (typeof (iterable == null ? void 0 : iterable[Symbol.iterator]) !== "function") {
|
|
1252
1257
|
throw new EvaluationError("value not iterable");
|
|
1253
1258
|
}
|
|
1254
1259
|
return func(iterable);
|
|
@@ -1571,7 +1576,7 @@ function applyBinaryOp(ast, context) {
|
|
|
1571
1576
|
}
|
|
1572
1577
|
return Math.floor(left / right);
|
|
1573
1578
|
case "**":
|
|
1574
|
-
return left
|
|
1579
|
+
return __pow(left, right);
|
|
1575
1580
|
case "==":
|
|
1576
1581
|
return isEqual(left, right);
|
|
1577
1582
|
case "<>":
|
|
@@ -1693,7 +1698,7 @@ function evaluate(ast, context = {}) {
|
|
|
1693
1698
|
const dicts = /* @__PURE__ */ new Set();
|
|
1694
1699
|
let pyContext;
|
|
1695
1700
|
const evalContext = Object.create(context);
|
|
1696
|
-
if (!evalContext
|
|
1701
|
+
if (!(evalContext == null ? void 0 : evalContext.context)) {
|
|
1697
1702
|
Object.defineProperty(evalContext, "context", {
|
|
1698
1703
|
get() {
|
|
1699
1704
|
if (!pyContext) {
|
|
@@ -1704,17 +1709,18 @@ function evaluate(ast, context = {}) {
|
|
|
1704
1709
|
});
|
|
1705
1710
|
}
|
|
1706
1711
|
function _innerEvaluate(ast2) {
|
|
1707
|
-
|
|
1712
|
+
var _a, _b, _c;
|
|
1713
|
+
switch (ast2 == null ? void 0 : ast2.type) {
|
|
1708
1714
|
case 0:
|
|
1709
1715
|
// Number
|
|
1710
1716
|
case 1:
|
|
1711
1717
|
return ast2.value;
|
|
1712
1718
|
case 5:
|
|
1713
1719
|
if (ast2.value in evalContext) {
|
|
1714
|
-
if (typeof evalContext[ast2.value] === "object" && evalContext[ast2.value]
|
|
1715
|
-
return evalContext[ast2.value]
|
|
1720
|
+
if (typeof evalContext[ast2.value] === "object" && ((_a = evalContext[ast2.value]) == null ? void 0 : _a.id)) {
|
|
1721
|
+
return (_b = evalContext[ast2.value]) == null ? void 0 : _b.id;
|
|
1716
1722
|
}
|
|
1717
|
-
return evalContext[ast2.value]
|
|
1723
|
+
return (_c = evalContext[ast2.value]) != null ? _c : false;
|
|
1718
1724
|
} else if (ast2.value in BUILTINS) {
|
|
1719
1725
|
return BUILTINS[ast2.value];
|
|
1720
1726
|
} else {
|
|
@@ -1751,7 +1757,7 @@ function evaluate(ast, context = {}) {
|
|
|
1751
1757
|
const args = ast2.args.map(_evaluate);
|
|
1752
1758
|
const kwargs = {};
|
|
1753
1759
|
for (const kwarg in ast2.kwargs) {
|
|
1754
|
-
kwargs[kwarg] = _evaluate(ast2
|
|
1760
|
+
kwargs[kwarg] = _evaluate(ast2 == null ? void 0 : ast2.kwargs[kwarg]);
|
|
1755
1761
|
}
|
|
1756
1762
|
if (fnValue === PyDate || fnValue === PyDateTime || fnValue === PyTime || fnValue === PyRelativeDelta || fnValue === PyTimeDelta) {
|
|
1757
1763
|
return fnValue.create(...args, kwargs);
|
|
@@ -1830,9 +1836,25 @@ function escapeRegExp(str) {
|
|
|
1830
1836
|
var InvalidDomainError = class extends Error {
|
|
1831
1837
|
};
|
|
1832
1838
|
var Domain = class _Domain {
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1839
|
+
constructor(descr = []) {
|
|
1840
|
+
this.ast = { type: -1, value: null };
|
|
1841
|
+
if (descr instanceof _Domain) {
|
|
1842
|
+
return new _Domain(descr.toString());
|
|
1843
|
+
} else {
|
|
1844
|
+
let rawAST;
|
|
1845
|
+
try {
|
|
1846
|
+
rawAST = typeof descr === "string" ? parseExpr(descr) : toAST(descr);
|
|
1847
|
+
} catch (error) {
|
|
1848
|
+
throw new InvalidDomainError(
|
|
1849
|
+
`Invalid domain representation: ${descr}`,
|
|
1850
|
+
{
|
|
1851
|
+
cause: error
|
|
1852
|
+
}
|
|
1853
|
+
);
|
|
1854
|
+
}
|
|
1855
|
+
this.ast = normalizeDomainAST(rawAST);
|
|
1856
|
+
}
|
|
1857
|
+
}
|
|
1836
1858
|
static combine(domains, operator) {
|
|
1837
1859
|
if (domains.length === 0) {
|
|
1838
1860
|
return new _Domain([]);
|
|
@@ -1911,24 +1933,6 @@ var Domain = class _Domain {
|
|
|
1911
1933
|
processLeaf(d.ast.value, 0, "&", newDomain);
|
|
1912
1934
|
return newDomain;
|
|
1913
1935
|
}
|
|
1914
|
-
constructor(descr = []) {
|
|
1915
|
-
if (descr instanceof _Domain) {
|
|
1916
|
-
return new _Domain(descr.toString());
|
|
1917
|
-
} else {
|
|
1918
|
-
let rawAST;
|
|
1919
|
-
try {
|
|
1920
|
-
rawAST = typeof descr === "string" ? parseExpr(descr) : toAST(descr);
|
|
1921
|
-
} catch (error) {
|
|
1922
|
-
throw new InvalidDomainError(
|
|
1923
|
-
`Invalid domain representation: ${descr}`,
|
|
1924
|
-
{
|
|
1925
|
-
cause: error
|
|
1926
|
-
}
|
|
1927
|
-
);
|
|
1928
|
-
}
|
|
1929
|
-
this.ast = normalizeDomainAST(rawAST);
|
|
1930
|
-
}
|
|
1931
|
-
}
|
|
1932
1936
|
contains(record) {
|
|
1933
1937
|
const expr = evaluate(this.ast, record);
|
|
1934
1938
|
return matchDomain(record, expr);
|
|
@@ -1947,7 +1951,7 @@ var Domain = class _Domain {
|
|
|
1947
1951
|
return evaluatedAsList;
|
|
1948
1952
|
}
|
|
1949
1953
|
return this.toString();
|
|
1950
|
-
} catch {
|
|
1954
|
+
} catch (e) {
|
|
1951
1955
|
return this.toString();
|
|
1952
1956
|
}
|
|
1953
1957
|
}
|
|
@@ -2170,22 +2174,22 @@ var updateTokenParamInOriginalRequest = (originalRequest, newAccessToken) => {
|
|
|
2170
2174
|
|
|
2171
2175
|
// src/utils/storage/local-storage.ts
|
|
2172
2176
|
var localStorageUtils = () => {
|
|
2173
|
-
const setToken =
|
|
2177
|
+
const setToken = (access_token) => __async(null, null, function* () {
|
|
2174
2178
|
localStorage.setItem("accessToken", access_token);
|
|
2175
|
-
};
|
|
2176
|
-
const setRefreshToken =
|
|
2179
|
+
});
|
|
2180
|
+
const setRefreshToken = (refresh_token) => __async(null, null, function* () {
|
|
2177
2181
|
localStorage.setItem("refreshToken", refresh_token);
|
|
2178
|
-
};
|
|
2179
|
-
const getAccessToken =
|
|
2182
|
+
});
|
|
2183
|
+
const getAccessToken = () => __async(null, null, function* () {
|
|
2180
2184
|
return localStorage.getItem("accessToken");
|
|
2181
|
-
};
|
|
2182
|
-
const getRefreshToken =
|
|
2185
|
+
});
|
|
2186
|
+
const getRefreshToken = () => __async(null, null, function* () {
|
|
2183
2187
|
return localStorage.getItem("refreshToken");
|
|
2184
|
-
};
|
|
2185
|
-
const clearToken =
|
|
2188
|
+
});
|
|
2189
|
+
const clearToken = () => __async(null, null, function* () {
|
|
2186
2190
|
localStorage.removeItem("accessToken");
|
|
2187
2191
|
localStorage.removeItem("refreshToken");
|
|
2188
|
-
};
|
|
2192
|
+
});
|
|
2189
2193
|
return {
|
|
2190
2194
|
setToken,
|
|
2191
2195
|
setRefreshToken,
|
|
@@ -2197,9 +2201,9 @@ var localStorageUtils = () => {
|
|
|
2197
2201
|
|
|
2198
2202
|
// src/utils/storage/session-storage.ts
|
|
2199
2203
|
var sessionStorageUtils = () => {
|
|
2200
|
-
const getBrowserSession =
|
|
2204
|
+
const getBrowserSession = () => __async(null, null, function* () {
|
|
2201
2205
|
return sessionStorage.getItem("browserSession");
|
|
2202
|
-
};
|
|
2206
|
+
});
|
|
2203
2207
|
return {
|
|
2204
2208
|
getBrowserSession
|
|
2205
2209
|
};
|
|
@@ -2208,13 +2212,14 @@ var sessionStorageUtils = () => {
|
|
|
2208
2212
|
// src/configs/axios-client.ts
|
|
2209
2213
|
var axiosClient = {
|
|
2210
2214
|
init(config) {
|
|
2211
|
-
|
|
2212
|
-
const
|
|
2215
|
+
var _a, _b;
|
|
2216
|
+
const localStorage2 = (_a = config.localStorageUtils) != null ? _a : localStorageUtils();
|
|
2217
|
+
const sessionStorage2 = (_b = config.sessionStorageUtils) != null ? _b : sessionStorageUtils();
|
|
2213
2218
|
const db = config.db;
|
|
2214
2219
|
let isRefreshing = false;
|
|
2215
2220
|
let failedQueue = [];
|
|
2216
2221
|
const processQueue = (error, token = null) => {
|
|
2217
|
-
failedQueue
|
|
2222
|
+
failedQueue == null ? void 0 : failedQueue.forEach((prom) => {
|
|
2218
2223
|
if (error) {
|
|
2219
2224
|
prom.reject(error);
|
|
2220
2225
|
} else {
|
|
@@ -2230,14 +2235,14 @@ var axiosClient = {
|
|
|
2230
2235
|
paramsSerializer: (params) => new URLSearchParams(params).toString()
|
|
2231
2236
|
});
|
|
2232
2237
|
instance.interceptors.request.use(
|
|
2233
|
-
|
|
2238
|
+
(config2) => __async(null, null, function* () {
|
|
2234
2239
|
const useRefreshToken = config2.useRefreshToken;
|
|
2235
|
-
const token = useRefreshToken ?
|
|
2240
|
+
const token = useRefreshToken ? yield localStorage2.getRefreshToken() : yield localStorage2.getAccessToken();
|
|
2236
2241
|
if (token) {
|
|
2237
2242
|
config2.headers["Authorization"] = "Bearer " + token;
|
|
2238
2243
|
}
|
|
2239
2244
|
return config2;
|
|
2240
|
-
},
|
|
2245
|
+
}),
|
|
2241
2246
|
(error) => {
|
|
2242
2247
|
Promise.reject(error);
|
|
2243
2248
|
}
|
|
@@ -2246,19 +2251,21 @@ var axiosClient = {
|
|
|
2246
2251
|
(response) => {
|
|
2247
2252
|
return handleResponse(response);
|
|
2248
2253
|
},
|
|
2249
|
-
|
|
2250
|
-
|
|
2254
|
+
(error) => __async(null, null, function* () {
|
|
2255
|
+
var _a2, _b2, _c;
|
|
2256
|
+
const handleError3 = (error2) => __async(null, null, function* () {
|
|
2257
|
+
var _a3;
|
|
2251
2258
|
if (!error2.response) {
|
|
2252
2259
|
return error2;
|
|
2253
2260
|
}
|
|
2254
2261
|
const { data } = error2.response;
|
|
2255
|
-
if (data && data.code === 400 && ["invalid_grant"].includes(data.data
|
|
2256
|
-
|
|
2262
|
+
if (data && data.code === 400 && ["invalid_grant"].includes((_a3 = data.data) == null ? void 0 : _a3.error)) {
|
|
2263
|
+
yield clearAuthToken();
|
|
2257
2264
|
}
|
|
2258
2265
|
return data;
|
|
2259
|
-
};
|
|
2266
|
+
});
|
|
2260
2267
|
const originalRequest = error.config;
|
|
2261
|
-
if ((error.response
|
|
2268
|
+
if ((((_a2 = error.response) == null ? void 0 : _a2.status) === 403 || ((_b2 = error.response) == null ? void 0 : _b2.status) === 401 || ((_c = error.response) == null ? void 0 : _c.status) === 404) && ["TOKEN_EXPIRED", "AUTHEN_FAIL", 401, "ERR_2FA_006"].includes(
|
|
2262
2269
|
error.response.data.code
|
|
2263
2270
|
)) {
|
|
2264
2271
|
if (isRefreshing) {
|
|
@@ -2271,18 +2278,19 @@ var axiosClient = {
|
|
|
2271
2278
|
token
|
|
2272
2279
|
);
|
|
2273
2280
|
return instance.request(originalRequest);
|
|
2274
|
-
}).catch(
|
|
2275
|
-
|
|
2276
|
-
|
|
2281
|
+
}).catch((err) => __async(null, null, function* () {
|
|
2282
|
+
var _a3, _b3;
|
|
2283
|
+
if ((((_a3 = err.response) == null ? void 0 : _a3.status) === 400 || ((_b3 = err.response) == null ? void 0 : _b3.status) === 401) && ["invalid_grant"].includes(err.response.data.error)) {
|
|
2284
|
+
yield clearAuthToken();
|
|
2277
2285
|
}
|
|
2278
|
-
});
|
|
2286
|
+
}));
|
|
2279
2287
|
}
|
|
2280
|
-
const browserSession =
|
|
2281
|
-
const refreshToken =
|
|
2282
|
-
const accessTokenExp =
|
|
2288
|
+
const browserSession = yield sessionStorage2.getBrowserSession();
|
|
2289
|
+
const refreshToken = yield localStorage2.getRefreshToken();
|
|
2290
|
+
const accessTokenExp = yield localStorage2.getAccessToken();
|
|
2283
2291
|
isRefreshing = true;
|
|
2284
2292
|
if (!refreshToken && (!browserSession || browserSession == "unActive")) {
|
|
2285
|
-
|
|
2293
|
+
yield clearAuthToken();
|
|
2286
2294
|
} else {
|
|
2287
2295
|
const payload = Object.fromEntries(
|
|
2288
2296
|
Object.entries({
|
|
@@ -2293,8 +2301,9 @@ var axiosClient = {
|
|
|
2293
2301
|
}).filter(([_, value]) => !!value)
|
|
2294
2302
|
);
|
|
2295
2303
|
return new Promise(function(resolve) {
|
|
2304
|
+
var _a3;
|
|
2296
2305
|
import_axios.default.post(
|
|
2297
|
-
`${config.baseUrl}${config.refreshTokenEndpoint
|
|
2306
|
+
`${config.baseUrl}${(_a3 = config.refreshTokenEndpoint) != null ? _a3 : "/authentication/oauth2/token" /* AUTH_TOKEN_PATH */}`,
|
|
2298
2307
|
payload,
|
|
2299
2308
|
{
|
|
2300
2309
|
headers: {
|
|
@@ -2302,10 +2311,10 @@ var axiosClient = {
|
|
|
2302
2311
|
Authorization: `Bearer ${accessTokenExp}`
|
|
2303
2312
|
}
|
|
2304
2313
|
}
|
|
2305
|
-
).then(
|
|
2314
|
+
).then((res) => __async(null, null, function* () {
|
|
2306
2315
|
const data = res.data;
|
|
2307
|
-
|
|
2308
|
-
|
|
2316
|
+
yield localStorage2.setToken(data.access_token);
|
|
2317
|
+
yield localStorage2.setRefreshToken(data.refresh_token);
|
|
2309
2318
|
import_axios.default.defaults.headers.common["Authorization"] = "Bearer " + data.access_token;
|
|
2310
2319
|
originalRequest.headers["Authorization"] = "Bearer " + data.access_token;
|
|
2311
2320
|
originalRequest.data = updateTokenParamInOriginalRequest(
|
|
@@ -2314,25 +2323,26 @@ var axiosClient = {
|
|
|
2314
2323
|
);
|
|
2315
2324
|
processQueue(null, data.access_token);
|
|
2316
2325
|
resolve(instance.request(originalRequest));
|
|
2317
|
-
}).catch(
|
|
2318
|
-
|
|
2319
|
-
|
|
2326
|
+
})).catch((err) => __async(null, null, function* () {
|
|
2327
|
+
var _a4;
|
|
2328
|
+
if (err && ((err == null ? void 0 : err.error_code) === "AUTHEN_FAIL" || (err == null ? void 0 : err.error_code) === "TOKEN_EXPIRED" || (err == null ? void 0 : err.error_code) === "TOKEN_INCORRECT" || (err == null ? void 0 : err.code) === "ERR_BAD_REQUEST") || (err == null ? void 0 : err.error_code) === "ERR_2FA_006") {
|
|
2329
|
+
yield clearAuthToken();
|
|
2320
2330
|
}
|
|
2321
2331
|
if (err && err.response) {
|
|
2322
|
-
const { error_code } = err.response
|
|
2332
|
+
const { error_code } = ((_a4 = err.response) == null ? void 0 : _a4.data) || {};
|
|
2323
2333
|
if (error_code === "AUTHEN_FAIL") {
|
|
2324
|
-
|
|
2334
|
+
yield clearAuthToken();
|
|
2325
2335
|
}
|
|
2326
2336
|
}
|
|
2327
2337
|
processQueue(err, null);
|
|
2328
|
-
}).finally(() => {
|
|
2338
|
+
})).finally(() => {
|
|
2329
2339
|
isRefreshing = false;
|
|
2330
2340
|
});
|
|
2331
2341
|
});
|
|
2332
2342
|
}
|
|
2333
2343
|
}
|
|
2334
|
-
return Promise.reject(
|
|
2335
|
-
}
|
|
2344
|
+
return Promise.reject(yield handleError3(error));
|
|
2345
|
+
})
|
|
2336
2346
|
);
|
|
2337
2347
|
const handleResponse = (res) => {
|
|
2338
2348
|
if (res && res.data) {
|
|
@@ -2341,6 +2351,7 @@ var axiosClient = {
|
|
|
2341
2351
|
return res;
|
|
2342
2352
|
};
|
|
2343
2353
|
const handleError2 = (error) => {
|
|
2354
|
+
var _a2, _b2, _c;
|
|
2344
2355
|
if (error.isAxiosError && error.code === "ECONNABORTED") {
|
|
2345
2356
|
console.error("Request Timeout Error:", error);
|
|
2346
2357
|
return "Request Timeout Error";
|
|
@@ -2348,17 +2359,17 @@ var axiosClient = {
|
|
|
2348
2359
|
console.error("Network Error:", error);
|
|
2349
2360
|
return "Network Error";
|
|
2350
2361
|
} else {
|
|
2351
|
-
console.error("Other Error:", error
|
|
2352
|
-
const errorMessage = error
|
|
2353
|
-
return { message: errorMessage, status: error
|
|
2362
|
+
console.error("Other Error:", error == null ? void 0 : error.response);
|
|
2363
|
+
const errorMessage = ((_b2 = (_a2 = error == null ? void 0 : error.response) == null ? void 0 : _a2.data) == null ? void 0 : _b2.message) || "An error occurred";
|
|
2364
|
+
return { message: errorMessage, status: (_c = error == null ? void 0 : error.response) == null ? void 0 : _c.status };
|
|
2354
2365
|
}
|
|
2355
2366
|
};
|
|
2356
|
-
const clearAuthToken =
|
|
2357
|
-
|
|
2367
|
+
const clearAuthToken = () => __async(null, null, function* () {
|
|
2368
|
+
yield localStorage2.clearToken();
|
|
2358
2369
|
if (typeof window !== "undefined") {
|
|
2359
2370
|
window.location.href = `/login`;
|
|
2360
2371
|
}
|
|
2361
|
-
};
|
|
2372
|
+
});
|
|
2362
2373
|
function formatUrl(url, db2) {
|
|
2363
2374
|
return url + (db2 ? "?db=" + db2 : "");
|
|
2364
2375
|
}
|