@solidstarters/solid-core 1.2.201 → 1.2.202

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 (224) hide show
  1. package/dist/config/cache.options.d.ts +1 -1
  2. package/dist/config/cache.options.d.ts.map +1 -1
  3. package/dist/config/cache.options.js +2 -2
  4. package/dist/config/cache.options.js.map +1 -1
  5. package/dist/config/iam.config.d.ts +4 -0
  6. package/dist/config/iam.config.d.ts.map +1 -1
  7. package/dist/config/iam.config.js +2 -0
  8. package/dist/config/iam.config.js.map +1 -1
  9. package/dist/controllers/model-metadata.controller.d.ts +25 -0
  10. package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
  11. package/dist/controllers/model-metadata.controller.js +23 -0
  12. package/dist/controllers/model-metadata.controller.js.map +1 -1
  13. package/dist/controllers/setting.controller.d.ts +1 -2
  14. package/dist/controllers/setting.controller.d.ts.map +1 -1
  15. package/dist/controllers/setting.controller.js +21 -42
  16. package/dist/controllers/setting.controller.js.map +1 -1
  17. package/dist/decorators/sms-provider.decorator.d.ts +3 -0
  18. package/dist/decorators/sms-provider.decorator.d.ts.map +1 -0
  19. package/dist/decorators/sms-provider.decorator.js +11 -0
  20. package/dist/decorators/sms-provider.decorator.js.map +1 -0
  21. package/dist/dtos/navigation.dto.d.ts +6 -0
  22. package/dist/dtos/navigation.dto.d.ts.map +1 -0
  23. package/dist/dtos/navigation.dto.js +33 -0
  24. package/dist/dtos/navigation.dto.js.map +1 -0
  25. package/dist/dtos/sign-in.dto.js +3 -3
  26. package/dist/dtos/sign-in.dto.js.map +1 -1
  27. package/dist/entities/common.entity.js +5 -4
  28. package/dist/entities/common.entity.js.map +1 -1
  29. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  30. package/dist/entities/field-metadata.entity.js +2 -1
  31. package/dist/entities/field-metadata.entity.js.map +1 -1
  32. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  33. package/dist/entities/legacy-common.entity.js +5 -4
  34. package/dist/entities/legacy-common.entity.js.map +1 -1
  35. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  36. package/dist/entities/model-metadata.entity.js +5 -1
  37. package/dist/entities/model-metadata.entity.js.map +1 -1
  38. package/dist/factories/mail.factory.d.ts.map +1 -1
  39. package/dist/factories/mail.factory.js.map +1 -1
  40. package/dist/factories/sms.factory.d.ts +14 -0
  41. package/dist/factories/sms.factory.d.ts.map +1 -0
  42. package/dist/factories/sms.factory.js +53 -0
  43. package/dist/factories/sms.factory.js.map +1 -0
  44. package/dist/helpers/date.helper.d.ts.map +1 -1
  45. package/dist/helpers/date.helper.js +13 -4
  46. package/dist/helpers/date.helper.js.map +1 -1
  47. package/dist/helpers/solid-registry.d.ts +3 -0
  48. package/dist/helpers/solid-registry.d.ts.map +1 -1
  49. package/dist/helpers/solid-registry.js +7 -0
  50. package/dist/helpers/solid-registry.js.map +1 -1
  51. package/dist/index.d.ts +9 -6
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +9 -6
  54. package/dist/index.js.map +1 -1
  55. package/dist/jobs/database/{sms-publisher-database.service.d.ts → msg91-sms-publisher-database.service.d.ts} +2 -2
  56. package/dist/jobs/database/msg91-sms-publisher-database.service.d.ts.map +1 -0
  57. package/dist/jobs/database/{sms-publisher-database.service.js → msg91-sms-publisher-database.service.js} +8 -8
  58. package/dist/jobs/database/msg91-sms-publisher-database.service.js.map +1 -0
  59. package/dist/jobs/database/{sms-queue-database-options.d.ts → msg91-sms-queue-database-options.d.ts} +1 -1
  60. package/dist/jobs/database/msg91-sms-queue-database-options.d.ts.map +1 -0
  61. package/dist/jobs/database/{sms-queue-database-options.js → msg91-sms-queue-database-options.js} +1 -1
  62. package/dist/jobs/database/msg91-sms-queue-database-options.js.map +1 -0
  63. package/dist/jobs/database/{sms-subscriber-database.service.d.ts → msg91-sms-subscriber-database.service.d.ts} +5 -5
  64. package/dist/jobs/database/msg91-sms-subscriber-database.service.d.ts.map +1 -0
  65. package/dist/jobs/database/{sms-subscriber-database.service.js → msg91-sms-subscriber-database.service.js} +14 -12
  66. package/dist/jobs/database/msg91-sms-subscriber-database.service.js.map +1 -0
  67. package/dist/jobs/database/otp-subscriber-database.service.d.ts +4 -4
  68. package/dist/jobs/database/otp-subscriber-database.service.d.ts.map +1 -1
  69. package/dist/jobs/database/otp-subscriber-database.service.js +6 -4
  70. package/dist/jobs/database/otp-subscriber-database.service.js.map +1 -1
  71. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +3 -3
  72. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts.map +1 -1
  73. package/dist/jobs/database/twilio-sms-subscriber-database.service.js +6 -4
  74. package/dist/jobs/database/twilio-sms-subscriber-database.service.js.map +1 -1
  75. package/dist/jobs/{sms-publisher.service.d.ts → msg91-otp-publisher.service.d.ts} +2 -2
  76. package/dist/jobs/msg91-otp-publisher.service.d.ts.map +1 -0
  77. package/dist/jobs/{sms-publisher.service.js → msg91-otp-publisher.service.js} +8 -8
  78. package/dist/jobs/msg91-otp-publisher.service.js.map +1 -0
  79. package/dist/jobs/{sms-queue-options.d.ts → msg91-otp-queue-options.d.ts} +1 -1
  80. package/dist/jobs/msg91-otp-queue-options.d.ts.map +1 -0
  81. package/dist/jobs/{otp-queue-options.js → msg91-otp-queue-options.js} +1 -1
  82. package/dist/jobs/msg91-otp-queue-options.js.map +1 -0
  83. package/dist/jobs/{sms-subscriber.service.d.ts → msg91-otp-subscriber.service.d.ts} +6 -6
  84. package/dist/jobs/msg91-otp-subscriber.service.d.ts.map +1 -0
  85. package/dist/jobs/{otp-subscriber.service.js → msg91-otp-subscriber.service.js} +14 -12
  86. package/dist/jobs/msg91-otp-subscriber.service.js.map +1 -0
  87. package/dist/jobs/{otp-publisher.service.d.ts → msg91-sms-publisher.service.d.ts} +2 -2
  88. package/dist/jobs/msg91-sms-publisher.service.d.ts.map +1 -0
  89. package/dist/jobs/{otp-publisher.service.js → msg91-sms-publisher.service.js} +8 -8
  90. package/dist/jobs/msg91-sms-publisher.service.js.map +1 -0
  91. package/dist/jobs/{otp-queue-options.d.ts → msg91-sms-queue-options.d.ts} +1 -1
  92. package/dist/jobs/msg91-sms-queue-options.d.ts.map +1 -0
  93. package/dist/jobs/{sms-queue-options.js → msg91-sms-queue-options.js} +1 -1
  94. package/dist/jobs/msg91-sms-queue-options.js.map +1 -0
  95. package/dist/jobs/{otp-subscriber.service.d.ts → msg91-sms-subscriber.service.d.ts} +7 -7
  96. package/dist/jobs/msg91-sms-subscriber.service.d.ts.map +1 -0
  97. package/dist/jobs/{sms-subscriber.service.js → msg91-sms-subscriber.service.js} +14 -12
  98. package/dist/jobs/msg91-sms-subscriber.service.js.map +1 -0
  99. package/dist/jobs/twilio-sms-subscriber.service.d.ts +3 -3
  100. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -1
  101. package/dist/jobs/twilio-sms-subscriber.service.js +6 -4
  102. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -1
  103. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  104. package/dist/seeders/module-metadata-seeder.service.js +23 -1
  105. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  106. package/dist/seeders/seed-data/solid-core-metadata.json +30 -25
  107. package/dist/seeders/user-seeder.service.d.ts.map +1 -1
  108. package/dist/seeders/user-seeder.service.js +5 -4
  109. package/dist/seeders/user-seeder.service.js.map +1 -1
  110. package/dist/services/authentication.service.d.ts +6 -3
  111. package/dist/services/authentication.service.d.ts.map +1 -1
  112. package/dist/services/authentication.service.js +48 -13
  113. package/dist/services/authentication.service.js.map +1 -1
  114. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  115. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  116. package/dist/services/crud.service.d.ts +1 -2
  117. package/dist/services/crud.service.d.ts.map +1 -1
  118. package/dist/services/crud.service.js.map +1 -1
  119. package/dist/services/excel.service.d.ts +1 -0
  120. package/dist/services/excel.service.d.ts.map +1 -1
  121. package/dist/services/excel.service.js +4 -0
  122. package/dist/services/excel.service.js.map +1 -1
  123. package/dist/services/model-metadata.service.d.ts +28 -1
  124. package/dist/services/model-metadata.service.d.ts.map +1 -1
  125. package/dist/services/model-metadata.service.js +109 -2
  126. package/dist/services/model-metadata.service.js.map +1 -1
  127. package/dist/services/setting.service.d.ts.map +1 -1
  128. package/dist/services/setting.service.js +3 -45
  129. package/dist/services/setting.service.js.map +1 -1
  130. package/dist/services/sms/Msg91BaseSMSService.js +6 -6
  131. package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
  132. package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
  133. package/dist/services/sms/Msg91OTPService.js +3 -1
  134. package/dist/services/sms/Msg91OTPService.js.map +1 -1
  135. package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
  136. package/dist/services/sms/Msg91SMSService.js +3 -1
  137. package/dist/services/sms/Msg91SMSService.js.map +1 -1
  138. package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
  139. package/dist/services/sms/TwilioSMSService.js +2 -0
  140. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  141. package/dist/services/solid-introspect.service.d.ts +1 -0
  142. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  143. package/dist/services/solid-introspect.service.js +14 -0
  144. package/dist/services/solid-introspect.service.js.map +1 -1
  145. package/dist/solid-core-cli.module.js +1 -1
  146. package/dist/solid-core-cli.module.js.map +1 -1
  147. package/dist/solid-core.module.d.ts.map +1 -1
  148. package/dist/solid-core.module.js +22 -13
  149. package/dist/solid-core.module.js.map +1 -1
  150. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  151. package/dist/subscribers/scheduled-job.subscriber.js +1 -1
  152. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  153. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +2 -2
  154. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
  155. package/dist/transformers/typeorm/local-date-time-transformer.js +28 -6
  156. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
  157. package/dist/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +1 -1
  159. package/src/config/cache.options.ts +6 -3
  160. package/src/config/iam.config.ts +2 -1
  161. package/src/controllers/model-metadata.controller.ts +21 -1
  162. package/src/controllers/setting.controller.ts +32 -36
  163. package/src/decorators/sms-provider.decorator.ts +7 -0
  164. package/src/dtos/navigation.dto.ts +14 -0
  165. package/src/dtos/sign-in.dto.ts +3 -3
  166. package/src/entities/common.entity.ts +7 -7
  167. package/src/entities/field-metadata.entity.ts +1 -1
  168. package/src/entities/legacy-common.entity.ts +6 -5
  169. package/src/entities/model-metadata.entity.ts +1 -1
  170. package/src/factories/mail.factory.ts +0 -1
  171. package/src/factories/sms.factory.ts +43 -0
  172. package/src/helpers/date.helper.ts +38 -9
  173. package/src/helpers/solid-registry.ts +9 -0
  174. package/src/index.ts +9 -6
  175. package/src/jobs/database/{sms-publisher-database.service.ts → msg91-sms-publisher-database.service.ts} +2 -2
  176. package/src/jobs/database/{sms-subscriber-database.service.ts → msg91-sms-subscriber-database.service.ts} +9 -4
  177. package/src/jobs/database/otp-subscriber-database.service.ts +8 -2
  178. package/src/jobs/database/twilio-sms-subscriber-database.service.ts +5 -2
  179. package/src/jobs/{otp-publisher.service.ts → msg91-otp-publisher.service.ts} +2 -2
  180. package/src/jobs/{otp-subscriber.service.ts → msg91-otp-subscriber.service.ts} +10 -4
  181. package/src/jobs/{sms-publisher.service.ts → msg91-sms-publisher.service.ts} +2 -2
  182. package/src/jobs/{sms-subscriber.service.ts → msg91-sms-subscriber.service.ts} +9 -4
  183. package/src/jobs/twilio-sms-subscriber.service.ts +6 -2
  184. package/src/seeders/module-metadata-seeder.service.ts +30 -5
  185. package/src/seeders/seed-data/email-templates/email-on-signup.handlebars.html +155 -0
  186. package/src/seeders/seed-data/sms-templates/text-on-signup.handlebars.txt +10 -0
  187. package/src/seeders/seed-data/solid-core-metadata.json +31 -26
  188. package/src/seeders/user-seeder.service.ts +5 -4
  189. package/src/services/authentication.service.ts +73 -10
  190. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +1 -2
  191. package/src/services/crud.service.ts +17 -18
  192. package/src/services/excel.service.ts +6 -0
  193. package/src/services/model-metadata.service.ts +151 -0
  194. package/src/services/setting.service.ts +12 -52
  195. package/src/services/sms/Msg91BaseSMSService.ts +6 -6
  196. package/src/services/sms/Msg91OTPService.ts +3 -2
  197. package/src/services/sms/Msg91SMSService.ts +3 -1
  198. package/src/services/sms/TwilioSMSService.ts +3 -3
  199. package/src/services/solid-introspect.service.ts +22 -0
  200. package/src/solid-core-cli.module.ts +2 -2
  201. package/src/solid-core.module.ts +24 -13
  202. package/src/subscribers/scheduled-job.subscriber.ts +9 -2
  203. package/src/transformers/typeorm/local-date-time-transformer.ts +38 -13
  204. package/dist/jobs/database/sms-publisher-database.service.d.ts.map +0 -1
  205. package/dist/jobs/database/sms-publisher-database.service.js.map +0 -1
  206. package/dist/jobs/database/sms-queue-database-options.d.ts.map +0 -1
  207. package/dist/jobs/database/sms-queue-database-options.js.map +0 -1
  208. package/dist/jobs/database/sms-subscriber-database.service.d.ts.map +0 -1
  209. package/dist/jobs/database/sms-subscriber-database.service.js.map +0 -1
  210. package/dist/jobs/otp-publisher.service.d.ts.map +0 -1
  211. package/dist/jobs/otp-publisher.service.js.map +0 -1
  212. package/dist/jobs/otp-queue-options.d.ts.map +0 -1
  213. package/dist/jobs/otp-queue-options.js.map +0 -1
  214. package/dist/jobs/otp-subscriber.service.d.ts.map +0 -1
  215. package/dist/jobs/otp-subscriber.service.js.map +0 -1
  216. package/dist/jobs/sms-publisher.service.d.ts.map +0 -1
  217. package/dist/jobs/sms-publisher.service.js.map +0 -1
  218. package/dist/jobs/sms-queue-options.d.ts.map +0 -1
  219. package/dist/jobs/sms-queue-options.js.map +0 -1
  220. package/dist/jobs/sms-subscriber.service.d.ts.map +0 -1
  221. package/dist/jobs/sms-subscriber.service.js.map +0 -1
  222. /package/src/jobs/database/{sms-queue-database-options.ts → msg91-sms-queue-database-options.ts} +0 -0
  223. /package/src/jobs/{otp-queue-options.ts → msg91-otp-queue-options.ts} +0 -0
  224. /package/src/jobs/{sms-queue-options.ts → msg91-sms-queue-options.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"excel.service.js","sourceRoot":"","sources":["../../src/services/excel.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport * as ExcelJS from 'exceljs';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { PassThrough, Readable } from 'stream';\n\nexport interface ExcelReadOptions {\n pageSize?: number; // Number of records per page\n hasHeaderRow?: boolean; // Whether the first row contains headers\n providedHeaders?: string[]; // Custom headers if hasHeaderRow is false\n}\n\nconst DEFAULT_PAGE_SIZE = 100; // Default page size if not provided\n\nexport interface ExcelReadResult {\n headers: string[]; // Headers of the Excel file\n data: Record<string, any>[]; // Data records in the current page\n}\n\nexport interface ExcelReadAllResult {\n headers: string[];\n rows: Record<string, any>[];\n}\n\n@Injectable()\nexport class ExcelService {\n private logger = new Logger(ExcelService.name);\n\n public async createExcelStream(\n getDataRecords: (chunkIndex: number, chunkSize: number) => Promise<any[]>,\n chunkSize: number = 100,\n headers: string[] = []\n ): Promise<Readable> {\n // Validations\n // If neither headers nor data records function is provided, throw an error\n if (headers.length === 0 && typeof getDataRecords !== 'function') {\n throw new Error(ERROR_MESSAGES.MISSING_HEADERS_OR_FUNCTION);\n }\n\n // If data records function is provided, chunkSize must be greater than 0\n if (getDataRecords && chunkSize <= 0) {\n throw new Error(ERROR_MESSAGES.INVALID_CHUNK_SIZE);\n }\n\n const passThrough = new PassThrough(); // Create streaming pipe\n try {\n const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({ stream: passThrough });\n const worksheet = workbook.addWorksheet('Data');\n\n // If headers are provided, use them;\n let isHeaderWritten = false;\n if (headers.length > 0) {\n worksheet.columns = headers.map((header) => ({\n header: header, // Convert header names to uppercase\n key: header,\n width: 20, // Set column width\n }));\n isHeaderWritten = true; // Mark headers as written\n }\n\n // ✅ If no data loader provided, write only headers and finish\n if (typeof getDataRecords !== 'function') {\n // worksheet.addRow(\n // headers.reduce((acc, header) => ({ ...acc, [header]: '' }), {})\n // ).commit(); // Write a dummy record with headers\n\n workbook.commit();\n return passThrough;\n }\n\n // Write the data records in chunks\n let chunkIndex = 0;\n while (true) {\n const records = await getDataRecords(chunkIndex, chunkSize); // Fetch chunked data\n if (records.length === 0) break; // Stop if no more records\n\n if (!isHeaderWritten) { // Falback because without columns being set, ExcelJS won't write data correctly\n worksheet.columns = Object.keys(records[0]).map((key) => ({\n header: key.toUpperCase(),\n key: key,\n width: 20,\n }));\n isHeaderWritten = true;\n }\n\n records.forEach((item) => {\n worksheet.addRow(item).commit(); // Commit each row immediately\n });\n\n chunkIndex++; // Fetch next chunk\n this.logger.debug(`✅ Chunk ${chunkIndex} written to Excel`);\n }\n\n workbook.commit();\n // passThrough.end(); // ✅ Properly close the stream\n } catch (error) {\n this.logger.error(`❌ Error writing Excel: ${error.message}`);\n passThrough.destroy(error); // Destroy stream\n throw error;\n }\n return passThrough; // Return streaming response\n }\n\n public async *readExcelInPagesFromStream(\n stream: Readable,\n options?: ExcelReadOptions\n ): AsyncGenerator<ExcelReadResult> {\n const { pageSize = DEFAULT_PAGE_SIZE, hasHeaderRow = true, providedHeaders = [] } = options || {};\n const workbookReader = new ExcelJS.stream.xlsx.WorkbookReader(stream, {});\n\n let headers: string[] = [];\n let page: Record<string, any>[] = [];\n let isFirstRow = true;\n let hasYieldedData = false;\n\n for await (const worksheet of workbookReader) {\n for await (const row of worksheet) {\n const values = Array.isArray(row.values) ? row.values.slice(1) : [];\n\n if (isFirstRow) {\n isFirstRow = false;\n\n if (hasHeaderRow) {\n headers = values.map(v => v?.toString().trim() || '');\n continue;\n } else if (providedHeaders.length) {\n headers = providedHeaders;\n } else {\n headers = values.map((_, idx) => `${idx}`);\n }\n }\n\n while (values.length < headers.length) values.push(null);\n if (values.length > headers.length) values.length = headers.length;\n\n const record = headers.reduce((acc, key, i) => {\n acc[key] = values[i] ?? null;\n return acc;\n }, {} as Record<string, any>);\n\n if (Object.values(record).every(v => v === null || v === '')) continue;\n\n page.push(record);\n\n if (page.length === pageSize) {\n yield { headers, data: page };\n hasYieldedData = true;\n page = [];\n }\n }\n\n // Optional: break if only processing first worksheet\n // break;\n }\n\n if (page.length > 0) {\n yield { headers, data: page };\n hasYieldedData = true;\n }\n\n // ✅ Yield headers with empty data if only headers were found\n if (!hasYieldedData && headers.length > 0) {\n yield { headers, data: [] };\n }\n }\n\n private cleanString(value: any): string {\n return (value === null || value === undefined ? '' : String(value))\n .replace(/\\uFEFF/g, '') // BOM\n .replace(/\\u00A0/g, ' ') // NBSP\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n private normalizeCellValue(value: any, sharedStrings?: any[]): any {\n if (value === undefined || value === null) return null;\n\n // ExcelJS streaming shared string ref: { sharedString: number }\n if (typeof value === 'object' && value && 'sharedString' in value) {\n const idx = (value as any).sharedString;\n const resolved = sharedStrings?.[idx];\n // sharedStrings may store objects or plain strings depending on ExcelJS internals\n if (resolved === undefined || resolved === null) return null;\n if (typeof resolved === 'string') return resolved;\n if (typeof resolved === 'object') {\n if ('text' in resolved && typeof (resolved as any).text === 'string') return (resolved as any).text;\n if ('richText' in resolved && Array.isArray((resolved as any).richText)) {\n return (resolved as any).richText.map((item: any) => item?.text ?? '').join('');\n }\n if ('value' in resolved) return (resolved as any).value;\n }\n return resolved;\n }\n\n // ExcelJS can return rich objects for styled cells; unwrap to plain text/primitive\n if (typeof value === 'object' && value) {\n // Plain rich cell: { text: '...' }\n if ('text' in value && typeof (value as any).text === 'string') return (value as any).text;\n\n // Rich text: { richText: [{text:'a'}, ...] }\n if ('richText' in value && Array.isArray((value as any).richText)) {\n return (value as any).richText.map((item: any) => item?.text ?? '').join('');\n }\n\n // Formula cells: { formula: '...', result: ... }\n if ('result' in value) return (value as any).result;\n if ('formula' in value) return (value as any).formula;\n\n // Hyperlinks: { text: '...', hyperlink: '...' }\n if ('hyperlink' in value && typeof (value as any).hyperlink === 'string') {\n return (value as any).text ?? (value as any).hyperlink;\n }\n\n // Sometimes primitive nested under .value\n if ('value' in value) return this.normalizeCellValue((value as any).value, sharedStrings);\n }\n\n return value;\n }\n\n public async readExcelFromStreamNonStreaming(\n stream: Readable,\n options?: ExcelReadOptions & { worksheetIndex?: number; maxRows?: number }\n ): Promise<ExcelReadAllResult> {\n const {\n hasHeaderRow = true,\n providedHeaders = [],\n worksheetIndex = 0, // 0-based\n maxRows,\n } = options || {};\n\n // 1) Read entire stream into a Buffer\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n\n // 2) Load workbook (non-streaming)\n const workbook = new ExcelJS.Workbook();\n // @ts-ignore\n await workbook.xlsx.load(buffer);\n\n const worksheet = workbook.worksheets?.[worksheetIndex];\n if (!worksheet) {\n return { headers: [], rows: [] };\n }\n\n // 3) Determine headers\n let headers: string[] = [];\n\n const firstRow = worksheet.getRow(1);\n const firstRowValues = Array.isArray(firstRow.values) ? (firstRow.values as any[]).slice(1) : [];\n\n const normalizeNonStreamingCell = (v: any) => {\n // In non-streaming ExcelJS, cell.value can be:\n // - string/number/boolean/date\n // - {richText}, {text}, {hyperlink}, {formula,result}, etc.\n // We'll reuse your normalizeCellValue but without sharedStrings\n return this.normalizeCellValue(v);\n };\n\n if (hasHeaderRow) {\n headers = firstRowValues.map((v) => this.cleanString(normalizeNonStreamingCell(v)));\n } else if (providedHeaders.length) {\n headers = providedHeaders.map((h) => this.cleanString(h));\n } else {\n headers = firstRowValues.map((_, idx) => `${idx}`);\n }\n\n // If headers are all blank and hasHeaderRow=true, treat as no headers (avoid mapping everything to \"\")\n if (hasHeaderRow && headers.length > 0 && headers.every((h) => !h)) {\n this.logger.warn(`ExcelService.readExcelFromStreamNonStreaming: header row appears blank`);\n }\n\n // 4) Read rows\n const rows: Record<string, any>[] = [];\n\n const startRowNumber = hasHeaderRow ? 2 : 1;\n const lastRowNumber = worksheet.rowCount || 0;\n\n for (let r = startRowNumber; r <= lastRowNumber; r++) {\n if (maxRows && rows.length >= maxRows) break;\n\n const row = worksheet.getRow(r);\n const rawValues = Array.isArray(row.values) ? (row.values as any[]).slice(1) : [];\n const values = rawValues.map((v) => normalizeNonStreamingCell(v));\n\n // Align row width to header width\n while (values.length < headers.length) values.push(null);\n if (values.length > headers.length) values.length = headers.length;\n\n const record = headers.reduce((acc, key, i) => {\n acc[key] = values[i] ?? null;\n return acc;\n }, {} as Record<string, any>);\n\n // Skip fully empty rows\n if (Object.values(record).every((v) => v === null || this.cleanString(v) === '')) continue;\n\n rows.push(record);\n }\n\n return { headers, rows };\n }\n}"]}
