@ims-view/server 1.1.0 → 1.2.1

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.
Files changed (93) hide show
  1. package/README.md +18 -1
  2. package/lib/excel/excel-parse.worker.cjs +279 -0
  3. package/lib/server/src/app.module.js.map +1 -0
  4. package/lib/server/src/config/env.d.ts +40 -0
  5. package/lib/server/src/config/env.js +35 -0
  6. package/lib/server/src/config/env.js.map +1 -0
  7. package/lib/server/src/excel/dto/excel-task-id.dto.d.ts +19 -0
  8. package/lib/server/src/excel/dto/excel-task-id.dto.js +17 -0
  9. package/lib/server/src/excel/dto/excel-task-id.dto.js.map +1 -0
  10. package/lib/server/src/excel/dto/export-excel.dto.d.ts +67 -0
  11. package/lib/server/src/excel/dto/export-excel.dto.js +48 -0
  12. package/lib/server/src/excel/dto/export-excel.dto.js.map +1 -0
  13. package/lib/server/src/excel/excel-storage.service.d.ts +54 -0
  14. package/lib/server/src/excel/excel-storage.service.js +258 -0
  15. package/lib/server/src/excel/excel-storage.service.js.map +1 -0
  16. package/lib/server/src/excel/excel.controller.d.ts +17 -0
  17. package/lib/{excel → server/src/excel}/excel.controller.js +40 -11
  18. package/lib/server/src/excel/excel.controller.js.map +1 -0
  19. package/lib/server/src/excel/excel.converter.d.ts +15 -0
  20. package/lib/server/src/excel/excel.converter.js +53 -0
  21. package/lib/server/src/excel/excel.converter.js.map +1 -0
  22. package/lib/{excel → server/src/excel}/excel.module.js +3 -2
  23. package/lib/server/src/excel/excel.module.js.map +1 -0
  24. package/lib/server/src/excel/excel.service.d.ts +33 -0
  25. package/lib/server/src/excel/excel.service.js +244 -0
  26. package/lib/server/src/excel/excel.service.js.map +1 -0
  27. package/lib/server/src/excel/types.d.ts +6 -0
  28. package/lib/server/src/excel/types.js +44 -0
  29. package/lib/server/src/excel/types.js.map +1 -0
  30. package/lib/server/src/index.d.ts +12 -0
  31. package/lib/server/src/index.js +32 -0
  32. package/lib/server/src/index.js.map +1 -0
  33. package/lib/server/src/main.d.ts +1 -0
  34. package/lib/{main.js → server/src/main.js} +55 -2
  35. package/lib/server/src/main.js.map +1 -0
  36. package/lib/server/src/shared/create-zod-base-model.d.ts +29 -0
  37. package/lib/server/src/shared/create-zod-base-model.js +55 -0
  38. package/lib/server/src/shared/create-zod-base-model.js.map +1 -0
  39. package/lib/server/src/shared/index.d.ts +5 -0
  40. package/lib/server/src/shared/index.js +16 -0
  41. package/lib/server/src/shared/index.js.map +1 -0
  42. package/lib/server/src/shared/response-entity.d.ts +32 -0
  43. package/lib/server/src/shared/response-entity.js +74 -0
  44. package/lib/server/src/shared/response-entity.js.map +1 -0
  45. package/lib/server/src/shared/zod-exception.filter.d.ts +5 -0
  46. package/lib/server/src/shared/zod-exception.filter.js +25 -0
  47. package/lib/server/src/shared/zod-exception.filter.js.map +1 -0
  48. package/lib/server/src/shared/zod-validation.pipe.d.ts +4 -0
  49. package/lib/server/src/shared/zod-validation.pipe.js +25 -0
  50. package/lib/server/src/shared/zod-validation.pipe.js.map +1 -0
  51. package/lib/utils/src/excel/converter.d.ts +8 -0
  52. package/lib/utils/src/excel/converter.js +144 -0
  53. package/lib/utils/src/excel/converter.js.map +1 -0
  54. package/lib/utils/src/excel/exceljsChunked.d.ts +75 -0
  55. package/lib/utils/src/excel/exceljsChunked.js +338 -0
  56. package/lib/utils/src/excel/exceljsChunked.js.map +1 -0
  57. package/lib/utils/src/excel/index.d.ts +9 -0
  58. package/lib/utils/src/excel/index.js +39 -0
  59. package/lib/utils/src/excel/index.js.map +1 -0
  60. package/lib/utils/src/excel/luckyexcel.d.ts +9 -0
  61. package/lib/utils/src/excel/luckyexcel.js +137 -0
  62. package/lib/utils/src/excel/luckyexcel.js.map +1 -0
  63. package/lib/utils/src/excel/sheetjsConverter.d.ts +6 -0
  64. package/lib/utils/src/excel/sheetjsConverter.js +224 -0
  65. package/lib/utils/src/excel/sheetjsConverter.js.map +1 -0
  66. package/lib/utils/src/excel/types.d.ts +88 -0
  67. package/lib/utils/src/excel/types.js +11 -0
  68. package/lib/utils/src/excel/types.js.map +1 -0
  69. package/lib/utils/src/excel/workbookChunked.d.ts +13 -0
  70. package/lib/utils/src/excel/workbookChunked.js +152 -0
  71. package/lib/utils/src/excel/workbookChunked.js.map +1 -0
  72. package/package.json +10 -5
  73. package/lib/app.module.js.map +0 -1
  74. package/lib/excel/excel.controller.d.ts +0 -13
  75. package/lib/excel/excel.controller.js.map +0 -1
  76. package/lib/excel/excel.converter.d.ts +0 -2
  77. package/lib/excel/excel.converter.js +0 -11
  78. package/lib/excel/excel.converter.js.map +0 -1
  79. package/lib/excel/excel.module.js.map +0 -1
  80. package/lib/excel/excel.service.d.ts +0 -9
  81. package/lib/excel/excel.service.js +0 -33
  82. package/lib/excel/excel.service.js.map +0 -1
  83. package/lib/excel/types.d.ts +0 -6
  84. package/lib/excel/types.js +0 -6
  85. package/lib/excel/types.js.map +0 -1
  86. package/lib/index.d.ts +0 -7
  87. package/lib/index.js +0 -14
  88. package/lib/index.js.map +0 -1
  89. package/lib/main.d.ts +0 -1
  90. package/lib/main.js.map +0 -1
  91. /package/lib/{app.module.d.ts → server/src/app.module.d.ts} +0 -0
  92. /package/lib/{app.module.js → server/src/app.module.js} +0 -0
  93. /package/lib/{excel → server/src/excel}/excel.module.d.ts +0 -0
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseEntity = exports.StatusCode = void 0;
4
+ var StatusCode;
5
+ (function (StatusCode) {
6
+ StatusCode[StatusCode["OK"] = 0] = "OK";
7
+ StatusCode[StatusCode["BAD_REQUEST"] = 400] = "BAD_REQUEST";
8
+ StatusCode[StatusCode["NOT_FOUND"] = 404] = "NOT_FOUND";
9
+ StatusCode[StatusCode["INTERNAL_SERVER_ERROR"] = 999] = "INTERNAL_SERVER_ERROR";
10
+ })(StatusCode || (exports.StatusCode = StatusCode = {}));
11
+ class ResponseEntity {
12
+ static of(...args) {
13
+ return new ResponseEntity(...args);
14
+ }
15
+ static ofSuccess(data, code = StatusCode.OK) {
16
+ return new ResponseEntity(code, data);
17
+ }
18
+ static ofSuccessWithMsg(data, msg, code = StatusCode.OK) {
19
+ return new ResponseEntity(code, data, msg);
20
+ }
21
+ static ofFailure(err, code = 1) {
22
+ const message = err instanceof Error
23
+ ? err.message
24
+ : typeof err === 'string'
25
+ ? err
26
+ : 'Server Error';
27
+ return new ResponseEntity(code, null, message);
28
+ }
29
+ static from(object) {
30
+ return this.of(object?.code ?? this.default.code, object?.data, object?.msg, object?.retriable);
31
+ }
32
+ constructor(code, data, msg, retriable) {
33
+ this.code = code;
34
+ this.data = data;
35
+ this.msg = msg;
36
+ this.retriable = retriable;
37
+ }
38
+ getCode() {
39
+ return this.code;
40
+ }
41
+ setCode(code) {
42
+ this.code = code;
43
+ return this;
44
+ }
45
+ getData() {
46
+ return this.data;
47
+ }
48
+ setData(data) {
49
+ this.data = data;
50
+ return this;
51
+ }
52
+ getMsg() {
53
+ return this.msg;
54
+ }
55
+ setMsg(msg) {
56
+ this.msg = msg;
57
+ return this;
58
+ }
59
+ getRetriable() {
60
+ return this.retriable;
61
+ }
62
+ setRetriable(retriable) {
63
+ this.retriable = retriable;
64
+ return this;
65
+ }
66
+ }
67
+ exports.ResponseEntity = ResponseEntity;
68
+ ResponseEntity.default = Object.freeze({
69
+ code: StatusCode.OK,
70
+ data: undefined,
71
+ msg: undefined,
72
+ retriable: undefined,
73
+ });
74
+ //# sourceMappingURL=response-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-entity.js","sourceRoot":"","sources":["../../../../src/shared/response-entity.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,uCAAM,CAAA;IACN,2DAAiB,CAAA;IACjB,uDAAe,CAAA;IACf,+EAA2B,CAAA;AAC7B,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,MAAa,cAAc;IAazB,MAAM,CAAC,EAAE,CAAI,GAAG,IAAqD;QACnE,OAAO,IAAI,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,SAAS,CAAI,IAAQ,EAAE,OAAe,UAAU,CAAC,EAAE;QACxD,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAI,IAAO,EAAE,GAAY,EAAE,OAAe,UAAU,CAAC,EAAE;QAC5E,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAY,EAAE,OAAe,CAAC;QAC7C,MAAM,OAAO,GACX,GAAG,YAAY,KAAK;YAClB,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ;gBACvB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,cAAc,CAAC;QACvB,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,IAAI,CAAI,MAAgC;QAC7C,OAAO,IAAI,CAAC,EAAE,CACX,MAAM,EAAE,IAAe,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAC7C,MAAM,EAAE,IAAS,EACjB,MAAM,EAAE,GAAyB,EACjC,MAAM,EAAE,SAAgC,CACzC,CAAC;IACJ,CAAC;IAOD,YACE,IAA+B,EAC/B,IAAgC,EAChC,GAA8B,EAC9B,SAA0C;QAE1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAA+B;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAA+B;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,GAA6B;QAClC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,SAAyC;QACpD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;;AA/FH,wCAgGC;AA/FQ,sBAAO,GAKV,MAAM,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC,EAAE;IACnB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,SAAS,EAAE,SAAS;CACrB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ExceptionFilter, type ArgumentsHost } from '@nestjs/common';
2
+ import { ZodValidationError } from './create-zod-base-model';
3
+ export declare class ZodExceptionFilter implements ExceptionFilter {
4
+ catch(exception: ZodValidationError, host: ArgumentsHost): void;
5
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ZodExceptionFilter = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const create_zod_base_model_1 = require("./create-zod-base-model");
12
+ const response_entity_1 = require("./response-entity");
13
+ let ZodExceptionFilter = class ZodExceptionFilter {
14
+ catch(exception, host) {
15
+ const ctx = host.switchToHttp();
16
+ const res = ctx.getResponse();
17
+ const message = exception.message || '参数校验失败';
18
+ res.status(400).json(response_entity_1.ResponseEntity.ofFailure(message, response_entity_1.StatusCode.BAD_REQUEST));
19
+ }
20
+ };
21
+ exports.ZodExceptionFilter = ZodExceptionFilter;
22
+ exports.ZodExceptionFilter = ZodExceptionFilter = __decorate([
23
+ (0, common_1.Catch)(create_zod_base_model_1.ZodValidationError)
24
+ ], ZodExceptionFilter);
25
+ //# sourceMappingURL=zod-exception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-exception.filter.js","sourceRoot":"","sources":["../../../../src/shared/zod-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAiF;AAEjF,mEAA6D;AAC7D,uDAA+D;AAGxD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,KAAK,CAAC,SAA6B,EAAE,IAAmB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QACxC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gCAAc,CAAC,SAAS,CAAC,OAAO,EAAE,4BAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAClF,CAAC;CACF,CAAA;AAPY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,cAAK,EAAC,0CAAkB,CAAC;GACb,kBAAkB,CAO9B"}
@@ -0,0 +1,4 @@
1
+ import { type ArgumentMetadata, type PipeTransform } from '@nestjs/common';
2
+ export declare class ZodValidationPipe implements PipeTransform {
3
+ transform(value: unknown, metadata: ArgumentMetadata): any;
4
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ZodValidationPipe = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const create_zod_base_model_1 = require("./create-zod-base-model");
12
+ let ZodValidationPipe = class ZodValidationPipe {
13
+ transform(value, metadata) {
14
+ const cstr = metadata?.metatype;
15
+ if ((0, create_zod_base_model_1.isZodModel)(cstr)) {
16
+ return new cstr(value);
17
+ }
18
+ return value;
19
+ }
20
+ };
21
+ exports.ZodValidationPipe = ZodValidationPipe;
22
+ exports.ZodValidationPipe = ZodValidationPipe = __decorate([
23
+ (0, common_1.Injectable)()
24
+ ], ZodValidationPipe);
25
+ //# sourceMappingURL=zod-validation.pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-validation.pipe.js","sourceRoot":"","sources":["../../../../src/shared/zod-validation.pipe.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAuF;AACvF,mEAAqD;AAG9C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,SAAS,CAAC,KAAc,EAAE,QAA0B;QAClD,MAAM,IAAI,GAAG,QAAQ,EAAE,QAAmB,CAAC;QAC3C,IAAI,IAAA,kCAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AARY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAQ7B"}
@@ -0,0 +1,8 @@
1
+ import { type ExcelBinary, type ExcelImportResult, type IWorkbookData } from './types';
2
+ export declare const ensureXlsxBytes: (input: ExcelBinary, fileName?: string) => Uint8Array;
3
+ export declare const isLegacyExcelSource: (input: ExcelBinary, fileName?: string) => boolean;
4
+ export declare const assertSupportedExcelSource: (input: ExcelBinary, fileName?: string) => void;
5
+ export declare const excelBufferToImportResult: (input: ExcelBinary, fileName?: string) => Promise<ExcelImportResult>;
6
+ export declare const excelBufferToWorkbookData: (input: ExcelBinary, fileName?: string) => Promise<Partial<IWorkbookData>>;
7
+ export declare const workbookDataToExcelBytes: (data: Partial<IWorkbookData>) => Promise<Uint8Array>;
8
+ export declare const workbookDataToExcelBuffer: (data: Partial<IWorkbookData>) => Promise<Buffer>;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.workbookDataToExcelBuffer = exports.workbookDataToExcelBytes = exports.excelBufferToWorkbookData = exports.excelBufferToImportResult = exports.assertSupportedExcelSource = exports.isLegacyExcelSource = exports.ensureXlsxBytes = void 0;
40
+ const exceljs_1 = __importDefault(require("exceljs"));
41
+ const toUint8Array = (input) => {
42
+ if (typeof Buffer !== 'undefined' && Buffer.isBuffer(input)) {
43
+ return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
44
+ }
45
+ if (input instanceof ArrayBuffer) {
46
+ return new Uint8Array(input);
47
+ }
48
+ return input;
49
+ };
50
+ const isLegacyXlsName = (fileName) => Boolean(fileName && /\.xls$/i.test(fileName) && !/\.xlsx$/i.test(fileName));
51
+ const isOleCompoundBuffer = (bytes) => bytes.length >= 4 &&
52
+ bytes[0] === 0xd0 &&
53
+ bytes[1] === 0xcf &&
54
+ bytes[2] === 0x11 &&
55
+ bytes[3] === 0xe0;
56
+ const isZipBuffer = (bytes) => bytes.length >= 2 && bytes[0] === 0x50 && bytes[1] === 0x4b;
57
+ const needsXlsToXlsx = (bytes, fileName) => {
58
+ if (isOleCompoundBuffer(bytes))
59
+ return true;
60
+ if (isLegacyXlsName(fileName) && !isZipBuffer(bytes))
61
+ return true;
62
+ return false;
63
+ };
64
+ const ensureXlsxBytes = (input, fileName) => {
65
+ const bytes = toUint8Array(input);
66
+ if (needsXlsToXlsx(bytes, fileName)) {
67
+ throw new Error('仅支持 .xlsx,不支持旧版 .xls');
68
+ }
69
+ return bytes;
70
+ };
71
+ exports.ensureXlsxBytes = ensureXlsxBytes;
72
+ const isLegacyExcelSource = (input, fileName) => needsXlsToXlsx(toUint8Array(input), fileName);
73
+ exports.isLegacyExcelSource = isLegacyExcelSource;
74
+ const assertSupportedExcelSource = (input, fileName) => {
75
+ if ((0, exports.isLegacyExcelSource)(input, fileName)) {
76
+ throw new Error('仅支持 .xlsx,不支持旧版 .xls');
77
+ }
78
+ };
79
+ exports.assertSupportedExcelSource = assertSupportedExcelSource;
80
+ const excelBufferToImportResult = async (input, fileName = 'workbook.xlsx') => {
81
+ const { importExcelBinary } = await Promise.resolve().then(() => __importStar(require('./luckyexcel')));
82
+ return importExcelBinary(input, fileName);
83
+ };
84
+ exports.excelBufferToImportResult = excelBufferToImportResult;
85
+ const excelBufferToWorkbookData = async (input, fileName) => {
86
+ const result = await (0, exports.excelBufferToImportResult)(input, fileName);
87
+ return result.workbookData;
88
+ };
89
+ exports.excelBufferToWorkbookData = excelBufferToWorkbookData;
90
+ const workbookDataToExcelBytes = async (data) => {
91
+ const workbook = new exceljs_1.default.Workbook();
92
+ workbook.creator = data.name || 'Workbook';
93
+ const sheetOrder = data.sheetOrder?.length
94
+ ? data.sheetOrder
95
+ : Object.keys(data.sheets || {});
96
+ if (!sheetOrder.length) {
97
+ workbook.addWorksheet('Sheet1');
98
+ }
99
+ sheetOrder.forEach((sheetId) => {
100
+ const sheet = data.sheets?.[sheetId];
101
+ const worksheet = workbook.addWorksheet(sheet?.name || sheetId || 'Sheet1');
102
+ const cellData = sheet?.cellData || {};
103
+ Object.keys(cellData).forEach((rowKey) => {
104
+ const rowIndex = Number(rowKey);
105
+ const row = cellData[rowIndex] || {};
106
+ Object.keys(row).forEach((colKey) => {
107
+ const colIndex = Number(colKey);
108
+ const cell = row[colIndex];
109
+ if (!cell)
110
+ return;
111
+ const excelCell = worksheet.getCell(rowIndex + 1, colIndex + 1);
112
+ if (cell.f) {
113
+ excelCell.value = {
114
+ formula: cell.f.replace(/^=/, ''),
115
+ result: cell.v,
116
+ };
117
+ return;
118
+ }
119
+ if (cell.v != null) {
120
+ excelCell.value = cell.v;
121
+ }
122
+ });
123
+ });
124
+ (sheet?.mergeData || []).forEach((range) => {
125
+ try {
126
+ worksheet.mergeCells(range.startRow + 1, range.startColumn + 1, range.endRow + 1, range.endColumn + 1);
127
+ }
128
+ catch {
129
+ }
130
+ });
131
+ });
132
+ const arrayBuffer = await workbook.xlsx.writeBuffer();
133
+ return toUint8Array(arrayBuffer);
134
+ };
135
+ exports.workbookDataToExcelBytes = workbookDataToExcelBytes;
136
+ const workbookDataToExcelBuffer = async (data) => {
137
+ const bytes = await (0, exports.workbookDataToExcelBytes)(data);
138
+ if (typeof Buffer === 'undefined') {
139
+ throw new Error('workbookDataToExcelBuffer 仅可在 Node.js 环境使用');
140
+ }
141
+ return Buffer.from(bytes);
142
+ };
143
+ exports.workbookDataToExcelBuffer = workbookDataToExcelBuffer;
144
+ //# sourceMappingURL=converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../../../../../utils/src/excel/converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA8B;AAO9B,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAc,EAAE;IACtD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAmB,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAiB,EAAE,EAAE,CAC5C,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE9E,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAE,EAAE,CAChD,KAAK,CAAC,MAAM,IAAI,CAAC;IACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;IACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;IACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;IACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEpB,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,EAAE,CACxC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAE9D,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAE,QAAiB,EAAE,EAAE;IAC9D,IAAI,mBAAmB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAGK,MAAM,eAAe,GAAG,CAAC,KAAkB,EAAE,QAAiB,EAAc,EAAE;IACnF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B;AAGK,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAE,QAAiB,EAAE,EAAE,CAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;AADnC,QAAA,mBAAmB,uBACgB;AAEzC,MAAM,0BAA0B,GAAG,CAAC,KAAkB,EAAE,QAAiB,EAAE,EAAE;IAClF,IAAI,IAAA,2BAAmB,EAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,KAAkB,EAClB,QAAQ,GAAG,eAAe,EACE,EAAE;IAE9B,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAAa,cAAc,GAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC,CAAC;AAPW,QAAA,yBAAyB,6BAOpC;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,KAAkB,EAClB,QAAiB,EACgB,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAyB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC,CAAC;AANW,QAAA,yBAAyB,6BAMpC;AAEK,MAAM,wBAAwB,GAAG,KAAK,EAC3C,IAA4B,EACP,EAAE;IACvB,MAAM,QAAQ,GAAG,IAAI,iBAAO,CAAC,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM;QACxC,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,IAAI,QAAQ,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAErC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3B,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAElB,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAEhE,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;oBACX,SAAS,CAAC,KAAK,GAAG;wBAChB,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;wBACjC,MAAM,EAAE,IAAI,CAAC,CAA0C;qBACxD,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;oBACnB,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,CAAsB,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,SAAS,CAAC,UAAU,CAClB,KAAK,CAAC,QAAQ,GAAG,CAAC,EAClB,KAAK,CAAC,WAAW,GAAG,CAAC,EACrB,KAAK,CAAC,MAAM,GAAG,CAAC,EAChB,KAAK,CAAC,SAAS,GAAG,CAAC,CACpB,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,YAAY,CAAC,WAA0B,CAAC,CAAC;AAClD,CAAC,CAAC;AA5DW,QAAA,wBAAwB,4BA4DnC;AAGK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,IAA4B,EACX,EAAE;IACnB,MAAM,KAAK,GAAG,MAAM,IAAA,gCAAwB,EAAC,IAAI,CAAC,CAAC;IACnD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AARW,QAAA,yBAAyB,6BAQpC"}
@@ -0,0 +1,75 @@
1
+ import { type ExcelBinary, type ICellData, type IRange, type IWorkbookData } from './types';
2
+ export declare const CHUNKED_FILE_BYTES: number;
3
+ export declare const CHUNKED_ROW_THRESHOLD = 50000;
4
+ export declare const DEFAULT_BLOCK_ROW_SIZE = 5000;
5
+ export declare const DEFAULT_MAX_ROWS = 150000;
6
+ export declare const DEFAULT_PARSE_TIMEOUT_MS: number;
7
+ export type ChunkedSheetMeta = {
8
+ id: string;
9
+ name: string;
10
+ rowCount: number;
11
+ columnCount: number;
12
+ blockCount: number;
13
+ mergeData?: IRange[];
14
+ columnData?: Record<number, {
15
+ w?: number;
16
+ hd?: number;
17
+ }>;
18
+ rowData?: Record<number, {
19
+ h?: number;
20
+ hd?: number;
21
+ }>;
22
+ defaultColumnWidth?: number;
23
+ defaultRowHeight?: number;
24
+ };
25
+ export type ChunkedWorkbookMeta = {
26
+ parseEngine: 'luckyexcel' | 'exceljs';
27
+ fileName: string;
28
+ name: string;
29
+ sheetOrder: string[];
30
+ sheets: ChunkedSheetMeta[];
31
+ blockRowSize: number;
32
+ truncated?: boolean;
33
+ maxRows?: number;
34
+ styles?: Record<string, unknown>;
35
+ resources?: Array<{
36
+ name: string;
37
+ data: string;
38
+ }>;
39
+ appVersion?: string;
40
+ locale?: string;
41
+ workbookId?: string;
42
+ };
43
+ export type ChunkedBlock = {
44
+ sheetId: string;
45
+ sheetIndex: number;
46
+ blockIndex: number;
47
+ startRow: number;
48
+ endRow: number;
49
+ cellData: Record<number, Record<number, ICellData>>;
50
+ };
51
+ export type ChunkedProgress = {
52
+ percent: number;
53
+ parsedBlocks: number;
54
+ totalBlocks: number;
55
+ phase: 'load' | 'convert' | 'done';
56
+ };
57
+ export type ChunkedConvertOptions = {
58
+ fileName?: string;
59
+ blockRowSize?: number;
60
+ maxRows?: number;
61
+ onProgress?: (progress: ChunkedProgress) => void;
62
+ onBlock?: (block: ChunkedBlock) => void | Promise<void>;
63
+ };
64
+ export declare const shouldUseChunkedImport: (sizeBytes: number, options?: {
65
+ bytesThreshold?: number;
66
+ rowsThreshold?: number;
67
+ estimatedRows?: number;
68
+ }) => boolean;
69
+ export declare const skeletonWorkbookFromMeta: (meta: ChunkedWorkbookMeta) => Partial<IWorkbookData>;
70
+ export declare const excelBufferToChunkedWorkbook: (input: ExcelBinary, options?: ChunkedConvertOptions) => Promise<{
71
+ meta: ChunkedWorkbookMeta;
72
+ blocks: ChunkedBlock[];
73
+ }>;
74
+ export declare const chunkedBlockFileName: (id: string, sheetIndex: number, blockIndex: number) => string;
75
+ export declare const chunkedMetaFileName: (id: string) => string;