UNPKG

@eristack/business-calendar

Version:

Business days and holidays on YYYY-MM-DD wall dates — no timestamp import in core

1 lines • 3.65 kB
{"version":3,"sources":["../../src/zod/index.ts","../../src/zod/schemas.ts","../../src/core/errors.ts","../../src/core/wall-date.ts"],"sourcesContent":["export { businessCalendarOptionsSchema, wallDateSchema } from \"./schemas.js\";\n","import { z } from \"zod\";\n\nimport { normalizeWallDate } from \"../core/wall-date.js\";\n\nexport const wallDateSchema = z.string().transform((value) => normalizeWallDate(value));\n\nexport const businessCalendarOptionsSchema = z.object({\n weekendDays: z.array(z.number().int().min(0).max(6)),\n holidays: z.array(z.string()),\n});\n","export class BusinessCalendarParseError extends Error {\n readonly code = \"BUSINESS_CALENDAR_PARSE_ERROR\" as const;\n\n constructor(message: string) {\n super(message);\n this.name = \"BusinessCalendarParseError\";\n }\n}\n","import { BusinessCalendarParseError } from \"./errors.js\";\n\n/** Calendar date `YYYY-MM-DD` (no time zone — wall intent). */\nexport type WallDate = string;\n\nconst WALL_DATE_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function normalizeWallDate(value: string): WallDate {\n const trimmed = value.trim();\n const match = WALL_DATE_RE.exec(trimmed);\n if (!match) {\n throw new BusinessCalendarParseError(\n `Invalid wall date \"${value}\" — expected YYYY-MM-DD`,\n );\n }\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const utc = Date.UTC(year, month - 1, day);\n const check = new Date(utc);\n if (\n check.getUTCFullYear() !== year ||\n check.getUTCMonth() !== month - 1 ||\n check.getUTCDate() !== day\n ) {\n throw new BusinessCalendarParseError(`Invalid calendar date \"${value}\"`);\n }\n const mm = String(month).padStart(2, \"0\");\n const dd = String(day).padStart(2, \"0\");\n return `${year}-${mm}-${dd}`;\n}\n\nexport function wallDateDayOfWeek(date: WallDate): number {\n const normalized = normalizeWallDate(date);\n const [y, m, d] = normalized.split(\"-\").map(Number) as [number, number, number];\n return new Date(Date.UTC(y, m - 1, d)).getUTCDay();\n}\n\nexport function addWallDays(date: WallDate, days: number): WallDate {\n const normalized = normalizeWallDate(date);\n const [y, m, d] = normalized.split(\"-\").map(Number) as [number, number, number];\n const next = new Date(Date.UTC(y, m - 1, d));\n next.setUTCDate(next.getUTCDate() + days);\n const ny = next.getUTCFullYear();\n const nm = String(next.getUTCMonth() + 1).padStart(2, \"0\");\n const nd = String(next.getUTCDate()).padStart(2, \"0\");\n return `${ny}-${nm}-${nd}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAAkB;;;ACAX,IAAM,6BAAN,cAAyC,MAAM;AAAA,EAC3C,OAAO;AAAA,EAEhB,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACFA,IAAM,eAAe;AAEd,SAAS,kBAAkB,OAAyB;AACzD,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,QAAQ,aAAa,KAAK,OAAO;AACvC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,sBAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAC3B,QAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG;AACzC,QAAM,QAAQ,IAAI,KAAK,GAAG;AAC1B,MACE,MAAM,eAAe,MAAM,QAC3B,MAAM,YAAY,MAAM,QAAQ,KAChC,MAAM,WAAW,MAAM,KACvB;AACA,UAAM,IAAI,2BAA2B,0BAA0B,KAAK,GAAG;AAAA,EACzE;AACA,QAAM,KAAK,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AACxC,QAAM,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;AACtC,SAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE;AAC5B;;;AF1BO,IAAM,iBAAiB,aAAE,OAAO,EAAE,UAAU,CAAC,UAAU,kBAAkB,KAAK,CAAC;AAE/E,IAAM,gCAAgC,aAAE,OAAO;AAAA,EACpD,aAAa,aAAE,MAAM,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EACnD,UAAU,aAAE,MAAM,aAAE,OAAO,CAAC;AAC9B,CAAC;","names":[]}