@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 +15 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -71
- package/dist/index.d.ts +30 -71
- package/dist/index.js +15 -17
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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({
|
|
49
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}).
|
|
124
|
+
}).superRefine((data, ctx) => {
|
|
127
125
|
if (data.product_type === "weight" && !data.weight_unit) {
|
|
128
126
|
ctx.addIssue({
|
|
129
|
-
code:
|
|
130
|
-
|
|
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:
|
|
137
|
-
|
|
134
|
+
code: "custom",
|
|
135
|
+
error: "Weight unit must be empty",
|
|
138
136
|
path: ["weight_unit"]
|
|
139
137
|
});
|
|
140
138
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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","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.
|
|
5
|
-
customer_address: z.ZodOptional<z.
|
|
6
|
-
customer_phone_number: z.ZodOptional<z.
|
|
7
|
-
customer_email_address: z.ZodOptional<z.
|
|
8
|
-
tax_rate: z.
|
|
9
|
-
},
|
|
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.
|
|
24
|
-
product_name: z.
|
|
25
|
-
product_description: z.ZodOptional<z.
|
|
26
|
-
product_sku: z.ZodOptional<z.
|
|
27
|
-
product_upc: z.ZodOptional<z.
|
|
28
|
-
product_gtin_14: z.ZodOptional<z.
|
|
29
|
-
product_type: z.ZodEnum<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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.
|
|
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,
|
|
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.
|
|
5
|
-
customer_address: z.ZodOptional<z.
|
|
6
|
-
customer_phone_number: z.ZodOptional<z.
|
|
7
|
-
customer_email_address: z.ZodOptional<z.
|
|
8
|
-
tax_rate: z.
|
|
9
|
-
},
|
|
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.
|
|
24
|
-
product_name: z.
|
|
25
|
-
product_description: z.ZodOptional<z.
|
|
26
|
-
product_sku: z.ZodOptional<z.
|
|
27
|
-
product_upc: z.ZodOptional<z.
|
|
28
|
-
product_gtin_14: z.ZodOptional<z.
|
|
29
|
-
product_type: z.ZodEnum<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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.
|
|
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,
|
|
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({
|
|
16
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}).
|
|
91
|
+
}).superRefine((data, ctx) => {
|
|
94
92
|
if (data.product_type === "weight" && !data.weight_unit) {
|
|
95
93
|
ctx.addIssue({
|
|
96
|
-
code:
|
|
97
|
-
|
|
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:
|
|
104
|
-
|
|
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": "
|
|
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": "^
|
|
40
|
+
"zod": "^4.1.12"
|
|
41
41
|
}
|
|
42
42
|
}
|