@machinemetrics/mm-erp-sdk 0.1.9-beta.0 → 0.1.9-beta.2

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 (24) hide show
  1. package/README.md +5 -0
  2. package/dist/{config-C2Dse2g2.js → config-Bax6Ofp5.js} +2 -2
  3. package/dist/{config-C2Dse2g2.js.map → config-Bax6Ofp5.js.map} +1 -1
  4. package/dist/{connector-factory-BGykiICT.js → connector-factory-BaMIlES8.js} +2 -2
  5. package/dist/{connector-factory-BGykiICT.js.map → connector-factory-BaMIlES8.js.map} +1 -1
  6. package/dist/{hashed-cache-manager-DbG72eRm.js → hashed-cache-manager-C1u9jQgY.js} +4 -4
  7. package/dist/{hashed-cache-manager-DbG72eRm.js.map → hashed-cache-manager-C1u9jQgY.js.map} +1 -1
  8. package/dist/{index-Cq9tNcJT.js → index-BkVlW0ZW.js} +2 -2
  9. package/dist/{index-Cq9tNcJT.js.map → index-BkVlW0ZW.js.map} +1 -1
  10. package/dist/{logger-DeKxCUPp.js → logger-DW5fyhVS.js} +101 -40
  11. package/dist/{logger-DeKxCUPp.js.map → logger-DW5fyhVS.js.map} +1 -1
  12. package/dist/mm-erp-sdk.js +8 -12
  13. package/dist/mm-erp-sdk.js.map +1 -1
  14. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +4 -4
  15. package/dist/services/data-sync-service/jobs/from-erp.js +4 -4
  16. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +3 -3
  17. package/dist/services/data-sync-service/jobs/run-migrations.js +1 -1
  18. package/dist/services/data-sync-service/jobs/to-erp.js +3 -3
  19. package/dist/services/reporting-service/logger.d.ts.map +1 -1
  20. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  21. package/package.json +1 -1
  22. package/src/services/mm-api-service/mm-api-service.ts +1 -1
  23. package/src/services/reporting-service/logger.ts +110 -43
  24. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +1 -5
@@ -1,7 +1,7 @@
1
- import "../../../config-C2Dse2g2.js";
2
- import { H as HashedCacheManager } from "../../../hashed-cache-manager-DbG72eRm.js";
3
- import { S as SQLiteCoordinator } from "../../../index-Cq9tNcJT.js";
4
- import { l as logger } from "../../../logger-DeKxCUPp.js";
1
+ import "../../../config-Bax6Ofp5.js";
2
+ import { H as HashedCacheManager } from "../../../hashed-cache-manager-C1u9jQgY.js";
3
+ import { S as SQLiteCoordinator } from "../../../index-BkVlW0ZW.js";
4
+ import { l as logger } from "../../../logger-DW5fyhVS.js";
5
5
  logger.level = process.env.LOG_LEVEL || "info";
