@marmot-systems/common 1.0.0 → 2.0.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.
package/dist/index.cjs CHANGED
@@ -45,10 +45,10 @@ function handleZodCurrency(minAmount, maxAmount) {
45
45
  return s;
46
46
  }
47
47
  return v;
48
- }, import_zod.z.coerce.number({ message: "Enter a valid number." }).refine(Number.isFinite, { message: "Enter a valid number." })).transform((x) => roundWithPrecision(x, 2)).refine((n) => n >= minAmount, {
49
- message: `Must be greater than ${minAmount}.`
48
+ }, import_zod.z.coerce.number({ error: "Enter a valid number." }).refine(Number.isFinite, { error: "Enter a valid number." })).transform((x) => roundWithPrecision(x, 2)).refine((n) => n >= minAmount, {
49
+ error: `Must be greater than ${minAmount}.`
50
50
  }).refine((n) => n <= maxAmount, {
51
- message: `Exceeds allowed limit ${maxAmount}.`
51
+ error: `Exceeds allowed limit ${maxAmount}.`
52
52
  });
53
53
  }
54
54
  var transformEmptyStringToUndefined = (s) => s.trim() === "" ? void 0 : s;
@@ -81,7 +81,7 @@ function roundWithPrecision(num, precision, opts) {
81
81
  }
82
82
 
83
83
  // src/schemas/customer_schemas.ts
