@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;
@@ -1,2 +1,3 @@
1
1
  export * from "./add-file-to-zip-folder";
2
+ export * from "./generate-app-index-ts";
2
3
  export * from "./get-handler-package-json";
@@ -1,12 +1,10 @@
1
1
  import { AppData, ResourceRecords } from "@ldsg/types";
2
2
  export interface LoadAppResourceRecordsParams {
3
3
  appDataUri?: string;
4
- apaasAppDataUri?: string;
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 kind === apaas_constants_namespaceObject.ApaasResourceKind.HANDLER;
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, apaasAppDataUri, apaasAppDataExpression } = params;
270
- if (apaasAppDataUri) {
271
- const rawData = await readSourceData(apaasAppDataUri);
272
- const expression = apaasAppDataExpression || "$";
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 kind === ApaasResourceKind.HANDLER;
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, apaasAppDataUri, apaasAppDataExpression } = params;
208
- if (apaasAppDataUri) {
209
- const rawData = await readSourceData(apaasAppDataUri);
210
- const expression = apaasAppDataExpression || "$";
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.37",
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/apaas-constants": "0.3.37",
40
- "@ldsg/constants": "0.3.37",
41
- "@ldsg/core": "0.3.37",
42
- "@ldsg/types": "0.3.37",
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",