6
6
  const main = async () => {
7
7
  const cacheManager = new HashedCacheManager();
@@ -1,7 +1,7 @@
1
- import "../../../config-C2Dse2g2.js";
2
- import { l as logger } from "../../../logger-DeKxCUPp.js";
3
- import { S as SQLiteCoordinator } from "../../../index-Cq9tNcJT.js";
4
- import { c as createConnectorFromPath } from "../../../connector-factory-BGykiICT.js";
1
+ import "../../../config-Bax6Ofp5.js";
2
+ import { l as logger } from "../../../logger-DW5fyhVS.js";
3
+ import { S as SQLiteCoordinator } from "../../../index-BkVlW0ZW.js";
4
+ import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
5
5
  logger.level = process.env.LOG_LEVEL || "info";
6
6
  const main = async () => {
7
7
  try {
@@ -1,6 +1,6 @@
1
- import "../../../config-C2Dse2g2.js";
2
- import { l as logger } from "../../../logger-DeKxCUPp.js";
3
- import { c as createConnectorFromPath } from "../../../connector-factory-BGykiICT.js";
1
+ import "../../../config-Bax6Ofp5.js";
2
+ import { l as logger } from "../../../logger-DW5fyhVS.js";
3
+ import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
4
4
  logger.level = process.env.LOG_LEVEL || "info";
5
5
  const main = async () => {
6
6
  try {
@@ -1,5 +1,5 @@
1
1
  import knex from "knex";
2
- import { l as logger } from "../../../logger-DeKxCUPp.js";
2
+ import { l as logger } from "../../../logger-DW5fyhVS.js";
3
3
  import { c as config } from "../../../knexfile-Bng2Ru9c.js";
4
4
  logger.level = process.env.LOG_LEVEL || "info";
5
5
  const db = knex(config.local);
@@ -1,6 +1,6 @@
1
- import "../../../config-C2Dse2g2.js";
2
- import { l as logger } from "../../../logger-DeKxCUPp.js";
3
- import { c as createConnectorFromPath } from "../../../connector-factory-BGykiICT.js";
1
+ import "../../../config-Bax6Ofp5.js";
2
+ import { l as logger } from "../../../logger-DW5fyhVS.js";
3
+ import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
4
4
  logger.level = process.env.LOG_LEVEL || "info";
5
5
  const main = async () => {
6
6
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/services/reporting-service/logger.ts"],"names":[],"mappings":"AA+DA,QAAA,MAAM,MAAM,0BAaV,CAAC;AA0DH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,SAuChE,CAAC;AAKF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/services/reporting-service/logger.ts"],"names":[],"mappings":"AAuGA,QAAA,MAAM,MAAM,0BAIV,CAAC;AAuGH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,SA8BhE,CAAC;AAKF,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"labor-ticket-erp-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOnE;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;WACU,SAAS,CACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IAgHhB;;OAEG;WACU,WAAW,CACtB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;mBA+DK,sBAAsB;mBAetB,kBAAkB;CAkDxC"}
1
+ {"version":3,"file":"labor-ticket-erp-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOnE;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;WACU,SAAS,CACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IA4GhB;;OAEG;WACU,WAAW,CACtB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;mBA+DK,sBAAsB;mBAetB,kBAAkB;CAkDxC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@machinemetrics/mm-erp-sdk",
3
3
  "description": "A library for syncing data between MachineMetrics and ERP systems",
4
- "version": "0.1.9-beta.0",
4
+ "version": "0.1.9-beta.2",
5
5
  "license": "MIT",
6
6
  "author": "machinemetrics",
7
7
  "main": "dist/mm-erp-sdk.js",
@@ -551,7 +551,7 @@ export class MMApiClient {
551
551
  logger.info("saveCheckpoint:", { saveCheckpoint });
552
552
  } else {
553
553
  logger.info("Existing checkpoint found:", {
554
- checkpointTimestamp: checkpointResponse.timestamp,
554
+ timestamp: checkpointResponse.timestamp,
555
555
  });
556
556
  }
557
557
  }
@@ -3,6 +3,33 @@ import DailyRotateFile from "winston-daily-rotate-file";
3
3
  import path from "path";
4
4
 
5
5
  const logDirectory = "logs";
6
+ const initialLogLevel = process.env.LOG_LEVEL || "info";
7
+
8
+ const LOGGER_ERROR_PREFIX = "[mm-erp-sdk logger]";
9
+
10
+ const serializeLoggerError = (error: unknown): string => {
11
+ if (error instanceof Error) {
12
+ return error.stack ?? error.message;
13
+ }
14
+ if (typeof error === "string") {
15
+ return error;
16
+ }
17
+ try {
18
+ return JSON.stringify(error);
19
+ } catch {
20
+ return String(error);
21
+ }
22
+ };
23
+
24
+ const handleLoggerError = (error: unknown) => {
25
+ const serialized = serializeLoggerError(error);
26
+ try {
27
+ // eslint-disable-next-line no-console
28
+ console.error(`${LOGGER_ERROR_PREFIX} transport error: ${serialized}`);
29
+ } catch {
30
+ /* ignore failures when reporting logger errors */
31
+ }
32
+ };
6
33
 
7
34
  const MSG_MAX_LEN = 60;
8
35
  const MSG_MAX_CHARS = 2048;
@@ -60,25 +87,31 @@ const logFormat = format.combine(
60
87
  baseFormat
61
88
  );
62
89
 
90
+ const createConsoleTransport = () => {
91
+ const consoleTransport = new transports.Console({
92
+ format: format.combine(
93
+ format.timestamp(),
94
+ format.splat(),
95
+ baseFormat,
96
+ format.colorize({ all: true })
97
+ ),
98
+ });
99
+ consoleTransport.on("error", handleLoggerError);
100
+ return consoleTransport;
101
+ };
102
+
63
103
  // Create a basic logger with default configuration
64
104
  const logger = createLogger({
65
- level: process.env.LOG_LEVEL || "info",
105
+ level: initialLogLevel,
66
106
  format: logFormat,
67
- transports: [
68
- new transports.Console({
69
- format: format.combine(
70
- format.timestamp(),
71
- format.splat(),
72
- baseFormat,
73
- format.colorize({ all: true })
74
- ),
75
- }),
76
- ],
107
+ transports: [createConsoleTransport()],
77
108
  });
78
109
 
110
+ logger.on("error", handleLoggerError);
111
+
79
112
  // Helper function to create a file transport with shared configuration
80
113
  const createFileTransport = (): DailyRotateFile => {
81
- return new DailyRotateFile({
114
+ const transport = new DailyRotateFile({
82
115
  filename: path.join(logDirectory, "%DATE%.log"),
83
116
  datePattern: "YYYY-MM-DD",
84
117
  zippedArchive: true,
@@ -86,6 +119,8 @@ const createFileTransport = (): DailyRotateFile => {
86
119
  maxFiles: "14d",
87
120
  format: logFormat,
88
121
  });
122
+ transport.on("error", handleLoggerError);
123
+ return transport;
89
124
  };
90
125
 
91
126
  // Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
@@ -99,35 +134,76 @@ function attachRotateMitigation(
99
134
  if (isRefreshing) return;
100
135
  isRefreshing = true;
101
136
  let removalTimer: NodeJS.Timeout | null = null;
137
+ let next: DailyRotateFile | null = null;
102
138
 
103
- // Create replacement first to avoid any logging gap
104
- const next = createFileTransport();
105
- // When the new file is created, remove the old transport
106
- next.on("new", () => {
139
+ const cleanupRefresh = () => {
107
140
  if (removalTimer) {
108
141
  clearTimeout(removalTimer);
109
142
  removalTimer = null;
110
143
  }
111
- try {
112
- logger.remove(transport);
113
- } catch {}
114
144
  isRefreshing = false;
115
- });
116
- attachRotateMitigation(next, opts);
117
- logger.add(next);
118
-
119
- // Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
120
- const REMOVAL_GRACE_MS = 30000;
121
- removalTimer = setTimeout(() => {
145
+ };
146
+
147
+ try {
148
+ // Create replacement first to avoid any logging gap
149
+ next = createFileTransport();
150
+ // When the new file is created, remove the old transport
151
+ next.on("new", () => {
152
+ if (removalTimer) {
153
+ clearTimeout(removalTimer);
154
+ removalTimer = null;
155
+ }
156
+ try {
157
+ logger.remove(transport);
158
+ } catch (error) {
159
+ handleLoggerError(error);
160
+ }
161
+ cleanupRefresh();
162
+ });
163
+ attachRotateMitigation(next, opts);
122
164
  try {
123
- logger.remove(transport);
124
- } catch {}
125
- isRefreshing = false;
126
- removalTimer = null;
127
- }, REMOVAL_GRACE_MS);
165
+ logger.add(next);
166
+ } catch (error) {
167
+ handleLoggerError(error);
168
+ cleanupRefresh();
169
+ try {
170
+ logger.remove(next);
171
+ } catch {}
172
+ try {
173
+ if (typeof next.close === "function") {
174
+ next.close();
175
+ }
176
+ } catch {}
177
+ return;
178
+ }
128
179
 
129
- // Keep console and other transports intact; do not silence or clear
130
- logger.level = logLevel;
180
+ // Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
181
+ const REMOVAL_GRACE_MS = 30000;
182
+ removalTimer = setTimeout(() => {
183
+ try {
184
+ logger.remove(transport);
185
+ } catch (error) {
186
+ handleLoggerError(error);
187
+ }
188
+ cleanupRefresh();
189
+ }, REMOVAL_GRACE_MS);
190
+
191
+ // Keep console and other transports intact; do not silence or clear
192
+ logger.level = logLevel;
193
+ } catch (error) {
194
+ cleanupRefresh();
195
+ handleLoggerError(error);
196
+ if (next) {
197
+ try {
198
+ logger.remove(next);
199
+ } catch {}
200
+ try {
201
+ if (typeof next.close === "function") {
202
+ next.close();
203
+ }
204
+ } catch {}
205
+ }
206
+ }
131
207
  });
132
208
  }
133
209
 
@@ -157,16 +233,7 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
157
233
 
158
234
  // Add console transport in non-production environments
159
235
  if (nodeEnv !== "production") {
160
- logger.add(
161
- new transports.Console({
162
- format: format.combine(
163
- format.timestamp(),
164
- format.splat(),
165
- baseFormat,
166
- format.colorize({ all: true })
167
- ),
168
- })
169
- );
236
+ logger.add(createConsoleTransport());
170
237
  }
171
238
 
172
239
  // Set the log level
@@ -56,8 +56,7 @@ export class LaborTicketERPSynchronizer {
56
56
  // the checkpoint to ensure there is no gap of time for the next sync.
57
57
  const mostRecentUpdate = laborTicketsUpdates.reduce(
58
58
  (latest: string | null, ticket: MMReceiveLaborTicket) => {
59
- if (!ticket.updatedAt) return latest; // Skip tickets without updatedAt
60
- if (!latest) return ticket.updatedAt; // Initialize on first valid value
59
+ if (!latest || !ticket.updatedAt) return latest;
61
60
  return new Date(ticket.updatedAt) > new Date(latest)
62
61
  ? ticket.updatedAt
63
62
  : latest;
@@ -119,9 +118,6 @@ export class LaborTicketERPSynchronizer {
119
118
  timestamp: mostRecentUpdate || fallbackTimestamp,
120
119
  },
121
120
  });
122
- logger.info("syncLaborTicketsToERP: Checkpoint saved:", {
123
- checkpointTimestamp: (mostRecentUpdate || fallbackTimestamp)
124
- });
125
121
  } catch (error) {
126
122
  logger.error("syncLaborTicketsToERP: Error:", error);
127
123
  }