@nx-ddd/common 19.0.0-preview.34 → 19.0.0-preview.36
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.
|
@@ -71,6 +71,9 @@ class ExcelUtils {
|
|
|
71
71
|
return value;
|
|
72
72
|
return value === 'TRUE';
|
|
73
73
|
}
|
|
74
|
+
static fromExcelText(value) {
|
|
75
|
+
return value ? `${value}` : null;
|
|
76
|
+
}
|
|
74
77
|
static toExcelDate(date) {
|
|
75
78
|
if (!date)
|
|
76
79
|
return null;
|
|
@@ -90,6 +93,7 @@ class ExcelUtils {
|
|
|
90
93
|
case 'date': return { ...acc, [annotation?.propName]: this.fromExcelDate(value) };
|
|
91
94
|
case 'array': return { ...acc, [annotation?.propName]: value?.split(',') ?? [] };
|
|
92
95
|
case 'boolean': return { ...acc, [annotation?.propName]: this.fromExcelBoolean(value) };
|
|
96
|
+
case 'text': return { ...acc, [annotation?.propName]: this.fromExcelText(value) };
|
|
93
97
|
default: return { ...acc, [annotation?.propName]: value || null };
|
|
94
98
|
}
|
|
95
99
|
}, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nx-ddd-common-infrastructure-repo-excel.mjs","sources":["../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.decorators.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.converter.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.repository.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/nx-ddd-common-infrastructure-repo-excel.ts"],"sourcesContent":["import { makeDecoratorFactories } from \"@nx-ddd/core\";\nimport { camelCase, snakeCase } from 'lodash-es';\n\nconst {\n createDecorator,\n getAnnotations,\n} = makeDecoratorFactories(\n (type, fieldName, propName, options) => ({ type, fieldName, propName, childType: options.childType }),\n '[@nx-ddd/excel] annotations'\n);\n\nexport function getFlattenFieldAnnotations<Annotation>(T: any, prefix = ''): Record<string, Annotation> {\n const annotations = getAnnotations(T);\n return (annotations ?? []).reduce((acc, annotation) => {\n const currentKey = prefix ? camelCase(`${prefix}_${annotation.fieldName}`) : annotation.fieldName;\n if (annotation.childType) {\n return {\n ...acc,\n ...getFlattenFieldAnnotations(annotation.childType(), currentKey)\n };\n }\n return {\n ...acc,\n [currentKey]: annotation\n };\n }, {});\n}\n\nexport function getFields(T: any, options: {\n prefix?: string;\n case?: 'snake' | 'camel' | 'original';\n} = {\n prefix: '',\n case: 'original'\n}): string[] {\n const annotations = getAnnotations(T);\n const changeCase = options?.case === 'snake' \n ? snakeCase \n : options?.case === 'camel' ? camelCase\n : (value: string) => value;\n const fields = (annotations ?? []).flatMap((annotation) => {\n const currentKey = changeCase(options?.prefix ? `${options?.prefix}_${annotation.fieldName}` : annotation.fieldName);\n if (annotation.childType) {\n return [\n ...getFields(annotation.childType(), {\n prefix: currentKey,\n case: options?.case,\n })\n ];\n }\n return [currentKey];\n });\n return fields;\n}\n\nexport function getHeaders(T: any): string[] {\n return getFields(T);\n}\n\nexport const Excel = {\n Text: createDecorator('text'),\n Date: createDecorator('date'),\n Number: createDecorator('number'),\n // JSON: createDecorator('json'),\n Array: createDecorator('array'),\n Boolean: createDecorator('boolean'),\n getAnnotations,\n};\n","import { get } from 'lodash-es';\nimport dayjs from 'dayjs';\nimport { getFlattenFieldAnnotations } from './excel.decorators';\n\nexport interface ExcelConverter<T> {\n fromExcel(record: any): T;\n fromExcelMany(records: any[]): T[];\n toExcel(model: T): any;\n toExcelMany(models: T[]): any[];\n}\n\nexport class ExcelUtils {\n static fromExcelDate(serial: number | null): Date | null {\n if (typeof serial !== 'number') return null;\n const excelEpoch = dayjs('1899-12-30');\n return excelEpoch.add(serial, 'day').toDate();\n }\n\n static fromExcelBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n return value === 'TRUE';\n }\n \n static toExcelDate(date: dayjs.Dayjs | Date | null): Date | null {\n if (!date) return null;\n if (dayjs.isDayjs(date)) return date.toDate();\n return date;\n }\n\n static toExcelBoolean(value: boolean): string {\n return value ? 'TRUE' : 'FALSE';\n }\n\n static fromExcel<E, D extends object>(record: D, type: {new(): E}): E {\n const annotations = getFlattenFieldAnnotations<{\n type: 'number' | 'string' | 'date' | 'array' | 'boolean';\n fieldName: string;\n propName: string;\n childType?: () => any;\n }>(type);\n const obj = Object.entries(annotations).reduce((acc, [key, annotation]) => {\n const value = get(record, annotation.fieldName);\n switch (annotation.type) {\n case 'number': return { ...acc, [annotation?.propName]: isNaN(Number(value)) ? null : Number(value) };\n case 'date': return { ...acc, [annotation?.propName]: this.fromExcelDate(value) };\n case 'array': return { ...acc, [annotation?.propName]: value?.split(',') ?? [] };\n case 'boolean': return { ...acc, [annotation?.propName]: this.fromExcelBoolean(value) };\n default: return { ...acc, [annotation?.propName]: value || null };\n }\n }, {} as E);\n return obj;\n }\n \n static toExcel<E, D extends object>(entity: E, type: {new(): E}): D {\n const annotations = getFlattenFieldAnnotations<{\n type: 'number' | 'string' | 'date' | 'array' | 'boolean';\n fieldName: string;\n propName: string;\n childType?: () => any;\n }>(type);\n const obj = Object.entries(annotations).reduce((acc, [key, annotation]) => {\n const value = get(entity, annotation.propName);\n switch (annotation.type) {\n case 'number': return { ...acc, [annotation.fieldName]: isNaN(Number(value)) ? null : Number(value) };\n case 'date': return { ...acc, [annotation.fieldName]: this.toExcelDate(value) };\n case 'array': return { ...acc, [annotation.fieldName]: Array.isArray(value) ? value.join(',') : value };\n case 'boolean': return { ...acc, [annotation.fieldName]: this.toExcelBoolean(value) };\n default: return { ...acc, [annotation.fieldName]: value };\n }\n }, {} as D);\n return obj;\n }\n}\n\nexport function getConverter<T>(type: {new(): T}): ExcelConverter<T> {\n return {\n fromExcel: (record: object) => ExcelUtils.fromExcel<T, object>(record, type),\n fromExcelMany: (records: object[]) => records.map(record => ExcelUtils.fromExcel(record, type)),\n toExcel: (model: T) => ExcelUtils.toExcel(model, type),\n toExcelMany: (models: T[]) => models.map(model => ExcelUtils.toExcel(model, type)),\n };\n}\n","import { Injectable } from '@angular/core';\nimport { ExcelConverter } from './excel.converter';\nimport type { ExcelService } from '@nx-ddd/common/infrastructure/repo/excel/impl';\nimport { getEntityName } from '@nx-ddd/common/domain';\nimport { getHeaders } from './excel.decorators';\nimport { getConverter } from './excel.converter';\nimport { EXCEL_SERVICE as _EXCEL_SERVICE } from '@nx-ddd/common/infrastructure/repo/excel/token';\nimport { DiToken } from '@nx-ddd/core';\n\nexport const EXCEL_SERVICE = _EXCEL_SERVICE as DiToken<ExcelService>;\n\nexport function injectExcelService(): ExcelService | null {\n return EXCEL_SERVICE.inject() ?? null;\n}\n\n@Injectable()\nexport abstract class ExcelRepository<T> {\n protected abstract path: string;\n protected abstract sheetName: string;\n protected abstract converter: ExcelConverter<T>;\n protected service = injectExcelService();\n protected headers?: string[];\n\n async list(): Promise<T[]> {\n const records = this.service.getRecords(this.path, this.sheetName);\n return this.converter.fromExcelMany(records as any[]);\n }\n \n async saveMany(entities: T[]): Promise<void> {\n const records = entities.map(entity => this.converter.toExcel(entity));\n this.service.loadWorkbook(this.path, (workbook) => {\n return this.service.writeSheet(workbook, this.sheetName, records, this.headers);\n });\n }\n}\n\nexport function getExcelRepository<T>(type: {new(): T}, {\n sheetName = getEntityName(type),\n converter = getConverter(type),\n headers = getHeaders(type),\n path = '',\n}: {\n sheetName?: string;\n converter?: ExcelConverter<T>;\n headers?: string[];\n path?: string;\n} = {}): ExcelRepository<T> {\n class ExcelRepositoryImpl extends ExcelRepository<T> {\n protected sheetName = sheetName;\n protected converter = converter;\n protected headers = headers;\n protected path = path;\n }\n return new ExcelRepositoryImpl();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_EXCEL_SERVICE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nx-ddd-common-infrastructure-repo-excel.mjs","sources":["../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.decorators.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.converter.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/excel.repository.ts","../../../../../packages/@nx-ddd/common/src/lib/infrastructure/repo/excel/nx-ddd-common-infrastructure-repo-excel.ts"],"sourcesContent":["import { makeDecoratorFactories } from \"@nx-ddd/core\";\nimport { camelCase, snakeCase } from 'lodash-es';\n\nconst {\n createDecorator,\n getAnnotations,\n} = makeDecoratorFactories(\n (type, fieldName, propName, options) => ({ type, fieldName, propName, childType: options.childType }),\n '[@nx-ddd/excel] annotations'\n);\n\nexport function getFlattenFieldAnnotations<Annotation>(T: any, prefix = ''): Record<string, Annotation> {\n const annotations = getAnnotations(T);\n return (annotations ?? []).reduce((acc, annotation) => {\n const currentKey = prefix ? camelCase(`${prefix}_${annotation.fieldName}`) : annotation.fieldName;\n if (annotation.childType) {\n return {\n ...acc,\n ...getFlattenFieldAnnotations(annotation.childType(), currentKey)\n };\n }\n return {\n ...acc,\n [currentKey]: annotation\n };\n }, {});\n}\n\nexport function getFields(T: any, options: {\n prefix?: string;\n case?: 'snake' | 'camel' | 'original';\n} = {\n prefix: '',\n case: 'original'\n}): string[] {\n const annotations = getAnnotations(T);\n const changeCase = options?.case === 'snake' \n ? snakeCase \n : options?.case === 'camel' ? camelCase\n : (value: string) => value;\n const fields = (annotations ?? []).flatMap((annotation) => {\n const currentKey = changeCase(options?.prefix ? `${options?.prefix}_${annotation.fieldName}` : annotation.fieldName);\n if (annotation.childType) {\n return [\n ...getFields(annotation.childType(), {\n prefix: currentKey,\n case: options?.case,\n })\n ];\n }\n return [currentKey];\n });\n return fields;\n}\n\nexport function getHeaders(T: any): string[] {\n return getFields(T);\n}\n\nexport const Excel = {\n Text: createDecorator('text'),\n Date: createDecorator('date'),\n Number: createDecorator('number'),\n // JSON: createDecorator('json'),\n Array: createDecorator('array'),\n Boolean: createDecorator('boolean'),\n getAnnotations,\n};\n","import { get } from 'lodash-es';\nimport dayjs from 'dayjs';\nimport { getFlattenFieldAnnotations } from './excel.decorators';\n\nexport interface ExcelConverter<T> {\n fromExcel(record: any): T;\n fromExcelMany(records: any[]): T[];\n toExcel(model: T): any;\n toExcelMany(models: T[]): any[];\n}\n\nexport class ExcelUtils {\n static fromExcelDate(serial: number | null): Date | null {\n if (typeof serial !== 'number') return null;\n const excelEpoch = dayjs('1899-12-30');\n return excelEpoch.add(serial, 'day').toDate();\n }\n\n static fromExcelBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n return value === 'TRUE';\n }\n\n static fromExcelText(value: any): string | null {\n return value ? `${value}` : null;\n }\n \n static toExcelDate(date: dayjs.Dayjs | Date | null): Date | null {\n if (!date) return null;\n if (dayjs.isDayjs(date)) return date.toDate();\n return date;\n }\n\n static toExcelBoolean(value: boolean): string {\n return value ? 'TRUE' : 'FALSE';\n }\n\n static fromExcel<E, D extends object>(record: D, type: {new(): E}): E {\n const annotations = getFlattenFieldAnnotations<{\n type: 'number' | 'text' | 'date' | 'array' | 'boolean';\n fieldName: string;\n propName: string;\n childType?: () => any;\n }>(type);\n const obj = Object.entries(annotations).reduce((acc, [key, annotation]) => {\n const value = get(record, annotation.fieldName);\n switch (annotation.type) {\n case 'number': return { ...acc, [annotation?.propName]: isNaN(Number(value)) ? null : Number(value) };\n case 'date': return { ...acc, [annotation?.propName]: this.fromExcelDate(value) };\n case 'array': return { ...acc, [annotation?.propName]: value?.split(',') ?? [] };\n case 'boolean': return { ...acc, [annotation?.propName]: this.fromExcelBoolean(value) };\n case 'text': return { ...acc, [annotation?.propName]: this.fromExcelText(value) };\n default: return { ...acc, [annotation?.propName]: value || null };\n }\n }, {} as E);\n return obj;\n }\n \n static toExcel<E, D extends object>(entity: E, type: {new(): E}): D {\n const annotations = getFlattenFieldAnnotations<{\n type: 'number' | 'string' | 'date' | 'array' | 'boolean';\n fieldName: string;\n propName: string;\n childType?: () => any;\n }>(type);\n const obj = Object.entries(annotations).reduce((acc, [key, annotation]) => {\n const value = get(entity, annotation.propName);\n switch (annotation.type) {\n case 'number': return { ...acc, [annotation.fieldName]: isNaN(Number(value)) ? null : Number(value) };\n case 'date': return { ...acc, [annotation.fieldName]: this.toExcelDate(value) };\n case 'array': return { ...acc, [annotation.fieldName]: Array.isArray(value) ? value.join(',') : value };\n case 'boolean': return { ...acc, [annotation.fieldName]: this.toExcelBoolean(value) };\n default: return { ...acc, [annotation.fieldName]: value };\n }\n }, {} as D);\n return obj;\n }\n}\n\nexport function getConverter<T>(type: {new(): T}): ExcelConverter<T> {\n return {\n fromExcel: (record: object) => ExcelUtils.fromExcel<T, object>(record, type),\n fromExcelMany: (records: object[]) => records.map(record => ExcelUtils.fromExcel(record, type)),\n toExcel: (model: T) => ExcelUtils.toExcel(model, type),\n toExcelMany: (models: T[]) => models.map(model => ExcelUtils.toExcel(model, type)),\n };\n}\n","import { Injectable } from '@angular/core';\nimport { ExcelConverter } from './excel.converter';\nimport type { ExcelService } from '@nx-ddd/common/infrastructure/repo/excel/impl';\nimport { getEntityName } from '@nx-ddd/common/domain';\nimport { getHeaders } from './excel.decorators';\nimport { getConverter } from './excel.converter';\nimport { EXCEL_SERVICE as _EXCEL_SERVICE } from '@nx-ddd/common/infrastructure/repo/excel/token';\nimport { DiToken } from '@nx-ddd/core';\n\nexport const EXCEL_SERVICE = _EXCEL_SERVICE as DiToken<ExcelService>;\n\nexport function injectExcelService(): ExcelService | null {\n return EXCEL_SERVICE.inject() ?? null;\n}\n\n@Injectable()\nexport abstract class ExcelRepository<T> {\n protected abstract path: string;\n protected abstract sheetName: string;\n protected abstract converter: ExcelConverter<T>;\n protected service = injectExcelService();\n protected headers?: string[];\n\n async list(): Promise<T[]> {\n const records = this.service.getRecords(this.path, this.sheetName);\n return this.converter.fromExcelMany(records as any[]);\n }\n \n async saveMany(entities: T[]): Promise<void> {\n const records = entities.map(entity => this.converter.toExcel(entity));\n this.service.loadWorkbook(this.path, (workbook) => {\n return this.service.writeSheet(workbook, this.sheetName, records, this.headers);\n });\n }\n}\n\nexport function getExcelRepository<T>(type: {new(): T}, {\n sheetName = getEntityName(type),\n converter = getConverter(type),\n headers = getHeaders(type),\n path = '',\n}: {\n sheetName?: string;\n converter?: ExcelConverter<T>;\n headers?: string[];\n path?: string;\n} = {}): ExcelRepository<T> {\n class ExcelRepositoryImpl extends ExcelRepository<T> {\n protected sheetName = sheetName;\n protected converter = converter;\n protected headers = headers;\n protected path = path;\n }\n return new ExcelRepositoryImpl();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_EXCEL_SERVICE"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface ExcelConverter<T> {
|
|
|
8
8
|
export declare class ExcelUtils {
|
|
9
9
|
static fromExcelDate(serial: number | null): Date | null;
|
|
10
10
|
static fromExcelBoolean(value: any): boolean;
|
|
11
|
+
static fromExcelText(value: any): string | null;
|
|
11
12
|
static toExcelDate(date: dayjs.Dayjs | Date | null): Date | null;
|
|
12
13
|
static toExcelBoolean(value: boolean): string;
|
|
13
14
|
static fromExcel<E, D extends object>(record: D, type: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx-ddd/common",
|
|
3
|
-
"version": "19.0.0-preview.
|
|
3
|
+
"version": "19.0.0-preview.36",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/core": "19.1.4",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"reflect-metadata": "^0.1.13",
|
|
16
16
|
"rxjs": "^7.8.0",
|
|
17
17
|
"stripe": "^14.15.0",
|
|
18
|
-
"@nx-ddd/core": "19.0.0-preview.
|
|
18
|
+
"@nx-ddd/core": "19.0.0-preview.36",
|
|
19
19
|
"playwright": "^1.49.1",
|
|
20
20
|
"puppeteer-chromium-resolver": "^23.0.0",
|
|
21
21
|
"xlsx": "^0.18.5"
|