1
+ {"version":3,"file":"excel.service.js","sourceRoot":"","sources":["../../src/services/excel.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport * as ExcelJS from 'exceljs';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { parseFlexibleDate } from 'src/helpers/date.helper';\nimport { PassThrough, Readable } from 'stream';\n\nexport interface ExcelReadOptions {\n pageSize?: number; // Number of records per page\n hasHeaderRow?: boolean; // Whether the first row contains headers\n providedHeaders?: string[]; // Custom headers if hasHeaderRow is false\n}\n\nconst DEFAULT_PAGE_SIZE = 100; // Default page size if not provided\n\nexport interface ExcelReadResult {\n headers: string[]; // Headers of the Excel file\n data: Record<string, any>[]; // Data records in the current page\n}\n\nexport interface ExcelReadAllResult {\n headers: string[];\n rows: Record<string, any>[];\n}\n\n@Injectable()\nexport class ExcelService {\n private logger = new Logger(ExcelService.name);\n\n public async createExcelStream(\n getDataRecords: (chunkIndex: number, chunkSize: number) => Promise<any[]>,\n chunkSize: number = 100,\n headers: string[] = []\n ): Promise<Readable> {\n // Validations\n // If neither headers nor data records function is provided, throw an error\n if (headers.length === 0 && typeof getDataRecords !== 'function') {\n throw new Error(ERROR_MESSAGES.MISSING_HEADERS_OR_FUNCTION);\n }\n\n // If data records function is provided, chunkSize must be greater than 0\n if (getDataRecords && chunkSize <= 0) {\n throw new Error(ERROR_MESSAGES.INVALID_CHUNK_SIZE);\n }\n\n const passThrough = new PassThrough(); // Create streaming pipe\n try {\n const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({ stream: passThrough });\n const worksheet = workbook.addWorksheet('Data');\n\n // If headers are provided, use them;\n let isHeaderWritten = false;\n if (headers.length > 0) {\n worksheet.columns = headers.map((header) => ({\n header: header, // Convert header names to uppercase\n key: header,\n width: 20, // Set column width\n }));\n isHeaderWritten = true; // Mark headers as written\n }\n\n // ✅ If no data loader provided, write only headers and finish\n if (typeof getDataRecords !== 'function') {\n // worksheet.addRow(\n // headers.reduce((acc, header) => ({ ...acc, [header]: '' }), {})\n // ).commit(); // Write a dummy record with headers\n\n workbook.commit();\n return passThrough;\n }\n\n // Write the data records in chunks\n let chunkIndex = 0;\n while (true) {\n const records = await getDataRecords(chunkIndex, chunkSize); // Fetch chunked data\n if (records.length === 0) break; // Stop if no more records\n\n if (!isHeaderWritten) { // Falback because without columns being set, ExcelJS won't write data correctly\n worksheet.columns = Object.keys(records[0]).map((key) => ({\n header: key.toUpperCase(),\n key: key,\n width: 20,\n }));\n isHeaderWritten = true;\n }\n\n records.forEach((item) => {\n worksheet.addRow(item).commit(); // Commit each row immediately\n });\n\n chunkIndex++; // Fetch next chunk\n this.logger.debug(`✅ Chunk ${chunkIndex} written to Excel`);\n }\n\n workbook.commit();\n // passThrough.end(); // ✅ Properly close the stream\n } catch (error) {\n this.logger.error(`❌ Error writing Excel: ${error.message}`);\n passThrough.destroy(error); // Destroy stream\n throw error;\n }\n return passThrough; // Return streaming response\n }\n\n public async *readExcelInPagesFromStream(\n stream: Readable,\n options?: ExcelReadOptions\n ): AsyncGenerator<ExcelReadResult> {\n const { pageSize = DEFAULT_PAGE_SIZE, hasHeaderRow = true, providedHeaders = [] } = options || {};\n const workbookReader = new ExcelJS.stream.xlsx.WorkbookReader(stream, {});\n\n let headers: string[] = [];\n let page: Record<string, any>[] = [];\n let isFirstRow = true;\n let hasYieldedData = false;\n\n for await (const worksheet of workbookReader) {\n for await (const row of worksheet) {\n const values = Array.isArray(row.values) ? row.values.slice(1) : [];\n\n if (isFirstRow) {\n isFirstRow = false;\n\n if (hasHeaderRow) {\n headers = values.map(v => v?.toString().trim() || '');\n continue;\n } else if (providedHeaders.length) {\n headers = providedHeaders;\n } else {\n headers = values.map((_, idx) => `${idx}`);\n }\n }\n\n while (values.length < headers.length) values.push(null);\n if (values.length > headers.length) values.length = headers.length;\n\n const record = headers.reduce((acc, key, i) => {\n acc[key] = values[i] ?? null;\n return acc;\n }, {} as Record<string, any>);\n\n if (Object.values(record).every(v => v === null || v === '')) continue;\n\n page.push(record);\n\n if (page.length === pageSize) {\n yield { headers, data: page };\n hasYieldedData = true;\n page = [];\n }\n }\n\n // Optional: break if only processing first worksheet\n // break;\n }\n\n if (page.length > 0) {\n yield { headers, data: page };\n hasYieldedData = true;\n }\n\n // ✅ Yield headers with empty data if only headers were found\n if (!hasYieldedData && headers.length > 0) {\n yield { headers, data: [] };\n }\n }\n\n private cleanString(value: any): string {\n return (value === null || value === undefined ? '' : String(value))\n .replace(/\\uFEFF/g, '') // BOM\n .replace(/\\u00A0/g, ' ') // NBSP\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n private normalizeCellValue(value: any, sharedStrings?: any[]): any {\n if (value === undefined || value === null) return null;\n\n // ExcelJS streaming shared string ref: { sharedString: number }\n if (typeof value === 'object' && value && 'sharedString' in value) {\n const idx = (value as any).sharedString;\n const resolved = sharedStrings?.[idx];\n // sharedStrings may store objects or plain strings depending on ExcelJS internals\n if (resolved === undefined || resolved === null) return null;\n if (typeof resolved === 'string') return resolved;\n if (typeof resolved === 'object') {\n if ('text' in resolved && typeof (resolved as any).text === 'string') return (resolved as any).text;\n if ('richText' in resolved && Array.isArray((resolved as any).richText)) {\n return (resolved as any).richText.map((item: any) => item?.text ?? '').join('');\n }\n if ('value' in resolved) return (resolved as any).value;\n }\n return resolved;\n }\n\n // ExcelJS can return rich objects for styled cells; unwrap to plain text/primitive\n if (typeof value === 'object' && value) {\n // Plain rich cell: { text: '...' }\n if ('text' in value && typeof (value as any).text === 'string') return (value as any).text;\n\n // Rich text: { richText: [{text:'a'}, ...] }\n if ('richText' in value && Array.isArray((value as any).richText)) {\n return (value as any).richText.map((item: any) => item?.text ?? '').join('');\n }\n\n // Formula cells: { formula: '...', result: ... }\n if ('result' in value) return (value as any).result;\n if ('formula' in value) return (value as any).formula;\n\n // Hyperlinks: { text: '...', hyperlink: '...' }\n if ('hyperlink' in value && typeof (value as any).hyperlink === 'string') {\n return (value as any).text ?? (value as any).hyperlink;\n }\n\n // Sometimes primitive nested under .value\n if ('value' in value) return this.normalizeCellValue((value as any).value, sharedStrings);\n }\n\n return value;\n }\n\n public async readExcelFromStreamNonStreaming(\n stream: Readable,\n options?: ExcelReadOptions & { worksheetIndex?: number; maxRows?: number }\n ): Promise<ExcelReadAllResult> {\n const {\n hasHeaderRow = true,\n providedHeaders = [],\n worksheetIndex = 0, // 0-based\n maxRows,\n } = options || {};\n\n // 1) Read entire stream into a Buffer\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n\n // 2) Load workbook (non-streaming)\n const workbook = new ExcelJS.Workbook();\n // @ts-ignore\n await workbook.xlsx.load(buffer);\n\n const worksheet = workbook.worksheets?.[worksheetIndex];\n if (!worksheet) {\n return { headers: [], rows: [] };\n }\n\n // 3) Determine headers\n let headers: string[] = [];\n\n const firstRow = worksheet.getRow(1);\n const firstRowValues = Array.isArray(firstRow.values) ? (firstRow.values as any[]).slice(1) : [];\n\n const normalizeNonStreamingCell = (v: any) => {\n // In non-streaming ExcelJS, cell.value can be:\n // - string/number/boolean/date\n // - {richText}, {text}, {hyperlink}, {formula,result}, etc.\n // We'll reuse your normalizeCellValue but without sharedStrings\n return this.normalizeCellValue(v);\n };\n\n if (hasHeaderRow) {\n headers = firstRowValues.map((v) => this.cleanString(normalizeNonStreamingCell(v)));\n } else if (providedHeaders.length) {\n headers = providedHeaders.map((h) => this.cleanString(h));\n } else {\n headers = firstRowValues.map((_, idx) => `${idx}`);\n }\n\n // If headers are all blank and hasHeaderRow=true, treat as no headers (avoid mapping everything to \"\")\n if (hasHeaderRow && headers.length > 0 && headers.every((h) => !h)) {\n this.logger.warn(`ExcelService.readExcelFromStreamNonStreaming: header row appears blank`);\n }\n\n // 4) Read rows\n const rows: Record<string, any>[] = [];\n\n const startRowNumber = hasHeaderRow ? 2 : 1;\n const lastRowNumber = worksheet.rowCount || 0;\n\n for (let r = startRowNumber; r <= lastRowNumber; r++) {\n if (maxRows && rows.length >= maxRows) break;\n\n const row = worksheet.getRow(r);\n const rawValues = Array.isArray(row.values) ? (row.values as any[]).slice(1) : [];\n const values = rawValues.map((v) => normalizeNonStreamingCell(v));\n\n // Align row width to header width\n while (values.length < headers.length) values.push(null);\n if (values.length > headers.length) values.length = headers.length;\n\n const record = headers.reduce((acc, key, i) => {\n acc[key] = values[i] ?? null;\n return acc;\n }, {} as Record<string, any>);\n\n // Skip fully empty rows\n if (Object.values(record).every((v) => v === null || this.cleanString(v) === '')) continue;\n\n rows.push(record);\n }\n\n return { headers, rows };\n }\n\n public parseAndValidateDate(value: string): Date | null {\n return parseFlexibleDate(value);\n }\n\n}"]}
@@ -12,6 +12,8 @@ import { CrudHelperService } from './crud-helper.service';
12
12
  import { FieldMetadataService } from './field-metadata.service';
