@nx-ddd/excel 19.2.1 → 19.3.0
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/fesm2022/nx-ddd-excel-impl.mjs +60 -0
- package/fesm2022/nx-ddd-excel-impl.mjs.map +1 -0
- package/fesm2022/nx-ddd-excel-infra.mjs +59 -0
- package/fesm2022/nx-ddd-excel-infra.mjs.map +1 -0
- package/fesm2022/nx-ddd-excel-tokens.mjs +13 -0
- package/fesm2022/nx-ddd-excel-tokens.mjs.map +1 -0
- package/fesm2022/nx-ddd-excel.mjs +217 -0
- package/fesm2022/nx-ddd-excel.mjs.map +1 -0
- package/impl/index.d.ts +11 -0
- package/index.d.ts +67 -0
- package/infra/index.d.ts +35 -0
- package/package.json +22 -19
- package/tokens/index.d.ts +8 -0
- package/README.md +0 -123
- package/src/index.js +0 -5
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
5
|
+
import { dirname } from 'path';
|
|
6
|
+
|
|
7
|
+
class ExcelServiceImpl {
|
|
8
|
+
async readSheet(path, sheetName) {
|
|
9
|
+
if (!existsSync(path)) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const workbook = XLSX.readFile(path);
|
|
13
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
14
|
+
if (!worksheet) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
return XLSX.utils.sheet_to_json(worksheet);
|
|
18
|
+
}
|
|
19
|
+
async writeSheet(path, sheetName, records, headers) {
|
|
20
|
+
// Ensure directory exists
|
|
21
|
+
const dir = dirname(path);
|
|
22
|
+
if (!existsSync(dir)) {
|
|
23
|
+
mkdirSync(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
// Create or read existing workbook
|
|
26
|
+
let workbook;
|
|
27
|
+
if (existsSync(path)) {
|
|
28
|
+
workbook = XLSX.readFile(path);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
workbook = XLSX.utils.book_new();
|
|
32
|
+
}
|
|
33
|
+
// Create worksheet from records
|
|
34
|
+
const worksheet = XLSX.utils.json_to_sheet(records, { header: headers });
|
|
35
|
+
// Set column widths
|
|
36
|
+
const colWidths = headers.map(header => ({ wch: Math.max(header.length + 5, 20) }));
|
|
37
|
+
worksheet['!cols'] = colWidths;
|
|
38
|
+
// Add or replace worksheet
|
|
39
|
+
if (workbook.Sheets[sheetName]) {
|
|
40
|
+
workbook.Sheets[sheetName] = worksheet;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
44
|
+
}
|
|
45
|
+
// Write file
|
|
46
|
+
XLSX.writeFile(workbook, path);
|
|
47
|
+
}
|
|
48
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
49
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelServiceImpl });
|
|
50
|
+
}
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelServiceImpl, decorators: [{
|
|
52
|
+
type: Injectable
|
|
53
|
+
}] });
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generated bundle index. Do not edit.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
export { ExcelServiceImpl };
|
|
60
|
+
//# sourceMappingURL=nx-ddd-excel-impl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx-ddd-excel-impl.mjs","sources":["../tmp-esm2022/impl/excel.service.impl.js","../tmp-esm2022/impl/nx-ddd-excel-impl.js"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as XLSX from 'xlsx';\nimport { existsSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\nimport * as i0 from \"@angular/core\";\nexport class ExcelServiceImpl {\n async readSheet(path, sheetName) {\n if (!existsSync(path)) {\n return [];\n }\n const workbook = XLSX.readFile(path);\n const worksheet = workbook.Sheets[sheetName];\n if (!worksheet) {\n return [];\n }\n return XLSX.utils.sheet_to_json(worksheet);\n }\n async writeSheet(path, sheetName, records, headers) {\n // Ensure directory exists\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n // Create or read existing workbook\n let workbook;\n if (existsSync(path)) {\n workbook = XLSX.readFile(path);\n }\n else {\n workbook = XLSX.utils.book_new();\n }\n // Create worksheet from records\n const worksheet = XLSX.utils.json_to_sheet(records, { header: headers });\n // Set column widths\n const colWidths = headers.map(header => ({ wch: Math.max(header.length + 5, 20) }));\n worksheet['!cols'] = colWidths;\n // Add or replace worksheet\n if (workbook.Sheets[sheetName]) {\n workbook.Sheets[sheetName] = worksheet;\n }\n else {\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n }\n // Write file\n XLSX.writeFile(workbook, path);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelServiceImpl });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelServiceImpl, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwuc2VydmljZS5pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQG54LWRkZC9leGNlbC9zcmMvbGliL2ltcGwvZXhjZWwuc2VydmljZS5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFJL0IsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixLQUFLLENBQUMsU0FBUyxDQUFDLElBQVksRUFBRSxTQUFpQjtRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQWlCLEVBQUUsT0FBYyxFQUFFLE9BQWlCO1FBQ2pGLDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksUUFBdUIsQ0FBQztRQUM1QixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV6RSxvQkFBb0I7UUFDcEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBRS9CLDJCQUEyQjtRQUMzQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvQixRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsYUFBYTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7dUdBL0NVLGdCQUFnQjsyR0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gJ0BueC1kZGQvZXhjZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXhjZWxTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEV4Y2VsU2VydmljZSB7XG4gIGFzeW5jIHJlYWRTaGVldChwYXRoOiBzdHJpbmcsIHNoZWV0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtib29rID0gWExTWC5yZWFkRmlsZShwYXRoKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcblxuICAgIGlmICghd29ya3NoZWV0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQpO1xuICB9XG5cbiAgYXN5bmMgd3JpdGVTaGVldChwYXRoOiBzdHJpbmcsIHNoZWV0TmFtZTogc3RyaW5nLCByZWNvcmRzOiBhbnlbXSwgaGVhZGVyczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGNvbnN0IGRpciA9IGRpcm5hbWUocGF0aCk7XG4gICAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHtcbiAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBvciByZWFkIGV4aXN0aW5nIHdvcmtib29rXG4gICAgbGV0IHdvcmtib29rOiBYTFNYLldvcmtCb29rO1xuICAgIGlmIChleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICB3b3JrYm9vayA9IFhMU1gucmVhZEZpbGUocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdvcmtib29rID0gWExTWC51dGlscy5ib29rX25ldygpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB3b3Jrc2hlZXQgZnJvbSByZWNvcmRzXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KHJlY29yZHMsIHsgaGVhZGVyOiBoZWFkZXJzIH0pO1xuXG4gICAgLy8gU2V0IGNvbHVtbiB3aWR0aHNcbiAgICBjb25zdCBjb2xXaWR0aHMgPSBoZWFkZXJzLm1hcChoZWFkZXIgPT4gKHsgd2NoOiBNYXRoLm1heChoZWFkZXIubGVuZ3RoICsgNSwgMjApIH0pKTtcbiAgICB3b3Jrc2hlZXRbJyFjb2xzJ10gPSBjb2xXaWR0aHM7XG5cbiAgICAvLyBBZGQgb3IgcmVwbGFjZSB3b3Jrc2hlZXRcbiAgICBpZiAod29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV0pIHtcbiAgICAgIHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdID0gd29ya3NoZWV0O1xuICAgIH0gZWxzZSB7XG4gICAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCB3b3Jrc2hlZXQsIHNoZWV0TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgZmlsZVxuICAgIFhMU1gud3JpdGVGaWxlKHdvcmtib29rLCBwYXRoKTtcbiAgfVxufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtZGRkLWV4Y2VsLWltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbngtZGRkL2V4Y2VsL3NyYy9saWIvaW1wbC9ueC1kZGQtZXhjZWwtaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;;;;;AAKO,MAAM,gBAAgB,CAAC;AAC9B,IAAI,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE;AACrC,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC/B,YAAY,OAAO,EAAE;AACrB;AACA,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5C,QAAQ,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;AACpD,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,YAAY,OAAO,EAAE;AACrB;AACA,QAAQ,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;AAClD;AACA,IAAI,MAAM,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;AACxD;AACA,QAAQ,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;AACjC,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9B,YAAY,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/C;AACA;AACA,QAAQ,IAAI,QAAQ;AACpB,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAY,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC1C;AACA,aAAa;AACb,YAAY,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC5C;AACA;AACA,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAChF;AACA,QAAQ,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3F,QAAQ,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS;AACtC;AACA,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;AACxC,YAAY,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS;AAClD;AACA,aAAa;AACb,YAAY,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;AACxE;AACA;AACA,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;AACtC;AACA,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;AAC3K,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AAC9H;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;AAC1H,YAAY,IAAI,EAAE;AAClB,SAAS,CAAC,EAAE,CAAC;;ACnDb;AACA;AACA;;;;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, inject } from '@angular/core';
|
|
3
|
+
import { makeDI } from '@nx-ddd/core';
|
|
4
|
+
import * as i1 from '@nx-ddd/excel';
|
|
5
|
+
import { getConverter, getHeaders } from '@nx-ddd/excel';
|
|
6
|
+
import { EXCEL_SERVICE } from '@nx-ddd/excel/tokens';
|
|
7
|
+
import { ExcelServiceImpl } from '@nx-ddd/excel/impl';
|
|
8
|
+
|
|
9
|
+
class BaseExcelRepository {
|
|
10
|
+
async list() {
|
|
11
|
+
const records = await this.excelService.readSheet(this.path, this.sheetName);
|
|
12
|
+
return this.converter.fromExcelMany(records);
|
|
13
|
+
}
|
|
14
|
+
async saveMany(entities) {
|
|
15
|
+
const records = this.converter.toExcelMany(entities);
|
|
16
|
+
await this.excelService.writeSheet(this.path, this.sheetName, records, this.headers);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
class ExcelRepository extends BaseExcelRepository {
|
|
20
|
+
path;
|
|
21
|
+
sheetName;
|
|
22
|
+
converter;
|
|
23
|
+
headers;
|
|
24
|
+
excelService;
|
|
25
|
+
constructor(path, sheetName, converter, headers, excelService) {
|
|
26
|
+
super();
|
|
27
|
+
this.path = path;
|
|
28
|
+
this.sheetName = sheetName;
|
|
29
|
+
this.converter = converter;
|
|
30
|
+
this.headers = headers;
|
|
31
|
+
this.excelService = excelService;
|
|
32
|
+
}
|
|
33
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelRepository, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
|
|
34
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelRepository });
|
|
35
|
+
}
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ExcelRepository, decorators: [{
|
|
37
|
+
type: Injectable
|
|
38
|
+
}], ctorParameters: () => [{ type: undefined }, { type: undefined }, { type: i1.ExcelConverter }, { type: undefined }, { type: undefined }] });
|
|
39
|
+
// Create DI token for ExcelRepository
|
|
40
|
+
const EXCEL_REPOSITORY = makeDI('[@nx-ddd/excel] ExcelRepository');
|
|
41
|
+
function getExcelRepository(Entity, config) {
|
|
42
|
+
const { path, sheetName = Entity.name, converter = getConverter(Entity), headers = getHeaders(Entity) } = config;
|
|
43
|
+
// Try to inject ExcelService, fallback to creating new instance
|
|
44
|
+
let excelService;
|
|
45
|
+
try {
|
|
46
|
+
excelService = inject(EXCEL_SERVICE);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
excelService = new ExcelServiceImpl();
|
|
50
|
+
}
|
|
51
|
+
return new ExcelRepository(path, sheetName, converter, headers, excelService);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Generated bundle index. Do not edit.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
export { BaseExcelRepository, EXCEL_REPOSITORY, ExcelRepository, getExcelRepository };
|
|
59
|
+
//# sourceMappingURL=nx-ddd-excel-infra.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx-ddd-excel-infra.mjs","sources":["../tmp-esm2022/infra/excel.repository.impl.js","../tmp-esm2022/infra/nx-ddd-excel-infra.js"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { makeDI } from '@nx-ddd/core';\nimport { ExcelConverter, getConverter, getHeaders } from '@nx-ddd/excel';\nimport { EXCEL_SERVICE } from '@nx-ddd/excel/tokens';\nimport { ExcelServiceImpl } from '@nx-ddd/excel/impl';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@nx-ddd/excel\";\nexport class BaseExcelRepository {\n async list() {\n const records = await this.excelService.readSheet(this.path, this.sheetName);\n return this.converter.fromExcelMany(records);\n }\n async saveMany(entities) {\n const records = this.converter.toExcelMany(entities);\n await this.excelService.writeSheet(this.path, this.sheetName, records, this.headers);\n }\n}\nexport class ExcelRepository extends BaseExcelRepository {\n path;\n sheetName;\n converter;\n headers;\n excelService;\n constructor(path, sheetName, converter, headers, excelService) {\n super();\n this.path = path;\n this.sheetName = sheetName;\n this.converter = converter;\n this.headers = headers;\n this.excelService = excelService;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelRepository, deps: \"invalid\", target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelRepository });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.5\", ngImport: i0, type: ExcelRepository, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: undefined }, { type: undefined }, { type: i1.ExcelConverter }, { type: undefined }, { type: undefined }] });\n// Create DI token for ExcelRepository\nexport const EXCEL_REPOSITORY = makeDI('[@nx-ddd/excel] ExcelRepository');\nexport function getExcelRepository(Entity, config) {\n const { path, sheetName = Entity.name, converter = getConverter(Entity), headers = getHeaders(Entity) } = config;\n // Try to inject ExcelService, fallback to creating new instance\n let excelService;\n try {\n excelService = inject(EXCEL_SERVICE);\n }\n catch {\n excelService = new ExcelServiceImpl();\n }\n return new ExcelRepository(path, sheetName, converter, headers, excelService);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwucmVwb3NpdG9yeS5pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQG54LWRkZC9leGNlbC9zcmMvbGliL2luZnJhL2V4Y2VsLnJlcG9zaXRvcnkuaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBZ0IsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFTdEQsTUFBTSxPQUFnQixtQkFBbUI7SUFPdkMsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBYTtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxlQUFtQixTQUFRLG1CQUFzQjtJQUUxQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBTGxCLFlBQ2tCLElBQVksRUFDWixTQUFpQixFQUNqQixTQUE0QixFQUM1QixPQUFpQixFQUNqQixZQUEwQjtRQUUxQyxLQUFLLEVBQUUsQ0FBQztRQU5RLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFHNUMsQ0FBQzt1R0FUVSxlQUFlOzJHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRDNCLFVBQVU7O0FBYVgsc0NBQXNDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBdUIsaUNBQWlDLENBQUMsQ0FBQztBQUVoRyxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE1BQWUsRUFDZixNQUE2QjtJQUU3QixNQUFNLEVBQ0osSUFBSSxFQUNKLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUN2QixTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUNoQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUM3QixHQUFHLE1BQU0sQ0FBQztJQUVYLGdFQUFnRTtJQUNoRSxJQUFJLFlBQTBCLENBQUM7SUFDL0IsSUFBSSxDQUFDO1FBQ0gsWUFBWSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsWUFBWSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsT0FBTyxJQUFJLGVBQWUsQ0FDeEIsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFlBQVksQ0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFR5cGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWFrZURJIH0gZnJvbSAnQG54LWRkZC9jb3JlJztcbmltcG9ydCB7IEV4Y2VsU2VydmljZSwgRXhjZWxDb252ZXJ0ZXIsIGdldENvbnZlcnRlciwgZ2V0SGVhZGVycyB9IGZyb20gJ0BueC1kZGQvZXhjZWwnO1xuaW1wb3J0IHsgRVhDRUxfU0VSVklDRSB9IGZyb20gJ0BueC1kZGQvZXhjZWwvdG9rZW5zJztcbmltcG9ydCB7IEV4Y2VsU2VydmljZUltcGwgfSBmcm9tICdAbngtZGRkL2V4Y2VsL2ltcGwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2VsUmVwb3NpdG9yeUNvbmZpZyB7XG4gIHBhdGg6IHN0cmluZztcbiAgc2hlZXROYW1lPzogc3RyaW5nO1xuICBjb252ZXJ0ZXI/OiBFeGNlbENvbnZlcnRlcjxhbnk+O1xuICBoZWFkZXJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXhjZWxSZXBvc2l0b3J5PFQ+IHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHNoZWV0TmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgY29udmVydGVyOiBFeGNlbENvbnZlcnRlcjxUPjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGhlYWRlcnM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZXhjZWxTZXJ2aWNlOiBFeGNlbFNlcnZpY2U7XG5cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmV4Y2VsU2VydmljZS5yZWFkU2hlZXQodGhpcy5wYXRoLCB0aGlzLnNoZWV0TmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydGVyLmZyb21FeGNlbE1hbnkocmVjb3Jkcyk7XG4gIH1cblxuICBhc3luYyBzYXZlTWFueShlbnRpdGllczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IHRoaXMuY29udmVydGVyLnRvRXhjZWxNYW55KGVudGl0aWVzKTtcbiAgICBhd2FpdCB0aGlzLmV4Y2VsU2VydmljZS53cml0ZVNoZWV0KHRoaXMucGF0aCwgdGhpcy5zaGVldE5hbWUsIHJlY29yZHMsIHRoaXMuaGVhZGVycyk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEV4Y2VsUmVwb3NpdG9yeTxUPiBleHRlbmRzIEJhc2VFeGNlbFJlcG9zaXRvcnk8VD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udmVydGVyOiBFeGNlbENvbnZlcnRlcjxUPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVyczogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLy8gQ3JlYXRlIERJIHRva2VuIGZvciBFeGNlbFJlcG9zaXRvcnlcbmV4cG9ydCBjb25zdCBFWENFTF9SRVBPU0lUT1JZID0gbWFrZURJPEV4Y2VsUmVwb3NpdG9yeTxhbnk+PignW0BueC1kZGQvZXhjZWxdIEV4Y2VsUmVwb3NpdG9yeScpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhjZWxSZXBvc2l0b3J5PFQ+KFxuICBFbnRpdHk6IFR5cGU8VD4sXG4gIGNvbmZpZzogRXhjZWxSZXBvc2l0b3J5Q29uZmlnXG4pOiBFeGNlbFJlcG9zaXRvcnk8VD4ge1xuICBjb25zdCB7XG4gICAgcGF0aCxcbiAgICBzaGVldE5hbWUgPSBFbnRpdHkubmFtZSxcbiAgICBjb252ZXJ0ZXIgPSBnZXRDb252ZXJ0ZXIoRW50aXR5KSxcbiAgICBoZWFkZXJzID0gZ2V0SGVhZGVycyhFbnRpdHkpXG4gIH0gPSBjb25maWc7XG5cbiAgLy8gVHJ5IHRvIGluamVjdCBFeGNlbFNlcnZpY2UsIGZhbGxiYWNrIHRvIGNyZWF0aW5nIG5ldyBpbnN0YW5jZVxuICBsZXQgZXhjZWxTZXJ2aWNlOiBFeGNlbFNlcnZpY2U7XG4gIHRyeSB7XG4gICAgZXhjZWxTZXJ2aWNlID0gaW5qZWN0KEVYQ0VMX1NFUlZJQ0UpO1xuICB9IGNhdGNoIHtcbiAgICBleGNlbFNlcnZpY2UgPSBuZXcgRXhjZWxTZXJ2aWNlSW1wbCgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFeGNlbFJlcG9zaXRvcnkoXG4gICAgcGF0aCxcbiAgICBzaGVldE5hbWUsXG4gICAgY29udmVydGVyLFxuICAgIGhlYWRlcnMsXG4gICAgZXhjZWxTZXJ2aWNlXG4gICk7XG59XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtZGRkLWV4Y2VsLWluZnJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQG54LWRkZC9leGNlbC9zcmMvbGliL2luZnJhL254LWRkZC1leGNlbC1pbmZyYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { makeDI } from '@nx-ddd/core';
|
|
2
|
+
|
|
3
|
+
// Use makeDI for ExcelService token
|
|
4
|
+
const EXCEL_SERVICE_DI = makeDI('[@nx-ddd/excel] ExcelService');
|
|
5
|
+
// Export the token for backward compatibility
|
|
6
|
+
const EXCEL_SERVICE = EXCEL_SERVICE_DI.token;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Generated bundle index. Do not edit.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { EXCEL_SERVICE, EXCEL_SERVICE_DI };
|
|
13
|
+
//# sourceMappingURL=nx-ddd-excel-tokens.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx-ddd-excel-tokens.mjs","sources":["../tmp-esm2022/tokens/excel.token.js","../tmp-esm2022/tokens/nx-ddd-excel-tokens.js"],"sourcesContent":["import { makeDI } from '@nx-ddd/core';\n// Use makeDI for ExcelService token\nexport const EXCEL_SERVICE_DI = makeDI('[@nx-ddd/excel] ExcelService');\n// Export the token for backward compatibility\nexport const EXCEL_SERVICE = EXCEL_SERVICE_DI.token;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwudG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AbngtZGRkL2V4Y2VsL3NyYy9saWIvdG9rZW5zL2V4Y2VsLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBZSw4QkFBOEIsQ0FBQyxDQUFDO0FBRXJGLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZURJIH0gZnJvbSAnQG54LWRkZC9jb3JlJztcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gJ0BueC1kZGQvZXhjZWwnO1xuXG4vLyBVc2UgbWFrZURJIGZvciBFeGNlbFNlcnZpY2UgdG9rZW5cbmV4cG9ydCBjb25zdCBFWENFTF9TRVJWSUNFX0RJID0gbWFrZURJPEV4Y2VsU2VydmljZT4oJ1tAbngtZGRkL2V4Y2VsXSBFeGNlbFNlcnZpY2UnKTtcblxuLy8gRXhwb3J0IHRoZSB0b2tlbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuZXhwb3J0IGNvbnN0IEVYQ0VMX1NFUlZJQ0UgPSBFWENFTF9TRVJWSUNFX0RJLnRva2VuO1xuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtZGRkLWV4Y2VsLXRva2Vucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BueC1kZGQvZXhjZWwvc3JjL2xpYi90b2tlbnMvbngtZGRkLWV4Y2VsLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;AACA;AACY,MAAC,gBAAgB,GAAG,MAAM,CAAC,8BAA8B;AACrE;AACY,MAAC,aAAa,GAAG,gBAAgB,CAAC;;ACJ9C;AACA;AACA;;;;"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
|
|
3
|
+
const EXCEL_METADATA_KEY = Symbol('excel');
|
|
4
|
+
function createDecorator(type, decoratorOptions = {}) {
|
|
5
|
+
return function (name, options = {}) {
|
|
6
|
+
return function (target, propertyKey) {
|
|
7
|
+
const metadata = Reflect.getMetadata(EXCEL_METADATA_KEY, target.constructor) || {
|
|
8
|
+
fields: new Map()
|
|
9
|
+
};
|
|
10
|
+
metadata.fields.set(propertyKey, {
|
|
11
|
+
name,
|
|
12
|
+
type,
|
|
13
|
+
index: options.index,
|
|
14
|
+
childType: decoratorOptions.childType
|
|
15
|
+
});
|
|
16
|
+
Reflect.defineMetadata(EXCEL_METADATA_KEY, metadata, target.constructor);
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const Excel = {
|
|
21
|
+
Text: createDecorator('text'),
|
|
22
|
+
Date: createDecorator('date'),
|
|
23
|
+
Number: createDecorator('number'),
|
|
24
|
+
Boolean: createDecorator('boolean'),
|
|
25
|
+
Array: createDecorator('array'),
|
|
26
|
+
Type: (name, childType, options = {}) => createDecorator('type', { childType })(name, options),
|
|
27
|
+
};
|
|
28
|
+
function getExcelMetadata(target) {
|
|
29
|
+
return Reflect.getMetadata(EXCEL_METADATA_KEY, target);
|
|
30
|
+
}
|
|
31
|
+
function getHeaders(target) {
|
|
32
|
+
const metadata = getExcelMetadata(target);
|
|
33
|
+
if (!metadata)
|
|
34
|
+
return [];
|
|
35
|
+
const fields = Array.from(metadata.fields.entries())
|
|
36
|
+
.map(([key, options]) => ({ key, ...options }))
|
|
37
|
+
.sort((a, b) => (a.index ?? 999) - (b.index ?? 999));
|
|
38
|
+
return fields.map(field => field.name);
|
|
39
|
+
}
|
|
40
|
+
function getFields(target, caseStyle = 'camel') {
|
|
41
|
+
const metadata = getExcelMetadata(target);
|
|
42
|
+
if (!metadata)
|
|
43
|
+
return [];
|
|
44
|
+
const fields = Array.from(metadata.fields.keys());
|
|
45
|
+
if (caseStyle === 'snake') {
|
|
46
|
+
return fields.map(field => field.replace(/([A-Z])/g, '_$1').toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
return fields;
|
|
49
|
+
}
|
|
50
|
+
function getFlattenFieldAnnotations(target, prefix = '', propertyPrefix = '') {
|
|
51
|
+
const metadata = getExcelMetadata(target);
|
|
52
|
+
const result = {};
|
|
53
|
+
if (metadata) {
|
|
54
|
+
metadata.fields.forEach((options, key) => {
|
|
55
|
+
const fieldName = prefix ? `${prefix}_${options.name}` : options.name;
|
|
56
|
+
const propertyPath = propertyPrefix ? `${propertyPrefix}.${key}` : key;
|
|
57
|
+
if (options.type === 'type' && options.childType) {
|
|
58
|
+
const nestedFields = getFlattenFieldAnnotations(options.childType(), fieldName, propertyPath);
|
|
59
|
+
Object.assign(result, nestedFields);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
result[propertyPath] = {
|
|
63
|
+
...options,
|
|
64
|
+
name: fieldName
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const EXCEL_EPOCH = new Date(1899, 11, 30);
|
|
73
|
+
class ExcelConverter {
|
|
74
|
+
fromExcelMany(records) {
|
|
75
|
+
return records.map(record => this.fromExcel(record));
|
|
76
|
+
}
|
|
77
|
+
toExcelMany(models) {
|
|
78
|
+
return models.map(model => this.toExcel(model));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class DefaultExcelConverter extends ExcelConverter {
|
|
82
|
+
Entity;
|
|
83
|
+
constructor(Entity) {
|
|
84
|
+
super();
|
|
85
|
+
this.Entity = Entity;
|
|
86
|
+
}
|
|
87
|
+
fromExcel(record) {
|
|
88
|
+
const annotations = getFlattenFieldAnnotations(this.Entity);
|
|
89
|
+
const instance = new this.Entity();
|
|
90
|
+
Object.entries(annotations).forEach(([propertyKey, options]) => {
|
|
91
|
+
const value = record[options.name];
|
|
92
|
+
const convertedValue = this.convertValue(value, options.type);
|
|
93
|
+
const parts = propertyKey.split('.');
|
|
94
|
+
if (parts.length === 1) {
|
|
95
|
+
instance[propertyKey] = convertedValue;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
let current = instance;
|
|
99
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
100
|
+
if (!current[parts[i]]) {
|
|
101
|
+
current[parts[i]] = {};
|
|
102
|
+
}
|
|
103
|
+
current = current[parts[i]];
|
|
104
|
+
}
|
|
105
|
+
current[parts[parts.length - 1]] = convertedValue;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return instance;
|
|
109
|
+
}
|
|
110
|
+
convertValue(value, type) {
|
|
111
|
+
switch (type) {
|
|
112
|
+
case 'date':
|
|
113
|
+
return this.excelDateToJsDate(value);
|
|
114
|
+
case 'number':
|
|
115
|
+
return this.toNumber(value);
|
|
116
|
+
case 'boolean':
|
|
117
|
+
return this.toBoolean(value);
|
|
118
|
+
case 'array':
|
|
119
|
+
return this.toArray(value);
|
|
120
|
+
default:
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
toExcel(model) {
|
|
125
|
+
const annotations = getFlattenFieldAnnotations(this.Entity);
|
|
126
|
+
const record = {};
|
|
127
|
+
Object.entries(annotations).forEach(([propertyKey, options]) => {
|
|
128
|
+
const value = this.getNestedValue(model, propertyKey);
|
|
129
|
+
switch (options.type) {
|
|
130
|
+
case 'date':
|
|
131
|
+
record[options.name] = this.jsDateToExcelDate(value);
|
|
132
|
+
break;
|
|
133
|
+
case 'boolean':
|
|
134
|
+
record[options.name] = value === undefined || value === null ? '' : (value ? 'TRUE' : 'FALSE');
|
|
135
|
+
break;
|
|
136
|
+
case 'array':
|
|
137
|
+
record[options.name] = Array.isArray(value) ? value.join(',') : '';
|
|
138
|
+
break;
|
|
139
|
+
case 'number':
|
|
140
|
+
record[options.name] = value === undefined || value === null ? '' : value;
|
|
141
|
+
break;
|
|
142
|
+
default:
|
|
143
|
+
record[options.name] = value ?? '';
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return record;
|
|
147
|
+
}
|
|
148
|
+
getNestedValue(obj, path) {
|
|
149
|
+
if (obj && obj.hasOwnProperty(path)) {
|
|
150
|
+
return obj[path];
|
|
151
|
+
}
|
|
152
|
+
const parts = path.split('.');
|
|
153
|
+
let current = obj;
|
|
154
|
+
for (const part of parts) {
|
|
155
|
+
if (current && typeof current === 'object' && part in current) {
|
|
156
|
+
current = current[part];
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return current;
|
|
163
|
+
}
|
|
164
|
+
excelDateToJsDate(excelDate) {
|
|
165
|
+
if (!excelDate)
|
|
166
|
+
return null;
|
|
167
|
+
if (excelDate instanceof Date)
|
|
168
|
+
return excelDate;
|
|
169
|
+
if (typeof excelDate === 'string' && excelDate.includes('-')) {
|
|
170
|
+
return new Date(excelDate);
|
|
171
|
+
}
|
|
172
|
+
const serialNumber = Number(excelDate);
|
|
173
|
+
if (!isNaN(serialNumber)) {
|
|
174
|
+
const date = new Date(EXCEL_EPOCH);
|
|
175
|
+
date.setDate(date.getDate() + serialNumber);
|
|
176
|
+
return date;
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
jsDateToExcelDate(date) {
|
|
181
|
+
if (!date)
|
|
182
|
+
return '';
|
|
183
|
+
return date.toISOString();
|
|
184
|
+
}
|
|
185
|
+
toNumber(value) {
|
|
186
|
+
if (value === '' || value === null || value === undefined)
|
|
187
|
+
return null;
|
|
188
|
+
const num = Number(value);
|
|
189
|
+
return isNaN(num) ? null : num;
|
|
190
|
+
}
|
|
191
|
+
toBoolean(value) {
|
|
192
|
+
if (typeof value === 'boolean')
|
|
193
|
+
return value;
|
|
194
|
+
if (typeof value === 'string') {
|
|
195
|
+
return value.toUpperCase() === 'TRUE' || value === '1';
|
|
196
|
+
}
|
|
197
|
+
return Boolean(value);
|
|
198
|
+
}
|
|
199
|
+
toArray(value) {
|
|
200
|
+
if (Array.isArray(value))
|
|
201
|
+
return value;
|
|
202
|
+
if (typeof value === 'string' && value) {
|
|
203
|
+
return value.split(',').map(v => v.trim());
|
|
204
|
+
}
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function getConverter(Entity) {
|
|
209
|
+
return new DefaultExcelConverter(Entity);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Generated bundle index. Do not edit.
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
export { DefaultExcelConverter, Excel, ExcelConverter, getConverter, getExcelMetadata, getFields, getFlattenFieldAnnotations, getHeaders };
|
|
217
|
+
//# sourceMappingURL=nx-ddd-excel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx-ddd-excel.mjs","sources":["../tmp-esm2022/decorators/excel.decorators.js","../tmp-esm2022/converter/excel.converter.js","../tmp-esm2022/nx-ddd-excel.js"],"sourcesContent":["import 'reflect-metadata';\nconst EXCEL_METADATA_KEY = Symbol('excel');\nfunction createDecorator(type, decoratorOptions = {}) {\n return function (name, options = {}) {\n return function (target, propertyKey) {\n const metadata = Reflect.getMetadata(EXCEL_METADATA_KEY, target.constructor) || {\n fields: new Map()\n };\n metadata.fields.set(propertyKey, {\n name,\n type,\n index: options.index,\n childType: decoratorOptions.childType\n });\n Reflect.defineMetadata(EXCEL_METADATA_KEY, metadata, target.constructor);\n };\n };\n}\nexport const Excel = {\n Text: createDecorator('text'),\n Date: createDecorator('date'),\n Number: createDecorator('number'),\n Boolean: createDecorator('boolean'),\n Array: createDecorator('array'),\n Type: (name, childType, options = {}) => createDecorator('type', { childType })(name, options),\n};\nexport function getExcelMetadata(target) {\n return Reflect.getMetadata(EXCEL_METADATA_KEY, target);\n}\nexport function getHeaders(target) {\n const metadata = getExcelMetadata(target);\n if (!metadata)\n return [];\n const fields = Array.from(metadata.fields.entries())\n .map(([key, options]) => ({ key, ...options }))\n .sort((a, b) => (a.index ?? 999) - (b.index ?? 999));\n return fields.map(field => field.name);\n}\nexport function getFields(target, caseStyle = 'camel') {\n const metadata = getExcelMetadata(target);\n if (!metadata)\n return [];\n const fields = Array.from(metadata.fields.keys());\n if (caseStyle === 'snake') {\n return fields.map(field => field.replace(/([A-Z])/g, '_$1').toLowerCase());\n }\n return fields;\n}\nexport function getFlattenFieldAnnotations(target, prefix = '', propertyPrefix = '') {\n const metadata = getExcelMetadata(target);\n const result = {};\n if (metadata) {\n metadata.fields.forEach((options, key) => {\n const fieldName = prefix ? `${prefix}_${options.name}` : options.name;\n const propertyPath = propertyPrefix ? `${propertyPrefix}.${key}` : key;\n if (options.type === 'type' && options.childType) {\n const nestedFields = getFlattenFieldAnnotations(options.childType(), fieldName, propertyPath);\n Object.assign(result, nestedFields);\n }\n else {\n result[propertyPath] = {\n ...options,\n name: fieldName\n };\n }\n });\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwuZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BueC1kZGQvZXhjZWwvc3JjL2xpYi9kZWNvcmF0b3JzL2V4Y2VsLmRlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUUxQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQWEzQyxTQUFTLGVBQWUsQ0FBQyxJQUErQixFQUFFLG1CQUE4QyxFQUFFO0lBQ3hHLE9BQU8sVUFBVSxJQUFZLEVBQUUsVUFBOEIsRUFBRTtRQUM3RCxPQUFPLFVBQVUsTUFBVyxFQUFFLFdBQW1CO1lBQy9DLE1BQU0sUUFBUSxHQUFrQixPQUFPLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDN0YsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO2FBQ2xCLENBQUM7WUFFRixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQy9CLElBQUk7Z0JBQ0osSUFBSTtnQkFDSixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO2FBQ3RDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLElBQUksRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDO0lBQ2pDLE9BQU8sRUFBRSxlQUFl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Q25CLFNBQVMsRUFDVCxZQUFZLENBQ2IsQ0FBQztnQkFDRixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHO29CQUNyQixHQUFHLE9BQU87b0JBQ1YsSUFBSSxFQUFFLFNBQVM7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbmNvbnN0IEVYQ0VMX01FVEFEQVRBX0tFWSA9IFN5bWJvbCgnZXhjZWwnKTtcblxuZXhwb3J0IGludGVyZmFjZSBFeGNlbEZpZWxkT3B0aW9ucyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ3RleHQnIHwgJ2RhdGUnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAnYXJyYXknIHwgJ3R5cGUnO1xuICBpbmRleD86IG51bWJlcjtcbiAgY2hpbGRUeXBlPzogKCkgPT4gYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2VsTWV0YWRhdGEge1xuICBmaWVsZHM6IE1hcDxzdHJpbmcsIEV4Y2VsRmllbGRPcHRpb25zPjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVjb3JhdG9yKHR5cGU6IEV4Y2VsRmllbGRPcHRpb25zWyd0eXBlJ10sIGRlY29yYXRvck9wdGlvbnM6IHsgY2hpbGRUeXBlPzogKCkgPT4gYW55IH0gPSB7fSkge1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBpbmRleD86IG51bWJlciB9ID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YTogRXhjZWxNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoRVhDRUxfTUVUQURBVEFfS0VZLCB0YXJnZXQuY29uc3RydWN0b3IpIHx8IHtcbiAgICAgICAgZmllbGRzOiBuZXcgTWFwKClcbiAgICAgIH07XG4gICAgICBcbiAgICAgIG1ldGFkYXRhLmZpZWxkcy5zZXQocHJvcGVydHlLZXksIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaW5kZXg6IG9wdGlvbnMuaW5kZXgsXG4gICAgICAgIGNoaWxkVHlwZTogZGVjb3JhdG9yT3B0aW9ucy5jaGlsZFR5cGVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEVYQ0VMX01FVEFEQVRBX0tFWSwgbWV0YWRhdGEsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEV4Y2VsID0ge1xuICBUZXh0OiBjcmVhdGVEZWNvcmF0b3IoJ3RleHQnKSxcbiAgRGF0ZTogY3JlYXRlRGVjb3JhdG9yKCdkYXRlJyksXG4gIE51bWJlcjogY3JlYXRlRGVjb3JhdG9yKCdudW1iZXInKSxcbiAgQm9vbGVhbjogY3JlYXRlRGVjb3JhdG9yKCdib29sZWFuJyksXG4gIEFycmF5OiBjcmVhdGVEZWNvcmF0b3IoJ2FycmF5JyksXG4gIFR5cGU6IChuYW1lOiBzdHJpbmcsIGNoaWxkVHlwZTogKCkgPT4gYW55LCBvcHRpb25zOiB7IGluZGV4PzogbnVtYmVyIH0gPSB7fSkgPT4gXG4gICAgY3JlYXRlRGVjb3JhdG9yKCd0eXBlJywgeyBjaGlsZFR5cGUgfSkobmFtZSwgb3B0aW9ucyksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhjZWxNZXRhZGF0YSh0YXJnZXQ6IGFueSk6IEV4Y2VsTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YShFWENFTF9NRVRBREFUQV9LRVksIHRhcmdldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJzKHRhcmdldDogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRhZGF0YSA9IGdldEV4Y2VsTWV0YWRhdGEodGFyZ2V0KTtcbiAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIFtdO1xuICBcbiAgY29uc3QgZmllbGRzID0gQXJyYXkuZnJvbShtZXRhZGF0YS5maWVsZHMuZW50cmllcygpKVxuICAgIC5tYXAoKFtrZXksIG9wdGlvbnNdKSA9PiAoeyBrZXksIC4uLm9wdGlvbnMgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IChhLmluZGV4ID8/IDk5OSkgLSAoYi5pbmRleCA/PyA5OTkpKTtcbiAgXG4gIHJldHVybiBmaWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRzKHRhcmdldDogYW55LCBjYXNlU3R5bGU6ICdjYW1lbCcgfCAnc25ha2UnID0gJ2NhbWVsJyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBnZXRFeGNlbE1ldGFkYXRhKHRhcmdldCk7XG4gIGlmICghbWV0YWRhdGEpIHJldHVybiBbXTtcbiAgXG4gIGNvbnN0IGZpZWxkcyA9IEFycmF5LmZyb20obWV0YWRhdGEuZmllbGRzLmtleXMoKSk7XG4gIFxuICBpZiAoY2FzZVN0eWxlID09PSAnc25ha2UnKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQucmVwbGFjZSgvKFtBLVpdKS9nLCAnXyQxJykudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgXG4gIHJldHVybiBmaWVsZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGF0dGVuRmllbGRBbm5vdGF0aW9ucyh0YXJnZXQ6IGFueSwgcHJlZml4ID0gJycsIHByb3BlcnR5UHJlZml4ID0gJycpOiBSZWNvcmQ8c3RyaW5nLCBFeGNlbEZpZWxkT3B0aW9ucz4ge1xuICBjb25zdCBtZXRhZGF0YSA9IGdldEV4Y2VsTWV0YWRhdGEodGFyZ2V0KTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBFeGNlbEZpZWxkT3B0aW9ucz4gPSB7fTtcbiAgXG4gIGlmIChtZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhLmZpZWxkcy5mb3JFYWNoKChvcHRpb25zLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHByZWZpeCA/IGAke3ByZWZpeH1fJHtvcHRpb25zLm5hbWV9YCA6IG9wdGlvbnMubmFtZTtcbiAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UHJlZml4ID8gYCR7cHJvcGVydHlQcmVmaXh9LiR7a2V5fWAgOiBrZXk7XG4gICAgICBcbiAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICd0eXBlJyAmJiBvcHRpb25zLmNoaWxkVHlwZSkge1xuICAgICAgICBjb25zdCBuZXN0ZWRGaWVsZHMgPSBnZXRGbGF0dGVuRmllbGRBbm5vdGF0aW9ucyhcbiAgICAgICAgICBvcHRpb25zLmNoaWxkVHlwZSgpLCBcbiAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgcHJvcGVydHlQYXRoXG4gICAgICAgICk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBuZXN0ZWRGaWVsZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5UGF0aF0gPSB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdDtcbn0iXX0=","import { getFlattenFieldAnnotations } from '../decorators';\nconst EXCEL_EPOCH = new Date(1899, 11, 30);\nexport class ExcelConverter {\n fromExcelMany(records) {\n return records.map(record => this.fromExcel(record));\n }\n toExcelMany(models) {\n return models.map(model => this.toExcel(model));\n }\n}\nexport class DefaultExcelConverter extends ExcelConverter {\n Entity;\n constructor(Entity) {\n super();\n this.Entity = Entity;\n }\n fromExcel(record) {\n const annotations = getFlattenFieldAnnotations(this.Entity);\n const instance = new this.Entity();\n Object.entries(annotations).forEach(([propertyKey, options]) => {\n const value = record[options.name];\n const convertedValue = this.convertValue(value, options.type);\n const parts = propertyKey.split('.');\n if (parts.length === 1) {\n instance[propertyKey] = convertedValue;\n }\n else {\n let current = instance;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n current[parts[parts.length - 1]] = convertedValue;\n }\n });\n return instance;\n }\n convertValue(value, type) {\n switch (type) {\n case 'date':\n return this.excelDateToJsDate(value);\n case 'number':\n return this.toNumber(value);\n case 'boolean':\n return this.toBoolean(value);\n case 'array':\n return this.toArray(value);\n default:\n return value;\n }\n }\n toExcel(model) {\n const annotations = getFlattenFieldAnnotations(this.Entity);\n const record = {};\n Object.entries(annotations).forEach(([propertyKey, options]) => {\n const value = this.getNestedValue(model, propertyKey);\n switch (options.type) {\n case 'date':\n record[options.name] = this.jsDateToExcelDate(value);\n break;\n case 'boolean':\n record[options.name] = value === undefined || value === null ? '' : (value ? 'TRUE' : 'FALSE');\n break;\n case 'array':\n record[options.name] = Array.isArray(value) ? value.join(',') : '';\n break;\n case 'number':\n record[options.name] = value === undefined || value === null ? '' : value;\n break;\n default:\n record[options.name] = value ?? '';\n }\n });\n return record;\n }\n getNestedValue(obj, path) {\n if (obj && obj.hasOwnProperty(path)) {\n return obj[path];\n }\n const parts = path.split('.');\n let current = obj;\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part];\n }\n else {\n return undefined;\n }\n }\n return current;\n }\n excelDateToJsDate(excelDate) {\n if (!excelDate)\n return null;\n if (excelDate instanceof Date)\n return excelDate;\n if (typeof excelDate === 'string' && excelDate.includes('-')) {\n return new Date(excelDate);\n }\n const serialNumber = Number(excelDate);\n if (!isNaN(serialNumber)) {\n const date = new Date(EXCEL_EPOCH);\n date.setDate(date.getDate() + serialNumber);\n return date;\n }\n return null;\n }\n jsDateToExcelDate(date) {\n if (!date)\n return '';\n return date.toISOString();\n }\n toNumber(value) {\n if (value === '' || value === null || value === undefined)\n return null;\n const num = Number(value);\n return isNaN(num) ? null : num;\n }\n toBoolean(value) {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string') {\n return value.toUpperCase() === 'TRUE' || value === '1';\n }\n return Boolean(value);\n }\n toArray(value) {\n if (Array.isArray(value))\n return value;\n if (typeof value === 'string' && value) {\n return value.split(',').map(v => v.trim());\n }\n return [];\n }\n}\nexport function getConverter(Entity) {\n return new DefaultExcelConverter(Entity);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwuY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQG54LWRkZC9leGNlbC9zcmMvbGliL2NvbnZlcnRlci9leGNlbC5jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFNM0MsTUFBTSxPQUFnQixjQUFjO0lBSWxDLGFBQWEsQ0FBQyxPQUFzQjtRQUNsQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFXO1FBQ3JCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXlCLFNBQVEsY0FBaUI7SUFDekM7SUFBcEIsWUFBb0IsTUFBZTtRQUNqQyxLQUFLLEVBQUUsQ0FBQztRQURVLFdBQU0sR0FBTixNQUFNLENBQVM7SUFFbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFtQjtRQUMzQixNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFTLENBQUM7UUFFMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzdELE1B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QUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQVU7UUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFJLE1BQWU7SUFDN0MsT0FBTyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXRGbGF0dGVuRmllbGRBbm5vdGF0aW9ucyB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuXG5jb25zdCBFWENFTF9FUE9DSCA9IG5ldyBEYXRlKDE4OTksIDExLCAzMCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjZWxSZWNvcmQge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFeGNlbENvbnZlcnRlcjxUPiB7XG4gIGFic3RyYWN0IGZyb21FeGNlbChyZWNvcmQ6IEV4Y2VsUmVjb3JkKTogVDtcbiAgYWJzdHJhY3QgdG9FeGNlbChtb2RlbDogVCk6IEV4Y2VsUmVjb3JkO1xuICBcbiAgZnJvbUV4Y2VsTWFueShyZWNvcmRzOiBFeGNlbFJlY29yZFtdKTogVFtdIHtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAocmVjb3JkID0+IHRoaXMuZnJvbUV4Y2VsKHJlY29yZCkpO1xuICB9XG4gIFxuICB0b0V4Y2VsTWFueShtb2RlbHM6IFRbXSk6IEV4Y2VsUmVjb3JkW10ge1xuICAgIHJldHVybiBtb2RlbHMubWFwKG1vZGVsID0+IHRoaXMudG9FeGNlbChtb2RlbCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RXhjZWxDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBFeGNlbENvbnZlcnRlcjxUPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgRW50aXR5OiBUeXBlPFQ+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBcbiAgZnJvbUV4Y2VsKHJlY29yZDogRXhjZWxSZWNvcmQpOiBUIHtcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGdldEZsYXR0ZW5GaWVsZEFubm90YXRpb25zKHRoaXMuRW50aXR5KTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzLkVudGl0eSgpIGFzIGFueTtcbiAgICBcbiAgICBPYmplY3QuZW50cmllcyhhbm5vdGF0aW9ucykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBvcHRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbb3B0aW9ucy5uYW1lXTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gdGhpcy5jb252ZXJ0VmFsdWUodmFsdWUsIG9wdGlvbnMudHlwZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBhcnRzID0gcHJvcGVydHlLZXkuc3BsaXQoJy4nKTtcbiAgICAgIFxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpbnN0YW5jZVtwcm9wZXJ0eUtleV0gPSBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gaW5zdGFuY2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50W3BhcnRzW2ldXSkge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0c1tpXV0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gY29udmVydGVkVmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG4gIFxuICBwcml2YXRlIGNvbnZlcnRWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsRGF0ZVRvSnNEYXRlKHZhbHVlKTtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiB0aGlzLnRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odmFsdWUpO1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KHZhbHVlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIFxuICB0b0V4Y2VsKG1vZGVsOiBUKTogRXhjZWxSZWNvcmQge1xuICAgIGNvbnN0IGFubm90YXRpb25zID0gZ2V0RmxhdHRlbkZpZWxkQW5ub3RhdGlvbnModGhpcy5FbnRpdHkpO1xuICAgIGNvbnN0IHJlY29yZDogRXhjZWxSZWNvcmQgPSB7fTtcbiAgICBcbiAgICBPYmplY3QuZW50cmllcyhhbm5vdGF0aW9ucykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBvcHRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKG1vZGVsLCBwcm9wZXJ0eUtleSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIHJlY29yZFtvcHRpb25zLm5hbWVdID0gdGhpcy5qc0RhdGVUb0V4Y2VsRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIHJlY29yZFtvcHRpb25zLm5hbWVdID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCA/ICcnIDogKHZhbHVlID8gJ1RSVUUnIDogJ0ZBTFNFJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgICAgICByZWNvcmRbb3B0aW9ucy5uYW1lXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCcpIDogJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgcmVjb3JkW29wdGlvbnMubmFtZV0gPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJycgOiB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWNvcmRbb3B0aW9ucy5uYW1lXSA9IHZhbHVlID8/ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cbiAgXG4gIHByaXZhdGUgZ2V0TmVzdGVkVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKG9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkocGF0aCkpIHtcbiAgICAgIHJldHVybiBvYmpbcGF0aF07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIFxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG4gIFxuICBwcml2YXRlIGV4Y2VsRGF0ZVRvSnNEYXRlKGV4Y2VsRGF0ZTogYW55KTogRGF0ZSB8IG51bGwge1xuICAgIGlmICghZXhjZWxEYXRlKSByZXR1cm4gbnVsbDtcbiAgICBcbiAgICBpZiAoZXhjZWxEYXRlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGV4Y2VsRGF0ZTtcbiAgICBcbiAgICBpZiAodHlwZW9mIGV4Y2VsRGF0ZSA9PT0gJ3N0cmluZycgJiYgZXhjZWxEYXRlLmluY2x1ZGVzKCctJykpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShleGNlbERhdGUpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzZXJpYWxOdW1iZXIgPSBOdW1iZXIoZXhjZWxEYXRlKTtcbiAgICBpZiAoIWlzTmFOKHNlcmlhbE51bWJlcikpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShFWENFTF9FUE9DSCk7XG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzZXJpYWxOdW1iZXIpO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICBwcml2YXRlIGpzRGF0ZVRvRXhjZWxEYXRlKGRhdGU6IERhdGUgfCBudWxsKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICBcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xuICB9XG4gIFxuICBwcml2YXRlIHRvTnVtYmVyKHZhbHVlOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyBudWxsIDogbnVtO1xuICB9XG4gIFxuICBwcml2YXRlIHRvQm9vbGVhbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSAnVFJVRScgfHwgdmFsdWUgPT09ICcxJztcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xuICB9XG4gIFxuICBwcml2YXRlIHRvQXJyYXkodmFsdWU6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKHYgPT4gdi50cmltKCkpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnZlcnRlcjxUPihFbnRpdHk6IFR5cGU8VD4pOiBFeGNlbENvbnZlcnRlcjxUPiB7XG4gIHJldHVybiBuZXcgRGVmYXVsdEV4Y2VsQ29udmVydGVyKEVudGl0eSk7XG59Il19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtZGRkLWV4Y2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQG54LWRkZC9leGNlbC9zcmMvbGliL254LWRkZC1leGNlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;AACA,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC;AAC1C,SAAS,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,EAAE,EAAE;AACtD,IAAI,OAAO,UAAU,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE;AACzC,QAAQ,OAAO,UAAU,MAAM,EAAE,WAAW,EAAE;AAC9C,YAAY,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;AAC5F,gBAAgB,MAAM,EAAE,IAAI,GAAG;AAC/B,aAAa;AACb,YAAY,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE;AAC7C,gBAAgB,IAAI;AACpB,gBAAgB,IAAI;AACpB,gBAAgB,KAAK,EAAE,OAAO,CAAC,KAAK;AACpC,gBAAgB,SAAS,EAAE,gBAAgB,CAAC;AAC5C,aAAa,CAAC;AACd,YAAY,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;AACpF,SAAS;AACT,KAAK;AACL;AACY,MAAC,KAAK,GAAG;AACrB,IAAI,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;AACjC,IAAI,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;AACjC,IAAI,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC;AACrC,IAAI,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC;AACvC,IAAI,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;AACnC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,KAAK,eAAe,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;AAClG;AACO,SAAS,gBAAgB,CAAC,MAAM,EAAE;AACzC,IAAI,OAAO,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC;AAC1D;AACO,SAAS,UAAU,CAAC,MAAM,EAAE;AACnC,IAAI,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAC7C,IAAI,IAAI,CAAC,QAAQ;AACjB,QAAQ,OAAO,EAAE;AACjB,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;AACvD,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;AACtD,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;AAC5D,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;AAC1C;AACO,SAAS,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,EAAE;AACvD,IAAI,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAC7C,IAAI,IAAI,CAAC,QAAQ;AACjB,QAAQ,OAAO,EAAE;AACjB,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACrD,IAAI,IAAI,SAAS,KAAK,OAAO,EAAE;AAC/B,QAAQ,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAClF;AACA,IAAI,OAAO,MAAM;AACjB;AACO,SAAS,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE;AACrF,IAAI,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAC7C,IAAI,MAAM,MAAM,GAAG,EAAE;AACrB,IAAI,IAAI,QAAQ,EAAE;AAClB,QAAQ,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK;AAClD,YAAY,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI;AACjF,YAAY,MAAM,YAAY,GAAG,cAAc,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG;AAClF,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE;AAC9D,gBAAgB,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC;AAC7G,gBAAgB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACnD;AACA,iBAAiB;AACjB,gBAAgB,MAAM,CAAC,YAAY,CAAC,GAAG;AACvC,oBAAoB,GAAG,OAAO;AAC9B,oBAAoB,IAAI,EAAE;AAC1B,iBAAiB;AACjB;AACA,SAAS,CAAC;AACV;AACA,IAAI,OAAO,MAAM;AACjB;;ACnEA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;AACnC,MAAM,cAAc,CAAC;AAC5B,IAAI,aAAa,CAAC,OAAO,EAAE;AAC3B,QAAQ,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC5D;AACA,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvD;AACA;AACO,MAAM,qBAAqB,SAAS,cAAc,CAAC;AAC1D,IAAI,MAAM;AACV,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,KAAK,EAAE;AACf,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM;AAC5B;AACA,IAAI,SAAS,CAAC,MAAM,EAAE;AACtB,QAAQ,MAAM,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;AACnE,QAAQ,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE;AAC1C,QAAQ,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK;AACxE,YAAY,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9C,YAAY,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;AACzE,YAAY,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;AAChD,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,gBAAgB,QAAQ,CAAC,WAAW,CAAC,GAAG,cAAc;AACtD;AACA,iBAAiB;AACjB,gBAAgB,IAAI,OAAO,GAAG,QAAQ;AACtC,gBAAgB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC3D,oBAAoB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AAC5C,wBAAwB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAC9C;AACA,oBAAoB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/C;AACA,gBAAgB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc;AACjE;AACA,SAAS,CAAC;AACV,QAAQ,OAAO,QAAQ;AACvB;AACA,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,QAAQ,QAAQ,IAAI;AACpB,YAAY,KAAK,MAAM;AACvB,gBAAgB,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AACpD,YAAY,KAAK,QAAQ;AACzB,gBAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC3C,YAAY,KAAK,SAAS;AAC1B,gBAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,YAAY,KAAK,OAAO;AACxB,gBAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1C,YAAY;AACZ,gBAAgB,OAAO,KAAK;AAC5B;AACA;AACA,IAAI,OAAO,CAAC,KAAK,EAAE;AACnB,QAAQ,MAAM,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;AACnE,QAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,QAAQ,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK;AACxE,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;AACjE,YAAY,QAAQ,OAAO,CAAC,IAAI;AAChC,gBAAgB,KAAK,MAAM;AAC3B,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AACxE,oBAAoB;AACpB,gBAAgB,KAAK,SAAS;AAC9B,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAClH,oBAAoB;AACpB,gBAAgB,KAAK,OAAO;AAC5B,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;AACtF,oBAAoB;AACpB,gBAAgB,KAAK,QAAQ;AAC7B,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK;AAC7F,oBAAoB;AACpB,gBAAgB;AAChB,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AACtD;AACA,SAAS,CAAC;AACV,QAAQ,OAAO,MAAM;AACrB;AACA,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;AAC9B,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;AAC7C,YAAY,OAAO,GAAG,CAAC,IAAI,CAAC;AAC5B;AACA,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACrC,QAAQ,IAAI,OAAO,GAAG,GAAG;AACzB,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,OAAO,EAAE;AAC3E,gBAAgB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;AACvC;AACA,iBAAiB;AACjB,gBAAgB,OAAO,SAAS;AAChC;AACA;AACA,QAAQ,OAAO,OAAO;AACtB;AACA,IAAI,iBAAiB,CAAC,SAAS,EAAE;AACjC,QAAQ,IAAI,CAAC,SAAS;AACtB,YAAY,OAAO,IAAI;AACvB,QAAQ,IAAI,SAAS,YAAY,IAAI;AACrC,YAAY,OAAO,SAAS;AAC5B,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACtE,YAAY,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;AACtC;AACA,QAAQ,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;AAC9C,QAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;AAClC,YAAY,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC;AAC9C,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC;AACvD,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,OAAO,IAAI;AACnB;AACA,IAAI,iBAAiB,CAAC,IAAI,EAAE;AAC5B,QAAQ,IAAI,CAAC,IAAI;AACjB,YAAY,OAAO,EAAE;AACrB,QAAQ,OAAO,IAAI,CAAC,WAAW,EAAE;AACjC;AACA,IAAI,QAAQ,CAAC,KAAK,EAAE;AACpB,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AACjE,YAAY,OAAO,IAAI;AACvB,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AACjC,QAAQ,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG;AACtC;AACA,IAAI,SAAS,CAAC,KAAK,EAAE;AACrB,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;AACtC,YAAY,OAAO,KAAK;AACxB,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAY,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;AAClE;AACA,QAAQ,OAAO,OAAO,CAAC,KAAK,CAAC;AAC7B;AACA,IAAI,OAAO,CAAC,KAAK,EAAE;AACnB,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAChC,YAAY,OAAO,KAAK;AACxB,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE;AAChD,YAAY,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD;AACA,QAAQ,OAAO,EAAE;AACjB;AACA;AACO,SAAS,YAAY,CAAC,MAAM,EAAE;AACrC,IAAI,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC;AAC5C;;AC3IA;AACA;AACA;;;;"}
|
package/impl/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExcelService } from '@nx-ddd/excel';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
|
|
4
|
+
declare class ExcelServiceImpl implements ExcelService {
|
|
5
|
+
readSheet(path: string, sheetName: string): Promise<any[]>;
|
|
6
|
+
writeSheet(path: string, sheetName: string, records: any[], headers: string[]): Promise<void>;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ExcelServiceImpl, never>;
|
|
8
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ExcelServiceImpl>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { ExcelServiceImpl };
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Type } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
interface ExcelFieldOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
type: 'text' | 'date' | 'number' | 'boolean' | 'array' | 'type';
|
|
6
|
+
index?: number;
|
|
7
|
+
childType?: () => any;
|
|
8
|
+
}
|
|
9
|
+
interface ExcelMetadata {
|
|
10
|
+
fields: Map<string, ExcelFieldOptions>;
|
|
11
|
+
}
|
|
12
|
+
declare const Excel: {
|
|
13
|
+
Text: (name: string, options?: {
|
|
14
|
+
index?: number;
|
|
15
|
+
}) => (target: any, propertyKey: string) => void;
|
|
16
|
+
Date: (name: string, options?: {
|
|
17
|
+
index?: number;
|
|
18
|
+
}) => (target: any, propertyKey: string) => void;
|
|
19
|
+
Number: (name: string, options?: {
|
|
20
|
+
index?: number;
|
|
21
|
+
}) => (target: any, propertyKey: string) => void;
|
|
22
|
+
Boolean: (name: string, options?: {
|
|
23
|
+
index?: number;
|
|
24
|
+
}) => (target: any, propertyKey: string) => void;
|
|
25
|
+
Array: (name: string, options?: {
|
|
26
|
+
index?: number;
|
|
27
|
+
}) => (target: any, propertyKey: string) => void;
|
|
28
|
+
Type: (name: string, childType: () => any, options?: {
|
|
29
|
+
index?: number;
|
|
30
|
+
}) => (target: any, propertyKey: string) => void;
|
|
31
|
+
};
|
|
32
|
+
declare function getExcelMetadata(target: any): ExcelMetadata | undefined;
|
|
33
|
+
declare function getHeaders(target: any): string[];
|
|
34
|
+
declare function getFields(target: any, caseStyle?: 'camel' | 'snake'): string[];
|
|
35
|
+
declare function getFlattenFieldAnnotations(target: any, prefix?: string, propertyPrefix?: string): Record<string, ExcelFieldOptions>;
|
|
36
|
+
|
|
37
|
+
interface ExcelRecord {
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
}
|
|
40
|
+
declare abstract class ExcelConverter<T> {
|
|
41
|
+
abstract fromExcel(record: ExcelRecord): T;
|
|
42
|
+
abstract toExcel(model: T): ExcelRecord;
|
|
43
|
+
fromExcelMany(records: ExcelRecord[]): T[];
|
|
44
|
+
toExcelMany(models: T[]): ExcelRecord[];
|
|
45
|
+
}
|
|
46
|
+
declare class DefaultExcelConverter<T> extends ExcelConverter<T> {
|
|
47
|
+
private Entity;
|
|
48
|
+
constructor(Entity: Type<T>);
|
|
49
|
+
fromExcel(record: ExcelRecord): T;
|
|
50
|
+
private convertValue;
|
|
51
|
+
toExcel(model: T): ExcelRecord;
|
|
52
|
+
private getNestedValue;
|
|
53
|
+
private excelDateToJsDate;
|
|
54
|
+
private jsDateToExcelDate;
|
|
55
|
+
private toNumber;
|
|
56
|
+
private toBoolean;
|
|
57
|
+
private toArray;
|
|
58
|
+
}
|
|
59
|
+
declare function getConverter<T>(Entity: Type<T>): ExcelConverter<T>;
|
|
60
|
+
|
|
61
|
+
interface ExcelService {
|
|
62
|
+
readSheet(path: string, sheetName: string): Promise<any[]>;
|
|
63
|
+
writeSheet(path: string, sheetName: string, records: any[], headers: string[]): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export { DefaultExcelConverter, Excel, ExcelConverter, getConverter, getExcelMetadata, getFields, getFlattenFieldAnnotations, getHeaders };
|
|
67
|
+
export type { ExcelFieldOptions, ExcelMetadata, ExcelRecord, ExcelService };
|
package/infra/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as _nx_ddd_core from '@nx-ddd/core';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { Type } from '@angular/core';
|
|
4
|
+
import { ExcelConverter, ExcelService } from '@nx-ddd/excel';
|
|
5
|
+
|
|
6
|
+
interface ExcelRepositoryConfig {
|
|
7
|
+
path: string;
|
|
8
|
+
sheetName?: string;
|
|
9
|
+
converter?: ExcelConverter<any>;
|
|
10
|
+
headers?: string[];
|
|
11
|
+
}
|
|
12
|
+
declare abstract class BaseExcelRepository<T> {
|
|
13
|
+
protected abstract readonly path: string;
|
|
14
|
+
protected abstract readonly sheetName: string;
|
|
15
|
+
protected abstract readonly converter: ExcelConverter<T>;
|
|
16
|
+
protected abstract readonly headers: string[];
|
|
17
|
+
protected abstract readonly excelService: ExcelService;
|
|
18
|
+
list(): Promise<T[]>;
|
|
19
|
+
saveMany(entities: T[]): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
declare class ExcelRepository<T> extends BaseExcelRepository<T> {
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly sheetName: string;
|
|
24
|
+
readonly converter: ExcelConverter<T>;
|
|
25
|
+
readonly headers: string[];
|
|
26
|
+
readonly excelService: ExcelService;
|
|
27
|
+
constructor(path: string, sheetName: string, converter: ExcelConverter<T>, headers: string[], excelService: ExcelService);
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ExcelRepository<any>, never>;
|
|
29
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ExcelRepository<any>>;
|
|
30
|
+
}
|
|
31
|
+
declare const EXCEL_REPOSITORY: _nx_ddd_core.DiToken<ExcelRepository<any>>;
|
|
32
|
+
declare function getExcelRepository<T>(Entity: Type<T>, config: ExcelRepositoryConfig): ExcelRepository<T>;
|
|
33
|
+
|
|
34
|
+
export { BaseExcelRepository, EXCEL_REPOSITORY, ExcelRepository, getExcelRepository };
|
|
35
|
+
export type { ExcelRepositoryConfig };
|
package/package.json
CHANGED
|
@@ -1,31 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx-ddd/excel",
|
|
3
|
-
"version": "19.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
"version": "19.3.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/core": ">=17.0.0",
|
|
6
|
+
"@nx-ddd/core": "19.3.0"
|
|
7
|
+
},
|
|
8
|
+
"module": "fesm2022/nx-ddd-excel.mjs",
|
|
9
|
+
"typings": "index.d.ts",
|
|
7
10
|
"exports": {
|
|
11
|
+
"./package.json": {
|
|
12
|
+
"default": "./package.json"
|
|
13
|
+
},
|
|
8
14
|
".": {
|
|
9
|
-
"types": "./
|
|
10
|
-
"default": "./
|
|
15
|
+
"types": "./index.d.ts",
|
|
16
|
+
"default": "./fesm2022/nx-ddd-excel.mjs"
|
|
17
|
+
},
|
|
18
|
+
"./impl": {
|
|
19
|
+
"types": "./impl/index.d.ts",
|
|
20
|
+
"default": "./fesm2022/nx-ddd-excel-impl.mjs"
|
|
11
21
|
},
|
|
12
|
-
"./
|
|
13
|
-
"types": "./
|
|
14
|
-
"default": "./
|
|
22
|
+
"./infra": {
|
|
23
|
+
"types": "./infra/index.d.ts",
|
|
24
|
+
"default": "./fesm2022/nx-ddd-excel-infra.mjs"
|
|
15
25
|
},
|
|
16
26
|
"./tokens": {
|
|
17
|
-
"types": "./
|
|
18
|
-
"default": "./
|
|
19
|
-
},
|
|
20
|
-
"./impl": {
|
|
21
|
-
"types": "./src/lib/impl/index.d.ts",
|
|
22
|
-
"default": "./src/lib/impl/index.js"
|
|
27
|
+
"types": "./tokens/index.d.ts",
|
|
28
|
+
"default": "./fesm2022/nx-ddd-excel-tokens.mjs"
|
|
23
29
|
}
|
|
24
30
|
},
|
|
25
|
-
"
|
|
26
|
-
"dist",
|
|
27
|
-
"!**/*.tsbuildinfo"
|
|
28
|
-
],
|
|
31
|
+
"sideEffects": false,
|
|
29
32
|
"dependencies": {
|
|
30
33
|
"tslib": "^2.3.0"
|
|
31
34
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import * as _nx_ddd_core from '@nx-ddd/core';
|
|
3
|
+
import { ExcelService } from '@nx-ddd/excel';
|
|
4
|
+
|
|
5
|
+
declare const EXCEL_SERVICE_DI: _nx_ddd_core.DiToken<ExcelService>;
|
|
6
|
+
declare const EXCEL_SERVICE: _angular_core.InjectionToken<ExcelService>;
|
|
7
|
+
|
|
8
|
+
export { EXCEL_SERVICE, EXCEL_SERVICE_DI };
|
package/README.md
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# @nx-ddd/excel
|
|
2
|
-
|
|
3
|
-
Excel操作のためのDDDベースのライブラリ
|
|
4
|
-
|
|
5
|
-
## ディレクトリ構成
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
src/lib/
|
|
9
|
-
├── domain/ # ドメイン層(インターフェース定義)
|
|
10
|
-
│ └── index.ts
|
|
11
|
-
├── infra/ # インフラストラクチャ層(実装)
|
|
12
|
-
│ ├── excel.repository.impl.ts
|
|
13
|
-
│ └── excel.repository.impl.spec.ts
|
|
14
|
-
├── impl/ # サービス実装
|
|
15
|
-
│ ├── excel.service.impl.ts
|
|
16
|
-
│ └── excel.service.impl.spec.ts
|
|
17
|
-
├── providers/ # DI設定
|
|
18
|
-
│ └── excel.providers.ts
|
|
19
|
-
├── tokens/ # InjectionToken定義
|
|
20
|
-
│ └── excel.token.ts
|
|
21
|
-
├── __mocks__/ # テスト用モック
|
|
22
|
-
│ ├── fs.ts
|
|
23
|
-
│ ├── path.ts
|
|
24
|
-
│ └── xlsx.ts
|
|
25
|
-
├── excel.converter.ts # データ変換ユーティリティ
|
|
26
|
-
├── excel.decorators.ts # デコレーター
|
|
27
|
-
├── excel.repository.ts # リポジトリの再エクスポート
|
|
28
|
-
└── excel.service.ts # サービスインターフェース
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## 使用方法
|
|
32
|
-
|
|
33
|
-
### 1. DIの設定
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
import { provideExcelService } from '@nx-ddd/excel/providers';
|
|
37
|
-
|
|
38
|
-
// Angularアプリケーション
|
|
39
|
-
@NgModule({
|
|
40
|
-
providers: [
|
|
41
|
-
...provideExcelService()
|
|
42
|
-
]
|
|
43
|
-
})
|
|
44
|
-
export class AppModule {}
|
|
45
|
-
|
|
46
|
-
// スタンドアロンアプリケーション
|
|
47
|
-
bootstrapApplication(AppComponent, {
|
|
48
|
-
providers: [
|
|
49
|
-
...provideExcelService()
|
|
50
|
-
]
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 2. サービスの使用
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
import { inject } from '@angular/core';
|
|
58
|
-
import { EXCEL_SERVICE } from '@nx-ddd/excel/tokens';
|
|
59
|
-
|
|
60
|
-
@Injectable()
|
|
61
|
-
export class MyService {
|
|
62
|
-
private readonly excelService = inject(EXCEL_SERVICE);
|
|
63
|
-
|
|
64
|
-
async exportData() {
|
|
65
|
-
await this.excelService.writeSheet(
|
|
66
|
-
'output.xlsx',
|
|
67
|
-
'Sheet1',
|
|
68
|
-
data,
|
|
69
|
-
['Column1', 'Column2']
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async importData() {
|
|
74
|
-
const data = await this.excelService.readSheet('input.xlsx', 'Sheet1');
|
|
75
|
-
return data;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 3. リポジトリの使用
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
import { getExcelRepository } from '@nx-ddd/excel';
|
|
84
|
-
|
|
85
|
-
// エンティティクラス
|
|
86
|
-
@Excel.Sheet('Users')
|
|
87
|
-
class User {
|
|
88
|
-
@Excel.Column('名前')
|
|
89
|
-
name: string;
|
|
90
|
-
|
|
91
|
-
@Excel.Column('メール')
|
|
92
|
-
email: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// リポジトリの取得
|
|
96
|
-
const userRepo = getExcelRepository(User, {
|
|
97
|
-
path: 'users.xlsx',
|
|
98
|
-
sheetName: 'Users'
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// データの保存
|
|
102
|
-
await userRepo.saveMany(users);
|
|
103
|
-
|
|
104
|
-
// データの読み込み
|
|
105
|
-
const users = await userRepo.list();
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## テスト
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
nx test @nx-ddd/excel
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## エクスポート構成
|
|
115
|
-
|
|
116
|
-
- `@nx-ddd/excel` - メインエクスポート
|
|
117
|
-
- `@nx-ddd/excel/providers` - DI設定
|
|
118
|
-
- `@nx-ddd/excel/tokens` - InjectionToken
|
|
119
|
-
- `@nx-ddd/excel/impl` - 実装詳細(通常は直接使用しない)
|
|
120
|
-
|
|
121
|
-
## Building
|
|
122
|
-
|
|
123
|
-
Run `nx build @nx-ddd/excel` to build the library.
|