@n8n/utils 1.43.0 → 1.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/number/smart-decimal.ts
3
3
  const smartDecimal = (value, decimals = 2) => {
4
4
  if (Number.isInteger(value)) return value;
5
- if (value.toString().split(".")[1].length <= decimals) return value;
5
+ const decimalPart = value.toString().split(".")[1];
6
+ if (decimalPart !== void 0 && decimalPart.length <= decimals) return value;
6
7
  return Number(value.toFixed(decimals));
7
8
  };
8
9
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"smart-decimal.cjs","names":[],"sources":["../../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";;AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;CAEpE,IAAI,OAAO,UAAU,KAAK,GACzB,OAAO;CAIR,IAAI,MAAM,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,UAC5C,OAAO;CAGR,OAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACtC"}
1
+ {"version":3,"file":"smart-decimal.cjs","names":[],"sources":["../../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place. Exponential-notation numbers\n\t// (e.g. `0.0000001` → `\"1e-7\"`) have no `.`, so fall through to rounding.\n\tconst decimalPart = value.toString().split('.')[1];\n\tif (decimalPart !== undefined && decimalPart.length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";;AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;CAEpE,IAAI,OAAO,UAAU,KAAK,GACzB,OAAO;CAKR,MAAM,cAAc,MAAM,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;CAChD,IAAI,gBAAgB,KAAA,KAAa,YAAY,UAAU,UACtD,OAAO;CAGR,OAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACtC"}
@@ -1,7 +1,8 @@
1
1
  //#region src/number/smart-decimal.ts
2
2
  const smartDecimal = (value, decimals = 2) => {
3
3
  if (Number.isInteger(value)) return value;
4
- if (value.toString().split(".")[1].length <= decimals) return value;
4
+ const decimalPart = value.toString().split(".")[1];
5
+ if (decimalPart !== void 0 && decimalPart.length <= decimals) return value;
5
6
  return Number(value.toFixed(decimals));
6
7
  };
7
8
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"smart-decimal.mjs","names":[],"sources":["../../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;CAEpE,IAAI,OAAO,UAAU,KAAK,GACzB,OAAO;CAIR,IAAI,MAAM,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,UAC5C,OAAO;CAGR,OAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACtC"}
1
+ {"version":3,"file":"smart-decimal.mjs","names":[],"sources":["../../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place. Exponential-notation numbers\n\t// (e.g. `0.0000001` → `\"1e-7\"`) have no `.`, so fall through to rounding.\n\tconst decimalPart = value.toString().split('.')[1];\n\tif (decimalPart !== undefined && decimalPart.length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;CAEpE,IAAI,OAAO,UAAU,KAAK,GACzB,OAAO;CAKR,MAAM,cAAc,MAAM,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;CAChD,IAAI,gBAAgB,KAAA,KAAa,YAAY,UAAU,UACtD,OAAO;CAGR,OAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACtC"}
package/dist/sleep.cjs CHANGED
@@ -1,20 +1,26 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_errors_ensure_error = require("./errors/ensure-error.cjs");
2
3
  //#region src/sleep.ts
3
4
  async function sleepWithAbort(ms, abortSignal) {
4
5
  return await new Promise((resolve, reject) => {
5
6
  if (abortSignal.aborted) {
6
- reject(/* @__PURE__ */ new Error("Aborted"));
7
+ reject(require_errors_ensure_error.ensureError(abortSignal.reason));
7
8
  return;
8
9
  }
9
- const timeout = setTimeout(resolve, ms);
10
- abortSignal.addEventListener("abort", () => {
10
+ const onAbort = () => {
11
11
  clearTimeout(timeout);
12
- reject(/* @__PURE__ */ new Error("Aborted"));
13
- }, { once: true });
12
+ reject(require_errors_ensure_error.ensureError(abortSignal.reason));
13
+ };
14
+ const timeout = setTimeout(() => {
15
+ abortSignal.removeEventListener("abort", onAbort);
16
+ resolve();
17
+ }, ms);
18
+ abortSignal.addEventListener("abort", onAbort, { once: true });
14
19
  });
15
20
  }
16
21
  /**
17
- * Resolves after `ms` milliseconds, or rejects early if `abortSignal` is aborted.
22
+ * Resolves after `ms` milliseconds, or rejects with the signal's abort reason
23
+ * if `abortSignal` fires first.
18
24
  */
19
25
  async function sleep(ms, abortSignal) {
20
26
  if (!abortSignal) return await new Promise((resolve) => setTimeout(resolve, ms));
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.cjs","names":[],"sources":["../src/sleep.ts"],"sourcesContent":["async function sleepWithAbort(ms: number, abortSignal: AbortSignal): Promise<void> {\n\treturn await new Promise((resolve, reject) => {\n\t\tif (abortSignal.aborted) {\n\t\t\treject(new Error('Aborted'));\n\t\t\treturn;\n\t\t}\n\n\t\tconst timeout = setTimeout(resolve, ms);\n\n\t\tabortSignal.addEventListener(\n\t\t\t'abort',\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(new Error('Aborted'));\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n\n/**\n * Resolves after `ms` milliseconds, or rejects early if `abortSignal` is aborted.\n */\nexport async function sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n\tif (!abortSignal) {\n\t\treturn await new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\n\treturn await sleepWithAbort(ms, abortSignal);\n}\n"],"mappings":";;AAAA,eAAe,eAAe,IAAY,aAAyC;CAClF,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,IAAI,YAAY,SAAS;GACxB,uBAAO,IAAI,MAAM,SAAS,CAAC;GAC3B;EACD;EAEA,MAAM,UAAU,WAAW,SAAS,EAAE;EAEtC,YAAY,iBACX,eACM;GACL,aAAa,OAAO;GACpB,uBAAO,IAAI,MAAM,SAAS,CAAC;EAC5B,GACA,EAAE,MAAM,KAAK,CACd;CACD,CAAC;AACF;;;;AAKA,eAAsB,MAAM,IAAY,aAA0C;CACjF,IAAI,CAAC,aACJ,OAAO,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CAG9D,OAAO,MAAM,eAAe,IAAI,WAAW;AAC5C"}
1
+ {"version":3,"file":"sleep.cjs","names":["ensureError"],"sources":["../src/sleep.ts"],"sourcesContent":["import { ensureError } from './errors/ensure-error';\n\nasync function sleepWithAbort(ms: number, abortSignal: AbortSignal): Promise<void> {\n\treturn await new Promise((resolve, reject) => {\n\t\tif (abortSignal.aborted) {\n\t\t\treject(ensureError(abortSignal.reason));\n\t\t\treturn;\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(ensureError(abortSignal.reason));\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tabortSignal.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\n\t\tabortSignal.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n\n/**\n * Resolves after `ms` milliseconds, or rejects with the signal's abort reason\n * if `abortSignal` fires first.\n */\nexport async function sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n\tif (!abortSignal) {\n\t\treturn await new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\n\treturn await sleepWithAbort(ms, abortSignal);\n}\n"],"mappings":";;;AAEA,eAAe,eAAe,IAAY,aAAyC;CAClF,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,IAAI,YAAY,SAAS;GACxB,OAAOA,4BAAAA,YAAY,YAAY,MAAM,CAAC;GACtC;EACD;EAEA,MAAM,gBAAgB;GACrB,aAAa,OAAO;GACpB,OAAOA,4BAAAA,YAAY,YAAY,MAAM,CAAC;EACvC;EAEA,MAAM,UAAU,iBAAiB;GAChC,YAAY,oBAAoB,SAAS,OAAO;GAChD,QAAQ;EACT,GAAG,EAAE;EAEL,YAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC9D,CAAC;AACF;;;;;AAMA,eAAsB,MAAM,IAAY,aAA0C;CACjF,IAAI,CAAC,aACJ,OAAO,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CAG9D,OAAO,MAAM,eAAe,IAAI,WAAW;AAC5C"}
package/dist/sleep.mjs CHANGED
@@ -1,19 +1,25 @@
1
+ import { ensureError } from "./errors/ensure-error.mjs";
1
2
  //#region src/sleep.ts
2
3
  async function sleepWithAbort(ms, abortSignal) {
3
4
  return await new Promise((resolve, reject) => {
4
5
  if (abortSignal.aborted) {
5
- reject(/* @__PURE__ */ new Error("Aborted"));
6
+ reject(ensureError(abortSignal.reason));
6
7
  return;
7
8
  }
8
- const timeout = setTimeout(resolve, ms);
9
- abortSignal.addEventListener("abort", () => {
9
+ const onAbort = () => {
10
10
  clearTimeout(timeout);
11
- reject(/* @__PURE__ */ new Error("Aborted"));
12
- }, { once: true });
11
+ reject(ensureError(abortSignal.reason));
12
+ };
13
+ const timeout = setTimeout(() => {
14
+ abortSignal.removeEventListener("abort", onAbort);
15
+ resolve();
16
+ }, ms);
17
+ abortSignal.addEventListener("abort", onAbort, { once: true });
13
18
  });
14
19
  }
15
20
  /**
16
- * Resolves after `ms` milliseconds, or rejects early if `abortSignal` is aborted.
21
+ * Resolves after `ms` milliseconds, or rejects with the signal's abort reason
22
+ * if `abortSignal` fires first.
17
23
  */
18
24
  async function sleep(ms, abortSignal) {
19
25
  if (!abortSignal) return await new Promise((resolve) => setTimeout(resolve, ms));
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.mjs","names":[],"sources":["../src/sleep.ts"],"sourcesContent":["async function sleepWithAbort(ms: number, abortSignal: AbortSignal): Promise<void> {\n\treturn await new Promise((resolve, reject) => {\n\t\tif (abortSignal.aborted) {\n\t\t\treject(new Error('Aborted'));\n\t\t\treturn;\n\t\t}\n\n\t\tconst timeout = setTimeout(resolve, ms);\n\n\t\tabortSignal.addEventListener(\n\t\t\t'abort',\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(new Error('Aborted'));\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n\n/**\n * Resolves after `ms` milliseconds, or rejects early if `abortSignal` is aborted.\n */\nexport async function sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n\tif (!abortSignal) {\n\t\treturn await new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\n\treturn await sleepWithAbort(ms, abortSignal);\n}\n"],"mappings":";AAAA,eAAe,eAAe,IAAY,aAAyC;CAClF,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,IAAI,YAAY,SAAS;GACxB,uBAAO,IAAI,MAAM,SAAS,CAAC;GAC3B;EACD;EAEA,MAAM,UAAU,WAAW,SAAS,EAAE;EAEtC,YAAY,iBACX,eACM;GACL,aAAa,OAAO;GACpB,uBAAO,IAAI,MAAM,SAAS,CAAC;EAC5B,GACA,EAAE,MAAM,KAAK,CACd;CACD,CAAC;AACF;;;;AAKA,eAAsB,MAAM,IAAY,aAA0C;CACjF,IAAI,CAAC,aACJ,OAAO,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CAG9D,OAAO,MAAM,eAAe,IAAI,WAAW;AAC5C"}
1
+ {"version":3,"file":"sleep.mjs","names":[],"sources":["../src/sleep.ts"],"sourcesContent":["import { ensureError } from './errors/ensure-error';\n\nasync function sleepWithAbort(ms: number, abortSignal: AbortSignal): Promise<void> {\n\treturn await new Promise((resolve, reject) => {\n\t\tif (abortSignal.aborted) {\n\t\t\treject(ensureError(abortSignal.reason));\n\t\t\treturn;\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(ensureError(abortSignal.reason));\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tabortSignal.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\n\t\tabortSignal.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n\n/**\n * Resolves after `ms` milliseconds, or rejects with the signal's abort reason\n * if `abortSignal` fires first.\n */\nexport async function sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n\tif (!abortSignal) {\n\t\treturn await new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\n\treturn await sleepWithAbort(ms, abortSignal);\n}\n"],"mappings":";;AAEA,eAAe,eAAe,IAAY,aAAyC;CAClF,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,IAAI,YAAY,SAAS;GACxB,OAAO,YAAY,YAAY,MAAM,CAAC;GACtC;EACD;EAEA,MAAM,gBAAgB;GACrB,aAAa,OAAO;GACpB,OAAO,YAAY,YAAY,MAAM,CAAC;EACvC;EAEA,MAAM,UAAU,iBAAiB;GAChC,YAAY,oBAAoB,SAAS,OAAO;GAChD,QAAQ;EACT,GAAG,EAAE;EAEL,YAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC9D,CAAC;AACF;;;;;AAMA,eAAsB,MAAM,IAAY,aAA0C;CACjF,IAAI,CAAC,aACJ,OAAO,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CAG9D,OAAO,MAAM,eAAe,IAAI,WAAW;AAC5C"}
package/dist/types.d.cts CHANGED
@@ -1,5 +1,8 @@
1
1
  //#region src/types.d.ts
2
2
  type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
3
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
4
+ type LastOf<U> = UnionToIntersection<U extends unknown ? () => U : never> extends (() => infer R) ? R : never;
5
+ type JoinKeys<U extends string> = [U] extends [never] ? '' : JoinKeys<Exclude<U, LastOf<U>>> extends (infer TRest extends string) ? TRest extends '' ? `'${LastOf<U> & string}'` : `${TRest}, '${LastOf<U> & string}'` : never;
3
6
  //#endregion
4
- export { DistributiveOmit };
7
+ export { DistributiveOmit, JoinKeys, LastOf, UnionToIntersection };
5
8
  //# sourceMappingURL=types.d.cts.map
package/dist/types.d.mts CHANGED
@@ -1,5 +1,8 @@
1
1
  //#region src/types.d.ts
2
2
  type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
3
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
4
+ type LastOf<U> = UnionToIntersection<U extends unknown ? () => U : never> extends (() => infer R) ? R : never;
5
+ type JoinKeys<U extends string> = [U] extends [never] ? '' : JoinKeys<Exclude<U, LastOf<U>>> extends (infer TRest extends string) ? TRest extends '' ? `'${LastOf<U> & string}'` : `${TRest}, '${LastOf<U> & string}'` : never;
3
6
  //#endregion
4
- export { DistributiveOmit };
7
+ export { DistributiveOmit, JoinKeys, LastOf, UnionToIntersection };
5
8
  //# sourceMappingURL=types.d.mts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@n8n/utils",
3
3
  "type": "module",
4
- "version": "1.43.0",
4
+ "version": "1.44.0",
5
5
  "files": [
6
6
  "dist",
7
7
  "LICENSE.md",
@@ -27,8 +27,8 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "nanoid": "3.3.8",
31
- "@n8n/constants": "0.34.0"
30
+ "nanoid": "3.3.18",
31
+ "@n8n/constants": "0.35.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@testing-library/jest-dom": "^6.6.3",
@@ -37,9 +37,9 @@
37
37
  "typescript": "7.0.2",
38
38
  "vite": "^8.0.2",
39
39
  "vitest": "^4.1.9",
40
+ "@n8n/typescript-config": "1.10.0",
40
41
  "@n8n/eslint-config": "0.0.1",
41
- "@n8n/typescript-config": "1.9.0",
42
- "@n8n/vitest-config": "1.20.0"
42
+ "@n8n/vitest-config": "1.21.0"
43
43
  },
44
44
  "license": "SEE LICENSE IN LICENSE.md",
45
45
  "homepage": "https://n8n.io",