13
13
  import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
14
14
  import { RoleMetadataService } from './role-metadata.service';
15
+ import { NavigationDto } from 'src/dtos/navigation.dto';
16
+ import { SolidIntrospectService } from './solid-introspect.service';
15
17
  export declare class ModelMetadataService {
16
18
  private readonly modelMetadataRepo;
17
19
  private readonly fieldMetadataRepo;
@@ -22,8 +24,9 @@ export declare class ModelMetadataService {
22
24
  private readonly fieldMetadataService;
23
25
  private readonly roleService;
24
26
  private readonly moduleMetadataHelperService;
27
+ readonly introspectService: SolidIntrospectService;
25
28
  private logger;
26
- constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService);
29
+ constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService);
27
30
  findMany(basicFilterDto: BasicFilterDto): Promise<{
28
31
  meta: {
29
32
  totalRecords: number;
@@ -70,5 +73,29 @@ export declare class ModelMetadataService {
70
73
  success: boolean;
71
74
  }>;
72
75
  private getRelationInverseFields;
76
+ navigation(navigationDto: NavigationDto): Promise<{
77
+ prev: {
78
+ recordId: any;
79
+ offset: number;
80
+ limit: number;
81
+ };
82
+ next: {
83
+ recordId: any;
84
+ offset: number;
85
+ limit: number;
86
+ };
87
+ meta: {
88
+ totalRecords: number;
89
+ perPage: number;
90
+ currentPage: number;
91
+ totalPages: number;
92
+ currentIndexInPage: number;
93
+ currentIndexGlobal: number;
94
+ hasPrev: boolean;
95
+ hasNext: boolean;
96
+ prevPage: number;
97
+ nextPage: number;
98
+ };
99
+ }>;
73
100
  }
74
101
  //# sourceMappingURL=model-metadata.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -68,8 +68,9 @@ const crud_helper_service_1 = require("./crud-helper.service");
68
68
  const field_metadata_service_1 = require("./field-metadata.service");
69
69
  const media_storage_provider_metadata_service_1 = require("./media-storage-provider-metadata.service");
70
70
  const role_metadata_service_1 = require("./role-metadata.service");
71
+ const solid_introspect_service_1 = require("./solid-introspect.service");
71
72
  let ModelMetadataService = class ModelMetadataService {
72
- constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService) {
73
+ constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService) {
73
74
  this.modelMetadataRepo = modelMetadataRepo;
74
75
  this.fieldMetadataRepo = fieldMetadataRepo;
75
76
  this.schematicService = schematicService;
@@ -79,6 +80,7 @@ let ModelMetadataService = class ModelMetadataService {
79
80
  this.fieldMetadataService = fieldMetadataService;
80
81
  this.roleService = roleService;
81
82
  this.moduleMetadataHelperService = moduleMetadataHelperService;
83
+ this.introspectService = introspectService;
82
84
  this.logger = new common_1.Logger('ModelMetadataService');
83
85
  }
84
86
  async findMany(basicFilterDto) {
@@ -957,6 +959,110 @@ let ModelMetadataService = class ModelMetadataService {
957
959
  }
958
960
  });
959
961
  }
