@ldsg/utils 0.3.37 → 0.3.40
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.
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { HandlerResourceSettings } from "@ldsg/handler";
|
|
2
|
+
import { ResourceRecords } from "@ldsg/types";
|
|
3
|
+
export interface GenerateAppIndexTsParams {
|
|
4
|
+
/**
|
|
5
|
+
* Handler 资源记录
|
|
6
|
+
*/
|
|
7
|
+
handlerResourceRecords: ResourceRecords<HandlerResourceSettings>;
|
|
8
|
+
/**
|
|
9
|
+
* 根据 handler id 生成其在 app 入口文件中的相对导入路径
|
|
10
|
+
* - FLAT: `../<id>`
|
|
11
|
+
* - NESTED: `./handlers/<id>`
|
|
12
|
+
*/
|
|
13
|
+
getHandlerImportPath: (handlerId: string) => string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 生成应用入口文件(app/index.ts)
|
|
17
|
+
*
|
|
18
|
+
* 将 handler 引入 app 并放入相应 handler 资源中:
|
|
19
|
+
* 1. 静态 import 每个 handler 模块
|
|
20
|
+
* 2. 把模块导出的 handler 注入到对应 handler 资源记录的 settings.handler
|
|
21
|
+
* 使运行时无需通过 require(moduleId) 动态加载 handler 模块
|
|
22
|
+
*/
|
|
23
|
+
export declare const generateAppIndexTs: (params: GenerateAppIndexTsParams) => string;
|
package/dist/fetch-app-data.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { AppData, ResourceRecords } from "@ldsg/types";
|
|
2
2
|
export interface LoadAppResourceRecordsParams {
|
|
3
3
|
appDataUri?: string;
|
|
4
|
-
|
|
5
|
-
apaasAppDataExpression?: string;
|
|
4
|
+
appDataExpression?: string;
|
|
6
5
|
}
|
|
7
6
|
export interface LoadAppResourceRecordsRes {
|
|
8
7
|
resourceRecords: ResourceRecords;
|
|
9
|
-
sourceType: "apaas" | "runtime";
|
|
10
8
|
}
|
|
11
9
|
export declare const loadAppResourceRecords: (params: LoadAppResourceRecordsParams) => Promise<LoadAppResourceRecordsRes>;
|
|
12
10
|
export interface FetchAppDataParams {
|
package/dist/index.cjs
CHANGED
|
@@ -40,6 +40,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
40
40
|
instantiateServices: ()=>instantiateServices,
|
|
41
41
|
RUSH_JSON_PATH: ()=>RUSH_JSON_PATH,
|
|
42
42
|
addFileToZipFolder: ()=>addFileToZipFolder,
|
|
43
|
+
generateAppIndexTs: ()=>generateAppIndexTs,
|
|
43
44
|
getTreeResourceRecords: ()=>getTreeResourceRecords,
|
|
44
45
|
zipAppData: ()=>zipAppData,
|
|
45
46
|
fetchAppData: ()=>fetchAppData,
|
|
@@ -111,7 +112,6 @@ function syncRushProjects(rushJsonPath, generatedProjects) {
|
|
|
111
112
|
spaces: 2
|
|
112
113
|
});
|
|
113
114
|
}
|
|
114
|
-
const apaas_constants_namespaceObject = require("@ldsg/apaas-constants");
|
|
115
115
|
const constants_namespaceObject = require("@ldsg/constants");
|
|
116
116
|
const external_jszip_namespaceObject = require("jszip");
|
|
117
117
|
var external_jszip_default = /*#__PURE__*/ __webpack_require__.n(external_jszip_namespaceObject);
|
|
@@ -126,6 +126,66 @@ const addFileToZipFolder = (params)=>{
|
|
|
126
126
|
const { folder, path, data } = params;
|
|
127
127
|
folder.file(path, external_lodash_default().isObject(data) ? JSON.stringify(data, null, 2) : data);
|
|
128
128
|
};
|
|
129
|
+
const normalizeHandlerAlias = (handlerId)=>handlerId.replace(/[^a-zA-Z0-9_$]/g, "_");
|
|
130
|
+
const generateAppIndexTs = (params)=>{
|
|
131
|
+
const { handlerResourceRecords, getHandlerImportPath } = params;
|
|
132
|
+
const handlerImports = handlerResourceRecords.map((resourceRecord)=>{
|
|
133
|
+
const { id } = resourceRecord;
|
|
134
|
+
const alias = `handlerModule_${normalizeHandlerAlias(id)}`;
|
|
135
|
+
const handlerImportPath = id;
|
|
136
|
+
return `import * as ${alias} from "${handlerImportPath}";`;
|
|
137
|
+
});
|
|
138
|
+
const handlerModulesEntries = handlerResourceRecords.map((resourceRecord)=>{
|
|
139
|
+
const { id } = resourceRecord;
|
|
140
|
+
const alias = `handlerModule_${normalizeHandlerAlias(id)}`;
|
|
141
|
+
return ` ${JSON.stringify(id)}: ${alias},`;
|
|
142
|
+
});
|
|
143
|
+
const res = `import { createApp } from "@ldsg/create-app";
|
|
144
|
+
import MANIFEST_JSON from "./manifest.json" with { type: "json" };
|
|
145
|
+
${handlerImports.length ? `${handlerImports.join("\n")}\n` : ""}const { resourceRecords } = MANIFEST_JSON as any;
|
|
146
|
+
|
|
147
|
+
const handlerModules: Record<string, any> = {
|
|
148
|
+
${handlerModulesEntries.join("\n")}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 将 handler 引入 app 并放入相应 handler 资源中
|
|
153
|
+
* 使运行时无需通过 require(moduleId) 动态加载 handler 模块
|
|
154
|
+
*/
|
|
155
|
+
const wiredResourceRecords = (resourceRecords as any[]).map((resourceRecord: any) => {
|
|
156
|
+
const { kind, id, settings } = resourceRecord;
|
|
157
|
+
|
|
158
|
+
if (kind === "handler" && handlerModules[id]) {
|
|
159
|
+
return {
|
|
160
|
+
...resourceRecord,
|
|
161
|
+
settings: {
|
|
162
|
+
...settings,
|
|
163
|
+
handler: handlerModules[id].handler,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return resourceRecord;
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const start = async () => {
|
|
172
|
+
const app = await createApp({
|
|
173
|
+
resourceRecords: wiredResourceRecords,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const port = process.env.PORT || "3253";
|
|
177
|
+
|
|
178
|
+
app.listen(port, () => {
|
|
179
|
+
console.log(\`App listening on http://localhost:\${port}\`);
|
|
180
|
+
|
|
181
|
+
console.log(\`GraphQL listening on http://localhost:\${port}/graphql\`);
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
start();
|
|
186
|
+
`;
|
|
187
|
+
return res;
|
|
188
|
+
};
|
|
129
189
|
const getHandlerPackageJson = (params)=>{
|
|
130
190
|
const { moduleName, dependencies, reuseMainAppDependencies, packageJson } = params;
|
|
131
191
|
external_lodash_default().set(packageJson, "name", moduleName);
|
|
@@ -144,7 +204,7 @@ const zipAppData = async (params)=>{
|
|
|
144
204
|
const rootZip = new (external_jszip_default())();
|
|
145
205
|
const handlerResourceRecords = resourceRecords.filter((resourceRecord)=>{
|
|
146
206
|
const { kind } = resourceRecord;
|
|
147
|
-
return
|
|
207
|
+
return "handler" === kind;
|
|
148
208
|
});
|
|
149
209
|
let appModuleFolder;
|
|
150
210
|
let handlerModuleParentFolder;
|
|
@@ -168,6 +228,15 @@ const zipAppData = async (params)=>{
|
|
|
168
228
|
case "manifest.json":
|
|
169
229
|
data = external_lodash_default().pick(params, "resourceRecords");
|
|
170
230
|
break;
|
|
231
|
+
case "index.ts":
|
|
232
|
+
data = generateAppIndexTs({
|
|
233
|
+
handlerResourceRecords,
|
|
234
|
+
getHandlerImportPath: (handlerId)=>{
|
|
235
|
+
if (layout === constants_ZipAppDataLayout.FLAT) return `../${handlerId}`;
|
|
236
|
+
return `./${DEFAULT_HANDLER_MODULE_PARENT_DIR_NAME}/${handlerId}`;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
break;
|
|
171
240
|
case ".env":
|
|
172
241
|
if (environmentVariables) data = external_lodash_default().toPairs(environmentVariables).map((value)=>value.join("=")).join("\n");
|
|
173
242
|
break;
|
|
@@ -258,7 +327,8 @@ var external_jsonata_default = /*#__PURE__*/ __webpack_require__.n(external_json
|
|
|
258
327
|
const readSourceData = async (uri)=>{
|
|
259
328
|
if (external_lodash_default().startsWith(uri, "http")) {
|
|
260
329
|
const axiosRes = await external_axios_default()({
|
|
261
|
-
url: uri
|
|
330
|
+
url: uri,
|
|
331
|
+
timeout: 60000
|
|
262
332
|
});
|
|
263
333
|
return axiosRes.data;
|
|
264
334
|
}
|
|
@@ -266,29 +336,12 @@ const readSourceData = async (uri)=>{
|
|
|
266
336
|
return external_fs_extra_default().readJson(external_path_default().resolve(process.cwd(), uri));
|
|
267
337
|
};
|
|
268
338
|
const loadAppResourceRecords = async (params)=>{
|
|
269
|
-
const { appDataUri,
|
|
270
|
-
if (
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
const exp = external_jsonata_default()(expression);
|
|
274
|
-
const appData = await exp.evaluate(rawData);
|
|
275
|
-
const { resourceRecords } = appData;
|
|
276
|
-
const apaasRecords = resourceRecords.map((record)=>({
|
|
277
|
-
id: record.id,
|
|
278
|
-
kind: record.kind,
|
|
279
|
-
parentId: record.parentId ?? null,
|
|
280
|
-
settings: record.settings ?? {}
|
|
281
|
-
}));
|
|
282
|
-
return {
|
|
283
|
-
resourceRecords: apaasRecords,
|
|
284
|
-
sourceType: "apaas"
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
if (!appDataUri) throw new Error("Missing appDataUri or apaasAppDataUri");
|
|
288
|
-
const appData = await readSourceData(appDataUri);
|
|
339
|
+
const { appDataUri, appDataExpression } = params;
|
|
340
|
+
if (!appDataUri) throw new Error("Missing appDataUri");
|
|
341
|
+
const rawData = await readSourceData(appDataUri);
|
|
342
|
+
const appData = appDataExpression ? await external_jsonata_default()(appDataExpression).evaluate(rawData) : rawData;
|
|
289
343
|
return {
|
|
290
|
-
resourceRecords: appData.resourceRecords
|
|
291
|
-
sourceType: "runtime"
|
|
344
|
+
resourceRecords: appData.resourceRecords
|
|
292
345
|
};
|
|
293
346
|
};
|
|
294
347
|
const fetchAppData = async (params)=>{
|
|
@@ -404,6 +457,7 @@ exports.extendAppData = __webpack_exports__.extendAppData;
|
|
|
404
457
|
exports.extendAppDataWithPath = __webpack_exports__.extendAppDataWithPath;
|
|
405
458
|
exports.fetchAppData = __webpack_exports__.fetchAppData;
|
|
406
459
|
exports.generate = __webpack_exports__.generate;
|
|
460
|
+
exports.generateAppIndexTs = __webpack_exports__.generateAppIndexTs;
|
|
407
461
|
exports.generateByAppData = __webpack_exports__.generateByAppData;
|
|
408
462
|
exports.getAppData = __webpack_exports__.getAppData;
|
|
409
463
|
exports.getHandlerPackageJson = __webpack_exports__.getHandlerPackageJson;
|
|
@@ -426,6 +480,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
426
480
|
"extendAppDataWithPath",
|
|
427
481
|
"fetchAppData",
|
|
428
482
|
"generate",
|
|
483
|
+
"generateAppIndexTs",
|
|
429
484
|
"generateByAppData",
|
|
430
485
|
"getAppData",
|
|
431
486
|
"getHandlerPackageJson",
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,6 @@ import { Service } from "@ldsg/core";
|
|
|
2
2
|
import fs_extra from "fs-extra";
|
|
3
3
|
import lodash from "lodash";
|
|
4
4
|
import path_0 from "path";
|
|
5
|
-
import { ApaasResourceKind } from "@ldsg/apaas-constants";
|
|
6
5
|
import { FILES_IN_APP_TEMPLATE_MODULE, FILES_IN_HANDLER_TEMPLATE_MODULE } from "@ldsg/constants";
|
|
7
6
|
import jszip from "jszip";
|
|
8
7
|
import axios from "axios";
|
|
@@ -68,6 +67,66 @@ const addFileToZipFolder = (params)=>{
|
|
|
68
67
|
const { folder, path, data } = params;
|
|
69
68
|
folder.file(path, lodash.isObject(data) ? JSON.stringify(data, null, 2) : data);
|
|
70
69
|
};
|
|
70
|
+
const normalizeHandlerAlias = (handlerId)=>handlerId.replace(/[^a-zA-Z0-9_$]/g, "_");
|
|
71
|
+
const generateAppIndexTs = (params)=>{
|
|
72
|
+
const { handlerResourceRecords, getHandlerImportPath } = params;
|
|
73
|
+
const handlerImports = handlerResourceRecords.map((resourceRecord)=>{
|
|
74
|
+
const { id } = resourceRecord;
|
|
75
|
+
const alias = `handlerModule_${normalizeHandlerAlias(id)}`;
|
|
76
|
+
const handlerImportPath = id;
|
|
77
|
+
return `import * as ${alias} from "${handlerImportPath}";`;
|
|
78
|
+
});
|
|
79
|
+
const handlerModulesEntries = handlerResourceRecords.map((resourceRecord)=>{
|
|
80
|
+
const { id } = resourceRecord;
|
|
81
|
+
const alias = `handlerModule_${normalizeHandlerAlias(id)}`;
|
|
82
|
+
return ` ${JSON.stringify(id)}: ${alias},`;
|
|
83
|
+
});
|
|
84
|
+
const res = `import { createApp } from "@ldsg/create-app";
|
|
85
|
+
import MANIFEST_JSON from "./manifest.json" with { type: "json" };
|
|
86
|
+
${handlerImports.length ? `${handlerImports.join("\n")}\n` : ""}const { resourceRecords } = MANIFEST_JSON as any;
|
|
87
|
+
|
|
88
|
+
const handlerModules: Record<string, any> = {
|
|
89
|
+
${handlerModulesEntries.join("\n")}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 将 handler 引入 app 并放入相应 handler 资源中
|
|
94
|
+
* 使运行时无需通过 require(moduleId) 动态加载 handler 模块
|
|
95
|
+
*/
|
|
96
|
+
const wiredResourceRecords = (resourceRecords as any[]).map((resourceRecord: any) => {
|
|
97
|
+
const { kind, id, settings } = resourceRecord;
|
|
98
|
+
|
|
99
|
+
if (kind === "handler" && handlerModules[id]) {
|
|
100
|
+
return {
|
|
101
|
+
...resourceRecord,
|
|
102
|
+
settings: {
|
|
103
|
+
...settings,
|
|
104
|
+
handler: handlerModules[id].handler,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return resourceRecord;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const start = async () => {
|
|
113
|
+
const app = await createApp({
|
|
114
|
+
resourceRecords: wiredResourceRecords,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const port = process.env.PORT || "3253";
|
|
118
|
+
|
|
119
|
+
app.listen(port, () => {
|
|
120
|
+
console.log(\`App listening on http://localhost:\${port}\`);
|
|
121
|
+
|
|
122
|
+
console.log(\`GraphQL listening on http://localhost:\${port}/graphql\`);
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
start();
|
|
127
|
+
`;
|
|
128
|
+
return res;
|
|
129
|
+
};
|
|
71
130
|
const getHandlerPackageJson = (params)=>{
|
|
72
131
|
const { moduleName, dependencies, reuseMainAppDependencies, packageJson } = params;
|
|
73
132
|
lodash.set(packageJson, "name", moduleName);
|
|
@@ -86,7 +145,7 @@ const zipAppData = async (params)=>{
|
|
|
86
145
|
const rootZip = new jszip();
|
|
87
146
|
const handlerResourceRecords = resourceRecords.filter((resourceRecord)=>{
|
|
88
147
|
const { kind } = resourceRecord;
|
|
89
|
-
return
|
|
148
|
+
return "handler" === kind;
|
|
90
149
|
});
|
|
91
150
|
let appModuleFolder;
|
|
92
151
|
let handlerModuleParentFolder;
|
|
@@ -110,6 +169,15 @@ const zipAppData = async (params)=>{
|
|
|
110
169
|
case "manifest.json":
|
|
111
170
|
data = lodash.pick(params, "resourceRecords");
|
|
112
171
|
break;
|
|
172
|
+
case "index.ts":
|
|
173
|
+
data = generateAppIndexTs({
|
|
174
|
+
handlerResourceRecords,
|
|
175
|
+
getHandlerImportPath: (handlerId)=>{
|
|
176
|
+
if (layout === constants_ZipAppDataLayout.FLAT) return `../${handlerId}`;
|
|
177
|
+
return `./${DEFAULT_HANDLER_MODULE_PARENT_DIR_NAME}/${handlerId}`;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
break;
|
|
113
181
|
case ".env":
|
|
114
182
|
if (environmentVariables) data = lodash.toPairs(environmentVariables).map((value)=>value.join("=")).join("\n");
|
|
115
183
|
break;
|
|
@@ -196,7 +264,8 @@ const extendAppDataWithPath = async (params)=>{
|
|
|
196
264
|
const readSourceData = async (uri)=>{
|
|
197
265
|
if (lodash.startsWith(uri, "http")) {
|
|
198
266
|
const axiosRes = await axios({
|
|
199
|
-
url: uri
|
|
267
|
+
url: uri,
|
|
268
|
+
timeout: 60000
|
|
200
269
|
});
|
|
201
270
|
return axiosRes.data;
|
|
202
271
|
}
|
|
@@ -204,29 +273,12 @@ const readSourceData = async (uri)=>{
|
|
|
204
273
|
return fs_extra.readJson(path_0.resolve(process.cwd(), uri));
|
|
205
274
|
};
|
|
206
275
|
const loadAppResourceRecords = async (params)=>{
|
|
207
|
-
const { appDataUri,
|
|
208
|
-
if (
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const exp = jsonata(expression);
|
|
212
|
-
const appData = await exp.evaluate(rawData);
|
|
213
|
-
const { resourceRecords } = appData;
|
|
214
|
-
const apaasRecords = resourceRecords.map((record)=>({
|
|
215
|
-
id: record.id,
|
|
216
|
-
kind: record.kind,
|
|
217
|
-
parentId: record.parentId ?? null,
|
|
218
|
-
settings: record.settings ?? {}
|
|
219
|
-
}));
|
|
220
|
-
return {
|
|
221
|
-
resourceRecords: apaasRecords,
|
|
222
|
-
sourceType: "apaas"
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
if (!appDataUri) throw new Error("Missing appDataUri or apaasAppDataUri");
|
|
226
|
-
const appData = await readSourceData(appDataUri);
|
|
276
|
+
const { appDataUri, appDataExpression } = params;
|
|
277
|
+
if (!appDataUri) throw new Error("Missing appDataUri");
|
|
278
|
+
const rawData = await readSourceData(appDataUri);
|
|
279
|
+
const appData = appDataExpression ? await jsonata(appDataExpression).evaluate(rawData) : rawData;
|
|
227
280
|
return {
|
|
228
|
-
resourceRecords: appData.resourceRecords
|
|
229
|
-
sourceType: "runtime"
|
|
281
|
+
resourceRecords: appData.resourceRecords
|
|
230
282
|
};
|
|
231
283
|
};
|
|
232
284
|
const fetchAppData = async (params)=>{
|
|
@@ -331,4 +383,4 @@ const replaceResourceIds = (params)=>{
|
|
|
331
383
|
return res;
|
|
332
384
|
};
|
|
333
385
|
var __webpack_exports__DEFAULT_APP_MODULE_DIR_NAME = "app";
|
|
334
|
-
export { DEFAULT_APP_MODULE_HANDLER_DEPENDENCY_VERSION_TEMPLATE, DEFAULT_HANDLER_MODULE_PARENT_DIR_NAME, RUSH_JSON_PATH, constants_ZipAppDataLayout as ZipAppDataLayout, addFileToZipFolder, extendAppData, extendAppDataWithPath, fetchAppData, generate, generateByAppData, getAppData, getHandlerPackageJson, getTreeResourceRecords, instantiate_service_instantiateService as instantiateService, instantiateServices, loadAppResourceRecords, prepare, replaceResourceIds, syncRushProjects, zipAppData, __webpack_exports__DEFAULT_APP_MODULE_DIR_NAME as DEFAULT_APP_MODULE_DIR_NAME };
|
|
386
|
+
export { DEFAULT_APP_MODULE_HANDLER_DEPENDENCY_VERSION_TEMPLATE, DEFAULT_HANDLER_MODULE_PARENT_DIR_NAME, RUSH_JSON_PATH, constants_ZipAppDataLayout as ZipAppDataLayout, addFileToZipFolder, extendAppData, extendAppDataWithPath, fetchAppData, generate, generateAppIndexTs, generateByAppData, getAppData, getHandlerPackageJson, getTreeResourceRecords, instantiate_service_instantiateService as instantiateService, instantiateServices, loadAppResourceRecords, prepare, replaceResourceIds, syncRushProjects, zipAppData, __webpack_exports__DEFAULT_APP_MODULE_DIR_NAME as DEFAULT_APP_MODULE_DIR_NAME };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ldsg/utils",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.40",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "wanxger",
|
|
@@ -36,11 +36,10 @@
|
|
|
36
36
|
"jsonata": "2.2.2",
|
|
37
37
|
"jszip": "^3.10.1",
|
|
38
38
|
"lodash": "^4.17.21",
|
|
39
|
-
"@ldsg/
|
|
40
|
-
"@ldsg/
|
|
41
|
-
"@ldsg/
|
|
42
|
-
"@ldsg/
|
|
43
|
-
"@ldsg/handler": "0.3.37"
|
|
39
|
+
"@ldsg/core": "0.3.40",
|
|
40
|
+
"@ldsg/handler": "0.3.40",
|
|
41
|
+
"@ldsg/types": "0.3.40",
|
|
42
|
+
"@ldsg/constants": "0.3.40"
|
|
44
43
|
},
|
|
45
44
|
"devDependencies": {
|
|
46
45
|
"@rslib/core": "^0.17.1",
|