@ldsg/utils 0.3.38 → 0.3.41

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;
@@ -267,29 +336,12 @@ const readSourceData = async (uri)=>{
267
336
  return external_fs_extra_default().readJson(external_path_default().resolve(process.cwd(), uri));
268
337
  };
269
338
  const loadAppResourceRecords = async (params)=>{
270
- const { appDataUri, apaasAppDataUri, apaasAppDataExpression } = params;
271
- if (apaasAppDataUri) {
272
- const rawData = await readSourceData(apaasAppDataUri);
273
- const expression = apaasAppDataExpression || "$";
274
- const exp = external_jsonata_default()(expression);
275
- const appData = await exp.evaluate(rawData);
276
- const { resourceRecords } = appData;
277
- const apaasRecords = resourceRecords.map((record)=>({
278
- id: record.id,
279
- kind: record.kind,
280
- parentId: record.parentId ?? null,
281
- settings: record.settings ?? {}
282
- }));
283
- return {
284
- resourceRecords: apaasRecords,
285
- sourceType: "apaas"
286
- };
287
- }
288
- if (!appDataUri) throw new Error("Missing appDataUri or apaasAppDataUri");
289
- 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;
290
343
  return {
291
- resourceRecords: appData.resourceRecords,
292
- sourceType: "runtime"
344
+ resourceRecords: appData.resourceRecords
293
345
  };
294
346
  };
295
347
  const fetchAppData = async (params)=>{
@@ -405,6 +457,7 @@ exports.extendAppData = __webpack_exports__.extendAppData;
405
457
  exports.extendAppDataWithPath = __webpack_exports__.extendAppDataWithPath;
406
458
  exports.fetchAppData = __webpack_exports__.fetchAppData;
407
459
  exports.generate = __webpack_exports__.generate;
460
+ exports.generateAppIndexTs = __webpack_exports__.generateAppIndexTs;
408
461
  exports.generateByAppData = __webpack_exports__.generateByAppData;
409
462
  exports.getAppData = __webpack_exports__.getAppData;
410
463
  exports.getHandlerPackageJson = __webpack_exports__.getHandlerPackageJson;
@@ -427,6 +480,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
427
480
  "extendAppDataWithPath",
428
481
  "fetchAppData",
429
482
  "generate",
483
+ "generateAppIndexTs",
430
484
  "generateByAppData",
431
485
  "getAppData",
432
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;
@@ -205,29 +273,12 @@ const readSourceData = async (uri)=>{
205
273
  return fs_extra.readJson(path_0.resolve(process.cwd(), uri));
206
274
  };
207
275
  const loadAppResourceRecords = async (params)=>{
208
- const { appDataUri, apaasAppDataUri, apaasAppDataExpression } = params;
209
- if (apaasAppDataUri) {
210
- const rawData = await readSourceData(apaasAppDataUri);
211
- const expression = apaasAppDataExpression || "$";
212
- const exp = jsonata(expression);
213
- const appData = await exp.evaluate(rawData);
214
- const { resourceRecords } = appData;
215
- const apaasRecords = resourceRecords.map((record)=>({
216
- id: record.id,
217
- kind: record.kind,
218
- parentId: record.parentId ?? null,
219
- settings: record.settings ?? {}
220
- }));
221
- return {
222
- resourceRecords: apaasRecords,
223
- sourceType: "apaas"
224
- };
225
- }
226
- if (!appDataUri) throw new Error("Missing appDataUri or apaasAppDataUri");
227
- 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;
228
280
  return {
229
- resourceRecords: appData.resourceRecords,
230
- sourceType: "runtime"
281
+ resourceRecords: appData.resourceRecords
231
282
  };
232
283
  };
233
284
  const fetchAppData = async (params)=>{
@@ -332,4 +383,4 @@ const replaceResourceIds = (params)=>{
332
383
  return res;
333
384
  };
334
385
  var __webpack_exports__DEFAULT_APP_MODULE_DIR_NAME = "app";
335
- 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.38",
3
+ "version": "0.3.41",
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.38",
40
- "@ldsg/constants": "0.3.38",
41
- "@ldsg/core": "0.3.38",
42
- "@ldsg/handler": "0.3.38",
43
- "@ldsg/types": "0.3.38"
39
+ "@ldsg/core": "0.3.41",
40
+ "@ldsg/handler": "0.3.41",
41
+ "@ldsg/constants": "0.3.41",
42
+ "@ldsg/types": "0.3.41"
44
43
  },
45
44
  "devDependencies": {
46
45
  "@rslib/core": "^0.17.1",