962
+ async navigation(navigationDto) {
963
+ const { recordId, modelName, ...basicFilterDto } = navigationDto;
964
+ const modelServiceInstanceWrapper = this.introspectService.getProvider(`${(0, strings_1.classify)(modelName)}Service`);
965
+ if (!modelServiceInstanceWrapper) {
966
+ throw new common_1.BadRequestException(`Invalid model name (${modelName}) specified in Navigation.`);
967
+ }
968
+ const modelService = modelServiceInstanceWrapper.instance;
969
+ const recs = await modelService.find(basicFilterDto);
970
+ if (!('records' in recs) || !('currentPage' in recs.meta)) {
971
+ return {
972
+ prev: null,
973
+ next: null,
974
+ meta: null,
975
+ };
976
+ }
977
+ const { records, meta } = recs;
978
+ const index = records.findIndex(r => String(r.id) === String(recordId));
979
+ if (index === -1) {
980
+ throw new common_1.BadRequestException(`Record not found in current page`);
981
+ }
982
+ const limit = meta.perPage;
983
+ const currentOffset = (meta.currentPage - 1) * meta.perPage;
984
+ const currentIndexGlobal = currentOffset + index + 1;
985
+ let prev = null;
986
+ let next = null;
987
+ if (index > 0) {
988
+ prev = {
989
+ record: records[index - 1],
990
+ offset: currentOffset,
991
+ limit,
992
+ };
993
+ }
994
+ else if (meta.prevPage !== null) {
995
+ const prevOffset = (meta.prevPage - 1) * meta.perPage;
996
+ const prevPage = await modelService.find({
997
+ ...basicFilterDto,
998
+ offset: prevOffset,
999
+ limit,
1000
+ });
1001
+ if ('records' in prevPage) {
1002
+ const record = prevPage.records.at(-1) ?? null;
1003
+ if (record) {
1004
+ prev = {
1005
+ record,
1006
+ offset: prevOffset,
1007
+ limit,
1008
+ };
1009
+ }
1010
+ }
1011
+ }
1012
+ if (index < records.length - 1) {
1013
+ next = {
1014
+ record: records[index + 1],
1015
+ offset: currentOffset,
1016
+ limit,
1017
+ };
1018
+ }
1019
+ else if (meta.nextPage !== null) {
1020
+ const nextOffset = (meta.nextPage - 1) * meta.perPage;
1021
+ const nextPage = await modelService.find({
1022
+ ...basicFilterDto,
1023
+ offset: nextOffset,
1024
+ limit,
1025
+ });
1026
+ if ('records' in nextPage) {
1027
+ const record = nextPage.records[0] ?? null;
1028
+ if (record) {
1029
+ next = {
1030
+ record,
1031
+ offset: nextOffset,
1032
+ limit,
1033
+ };
1034
+ }
1035
+ }
1036
+ }
1037
+ return {
1038
+ prev: prev
1039
+ ? {
1040
+ recordId: prev.record.id,
1041
+ offset: prev.offset,
1042
+ limit: prev.limit,
1043
+ }
1044
+ : null,
1045
+ next: next
1046
+ ? {
1047
+ recordId: next.record.id,
1048
+ offset: next.offset,
1049
+ limit: next.limit,
1050
+ }
1051
+ : null,
1052
+ meta: {
1053
+ totalRecords: meta.totalRecords,
1054
+ perPage: meta.perPage,
1055
+ currentPage: meta.currentPage,
1056
+ totalPages: meta.totalPages,
1057
+ currentIndexInPage: index,
1058
+ currentIndexGlobal,
1059
+ hasPrev: !!prev,
1060
+ hasNext: !!next,
1061
+ prevPage: meta.prevPage,
1062
+ nextPage: meta.nextPage,
1063
+ },
1064
+ };
1065
+ }
960
1066
  };
961
1067
  exports.ModelMetadataService = ModelMetadataService;
962
1068
  __decorate([
@@ -977,6 +1083,7 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
977
1083
  media_storage_provider_metadata_service_1.MediaStorageProviderMetadataService,
978
1084
  field_metadata_service_1.FieldMetadataService,
979
1085
  role_metadata_service_1.RoleMetadataService,
980
- module_metadata_helper_service_1.ModuleMetadataHelperService])
1086
+ module_metadata_helper_service_1.ModuleMetadataHelperService,
1087
+ solid_introspect_service_1.SolidIntrospectService])
981
1088
  ], ModelMetadataService);
982
1089
  //# sourceMappingURL=model-metadata.service.js.map