84
- var CustomerFormSchema = import_zod2.z.object({
84
+ var CustomerFormSchema = import_zod2.z.strictObject({
85
85
  customer_name: import_zod2.z.string().transform(normalizeSpaces).pipe(
86
86
  import_zod2.z.string().min(1, "Customer name is required").max(50, "Customer name must be at most 50 characters.")
87
87
  ),
@@ -89,17 +89,17 @@ var CustomerFormSchema = import_zod2.z.object({
89
89
  import_zod2.z.string().max(100, "Customer address must be at most 100 characters.")
90
90
  ).transform(transformEmptyStringToUndefined).optional(),
91
91
  customer_phone_number: import_zod2.z.string().transform(removeAllWhitespace).transform(removeDashesAndPlusSign).refine((s) => s === "" || /^\d{1,15}$/.test(s), {
92
- message: "Phone number must be from 1 to 15 digits."
92
+ error: "Phone number must be from 1 to 15 digits."
93
93
  }).transform(transformEmptyStringToUndefined).optional(),
94
94
  customer_email_address: import_zod2.z.string().transform(removeAllWhitespace).transform(transformEmptyStringToUndefined).pipe(
95
- import_zod2.z.string().email().max(254, "Customer email must be at most 254 characters.").transform((email) => email.toLowerCase()).optional()
95
+ import_zod2.z.email().max(254, "Customer email must be at most 254 characters.").transform((email) => email.toLowerCase()).optional()
96
96
  ).optional(),
97
97
  tax_rate: handleZodCurrency(0, 100)
98
98
  });
99
99
 
100
100
  // src/schemas/product_schemas.ts
101
101
  var import_zod3 = require("zod");
102
- var ProductFormSchema = import_zod3.z.object({
102
+ var ProductFormSchema = import_zod3.z.strictObject({
103
103
  product_name: import_zod3.z.string().transform(normalizeSpaces).pipe(
104
104
  import_zod3.z.string().min(1, "Product name is required").max(50, "Product name must be at most 50 characters.")
105
105
  ),
@@ -108,14 +108,12 @@ var ProductFormSchema = import_zod3.z.object({
108
108
  ).transform(transformEmptyStringToUndefined).optional(),
109
109
  product_sku: import_zod3.z.string().transform(normalizeSpaces).pipe(import_zod3.z.string().max(30, "Product SKU must be at most 30 characters.")).transform(transformEmptyStringToUndefined).optional(),
110
110
  product_upc: import_zod3.z.string().transform((s) => s.replace(/\s+/g, "")).refine((s) => s === "" || /^\d{12}$/.test(s), {
111
- message: "UPC must be exactly 12 digits"
111
+ error: "UPC must be exactly 12 digits"
112
112
  }).transform(transformEmptyStringToUndefined).optional(),
113
113
  product_gtin_14: import_zod3.z.string().transform((s) => s.replace(/\s+/g, "")).refine((s) => s === "" || /^\d{14}$/.test(s), {
114
- message: "GTIN14 must be exactly 14 digits"
114
+ error: "GTIN14 must be exactly 14 digits"
115
115
  }).transform(transformEmptyStringToUndefined).optional(),
116
- product_type: import_zod3.z.enum(["unit", "weight", "case"], {
117
- errorMap: () => ({ message: "Product type is required" })
118
- }),
116
+ product_type: import_zod3.z.enum(["unit", "weight", "case"], { error: "" }),
119
117
  weight_unit: import_zod3.z.preprocess((v) => {
120
118
  if (v === "") return void 0;
121
119
  if (typeof v === "string") return v.trim().toLowerCase();
@@ -123,18 +121,18 @@ var ProductFormSchema = import_zod3.z.object({
123
121
  }, import_zod3.z.enum(["kg", "lb", "g", "oz"]).optional()),
124
122
  price: handleZodCurrency(1, 99999),
125
123
  cost: handleZodCurrency(1, 99999)
126
- }).strict().superRefine((data, ctx) => {
124
+ }).superRefine((data, ctx) => {
127
125
  if (data.product_type === "weight" && !data.weight_unit) {
128
126
  ctx.addIssue({
129
- code: import_zod3.z.ZodIssueCode.custom,
130
- message: "Weight unit is required.",
127
+ code: "custom",
128
+ error: "Weight unit is required.",
131
129
  path: ["weight_unit"]
132
130
  });
133
131
  }
134
132
  if (data.product_type !== "weight" && typeof data.weight_unit !== "undefined") {
135
133
  ctx.addIssue({
136
- code: import_zod3.z.ZodIssueCode.custom,
137
- message: "Weight unit must be empty",
134
+ code: "custom",
135
+ error: "Weight unit must be empty",
138
136
  path: ["weight_unit"]
139
137
  });
140
138
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schemas/customer_schemas.ts","../src/utils/utils.ts","../src/schemas/product_schemas.ts"],"sourcesContent":["export * from \"./schemas/customer_schemas\";\nexport * from \"./schemas/product_schemas\";\nexport * from \"./utils/utils\";\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const CustomerFormSchema = z.object({\n customer_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Customer name is required\")\n .max(50, \"Customer name must be at most 50 characters.\")\n ),\n\n customer_address: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z.string().max(100, \"Customer address must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_phone_number: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.removeDashesAndPlusSign)\n .refine((s) => s === \"\" || /^\\d{1,15}$/.test(s), {\n message: \"Phone number must be from 1 to 15 digits.\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_email_address: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .pipe(\n z\n .string()\n .email()\n .max(254, \"Customer email must be at most 254 characters.\")\n .transform((email) => email.toLowerCase())\n .optional()\n )\n .optional(),\n\n tax_rate: GlobalUtils.handleZodCurrency(0, 100),\n});\n","import * as GlobalTypes from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Validates zod currency with precision.\n *\n *\n * @param minAmount\n * @param maxAmount\n * @returns\n */\nexport function handleZodCurrency(minAmount: number, maxAmount: number) {\n return z\n .preprocess((v) => {\n if (v === null || v === undefined) return NaN;\n\n if (typeof v === \"string\") {\n const s = v.replace(/[,\\s]/g, \"\");\n if (s === \"\") return NaN;\n return s;\n }\n\n return v;\n }, z.coerce.number({ message: \"Enter a valid number.\" }).refine(Number.isFinite, { message: \"Enter a valid number.\" }))\n .transform((x) => roundWithPrecision(x, 2))\n .refine((n) => n >= minAmount, {\n message: `Must be greater than ${minAmount}.`,\n })\n .refine((n) => n <= maxAmount, {\n message: `Exceeds allowed limit ${maxAmount}.`,\n });\n}\n\n/**\n * Trims any leading or trailing spaces\n * Transforms empty strings into undefined.\n *\n * @param s\n * @returns\n */\nexport const transformEmptyStringToUndefined = (s: string) =>\n s.trim() === \"\" ? undefined : s;\n\n/**\n * - Collapses any run of whitespace in a string (spaces, tabs, newlines, etc.) into a single ASCII space.\n * - Trims leading and trailing whitespace.\n *\n * @param s\n * @returns\n */\nexport const normalizeSpaces = (s: string) => whitespace(s, \"normalize\");\n\n/**\n * Removes all whitespace from a string\n * @param s\n * @returns\n */\nexport const removeAllWhitespace = (s: string) => whitespace(s, \"remove\");\n\nconst whitespace = (s: string, mode: GlobalTypes.WhitespaceMode) => {\n if (mode === \"remove\") {\n return s.replace(/\\s+/g, \"\");\n }\n\n return s.replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * Removes all dashes and + signs from a string\n * +1-305-555-0123 -> \"13055550123\"\n * 305-555-0123 -> \"3055550123\"\n *\n * @param s\n * @returns\n */\nexport const removeDashesAndPlusSign = (s: string): string =>\n s.replace(/[+-]/g, \"\");\n\n/**\n * Rounds a number to a certain precision.\n * Contract:\n * 1. Number must be finite and non negative.\n * 2. Precision must be finite nonnegative and an integer.\n * 3. Precision must be <= Max precision\n * 4. Returns a number >= 0\n *\n * @param num\n * @param precision\n * @param opts\n * @returns\n */\nexport function roundWithPrecision(\n num: number,\n precision: number,\n opts?: GlobalTypes.ToFixedOptions\n): number {\n const MAX_PRECISION = 2;\n const { roundType = \"half_up\" } = opts ?? {};\n\n if (!Number.isFinite(num) || num < 0) {\n throw new RangeError(\"Number must be finite and greater than 0.\");\n }\n\n if (\n !Number.isFinite(precision) ||\n !Number.isInteger(precision) ||\n precision < 1\n ) {\n throw new RangeError(\"Precision must be a finite integer greater than 0.\");\n }\n\n if (precision > MAX_PRECISION) {\n throw new RangeError(\"Max precision allowed is 2.\");\n }\n\n return Number(\n (+(Math.round(+(num + \"e\" + precision)) + \"e\" + -precision)).toFixed(\n precision\n )\n );\n}\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const ProductFormSchema = z\n .object({\n product_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Product name is required\")\n .max(50, \"Product name must be at most 50 characters.\")\n ),\n\n product_description: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .max(100, \"Product desription must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_sku: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(z.string().max(30, \"Product SKU must be at most 30 characters.\"))\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_upc: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{12}$/.test(s), {\n message: \"UPC must be exactly 12 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_gtin_14: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{14}$/.test(s), {\n message: \"GTIN14 must be exactly 14 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_type: z.enum([\"unit\", \"weight\", \"case\"], {\n errorMap: () => ({ message: \"Product type is required\" }),\n }),\n\n weight_unit: z.preprocess((v) => {\n if (v === \"\") return undefined;\n if (typeof v === \"string\") return v.trim().toLowerCase();\n return v;\n }, z.enum([\"kg\", \"lb\", \"g\", \"oz\"]).optional()),\n\n price: GlobalUtils.handleZodCurrency(1, 99_999),\n cost: GlobalUtils.handleZodCurrency(1, 99_999),\n })\n .strict()\n\n .superRefine((data, ctx) => {\n if (data.product_type === \"weight\" && !data.weight_unit) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Weight unit is required.\",\n path: [\"weight_unit\"],\n });\n }\n\n if (\n data.product_type !== \"weight\" &&\n typeof data.weight_unit !== \"undefined\"\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Weight unit must be empty\",\n path: [\"weight_unit\"],\n });\n }\n });\n"],"mappings":"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","names":["import_zod","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/customer_schemas.ts","../src/utils/utils.ts","../src/schemas/product_schemas.ts"],"sourcesContent":["export * from \"./schemas/customer_schemas\";\nexport * from \"./schemas/product_schemas\";\nexport * from \"./utils/utils\";\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const CustomerFormSchema = z.strictObject({\n customer_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Customer name is required\")\n .max(50, \"Customer name must be at most 50 characters.\")\n ),\n\n customer_address: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z.string().max(100, \"Customer address must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_phone_number: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.removeDashesAndPlusSign)\n .refine((s) => s === \"\" || /^\\d{1,15}$/.test(s), {\n error: \"Phone number must be from 1 to 15 digits.\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_email_address: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .pipe(\n z\n .email()\n .max(254, \"Customer email must be at most 254 characters.\")\n .transform((email) => email.toLowerCase())\n .optional()\n )\n .optional(),\n\n tax_rate: GlobalUtils.handleZodCurrency(0, 100),\n});\n","import * as GlobalTypes from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Validates zod currency with precision.\n *\n *\n * @param minAmount\n * @param maxAmount\n * @returns\n */\nexport function handleZodCurrency(minAmount: number, maxAmount: number) {\n return z\n .preprocess((v) => {\n if (v === null || v === undefined) return NaN;\n\n if (typeof v === \"string\") {\n const s = v.replace(/[,\\s]/g, \"\");\n if (s === \"\") return NaN;\n return s;\n }\n\n return v;\n }, z.coerce.number({ error: \"Enter a valid number.\" }).refine(Number.isFinite, { error: \"Enter a valid number.\" }))\n .transform((x) => roundWithPrecision(x, 2))\n .refine((n) => n >= minAmount, {\n error: `Must be greater than ${minAmount}.`,\n })\n .refine((n) => n <= maxAmount, {\n error: `Exceeds allowed limit ${maxAmount}.`,\n });\n}\n\n/**\n * Trims any leading or trailing spaces\n * Transforms empty strings into undefined.\n *\n * @param s\n * @returns\n */\nexport const transformEmptyStringToUndefined = (s: string) =>\n s.trim() === \"\" ? undefined : s;\n\n/**\n * - Collapses any run of whitespace in a string (spaces, tabs, newlines, nbspb, and other weird unicode spaces etc.)\n * into a single ASCII space.\n * - Trims leading and trailing whitespace.\n * \" Jared \\n Gomez \\t Driver\\t \" -> \"Jared Gomez Driver\"\n *\n * @param s\n * @returns\n */\nexport const normalizeSpaces = (s: string) => whitespace(s, \"normalize\");\n\n/**\n * Removes all whitespace from a string\n * @param s\n * @returns\n */\nexport const removeAllWhitespace = (s: string) => whitespace(s, \"remove\");\n\nconst whitespace = (s: string, mode: GlobalTypes.WhitespaceMode) => {\n if (mode === \"remove\") {\n return s.replace(/\\s+/g, \"\");\n }\n\n return s.replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * Removes all dashes and + signs from a string\n * +1-305-555-0123 -> \"13055550123\"\n * 305-555-0123 -> \"3055550123\"\n *\n * @param s\n * @returns\n */\nexport const removeDashesAndPlusSign = (s: string): string =>\n s.replace(/[+-]/g, \"\");\n\n/**\n * Rounds a number to a certain precision.\n * Contract:\n * 1. Number must be finite and non negative.\n * 2. Precision must be finite nonnegative and an integer.\n * 3. Precision must be <= Max precision\n * 4. Returns a number >= 0\n *\n * @param num\n * @param precision\n * @param opts\n * @returns\n */\nexport function roundWithPrecision(\n num: number,\n precision: number,\n opts?: GlobalTypes.ToFixedOptions\n): number {\n const MAX_PRECISION = 2;\n const { roundType = \"half_up\" } = opts ?? {};\n\n if (!Number.isFinite(num) || num < 0) {\n throw new RangeError(\"Number must be finite and greater than 0.\");\n }\n\n if (\n !Number.isFinite(precision) ||\n !Number.isInteger(precision) ||\n precision < 1\n ) {\n throw new RangeError(\"Precision must be a finite integer greater than 0.\");\n }\n\n if (precision > MAX_PRECISION) {\n throw new RangeError(\"Max precision allowed is 2.\");\n }\n\n return Number(\n (+(Math.round(+(num + \"e\" + precision)) + \"e\" + -precision)).toFixed(\n precision\n )\n );\n}\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const ProductFormSchema = z\n .strictObject({\n product_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Product name is required\")\n .max(50, \"Product name must be at most 50 characters.\")\n ),\n\n product_description: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .max(100, \"Product desription must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_sku: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(z.string().max(30, \"Product SKU must be at most 30 characters.\"))\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_upc: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{12}$/.test(s), {\n error: \"UPC must be exactly 12 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_gtin_14: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{14}$/.test(s), {\n error: \"GTIN14 must be exactly 14 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_type: z.enum([\"unit\", \"weight\", \"case\"], { error: \"\" }),\n\n weight_unit: z.preprocess((v) => {\n if (v === \"\") return undefined;\n if (typeof v === \"string\") return v.trim().toLowerCase();\n return v;\n }, z.enum([\"kg\", \"lb\", \"g\", \"oz\"]).optional()),\n\n price: GlobalUtils.handleZodCurrency(1, 99_999),\n cost: GlobalUtils.handleZodCurrency(1, 99_999),\n })\n\n .superRefine((data, ctx) => {\n if (data.product_type === \"weight\" && !data.weight_unit) {\n ctx.addIssue({\n code: \"custom\",\n error: \"Weight unit is required.\",\n path: [\"weight_unit\"],\n });\n }\n\n if (\n data.product_type !== \"weight\" &&\n typeof data.weight_unit !== \"undefined\"\n ) {\n ctx.addIssue({\n code: \"custom\",\n error: \"Weight unit must be empty\",\n path: [\"weight_unit\"],\n });\n }\n });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,cAAkB;;;ACClB,iBAAkB;AAUX,SAAS,kBAAkB,WAAmB,WAAmB;AACtE,SAAO,aACJ,WAAW,CAAC,MAAM;AACjB,QAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAE1C,QAAI,OAAO,MAAM,UAAU;AACzB,YAAM,IAAI,EAAE,QAAQ,UAAU,EAAE;AAChC,UAAI,MAAM,GAAI,QAAO;AACrB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,GAAG,aAAE,OAAO,OAAO,EAAE,OAAO,wBAAwB,CAAC,EAAE,OAAO,OAAO,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC,EACjH,UAAU,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,EACzC,OAAO,CAAC,MAAM,KAAK,WAAW;AAAA,IAC7B,OAAO,wBAAwB,SAAS;AAAA,EAC1C,CAAC,EACA,OAAO,CAAC,MAAM,KAAK,WAAW;AAAA,IAC7B,OAAO,yBAAyB,SAAS;AAAA,EAC3C,CAAC;AACL;AASO,IAAM,kCAAkC,CAAC,MAC9C,EAAE,KAAK,MAAM,KAAK,SAAY;AAWzB,IAAM,kBAAkB,CAAC,MAAc,WAAW,GAAG,WAAW;AAOhE,IAAM,sBAAsB,CAAC,MAAc,WAAW,GAAG,QAAQ;AAExE,IAAM,aAAa,CAAC,GAAW,SAAqC;AAClE,MAAI,SAAS,UAAU;AACrB,WAAO,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC7B;AAEA,SAAO,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACrC;AAUO,IAAM,0BAA0B,CAAC,MACtC,EAAE,QAAQ,SAAS,EAAE;AAehB,SAAS,mBACd,KACA,WACA,MACQ;AACR,QAAM,gBAAgB;AACtB,QAAM,EAAE,YAAY,UAAU,IAAI,sBAAQ,CAAC;AAE3C,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,GAAG;AACpC,UAAM,IAAI,WAAW,2CAA2C;AAAA,EAClE;AAEA,MACE,CAAC,OAAO,SAAS,SAAS,KAC1B,CAAC,OAAO,UAAU,SAAS,KAC3B,YAAY,GACZ;AACA,UAAM,IAAI,WAAW,oDAAoD;AAAA,EAC3E;AAEA,MAAI,YAAY,eAAe;AAC7B,UAAM,IAAI,WAAW,6BAA6B;AAAA,EACpD;AAEA,SAAO;AAAA,KACJ,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,UAAU,IAAI,MAAM,CAAC,YAAY;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACF;;;ADvHO,IAAM,qBAAqB,cAAE,aAAa;AAAA,EAC/C,eAAe,cACZ,OAAO,EACP,UAAsB,eAAe,EACrC;AAAA,IACC,cACG,OAAO,EACP,IAAI,GAAG,2BAA2B,EAClC,IAAI,IAAI,8CAA8C;AAAA,EAC3D;AAAA,EAEF,kBAAkB,cACf,OAAO,EACP,UAAsB,eAAe,EACrC;AAAA,IACC,cAAE,OAAO,EAAE,IAAI,KAAK,kDAAkD;AAAA,EACxE,EACC,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,uBAAuB,cACpB,OAAO,EACP,UAAsB,mBAAmB,EACzC,UAAsB,uBAAuB,EAC7C,OAAO,CAAC,MAAM,MAAM,MAAM,aAAa,KAAK,CAAC,GAAG;AAAA,IAC/C,OAAO;AAAA,EACT,CAAC,EACA,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,wBAAwB,cACrB,OAAO,EACP,UAAsB,mBAAmB,EACzC,UAAsB,+BAA+B,EACrD;AAAA,IACC,cACG,MAAM,EACN,IAAI,KAAK,gDAAgD,EACzD,UAAU,CAAC,UAAU,MAAM,YAAY,CAAC,EACxC,SAAS;AAAA,EACd,EACC,SAAS;AAAA,EAEZ,UAAsB,kBAAkB,GAAG,GAAG;AAChD,CAAC;;;AE/CD,IAAAC,cAAkB;AAGX,IAAM,oBAAoB,cAC9B,aAAa;AAAA,EACZ,cAAc,cACX,OAAO,EACP,UAAsB,eAAe,EACrC;AAAA,IACC,cACG,OAAO,EACP,IAAI,GAAG,0BAA0B,EACjC,IAAI,IAAI,6CAA6C;AAAA,EAC1D;AAAA,EAEF,qBAAqB,cAClB,OAAO,EACP,UAAsB,eAAe,EACrC;AAAA,IACC,cACG,OAAO,EACP,IAAI,KAAK,oDAAoD;AAAA,EAClE,EACC,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,aAAa,cACV,OAAO,EACP,UAAsB,eAAe,EACrC,KAAK,cAAE,OAAO,EAAE,IAAI,IAAI,4CAA4C,CAAC,EACrE,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,aAAa,cACV,OAAO,EACP,UAAU,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,MAAM,MAAM,WAAW,KAAK,CAAC,GAAG;AAAA,IAC7C,OAAO;AAAA,EACT,CAAC,EACA,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,iBAAiB,cACd,OAAO,EACP,UAAU,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,MAAM,MAAM,WAAW,KAAK,CAAC,GAAG;AAAA,IAC7C,OAAO;AAAA,EACT,CAAC,EACA,UAAsB,+BAA+B,EACrD,SAAS;AAAA,EAEZ,cAAc,cAAE,KAAK,CAAC,QAAQ,UAAU,MAAM,GAAG,EAAE,OAAO,GAAG,CAAC;AAAA,EAE9D,aAAa,cAAE,WAAW,CAAC,MAAM;AAC/B,QAAI,MAAM,GAAI,QAAO;AACrB,QAAI,OAAO,MAAM,SAAU,QAAO,EAAE,KAAK,EAAE,YAAY;AACvD,WAAO;AAAA,EACT,GAAG,cAAE,KAAK,CAAC,MAAM,MAAM,KAAK,IAAI,CAAC,EAAE,SAAS,CAAC;AAAA,EAE7C,OAAmB,kBAAkB,GAAG,KAAM;AAAA,EAC9C,MAAkB,kBAAkB,GAAG,KAAM;AAC/C,CAAC,EAEA,YAAY,CAAC,MAAM,QAAQ;AAC1B,MAAI,KAAK,iBAAiB,YAAY,CAAC,KAAK,aAAa;AACvD,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,CAAC,aAAa;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,MACE,KAAK,iBAAiB,YACtB,OAAO,KAAK,gBAAgB,aAC5B;AACA,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,CAAC,aAAa;AAAA,IACtB,CAAC;AAAA,EACH;AACF,CAAC;","names":["import_zod","import_zod"]}
package/dist/index.d.cts CHANGED
@@ -1,76 +1,33 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  declare const CustomerFormSchema: z.ZodObject<{
4
- customer_name: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
5
- customer_address: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
6
- customer_phone_number: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>, string | undefined, string>>;
7
- customer_email_address: z.ZodOptional<z.ZodPipeline<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string | undefined, string>, z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>>>;
8
- tax_rate: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
9
- }, "strip", z.ZodTypeAny, {
10
- customer_name: string;
11
- tax_rate: number;
12
- customer_address?: string | undefined;
13
- customer_phone_number?: string | undefined;
14
- customer_email_address?: string | undefined;
15
- }, {
16
- customer_name: string;
17
- customer_address?: string | undefined;
18
- customer_phone_number?: string | undefined;
19
- customer_email_address?: string | undefined;
20
- tax_rate?: unknown;
21
- }>;
4
+ customer_name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
5
+ customer_address: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
6
+ customer_phone_number: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
7
+ customer_email_address: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>, z.ZodOptional<z.ZodPipe<z.ZodEmail, z.ZodTransform<string, string>>>>>;
8
+ tax_rate: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
9
+ }, z.core.$strict>;
22
10
 
23
- declare const ProductFormSchema: z.ZodEffects<z.ZodObject<{
24
- product_name: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
25
- product_description: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
26
- product_sku: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
27
- product_upc: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string | undefined, string>>;
28
- product_gtin_14: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string | undefined, string>>;
29
- product_type: z.ZodEnum<["unit", "weight", "case"]>;
30
- weight_unit: z.ZodEffects<z.ZodOptional<z.ZodEnum<["kg", "lb", "g", "oz"]>>, "kg" | "lb" | "g" | "oz" | undefined, unknown>;
31
- price: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
32
- cost: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
33
- }, "strict", z.ZodTypeAny, {
34
- product_name: string;
35
- product_type: "unit" | "weight" | "case";
36
- price: number;
37
- cost: number;
38
- product_description?: string | undefined;
39
- product_sku?: string | undefined;
40
- product_upc?: string | undefined;
41
- product_gtin_14?: string | undefined;
42
- weight_unit?: "kg" | "lb" | "g" | "oz" | undefined;
43
- }, {
44
- product_name: string;
45
- product_type: "unit" | "weight" | "case";
46
- product_description?: string | undefined;
47
- product_sku?: string | undefined;
48
- product_upc?: string | undefined;
49
- product_gtin_14?: string | undefined;
50
- weight_unit?: unknown;
51
- price?: unknown;
52
- cost?: unknown;
53
- }>, {
54
- product_name: string;
55
- product_type: "unit" | "weight" | "case";
56
- price: number;
57
- cost: number;
58
- product_description?: string | undefined;
59
- product_sku?: string | undefined;
60
- product_upc?: string | undefined;
61
- product_gtin_14?: string | undefined;
62
- weight_unit?: "kg" | "lb" | "g" | "oz" | undefined;
63
- }, {
64
- product_name: string;
65
- product_type: "unit" | "weight" | "case";
66
- product_description?: string | undefined;
67
- product_sku?: string | undefined;
68
- product_upc?: string | undefined;
69
- product_gtin_14?: string | undefined;
70
- weight_unit?: unknown;
71
- price?: unknown;
72
- cost?: unknown;
73
- }>;
11
+ declare const ProductFormSchema: z.ZodObject<{
12
+ product_name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
13
+ product_description: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
14
+ product_sku: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
15
+ product_upc: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
16
+ product_gtin_14: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
17
+ product_type: z.ZodEnum<{
18
+ unit: "unit";
19
+ weight: "weight";
20
+ case: "case";
21
+ }>;
22
+ weight_unit: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodOptional<z.ZodEnum<{
23
+ kg: "kg";
24
+ lb: "lb";
25
+ g: "g";
26
+ oz: "oz";
27
+ }>>>;
28
+ price: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
29
+ cost: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
30
+ }, z.core.$strict>;
74
31
 
75
32
  type RoundType = "half_up";
76
33
  interface ToFixedOptions {
@@ -85,7 +42,7 @@ interface ToFixedOptions {
85
42
  * @param maxAmount
86
43
  * @returns
87
44
  */
88
- declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
45
+ declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
89
46
  /**
90
47
  * Trims any leading or trailing spaces
91
48
  * Transforms empty strings into undefined.
@@ -95,8 +52,10 @@ declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodE
95
52
  */
96
53
  declare const transformEmptyStringToUndefined: (s: string) => string | undefined;
97
54
  /**
98
- * - Collapses any run of whitespace in a string (spaces, tabs, newlines, etc.) into a single ASCII space.
55
+ * - Collapses any run of whitespace in a string (spaces, tabs, newlines, nbspb, and other weird unicode spaces etc.)
56
+ * into a single ASCII space.
99
57
  * - Trims leading and trailing whitespace.
58
+ * " Jared \n Gomez \t Driver\t " -> "Jared Gomez Driver"
100
59
  *
101
60
  * @param s
102
61
  * @returns
package/dist/index.d.ts CHANGED
@@ -1,76 +1,33 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  declare const CustomerFormSchema: z.ZodObject<{
4
- customer_name: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
5
- customer_address: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
6
- customer_phone_number: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>, string | undefined, string>>;
7
- customer_email_address: z.ZodOptional<z.ZodPipeline<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string | undefined, string>, z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>>>;
8
- tax_rate: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
9
- }, "strip", z.ZodTypeAny, {
10
- customer_name: string;
11
- tax_rate: number;
12
- customer_address?: string | undefined;
13
- customer_phone_number?: string | undefined;
14
- customer_email_address?: string | undefined;
15
- }, {
16
- customer_name: string;
17
- customer_address?: string | undefined;
18
- customer_phone_number?: string | undefined;
19
- customer_email_address?: string | undefined;
20
- tax_rate?: unknown;
21
- }>;
4
+ customer_name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
5
+ customer_address: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
6
+ customer_phone_number: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
7
+ customer_email_address: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>, z.ZodOptional<z.ZodPipe<z.ZodEmail, z.ZodTransform<string, string>>>>>;
8
+ tax_rate: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
9
+ }, z.core.$strict>;
22
10
 
23
- declare const ProductFormSchema: z.ZodEffects<z.ZodObject<{
24
- product_name: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
25
- product_description: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
26
- product_sku: z.ZodOptional<z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string | undefined, string>>;
27
- product_upc: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string | undefined, string>>;
28
- product_gtin_14: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string | undefined, string>>;
29
- product_type: z.ZodEnum<["unit", "weight", "case"]>;
30
- weight_unit: z.ZodEffects<z.ZodOptional<z.ZodEnum<["kg", "lb", "g", "oz"]>>, "kg" | "lb" | "g" | "oz" | undefined, unknown>;
31
- price: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
32
- cost: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
33
- }, "strict", z.ZodTypeAny, {
34
- product_name: string;
35
- product_type: "unit" | "weight" | "case";
36
- price: number;
37
- cost: number;
38
- product_description?: string | undefined;
39
- product_sku?: string | undefined;
40
- product_upc?: string | undefined;
41
- product_gtin_14?: string | undefined;
42
- weight_unit?: "kg" | "lb" | "g" | "oz" | undefined;
43
- }, {
44
- product_name: string;
45
- product_type: "unit" | "weight" | "case";
46
- product_description?: string | undefined;
47
- product_sku?: string | undefined;
48
- product_upc?: string | undefined;
49
- product_gtin_14?: string | undefined;
50
- weight_unit?: unknown;
51
- price?: unknown;
52
- cost?: unknown;
53
- }>, {
54
- product_name: string;
55
- product_type: "unit" | "weight" | "case";
56
- price: number;
57
- cost: number;
58
- product_description?: string | undefined;
59
- product_sku?: string | undefined;
60
- product_upc?: string | undefined;
61
- product_gtin_14?: string | undefined;
62
- weight_unit?: "kg" | "lb" | "g" | "oz" | undefined;
63
- }, {
64
- product_name: string;
65
- product_type: "unit" | "weight" | "case";
66
- product_description?: string | undefined;
67
- product_sku?: string | undefined;
68
- product_upc?: string | undefined;
69
- product_gtin_14?: string | undefined;
70
- weight_unit?: unknown;
71
- price?: unknown;
72
- cost?: unknown;
73
- }>;
11
+ declare const ProductFormSchema: z.ZodObject<{
12
+ product_name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
13
+ product_description: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
14
+ product_sku: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>, z.ZodTransform<string | undefined, string>>>;
15
+ product_upc: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
16
+ product_gtin_14: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string | undefined, string>>>;
17
+ product_type: z.ZodEnum<{
18
+ unit: "unit";
19
+ weight: "weight";
20
+ case: "case";
21
+ }>;
22
+ weight_unit: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodOptional<z.ZodEnum<{
23
+ kg: "kg";
24
+ lb: "lb";
25
+ g: "g";
26
+ oz: "oz";
27
+ }>>>;
28
+ price: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
29
+ cost: z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
30
+ }, z.core.$strict>;
74
31
 
75
32
  type RoundType = "half_up";
76
33
  interface ToFixedOptions {
@@ -85,7 +42,7 @@ interface ToFixedOptions {
85
42
  * @param maxAmount
86
43
  * @returns
87
44
  */
88
- declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodNumber, number, number>, number, unknown>, number, unknown>, number, unknown>, number, unknown>;
45
+ declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodPipe<z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodCoercedNumber<unknown>>, z.ZodTransform<number, number>>;
89
46
  /**
90
47
  * Trims any leading or trailing spaces
91
48
  * Transforms empty strings into undefined.
@@ -95,8 +52,10 @@ declare function handleZodCurrency(minAmount: number, maxAmount: number): z.ZodE
95
52
  */
96
53
  declare const transformEmptyStringToUndefined: (s: string) => string | undefined;
97
54
  /**
98
- * - Collapses any run of whitespace in a string (spaces, tabs, newlines, etc.) into a single ASCII space.
55
+ * - Collapses any run of whitespace in a string (spaces, tabs, newlines, nbspb, and other weird unicode spaces etc.)
56
+ * into a single ASCII space.
99
57
  * - Trims leading and trailing whitespace.
58
+ * " Jared \n Gomez \t Driver\t " -> "Jared Gomez Driver"
100
59
  *
101
60
  * @param s
102
61
  * @returns
package/dist/index.js CHANGED
@@ -12,10 +12,10 @@ function handleZodCurrency(minAmount, maxAmount) {
12
12
  return s;
13
13
  }
14
14
  return v;
15
- }, z.coerce.number({ message: "Enter a valid number." }).refine(Number.isFinite, { message: "Enter a valid number." })).transform((x) => roundWithPrecision(x, 2)).refine((n) => n >= minAmount, {
16
- message: `Must be greater than ${minAmount}.`
15
+ }, z.coerce.number({ error: "Enter a valid number." }).refine(Number.isFinite, { error: "Enter a valid number." })).transform((x) => roundWithPrecision(x, 2)).refine((n) => n >= minAmount, {
16
+ error: `Must be greater than ${minAmount}.`
17
17
  }).refine((n) => n <= maxAmount, {
18
- message: `Exceeds allowed limit ${maxAmount}.`
18
+ error: `Exceeds allowed limit ${maxAmount}.`
19
19
  });
20
20
  }
21
21
  var transformEmptyStringToUndefined = (s) => s.trim() === "" ? void 0 : s;
@@ -48,7 +48,7 @@ function roundWithPrecision(num, precision, opts) {
48
48
  }
49
49
 
50
50
  // src/schemas/customer_schemas.ts
51
- var CustomerFormSchema = z2.object({
51
+ var CustomerFormSchema = z2.strictObject({
52
52
  customer_name: z2.string().transform(normalizeSpaces).pipe(
53
53
  z2.string().min(1, "Customer name is required").max(50, "Customer name must be at most 50 characters.")
54
54
  ),
@@ -56,17 +56,17 @@ var CustomerFormSchema = z2.object({
56
56
  z2.string().max(100, "Customer address must be at most 100 characters.")
57
57
  ).transform(transformEmptyStringToUndefined).optional(),
58
58
  customer_phone_number: z2.string().transform(removeAllWhitespace).transform(removeDashesAndPlusSign).refine((s) => s === "" || /^\d{1,15}$/.test(s), {
59
- message: "Phone number must be from 1 to 15 digits."
59
+ error: "Phone number must be from 1 to 15 digits."
60
60
  }).transform(transformEmptyStringToUndefined).optional(),
61
61
  customer_email_address: z2.string().transform(removeAllWhitespace).transform(transformEmptyStringToUndefined).pipe(
62
- z2.string().email().max(254, "Customer email must be at most 254 characters.").transform((email) => email.toLowerCase()).optional()
62
+ z2.email().max(254, "Customer email must be at most 254 characters.").transform((email) => email.toLowerCase()).optional()
63
63
  ).optional(),
64
64
  tax_rate: handleZodCurrency(0, 100)
65
65
  });
66
66
 
67
67
  // src/schemas/product_schemas.ts
68
68
  import { z as z3 } from "zod";
69
- var ProductFormSchema = z3.object({
69
+ var ProductFormSchema = z3.strictObject({
70
70
  product_name: z3.string().transform(normalizeSpaces).pipe(
71
71
  z3.string().min(1, "Product name is required").max(50, "Product name must be at most 50 characters.")
72
72
  ),
@@ -75,14 +75,12 @@ var ProductFormSchema = z3.object({
75
75
  ).transform(transformEmptyStringToUndefined).optional(),
76
76
  product_sku: z3.string().transform(normalizeSpaces).pipe(z3.string().max(30, "Product SKU must be at most 30 characters.")).transform(transformEmptyStringToUndefined).optional(),
77
77
  product_upc: z3.string().transform((s) => s.replace(/\s+/g, "")).refine((s) => s === "" || /^\d{12}$/.test(s), {
78
- message: "UPC must be exactly 12 digits"
78
+ error: "UPC must be exactly 12 digits"
79
79
  }).transform(transformEmptyStringToUndefined).optional(),
80
80
  product_gtin_14: z3.string().transform((s) => s.replace(/\s+/g, "")).refine((s) => s === "" || /^\d{14}$/.test(s), {
81
- message: "GTIN14 must be exactly 14 digits"
81
+ error: "GTIN14 must be exactly 14 digits"
82
82
  }).transform(transformEmptyStringToUndefined).optional(),
83
- product_type: z3.enum(["unit", "weight", "case"], {
84
- errorMap: () => ({ message: "Product type is required" })
85
- }),
83
+ product_type: z3.enum(["unit", "weight", "case"], { error: "" }),
86
84
  weight_unit: z3.preprocess((v) => {
87
85
  if (v === "") return void 0;
88
86
  if (typeof v === "string") return v.trim().toLowerCase();
@@ -90,18 +88,18 @@ var ProductFormSchema = z3.object({
90
88
  }, z3.enum(["kg", "lb", "g", "oz"]).optional()),
91
89
  price: handleZodCurrency(1, 99999),
92
90
  cost: handleZodCurrency(1, 99999)
93
- }).strict().superRefine((data, ctx) => {
91
+ }).superRefine((data, ctx) => {
94
92
  if (data.product_type === "weight" && !data.weight_unit) {
95
93
  ctx.addIssue({
96
- code: z3.ZodIssueCode.custom,
97
- message: "Weight unit is required.",
94
+ code: "custom",
95
+ error: "Weight unit is required.",
98
96
  path: ["weight_unit"]
99
97
  });
100
98
  }
101
99
  if (data.product_type !== "weight" && typeof data.weight_unit !== "undefined") {
102
100
  ctx.addIssue({
103
- code: z3.ZodIssueCode.custom,
104
- message: "Weight unit must be empty",
101
+ code: "custom",
102
+ error: "Weight unit must be empty",
105
103
  path: ["weight_unit"]
106
104
  });
107
105
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/customer_schemas.ts","../src/utils/utils.ts","../src/schemas/product_schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const CustomerFormSchema = z.object({\n customer_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Customer name is required\")\n .max(50, \"Customer name must be at most 50 characters.\")\n ),\n\n customer_address: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z.string().max(100, \"Customer address must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_phone_number: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.removeDashesAndPlusSign)\n .refine((s) => s === \"\" || /^\\d{1,15}$/.test(s), {\n message: \"Phone number must be from 1 to 15 digits.\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_email_address: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .pipe(\n z\n .string()\n .email()\n .max(254, \"Customer email must be at most 254 characters.\")\n .transform((email) => email.toLowerCase())\n .optional()\n )\n .optional(),\n\n tax_rate: GlobalUtils.handleZodCurrency(0, 100),\n});\n","import * as GlobalTypes from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Validates zod currency with precision.\n *\n *\n * @param minAmount\n * @param maxAmount\n * @returns\n */\nexport function handleZodCurrency(minAmount: number, maxAmount: number) {\n return z\n .preprocess((v) => {\n if (v === null || v === undefined) return NaN;\n\n if (typeof v === \"string\") {\n const s = v.replace(/[,\\s]/g, \"\");\n if (s === \"\") return NaN;\n return s;\n }\n\n return v;\n }, z.coerce.number({ message: \"Enter a valid number.\" }).refine(Number.isFinite, { message: \"Enter a valid number.\" }))\n .transform((x) => roundWithPrecision(x, 2))\n .refine((n) => n >= minAmount, {\n message: `Must be greater than ${minAmount}.`,\n })\n .refine((n) => n <= maxAmount, {\n message: `Exceeds allowed limit ${maxAmount}.`,\n });\n}\n\n/**\n * Trims any leading or trailing spaces\n * Transforms empty strings into undefined.\n *\n * @param s\n * @returns\n */\nexport const transformEmptyStringToUndefined = (s: string) =>\n s.trim() === \"\" ? undefined : s;\n\n/**\n * - Collapses any run of whitespace in a string (spaces, tabs, newlines, etc.) into a single ASCII space.\n * - Trims leading and trailing whitespace.\n *\n * @param s\n * @returns\n */\nexport const normalizeSpaces = (s: string) => whitespace(s, \"normalize\");\n\n/**\n * Removes all whitespace from a string\n * @param s\n * @returns\n */\nexport const removeAllWhitespace = (s: string) => whitespace(s, \"remove\");\n\nconst whitespace = (s: string, mode: GlobalTypes.WhitespaceMode) => {\n if (mode === \"remove\") {\n return s.replace(/\\s+/g, \"\");\n }\n\n return s.replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * Removes all dashes and + signs from a string\n * +1-305-555-0123 -> \"13055550123\"\n * 305-555-0123 -> \"3055550123\"\n *\n * @param s\n * @returns\n */\nexport const removeDashesAndPlusSign = (s: string): string =>\n s.replace(/[+-]/g, \"\");\n\n/**\n * Rounds a number to a certain precision.\n * Contract:\n * 1. Number must be finite and non negative.\n * 2. Precision must be finite nonnegative and an integer.\n * 3. Precision must be <= Max precision\n * 4. Returns a number >= 0\n *\n * @param num\n * @param precision\n * @param opts\n * @returns\n */\nexport function roundWithPrecision(\n num: number,\n precision: number,\n opts?: GlobalTypes.ToFixedOptions\n): number {\n const MAX_PRECISION = 2;\n const { roundType = \"half_up\" } = opts ?? {};\n\n if (!Number.isFinite(num) || num < 0) {\n throw new RangeError(\"Number must be finite and greater than 0.\");\n }\n\n if (\n !Number.isFinite(precision) ||\n !Number.isInteger(precision) ||\n precision < 1\n ) {\n throw new RangeError(\"Precision must be a finite integer greater than 0.\");\n }\n\n if (precision > MAX_PRECISION) {\n throw new RangeError(\"Max precision allowed is 2.\");\n }\n\n return Number(\n (+(Math.round(+(num + \"e\" + precision)) + \"e\" + -precision)).toFixed(\n precision\n )\n );\n}\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const ProductFormSchema = z\n .object({\n product_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Product name is required\")\n .max(50, \"Product name must be at most 50 characters.\")\n ),\n\n product_description: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .max(100, \"Product desription must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_sku: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(z.string().max(30, \"Product SKU must be at most 30 characters.\"))\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_upc: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{12}$/.test(s), {\n message: \"UPC must be exactly 12 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_gtin_14: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{14}$/.test(s), {\n message: \"GTIN14 must be exactly 14 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_type: z.enum([\"unit\", \"weight\", \"case\"], {\n errorMap: () => ({ message: \"Product type is required\" }),\n }),\n\n weight_unit: z.preprocess((v) => {\n if (v === \"\") return undefined;\n if (typeof v === \"string\") return v.trim().toLowerCase();\n return v;\n }, z.enum([\"kg\", \"lb\", \"g\", \"oz\"]).optional()),\n\n price: GlobalUtils.handleZodCurrency(1, 99_999),\n cost: GlobalUtils.handleZodCurrency(1, 99_999),\n })\n .strict()\n\n .superRefine((data, ctx) => {\n if (data.product_type === \"weight\" && !data.weight_unit) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Weight unit is required.\",\n path: [\"weight_unit\"],\n });\n }\n\n if (\n data.product_type !== \"weight\" &&\n typeof data.weight_unit !== \"undefined\"\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Weight unit must be empty\",\n path: [\"weight_unit\"],\n });\n }\n });\n"],"mappings":"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","names":["z","z","z","z"]}
1
+ {"version":3,"sources":["../src/schemas/customer_schemas.ts","../src/utils/utils.ts","../src/schemas/product_schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const CustomerFormSchema = z.strictObject({\n customer_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Customer name is required\")\n .max(50, \"Customer name must be at most 50 characters.\")\n ),\n\n customer_address: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z.string().max(100, \"Customer address must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_phone_number: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.removeDashesAndPlusSign)\n .refine((s) => s === \"\" || /^\\d{1,15}$/.test(s), {\n error: \"Phone number must be from 1 to 15 digits.\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n customer_email_address: z\n .string()\n .transform(GlobalUtils.removeAllWhitespace)\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .pipe(\n z\n .email()\n .max(254, \"Customer email must be at most 254 characters.\")\n .transform((email) => email.toLowerCase())\n .optional()\n )\n .optional(),\n\n tax_rate: GlobalUtils.handleZodCurrency(0, 100),\n});\n","import * as GlobalTypes from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Validates zod currency with precision.\n *\n *\n * @param minAmount\n * @param maxAmount\n * @returns\n */\nexport function handleZodCurrency(minAmount: number, maxAmount: number) {\n return z\n .preprocess((v) => {\n if (v === null || v === undefined) return NaN;\n\n if (typeof v === \"string\") {\n const s = v.replace(/[,\\s]/g, \"\");\n if (s === \"\") return NaN;\n return s;\n }\n\n return v;\n }, z.coerce.number({ error: \"Enter a valid number.\" }).refine(Number.isFinite, { error: \"Enter a valid number.\" }))\n .transform((x) => roundWithPrecision(x, 2))\n .refine((n) => n >= minAmount, {\n error: `Must be greater than ${minAmount}.`,\n })\n .refine((n) => n <= maxAmount, {\n error: `Exceeds allowed limit ${maxAmount}.`,\n });\n}\n\n/**\n * Trims any leading or trailing spaces\n * Transforms empty strings into undefined.\n *\n * @param s\n * @returns\n */\nexport const transformEmptyStringToUndefined = (s: string) =>\n s.trim() === \"\" ? undefined : s;\n\n/**\n * - Collapses any run of whitespace in a string (spaces, tabs, newlines, nbspb, and other weird unicode spaces etc.)\n * into a single ASCII space.\n * - Trims leading and trailing whitespace.\n * \" Jared \\n Gomez \\t Driver\\t \" -> \"Jared Gomez Driver\"\n *\n * @param s\n * @returns\n */\nexport const normalizeSpaces = (s: string) => whitespace(s, \"normalize\");\n\n/**\n * Removes all whitespace from a string\n * @param s\n * @returns\n */\nexport const removeAllWhitespace = (s: string) => whitespace(s, \"remove\");\n\nconst whitespace = (s: string, mode: GlobalTypes.WhitespaceMode) => {\n if (mode === \"remove\") {\n return s.replace(/\\s+/g, \"\");\n }\n\n return s.replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * Removes all dashes and + signs from a string\n * +1-305-555-0123 -> \"13055550123\"\n * 305-555-0123 -> \"3055550123\"\n *\n * @param s\n * @returns\n */\nexport const removeDashesAndPlusSign = (s: string): string =>\n s.replace(/[+-]/g, \"\");\n\n/**\n * Rounds a number to a certain precision.\n * Contract:\n * 1. Number must be finite and non negative.\n * 2. Precision must be finite nonnegative and an integer.\n * 3. Precision must be <= Max precision\n * 4. Returns a number >= 0\n *\n * @param num\n * @param precision\n * @param opts\n * @returns\n */\nexport function roundWithPrecision(\n num: number,\n precision: number,\n opts?: GlobalTypes.ToFixedOptions\n): number {\n const MAX_PRECISION = 2;\n const { roundType = \"half_up\" } = opts ?? {};\n\n if (!Number.isFinite(num) || num < 0) {\n throw new RangeError(\"Number must be finite and greater than 0.\");\n }\n\n if (\n !Number.isFinite(precision) ||\n !Number.isInteger(precision) ||\n precision < 1\n ) {\n throw new RangeError(\"Precision must be a finite integer greater than 0.\");\n }\n\n if (precision > MAX_PRECISION) {\n throw new RangeError(\"Max precision allowed is 2.\");\n }\n\n return Number(\n (+(Math.round(+(num + \"e\" + precision)) + \"e\" + -precision)).toFixed(\n precision\n )\n );\n}\n","import { z } from \"zod\";\nimport * as GlobalUtils from \"../utils/utils\";\n\nexport const ProductFormSchema = z\n .strictObject({\n product_name: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .min(1, \"Product name is required\")\n .max(50, \"Product name must be at most 50 characters.\")\n ),\n\n product_description: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(\n z\n .string()\n .max(100, \"Product desription must be at most 100 characters.\")\n )\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_sku: z\n .string()\n .transform(GlobalUtils.normalizeSpaces)\n .pipe(z.string().max(30, \"Product SKU must be at most 30 characters.\"))\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_upc: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{12}$/.test(s), {\n error: \"UPC must be exactly 12 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_gtin_14: z\n .string()\n .transform((s) => s.replace(/\\s+/g, \"\"))\n .refine((s) => s === \"\" || /^\\d{14}$/.test(s), {\n error: \"GTIN14 must be exactly 14 digits\",\n })\n .transform(GlobalUtils.transformEmptyStringToUndefined)\n .optional(),\n\n product_type: z.enum([\"unit\", \"weight\", \"case\"], { error: \"\" }),\n\n weight_unit: z.preprocess((v) => {\n if (v === \"\") return undefined;\n if (typeof v === \"string\") return v.trim().toLowerCase();\n return v;\n }, z.enum([\"kg\", \"lb\", \"g\", \"oz\"]).optional()),\n\n price: GlobalUtils.handleZodCurrency(1, 99_999),\n cost: GlobalUtils.handleZodCurrency(1, 99_999),\n })\n\n .superRefine((data, ctx) => {\n if (data.product_type === \"weight\" && !data.weight_unit) {\n ctx.addIssue({\n code: \"custom\",\n error: \"Weight unit is required.\",\n path: [\"weight_unit\"],\n });\n }\n\n if (\n data.product_type !== \"weight\" &&\n typeof data.weight_unit !== \"undefined\"\n ) {\n ctx.addIssue({\n code: \"custom\",\n error: \"Weight unit must be empty\",\n path: [\"weight_unit\"],\n });\n }\n });\n"],"mappings":"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","names":["z","z","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marmot-systems/common",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Schemas and utils shared across Marmot apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -37,6 +37,6 @@
37
37
  "vitest": "^3.2.4"
38
38
  },
39
39
  "dependencies": {
40
- "zod": "^3.24.1"
40
+ "zod": "^4.1.12"
41
41
  }
42
42
  }