@intech-software/chronera 0.1.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/LICENSE +190 -0
- package/README.md +6644 -0
- package/dist/calendar/buddhist/adapter.d.ts +2 -0
- package/dist/calendar/buddhist/adapter.js +33 -0
- package/dist/calendar/buddhist/adapter.js.map +1 -0
- package/dist/calendar/buddhist/constants.d.ts +3 -0
- package/dist/calendar/buddhist/constants.js +14 -0
- package/dist/calendar/buddhist/constants.js.map +1 -0
- package/dist/calendar/buddhist/index.d.ts +3 -0
- package/dist/calendar/buddhist/index.js +4 -0
- package/dist/calendar/buddhist/index.js.map +1 -0
- package/dist/calendar/buddhist/validator.d.ts +4 -0
- package/dist/calendar/buddhist/validator.js +60 -0
- package/dist/calendar/buddhist/validator.js.map +1 -0
- package/dist/calendar/gregory/absolute-day.d.ts +12 -0
- package/dist/calendar/gregory/absolute-day.js +14 -0
- package/dist/calendar/gregory/absolute-day.js.map +1 -0
- package/dist/calendar/gregory/adapter.d.ts +3 -0
- package/dist/calendar/gregory/adapter.js +93 -0
- package/dist/calendar/gregory/adapter.js.map +1 -0
- package/dist/calendar/gregory/constants.d.ts +3 -0
- package/dist/calendar/gregory/constants.js +18 -0
- package/dist/calendar/gregory/constants.js.map +1 -0
- package/dist/calendar/gregory/index.d.ts +4 -0
- package/dist/calendar/gregory/index.js +5 -0
- package/dist/calendar/gregory/index.js.map +1 -0
- package/dist/calendar/gregory/leap-year.d.ts +1 -0
- package/dist/calendar/gregory/leap-year.js +2 -0
- package/dist/calendar/gregory/leap-year.js.map +1 -0
- package/dist/calendar/gregory/validator.d.ts +2 -0
- package/dist/calendar/gregory/validator.js +45 -0
- package/dist/calendar/gregory/validator.js.map +1 -0
- package/dist/calendar/hijri/civil-adapter.d.ts +12 -0
- package/dist/calendar/hijri/civil-adapter.js +132 -0
- package/dist/calendar/hijri/civil-adapter.js.map +1 -0
- package/dist/calendar/hijri/index.d.ts +3 -0
- package/dist/calendar/hijri/index.js +4 -0
- package/dist/calendar/hijri/index.js.map +1 -0
- package/dist/calendar/hijri/tabular-adapter.d.ts +4 -0
- package/dist/calendar/hijri/tabular-adapter.js +79 -0
- package/dist/calendar/hijri/tabular-adapter.js.map +1 -0
- package/dist/calendar/hijri/umm-al-qura-adapter.d.ts +4 -0
- package/dist/calendar/hijri/umm-al-qura-adapter.js +27 -0
- package/dist/calendar/hijri/umm-al-qura-adapter.js.map +1 -0
- package/dist/calendar/index.d.ts +13 -0
- package/dist/calendar/index.js +12 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/calendar/indian/adapter.d.ts +2 -0
- package/dist/calendar/indian/adapter.js +66 -0
- package/dist/calendar/indian/adapter.js.map +1 -0
- package/dist/calendar/indian/constants.d.ts +5 -0
- package/dist/calendar/indian/constants.js +43 -0
- package/dist/calendar/indian/constants.js.map +1 -0
- package/dist/calendar/indian/index.d.ts +3 -0
- package/dist/calendar/indian/index.js +4 -0
- package/dist/calendar/indian/index.js.map +1 -0
- package/dist/calendar/indian/validator.d.ts +6 -0
- package/dist/calendar/indian/validator.js +65 -0
- package/dist/calendar/indian/validator.js.map +1 -0
- package/dist/calendar/japanese/adapter.d.ts +3 -0
- package/dist/calendar/japanese/adapter.js +63 -0
- package/dist/calendar/japanese/adapter.js.map +1 -0
- package/dist/calendar/japanese/constants.d.ts +17 -0
- package/dist/calendar/japanese/constants.js +85 -0
- package/dist/calendar/japanese/constants.js.map +1 -0
- package/dist/calendar/japanese/index.d.ts +3 -0
- package/dist/calendar/japanese/index.js +4 -0
- package/dist/calendar/japanese/index.js.map +1 -0
- package/dist/calendar/japanese/validator.d.ts +5 -0
- package/dist/calendar/japanese/validator.js +76 -0
- package/dist/calendar/japanese/validator.js.map +1 -0
- package/dist/calendar/persian/adapter.d.ts +2 -0
- package/dist/calendar/persian/adapter.js +42 -0
- package/dist/calendar/persian/adapter.js.map +1 -0
- package/dist/calendar/persian/constants.d.ts +5 -0
- package/dist/calendar/persian/constants.js +43 -0
- package/dist/calendar/persian/constants.js.map +1 -0
- package/dist/calendar/persian/index.d.ts +4 -0
- package/dist/calendar/persian/index.js +5 -0
- package/dist/calendar/persian/index.js.map +1 -0
- package/dist/calendar/persian/math.d.ts +24 -0
- package/dist/calendar/persian/math.js +109 -0
- package/dist/calendar/persian/math.js.map +1 -0
- package/dist/calendar/persian/validator.d.ts +4 -0
- package/dist/calendar/persian/validator.js +52 -0
- package/dist/calendar/persian/validator.js.map +1 -0
- package/dist/calendar/registry.d.ts +9 -0
- package/dist/calendar/registry.js +119 -0
- package/dist/calendar/registry.js.map +1 -0
- package/dist/calendar/roc/adapter.d.ts +2 -0
- package/dist/calendar/roc/adapter.js +47 -0
- package/dist/calendar/roc/adapter.js.map +1 -0
- package/dist/calendar/roc/constants.d.ts +6 -0
- package/dist/calendar/roc/constants.js +34 -0
- package/dist/calendar/roc/constants.js.map +1 -0
- package/dist/calendar/roc/index.d.ts +3 -0
- package/dist/calendar/roc/index.js +4 -0
- package/dist/calendar/roc/index.js.map +1 -0
- package/dist/calendar/roc/validator.d.ts +4 -0
- package/dist/calendar/roc/validator.js +52 -0
- package/dist/calendar/roc/validator.js.map +1 -0
- package/dist/calendar/types.d.ts +34 -0
- package/dist/calendar/types.js +2 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/core/absolute-day.d.ts +8 -0
- package/dist/core/absolute-day.js +39 -0
- package/dist/core/absolute-day.js.map +1 -0
- package/dist/core/calendar-date.d.ts +11 -0
- package/dist/core/calendar-date.js +37 -0
- package/dist/core/calendar-date.js.map +1 -0
- package/dist/core/day-of-year.d.ts +16 -0
- package/dist/core/day-of-year.js +30 -0
- package/dist/core/day-of-year.js.map +1 -0
- package/dist/core/duration.d.ts +2 -0
- package/dist/core/duration.js +31 -0
- package/dist/core/duration.js.map +1 -0
- package/dist/core/fiscal.d.ts +31 -0
- package/dist/core/fiscal.js +45 -0
- package/dist/core/fiscal.js.map +1 -0
- package/dist/core/gregorian-math.d.ts +4 -0
- package/dist/core/gregorian-math.js +30 -0
- package/dist/core/gregorian-math.js.map +1 -0
- package/dist/core/instant.d.ts +6 -0
- package/dist/core/instant.js +26 -0
- package/dist/core/instant.js.map +1 -0
- package/dist/core/integer.d.ts +1 -0
- package/dist/core/integer.js +7 -0
- package/dist/core/integer.js.map +1 -0
- package/dist/core/iso-week.d.ts +19 -0
- package/dist/core/iso-week.js +41 -0
- package/dist/core/iso-week.js.map +1 -0
- package/dist/core/julian-day.d.ts +26 -0
- package/dist/core/julian-day.js +35 -0
- package/dist/core/julian-day.js.map +1 -0
- package/dist/core/local-date-time.d.ts +2 -0
- package/dist/core/local-date-time.js +15 -0
- package/dist/core/local-date-time.js.map +1 -0
- package/dist/core/local-date.d.ts +2 -0
- package/dist/core/local-date.js +22 -0
- package/dist/core/local-date.js.map +1 -0
- package/dist/core/local-time.d.ts +2 -0
- package/dist/core/local-time.js +28 -0
- package/dist/core/local-time.js.map +1 -0
- package/dist/core/range.d.ts +2 -0
- package/dist/core/range.js +9 -0
- package/dist/core/range.js.map +1 -0
- package/dist/create-chronera.d.ts +2 -0
- package/dist/create-chronera.js +59 -0
- package/dist/create-chronera.js.map +1 -0
- package/dist/errors/error-codes.d.ts +1 -0
- package/dist/errors/error-codes.js +2 -0
- package/dist/errors/error-codes.js.map +1 -0
- package/dist/errors/errors.d.ts +16 -0
- package/dist/errors/errors.js +22 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/format/format-date-range.d.ts +2 -0
- package/dist/format/format-date-range.js +89 -0
- package/dist/format/format-date-range.js.map +1 -0
- package/dist/format/format-date-time.d.ts +2 -0
- package/dist/format/format-date-time.js +51 -0
- package/dist/format/format-date-time.js.map +1 -0
- package/dist/format/format-date.d.ts +4 -0
- package/dist/format/format-date.js +103 -0
- package/dist/format/format-date.js.map +1 -0
- package/dist/format/format-pattern.d.ts +4 -0
- package/dist/format/format-pattern.js +266 -0
- package/dist/format/format-pattern.js.map +1 -0
- package/dist/format/format-relative.d.ts +2 -0
- package/dist/format/format-relative.js +93 -0
- package/dist/format/format-relative.js.map +1 -0
- package/dist/format/format-time.d.ts +2 -0
- package/dist/format/format-time.js +48 -0
- package/dist/format/format-time.js.map +1 -0
- package/dist/format/index.d.ts +13 -0
- package/dist/format/index.js +12 -0
- package/dist/format/index.js.map +1 -0
- package/dist/format/pattern-scanner.d.ts +8 -0
- package/dist/format/pattern-scanner.js +102 -0
- package/dist/format/pattern-scanner.js.map +1 -0
- package/dist/format/presets/japanese-official.d.ts +8 -0
- package/dist/format/presets/japanese-official.js +39 -0
- package/dist/format/presets/japanese-official.js.map +1 -0
- package/dist/format/presets/taiwan-official.d.ts +6 -0
- package/dist/format/presets/taiwan-official.js +23 -0
- package/dist/format/presets/taiwan-official.js.map +1 -0
- package/dist/format/presets/thai-official.d.ts +2 -0
- package/dist/format/presets/thai-official.js +45 -0
- package/dist/format/presets/thai-official.js.map +1 -0
- package/dist/format/presets/types.d.ts +2 -0
- package/dist/format/presets/types.js +2 -0
- package/dist/format/presets/types.js.map +1 -0
- package/dist/format/presets/world-locales.d.ts +29 -0
- package/dist/format/presets/world-locales.js +330 -0
- package/dist/format/presets/world-locales.js.map +1 -0
- package/dist/format/resolve-date-input.d.ts +9 -0
- package/dist/format/resolve-date-input.js +93 -0
- package/dist/format/resolve-date-input.js.map +1 -0
- package/dist/format/rfc2822.d.ts +17 -0
- package/dist/format/rfc2822.js +59 -0
- package/dist/format/rfc2822.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/engine.d.ts +8 -0
- package/dist/internal/engine.js +11 -0
- package/dist/internal/engine.js.map +1 -0
- package/dist/locale/numbering-system.d.ts +4 -0
- package/dist/locale/numbering-system.js +133 -0
- package/dist/locale/numbering-system.js.map +1 -0
- package/dist/locale/resolve-locale.d.ts +7 -0
- package/dist/locale/resolve-locale.js +51 -0
- package/dist/locale/resolve-locale.js.map +1 -0
- package/dist/locale/types.d.ts +1 -0
- package/dist/locale/types.js +2 -0
- package/dist/locale/types.js.map +1 -0
- package/dist/operations/arithmetic.d.ts +4 -0
- package/dist/operations/arithmetic.js +13 -0
- package/dist/operations/arithmetic.js.map +1 -0
- package/dist/operations/compare.d.ts +5 -0
- package/dist/operations/compare.js +50 -0
- package/dist/operations/compare.js.map +1 -0
- package/dist/operations/convert-calendar-date.d.ts +4 -0
- package/dist/operations/convert-calendar-date.js +54 -0
- package/dist/operations/convert-calendar-date.js.map +1 -0
- package/dist/operations/day-of-year.d.ts +7 -0
- package/dist/operations/day-of-year.js +29 -0
- package/dist/operations/day-of-year.js.map +1 -0
- package/dist/operations/fiscal.d.ts +5 -0
- package/dist/operations/fiscal.js +25 -0
- package/dist/operations/fiscal.js.map +1 -0
- package/dist/operations/iso-week.d.ts +9 -0
- package/dist/operations/iso-week.js +29 -0
- package/dist/operations/iso-week.js.map +1 -0
- package/dist/operations/julian-day.d.ts +6 -0
- package/dist/operations/julian-day.js +37 -0
- package/dist/operations/julian-day.js.map +1 -0
- package/dist/operations/validate.d.ts +10 -0
- package/dist/operations/validate.js +55 -0
- package/dist/operations/validate.js.map +1 -0
- package/dist/parse/field-normalizer.d.ts +1 -0
- package/dist/parse/field-normalizer.js +5 -0
- package/dist/parse/field-normalizer.js.map +1 -0
- package/dist/parse/index.d.ts +4 -0
- package/dist/parse/index.js +4 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/parse-instant.d.ts +2 -0
- package/dist/parse/parse-instant.js +97 -0
- package/dist/parse/parse-instant.js.map +1 -0
- package/dist/parse/parse-local-date.d.ts +2 -0
- package/dist/parse/parse-local-date.js +31 -0
- package/dist/parse/parse-local-date.js.map +1 -0
- package/dist/parse/pattern-parser.d.ts +2 -0
- package/dist/parse/pattern-parser.js +150 -0
- package/dist/parse/pattern-parser.js.map +1 -0
- package/dist/parse/safe-parse.d.ts +3 -0
- package/dist/parse/safe-parse.js +46 -0
- package/dist/parse/safe-parse.js.map +1 -0
- package/dist/public-types.d.ts +209 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/bounded-lru.d.ts +11 -0
- package/dist/runtime/bounded-lru.js +42 -0
- package/dist/runtime/bounded-lru.js.map +1 -0
- package/dist/runtime/capabilities.d.ts +5 -0
- package/dist/runtime/capabilities.js +61 -0
- package/dist/runtime/capabilities.js.map +1 -0
- package/dist/runtime/intl-date-time.d.ts +11 -0
- package/dist/runtime/intl-date-time.js +38 -0
- package/dist/runtime/intl-date-time.js.map +1 -0
- package/dist/runtime/intl-number.d.ts +7 -0
- package/dist/runtime/intl-number.js +35 -0
- package/dist/runtime/intl-number.js.map +1 -0
- package/dist/runtime/intl-relative-time.d.ts +7 -0
- package/dist/runtime/intl-relative-time.js +35 -0
- package/dist/runtime/intl-relative-time.js.map +1 -0
- package/dist/runtime/timezone.d.ts +14 -0
- package/dist/runtime/timezone.js +95 -0
- package/dist/runtime/timezone.js.map +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,UAAU,EACV,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EACL,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,4BAA4B,EAC5B,uCAAuC,EACvC,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,8BAA8B,EAC9B,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,sBAAsB,EACtB,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC","sourcesContent":["export { createChronera } from \"./create-chronera.js\";\n\nexport {\n compareInstants,\n compareLocalDates,\n sameAbsoluteDate,\n sameCalendarDate,\n} from \"./operations/compare.js\";\n\nexport { convertCalendarDate } from \"./operations/convert-calendar-date.js\";\n\nexport {\n daysInMonth,\n getCalendarCapabilities,\n isLeapYear,\n isValidCalendarDate,\n} from \"./operations/validate.js\";\n\nexport { getIsoWeek, formatIsoWeek } from \"./operations/iso-week.js\";\n\nexport {\n getDayOfYear,\n getDayOfYearWithRegistry,\n formatOrdinalDate,\n} from \"./operations/day-of-year.js\";\n\nexport {\n toJulianDayNumber,\n toModifiedJulianDay,\n localDateFromJulianDayNumber,\n localDateFromModifiedJulianDay,\n} from \"./operations/julian-day.js\";\n\nexport { getQuarter, getFiscalYear } from \"./operations/fiscal.js\";\n\nexport {\n formatDate,\n formatDateRange,\n formatDateTime,\n formatRelative,\n formatTime,\n formatWithPattern,\n formatRfc2822,\n formatJapaneseOfficialPreset,\n formatJapaneseOfficialWithWeekdayPreset,\n formatTaiwanOfficialPreset,\n formatThaiOfficialPreset,\n formatArabicGregorianPreset,\n formatArabicHijriPreset,\n formatChineseShortPreset,\n formatChineseStandardPreset,\n formatChineseWithWeekdayPreset,\n formatFrenchLongPreset,\n formatFrenchStandardPreset,\n formatFrenchWithWeekdayPreset,\n formatGermanDinStandardPreset,\n formatGermanLongPreset,\n formatGermanWithWeekdayPreset,\n formatJapaneseEraShortPreset,\n formatJapaneseSeirekiPreset,\n formatSpanishLongPreset,\n formatSpanishStandardPreset,\n formatSpanishWithWeekdayPreset,\n formatThaiShortDatePreset,\n formatThaiSlashDatePreset,\n formatUkLongPreset,\n formatUkStandardPreset,\n formatUkWithWeekdayPreset,\n formatUsLongPreset,\n formatUsStandardPreset,\n formatUsWithWeekdayPreset,\n} from \"./format/index.js\";\n\nexport {\n parseInstant,\n parseLocalDate,\n safeParseInstant,\n safeParseLocalDate,\n} from \"./parse/index.js\";\n\nexport {\n instantFromDate,\n instantFromEpochMilliseconds,\n instantFromEpochSeconds,\n} from \"./core/instant.js\";\n\nexport { getRuntimeCapabilities } from \"./runtime/capabilities.js\";\n\nexport { calendarDate } from \"./core/calendar-date.js\";\n\nexport { localDate } from \"./core/local-date.js\";\n\nexport { localTime } from \"./core/local-time.js\";\n\nexport { localDateTime } from \"./core/local-date-time.js\";\n\nexport { dateRange } from \"./core/range.js\";\n\nexport {\n ChroneraError,\n ChroneraParseError,\n ChroneraRangeError,\n ChroneraUnsupportedError,\n} from \"./errors/index.js\";\n\nexport type {\n BuiltInCalendarId,\n CalendarPlugin,\n CalendarCapabilities,\n CalendarConversionMetadata,\n CalendarConversionResult,\n CalendarDate,\n CalendarId,\n ChroneraErrorCode,\n ChroneraConfig,\n ChroneraInstance,\n ChroneraIssue,\n Comparison,\n ConvertCalendarOptions,\n DateRange,\n DayOfYearFields,\n Duration,\n EraId,\n FiscalFields,\n FiscalOptions,\n FormatDateBaseOptions,\n FormatDateInput,\n FormatDateOptions,\n FormatDateRangeOptions,\n FormatDateTimeOptions,\n FormatRelativeOptions,\n FormatTimeOptions,\n Instant,\n IsoWeekFields,\n LocalDate,\n LocalDateTime,\n LocalTime,\n LocaleId,\n MonthCode,\n NumberingSystemId,\n PatternFormatOptions,\n ParseInstantOptions,\n ParseLocalDateOptions,\n PresetName,\n QuarterNumber,\n ResolvedChroneraOptions,\n Rfc2822Options,\n RuntimeCapabilities,\n SafeParseResult,\n TimeZoneId,\n ZonedDateTime,\n} from \"./public-types.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { IntlDateTimeService } from "../runtime/intl-date-time.js";
|
|
3
|
+
import type { ChroneraConfig } from "../public-types.js";
|
|
4
|
+
export declare class ChroneraEngine {
|
|
5
|
+
readonly registry: CalendarRegistry;
|
|
6
|
+
readonly intl: IntlDateTimeService;
|
|
7
|
+
constructor(config?: Readonly<ChroneraConfig>);
|
|
8
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { IntlDateTimeService } from "../runtime/intl-date-time.js";
|
|
3
|
+
export class ChroneraEngine {
|
|
4
|
+
registry;
|
|
5
|
+
intl;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.registry = new CalendarRegistry(config?.calendars);
|
|
8
|
+
this.intl = new IntlDateTimeService(config?.formatterCacheSize ?? 64);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/internal/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAInE,MAAM,OAAO,cAAc;IAChB,QAAQ,CAAmB;IAC3B,IAAI,CAAsB;IAEnC,YAAY,MAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;CACF","sourcesContent":["import { CalendarRegistry } from \"../calendar/registry.js\";\nimport { IntlDateTimeService } from \"../runtime/intl-date-time.js\";\n\nimport type { ChroneraConfig } from \"../public-types.js\";\n\nexport class ChroneraEngine {\n readonly registry: CalendarRegistry;\n readonly intl: IntlDateTimeService;\n\n constructor(config?: Readonly<ChroneraConfig>) {\n this.registry = new CalendarRegistry(config?.calendars);\n this.intl = new IntlDateTimeService(config?.formatterCacheSize ?? 64);\n }\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NumberingSystemId } from "../public-types.js";
|
|
2
|
+
export declare function isValidNumberingSystem(id: string): boolean;
|
|
3
|
+
export declare function formatNumberWithSystem(value: number | string, numberingSystem?: NumberingSystemId): string;
|
|
4
|
+
export declare function parseDigitsToLatin(input: string): string;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
2
|
+
const LATN_DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
|
|
3
|
+
const THAI_DIGITS = ["๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙"];
|
|
4
|
+
const ARAB_DIGITS = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
|
|
5
|
+
const ARABEXT_DIGITS = [
|
|
6
|
+
"۰",
|
|
7
|
+
"۱",
|
|
8
|
+
"۲",
|
|
9
|
+
"۳",
|
|
10
|
+
"۴",
|
|
11
|
+
"۵",
|
|
12
|
+
"۶",
|
|
13
|
+
"۷",
|
|
14
|
+
"۸",
|
|
15
|
+
"۹",
|
|
16
|
+
];
|
|
17
|
+
const FULLWIDE_DIGITS = [
|
|
18
|
+
"0",
|
|
19
|
+
"1",
|
|
20
|
+
"2",
|
|
21
|
+
"3",
|
|
22
|
+
"4",
|
|
23
|
+
"5",
|
|
24
|
+
"6",
|
|
25
|
+
"7",
|
|
26
|
+
"8",
|
|
27
|
+
"9",
|
|
28
|
+
];
|
|
29
|
+
const HANIDEC_DIGITS = [
|
|
30
|
+
"〇",
|
|
31
|
+
"一",
|
|
32
|
+
"二",
|
|
33
|
+
"三",
|
|
34
|
+
"四",
|
|
35
|
+
"五",
|
|
36
|
+
"六",
|
|
37
|
+
"七",
|
|
38
|
+
"八",
|
|
39
|
+
"九",
|
|
40
|
+
];
|
|
41
|
+
const DEVA_DIGITS = ["०", "१", "२", "३", "४", "५", "६", "७", "८", "९"];
|
|
42
|
+
const BENG_DIGITS = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"];
|
|
43
|
+
const DIGIT_MAPS = {
|
|
44
|
+
latn: LATN_DIGITS,
|
|
45
|
+
thai: THAI_DIGITS,
|
|
46
|
+
arab: ARAB_DIGITS,
|
|
47
|
+
arabext: ARABEXT_DIGITS,
|
|
48
|
+
fullwide: FULLWIDE_DIGITS,
|
|
49
|
+
hanidec: HANIDEC_DIGITS,
|
|
50
|
+
deva: DEVA_DIGITS,
|
|
51
|
+
beng: BENG_DIGITS,
|
|
52
|
+
};
|
|
53
|
+
const HANIDEC_TO_LATIN = {
|
|
54
|
+
〇: "0",
|
|
55
|
+
一: "1",
|
|
56
|
+
二: "2",
|
|
57
|
+
三: "3",
|
|
58
|
+
四: "4",
|
|
59
|
+
五: "5",
|
|
60
|
+
六: "6",
|
|
61
|
+
七: "7",
|
|
62
|
+
八: "8",
|
|
63
|
+
九: "9",
|
|
64
|
+
};
|
|
65
|
+
export function isValidNumberingSystem(id) {
|
|
66
|
+
return id in DIGIT_MAPS;
|
|
67
|
+
}
|
|
68
|
+
export function formatNumberWithSystem(value, numberingSystem = "latn") {
|
|
69
|
+
const digits = DIGIT_MAPS[numberingSystem];
|
|
70
|
+
if (!digits) {
|
|
71
|
+
throw new ChroneraError("CHRONERA_INCOMPATIBLE_OPTION", `Unsupported numbering system: "${numberingSystem}". Supported: latn, thai, arab, arabext, fullwide, hanidec, deva, beng.`);
|
|
72
|
+
}
|
|
73
|
+
const str = String(value);
|
|
74
|
+
if (numberingSystem === "latn") {
|
|
75
|
+
return str;
|
|
76
|
+
}
|
|
77
|
+
let result = "";
|
|
78
|
+
for (let i = 0; i < str.length; i++) {
|
|
79
|
+
const ch = str.charAt(i);
|
|
80
|
+
const code = ch.charCodeAt(0);
|
|
81
|
+
if (code >= 48 && code <= 57) {
|
|
82
|
+
result += digits[code - 48];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
result += ch;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
export function parseDigitsToLatin(input) {
|
|
91
|
+
let result = "";
|
|
92
|
+
for (let i = 0; i < input.length; i++) {
|
|
93
|
+
const ch = input.charAt(i);
|
|
94
|
+
const code = ch.charCodeAt(0);
|
|
95
|
+
// ASCII 0-9
|
|
96
|
+
if (code >= 48 && code <= 57) {
|
|
97
|
+
result += ch;
|
|
98
|
+
}
|
|
99
|
+
// Thai 0-9: \u0E50 - \u0E59
|
|
100
|
+
else if (code >= 0x0e50 && code <= 0x0e59) {
|
|
101
|
+
result += String(code - 0x0e50);
|
|
102
|
+
}
|
|
103
|
+
// Arabic-Indic 0-9: \u0660 - \u0669
|
|
104
|
+
else if (code >= 0x0660 && code <= 0x0669) {
|
|
105
|
+
result += String(code - 0x0660);
|
|
106
|
+
}
|
|
107
|
+
// Eastern Arabic-Indic 0-9: \u06F0 - \u06F9
|
|
108
|
+
else if (code >= 0x06f0 && code <= 0x06f9) {
|
|
109
|
+
result += String(code - 0x06f0);
|
|
110
|
+
}
|
|
111
|
+
// Fullwidth 0-9: \uFF10 - \uFF19
|
|
112
|
+
else if (code >= 0xff10 && code <= 0xff19) {
|
|
113
|
+
result += String(code - 0xff10);
|
|
114
|
+
}
|
|
115
|
+
// Devanagari 0-9: \u0966 - \u096F
|
|
116
|
+
else if (code >= 0x0966 && code <= 0x096f) {
|
|
117
|
+
result += String(code - 0x0966);
|
|
118
|
+
}
|
|
119
|
+
// Bengali 0-9: \u09E6 - \u09EF
|
|
120
|
+
else if (code >= 0x09e6 && code <= 0x09ef) {
|
|
121
|
+
result += String(code - 0x09e6);
|
|
122
|
+
}
|
|
123
|
+
// Hanidec (Kanji/Han positional digits)
|
|
124
|
+
else if (ch in HANIDEC_TO_LATIN) {
|
|
125
|
+
result += HANIDEC_TO_LATIN[ch];
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
result += ch;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=numbering-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbering-system.js","sourceRoot":"","sources":["../../src/locale/numbering-system.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChroneraError } from \"../errors/errors.js\";\n\nimport type { NumberingSystemId } from \"../public-types.js\";\n\nconst LATN_DIGITS = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"] as const;\nconst THAI_DIGITS = [\"๐\", \"๑\", \"๒\", \"๓\", \"๔\", \"๕\", \"๖\", \"๗\", \"๘\", \"๙\"] as const;\nconst ARAB_DIGITS = [\"٠\", \"١\", \"٢\", \"٣\", \"٤\", \"٥\", \"٦\", \"٧\", \"٨\", \"٩\"] as const;\nconst ARABEXT_DIGITS = [\n \"۰\",\n \"۱\",\n \"۲\",\n \"۳\",\n \"۴\",\n \"۵\",\n \"۶\",\n \"۷\",\n \"۸\",\n \"۹\",\n] as const;\nconst FULLWIDE_DIGITS = [\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n] as const;\nconst HANIDEC_DIGITS = [\n \"〇\",\n \"一\",\n \"二\",\n \"三\",\n \"四\",\n \"五\",\n \"六\",\n \"七\",\n \"八\",\n \"九\",\n] as const;\nconst DEVA_DIGITS = [\"०\", \"१\", \"२\", \"३\", \"४\", \"५\", \"६\", \"७\", \"८\", \"९\"] as const;\nconst BENG_DIGITS = [\"০\", \"১\", \"২\", \"৩\", \"৪\", \"৫\", \"৬\", \"৭\", \"৮\", \"৯\"] as const;\n\nconst DIGIT_MAPS: Record<string, readonly string[]> = {\n latn: LATN_DIGITS,\n thai: THAI_DIGITS,\n arab: ARAB_DIGITS,\n arabext: ARABEXT_DIGITS,\n fullwide: FULLWIDE_DIGITS,\n hanidec: HANIDEC_DIGITS,\n deva: DEVA_DIGITS,\n beng: BENG_DIGITS,\n};\n\nconst HANIDEC_TO_LATIN: Record<string, string> = {\n 〇: \"0\",\n 一: \"1\",\n 二: \"2\",\n 三: \"3\",\n 四: \"4\",\n 五: \"5\",\n 六: \"6\",\n 七: \"7\",\n 八: \"8\",\n 九: \"9\",\n};\n\nexport function isValidNumberingSystem(id: string): boolean {\n return id in DIGIT_MAPS;\n}\n\nexport function formatNumberWithSystem(\n value: number | string,\n numberingSystem: NumberingSystemId = \"latn\",\n): string {\n const digits = DIGIT_MAPS[numberingSystem];\n if (!digits) {\n throw new ChroneraError(\n \"CHRONERA_INCOMPATIBLE_OPTION\",\n `Unsupported numbering system: \"${numberingSystem}\". Supported: latn, thai, arab, arabext, fullwide, hanidec, deva, beng.`,\n );\n }\n\n const str = String(value);\n if (numberingSystem === \"latn\") {\n return str;\n }\n\n let result = \"\";\n for (let i = 0; i < str.length; i++) {\n const ch = str.charAt(i);\n const code = ch.charCodeAt(0);\n if (code >= 48 && code <= 57) {\n result += digits[code - 48];\n } else {\n result += ch;\n }\n }\n return result;\n}\n\nexport function parseDigitsToLatin(input: string): string {\n let result = \"\";\n for (let i = 0; i < input.length; i++) {\n const ch = input.charAt(i);\n const code = ch.charCodeAt(0);\n\n // ASCII 0-9\n if (code >= 48 && code <= 57) {\n result += ch;\n }\n // Thai 0-9: \\u0E50 - \\u0E59\n else if (code >= 0x0e50 && code <= 0x0e59) {\n result += String(code - 0x0e50);\n }\n // Arabic-Indic 0-9: \\u0660 - \\u0669\n else if (code >= 0x0660 && code <= 0x0669) {\n result += String(code - 0x0660);\n }\n // Eastern Arabic-Indic 0-9: \\u06F0 - \\u06F9\n else if (code >= 0x06f0 && code <= 0x06f9) {\n result += String(code - 0x06f0);\n }\n // Fullwidth 0-9: \\uFF10 - \\uFF19\n else if (code >= 0xff10 && code <= 0xff19) {\n result += String(code - 0xff10);\n }\n // Devanagari 0-9: \\u0966 - \\u096F\n else if (code >= 0x0966 && code <= 0x096f) {\n result += String(code - 0x0966);\n }\n // Bengali 0-9: \\u09E6 - \\u09EF\n else if (code >= 0x09e6 && code <= 0x09ef) {\n result += String(code - 0x09e6);\n }\n // Hanidec (Kanji/Han positional digits)\n else if (ch in HANIDEC_TO_LATIN) {\n result += HANIDEC_TO_LATIN[ch];\n } else {\n result += ch;\n }\n }\n return result;\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CalendarId, LocaleId, NumberingSystemId } from "../public-types.js";
|
|
2
|
+
export interface ResolvedLocaleInfo {
|
|
3
|
+
baseLocale: LocaleId;
|
|
4
|
+
unicodeCalendar?: CalendarId;
|
|
5
|
+
unicodeNumberingSystem?: NumberingSystemId;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateAndResolveLocale(localeInput?: unknown): ResolvedLocaleInfo;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
2
|
+
const BCP47_LANGUAGE_TAG_REGEX = /^[a-z]{2,3}(-[a-z]{4})?(-([a-z]{2}|\d{3}))?(-([a-z\d]{5,8}|\d[a-z\d]{3}))*(-[a-wy-z\d](-[a-z\d]{2,8})+)*(-x(-[a-z\d]{1,8})+)?$/i;
|
|
3
|
+
export function validateAndResolveLocale(localeInput) {
|
|
4
|
+
if (localeInput === undefined) {
|
|
5
|
+
return { baseLocale: "en-US" };
|
|
6
|
+
}
|
|
7
|
+
if (typeof localeInput !== "string") {
|
|
8
|
+
throw new ChroneraError("CHRONERA_INVALID_LOCALE", `Expected locale string; received ${typeof localeInput}.`);
|
|
9
|
+
}
|
|
10
|
+
const trimmed = localeInput.trim();
|
|
11
|
+
if (trimmed.length === 0) {
|
|
12
|
+
throw new ChroneraError("CHRONERA_INVALID_LOCALE", "Locale identifier cannot be empty.");
|
|
13
|
+
}
|
|
14
|
+
// If candidate count (comma-separated or list) exceeds 16
|
|
15
|
+
const parts = trimmed.split(",");
|
|
16
|
+
if (parts.length > 16) {
|
|
17
|
+
throw new ChroneraError("CHRONERA_INPUT_TOO_LARGE", `Locale candidates exceed maximum limit of 16; received ${parts.length}.`);
|
|
18
|
+
}
|
|
19
|
+
const primary = parts[0]?.trim() ?? "en-US";
|
|
20
|
+
// Validate BCP 47 tag
|
|
21
|
+
let unicodeCalendar;
|
|
22
|
+
let unicodeNumberingSystem;
|
|
23
|
+
try {
|
|
24
|
+
if (typeof Intl !== "undefined" && typeof Intl.Locale === "function") {
|
|
25
|
+
const loc = new Intl.Locale(primary);
|
|
26
|
+
if (loc.calendar) {
|
|
27
|
+
unicodeCalendar = loc.calendar;
|
|
28
|
+
}
|
|
29
|
+
if (loc.numberingSystem) {
|
|
30
|
+
unicodeNumberingSystem = loc.numberingSystem;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
baseLocale: loc.baseName,
|
|
34
|
+
...(unicodeCalendar !== undefined ? { unicodeCalendar } : {}),
|
|
35
|
+
...(unicodeNumberingSystem !== undefined
|
|
36
|
+
? { unicodeNumberingSystem }
|
|
37
|
+
: {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
throw new ChroneraError("CHRONERA_INVALID_LOCALE", `Structurally invalid BCP 47 locale identifier: "${primary}".`, { cause: err });
|
|
43
|
+
}
|
|
44
|
+
if (!BCP47_LANGUAGE_TAG_REGEX.test(primary)) {
|
|
45
|
+
throw new ChroneraError("CHRONERA_INVALID_LOCALE", `Structurally invalid BCP 47 locale identifier: "${primary}".`);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
baseLocale: primary,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=resolve-locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-locale.js","sourceRoot":"","sources":["../../src/locale/resolve-locale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQpD,MAAM,wBAAwB,GAC5B,iIAAiI,CAAC;AAQpI,MAAM,UAAU,wBAAwB,CACtC,WAAqB;IAErB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,oCAAoC,OAAO,WAAW,GAAG,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,aAAa,CACrB,0BAA0B,EAC1B,0DAA0D,KAAK,CAAC,MAAM,GAAG,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC;IAE5C,sBAAsB;IACtB,IAAI,eAAuC,CAAC;IAC5C,IAAI,sBAAqD,CAAC;IAE1D,IAAI,CAAC;QACH,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,eAAe,GAAG,GAAG,CAAC,QAAsB,CAAC;YAC/C,CAAC;YACD,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxB,sBAAsB,GAAG,GAAG,CAAC,eAAe,CAAC;YAC/C,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,GAAG,CAAC,QAAQ;gBACxB,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,sBAAsB,KAAK,SAAS;oBACtC,CAAC,CAAC,EAAE,sBAAsB,EAAE;oBAC5B,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,mDAAmD,OAAO,IAAI,EAC9D,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,mDAAmD,OAAO,IAAI,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO;KACpB,CAAC;AACJ,CAAC","sourcesContent":["import { ChroneraError } from \"../errors/errors.js\";\n\nimport type {\n CalendarId,\n LocaleId,\n NumberingSystemId,\n} from \"../public-types.js\";\n\nconst BCP47_LANGUAGE_TAG_REGEX =\n /^[a-z]{2,3}(-[a-z]{4})?(-([a-z]{2}|\\d{3}))?(-([a-z\\d]{5,8}|\\d[a-z\\d]{3}))*(-[a-wy-z\\d](-[a-z\\d]{2,8})+)*(-x(-[a-z\\d]{1,8})+)?$/i;\n\nexport interface ResolvedLocaleInfo {\n baseLocale: LocaleId;\n unicodeCalendar?: CalendarId;\n unicodeNumberingSystem?: NumberingSystemId;\n}\n\nexport function validateAndResolveLocale(\n localeInput?: unknown,\n): ResolvedLocaleInfo {\n if (localeInput === undefined) {\n return { baseLocale: \"en-US\" };\n }\n\n if (typeof localeInput !== \"string\") {\n throw new ChroneraError(\n \"CHRONERA_INVALID_LOCALE\",\n `Expected locale string; received ${typeof localeInput}.`,\n );\n }\n\n const trimmed = localeInput.trim();\n if (trimmed.length === 0) {\n throw new ChroneraError(\n \"CHRONERA_INVALID_LOCALE\",\n \"Locale identifier cannot be empty.\",\n );\n }\n\n // If candidate count (comma-separated or list) exceeds 16\n const parts = trimmed.split(\",\");\n if (parts.length > 16) {\n throw new ChroneraError(\n \"CHRONERA_INPUT_TOO_LARGE\",\n `Locale candidates exceed maximum limit of 16; received ${parts.length}.`,\n );\n }\n\n const primary = parts[0]?.trim() ?? \"en-US\";\n\n // Validate BCP 47 tag\n let unicodeCalendar: CalendarId | undefined;\n let unicodeNumberingSystem: NumberingSystemId | undefined;\n\n try {\n if (typeof Intl !== \"undefined\" && typeof Intl.Locale === \"function\") {\n const loc = new Intl.Locale(primary);\n if (loc.calendar) {\n unicodeCalendar = loc.calendar as CalendarId;\n }\n if (loc.numberingSystem) {\n unicodeNumberingSystem = loc.numberingSystem;\n }\n return {\n baseLocale: loc.baseName,\n ...(unicodeCalendar !== undefined ? { unicodeCalendar } : {}),\n ...(unicodeNumberingSystem !== undefined\n ? { unicodeNumberingSystem }\n : {}),\n };\n }\n } catch (err) {\n throw new ChroneraError(\n \"CHRONERA_INVALID_LOCALE\",\n `Structurally invalid BCP 47 locale identifier: \"${primary}\".`,\n { cause: err },\n );\n }\n\n if (!BCP47_LANGUAGE_TAG_REGEX.test(primary)) {\n throw new ChroneraError(\n \"CHRONERA_INVALID_LOCALE\",\n `Structurally invalid BCP 47 locale identifier: \"${primary}\".`,\n );\n }\n\n return {\n baseLocale: primary,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type SupportedNumberingSystem = "latn" | "thai" | "arab" | "arabext" | "fullwide" | "hanidec" | "deva" | "beng";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/locale/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SupportedNumberingSystem =\n | \"latn\"\n | \"thai\"\n | \"arab\"\n | \"arabext\"\n | \"fullwide\"\n | \"hanidec\"\n | \"deva\"\n | \"beng\";\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CalendarDate, Duration } from "../public-types.js";
|
|
2
|
+
import type { CalendarRegistry } from "../calendar/registry.js";
|
|
3
|
+
export declare function addDateDurationWithRegistry(registry: CalendarRegistry, date: CalendarDate, dur: Duration, overflow?: "constrain" | "reject"): CalendarDate;
|
|
4
|
+
export declare function addDateDuration(date: CalendarDate, dur: Duration, overflow?: "constrain" | "reject"): CalendarDate;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defaultCalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
3
|
+
export function addDateDurationWithRegistry(registry, date, dur, overflow = "reject") {
|
|
4
|
+
const adapter = registry.getAdapter(date.calendar);
|
|
5
|
+
if (!adapter.arithmetic) {
|
|
6
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Calendar "${date.calendar}" does not support date arithmetic.`);
|
|
7
|
+
}
|
|
8
|
+
return adapter.arithmetic.add(date, dur, overflow);
|
|
9
|
+
}
|
|
10
|
+
export function addDateDuration(date, dur, overflow = "reject") {
|
|
11
|
+
return addDateDurationWithRegistry(defaultCalendarRegistry, date, dur, overflow);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=arithmetic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arithmetic.js","sourceRoot":"","sources":["../../src/operations/arithmetic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,UAAU,2BAA2B,CACzC,QAA0B,EAC1B,IAAkB,EAClB,GAAa,EACb,WAAmC,QAAQ;IAE3C,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CACrB,gCAAgC,EAChC,aAAa,IAAI,CAAC,QAAQ,qCAAqC,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAkB,EAClB,GAAa,EACb,WAAmC,QAAQ;IAE3C,OAAO,2BAA2B,CAChC,uBAAuB,EACvB,IAAI,EACJ,GAAG,EACH,QAAQ,CACT,CAAC;AACJ,CAAC","sourcesContent":["import { defaultCalendarRegistry } from \"../calendar/registry.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type { CalendarDate, Duration } from \"../public-types.js\";\nimport type { CalendarRegistry } from \"../calendar/registry.js\";\n\nexport function addDateDurationWithRegistry(\n registry: CalendarRegistry,\n date: CalendarDate,\n dur: Duration,\n overflow: \"constrain\" | \"reject\" = \"reject\",\n): CalendarDate {\n const adapter = registry.getAdapter(date.calendar);\n if (!adapter.arithmetic) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Calendar \"${date.calendar}\" does not support date arithmetic.`,\n );\n }\n return adapter.arithmetic.add(date, dur, overflow);\n}\n\nexport function addDateDuration(\n date: CalendarDate,\n dur: Duration,\n overflow: \"constrain\" | \"reject\" = \"reject\",\n): CalendarDate {\n return addDateDurationWithRegistry(\n defaultCalendarRegistry,\n date,\n dur,\n overflow,\n );\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CalendarDate, Comparison, Instant, LocalDate } from "../public-types.js";
|
|
2
|
+
export declare function compareInstants(left: Instant, right: Instant): Comparison;
|
|
3
|
+
export declare function compareLocalDates(left: LocalDate, right: LocalDate): Comparison;
|
|
4
|
+
export declare function sameCalendarDate(left: CalendarDate, right: CalendarDate): boolean;
|
|
5
|
+
export declare function sameAbsoluteDate(left: CalendarDate, right: CalendarDate): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defaultCalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
3
|
+
export function compareInstants(left, right) {
|
|
4
|
+
if (left.epochMilliseconds < right.epochMilliseconds)
|
|
5
|
+
return -1;
|
|
6
|
+
if (left.epochMilliseconds > right.epochMilliseconds)
|
|
7
|
+
return 1;
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
export function compareLocalDates(left, right) {
|
|
11
|
+
if (left.year !== right.year) {
|
|
12
|
+
return left.year < right.year ? -1 : 1;
|
|
13
|
+
}
|
|
14
|
+
if (left.month !== right.month) {
|
|
15
|
+
return left.month < right.month ? -1 : 1;
|
|
16
|
+
}
|
|
17
|
+
if (left.day !== right.day) {
|
|
18
|
+
return left.day < right.day ? -1 : 1;
|
|
19
|
+
}
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
export function sameCalendarDate(left, right) {
|
|
23
|
+
if (left.calendar !== right.calendar)
|
|
24
|
+
return false;
|
|
25
|
+
if (left.year !== right.year)
|
|
26
|
+
return false;
|
|
27
|
+
if (left.monthCode !== right.monthCode)
|
|
28
|
+
return false;
|
|
29
|
+
if (left.day !== right.day)
|
|
30
|
+
return false;
|
|
31
|
+
if (left.era !== right.era)
|
|
32
|
+
return false;
|
|
33
|
+
if (left.eraYear !== right.eraYear)
|
|
34
|
+
return false;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
export function sameAbsoluteDate(left, right) {
|
|
38
|
+
const leftAdapter = defaultCalendarRegistry.getAdapter(left.calendar);
|
|
39
|
+
const rightAdapter = defaultCalendarRegistry.getAdapter(right.calendar);
|
|
40
|
+
if (!leftAdapter.converter) {
|
|
41
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Calendar "${left.calendar}" does not support conversion to absolute date.`);
|
|
42
|
+
}
|
|
43
|
+
if (!rightAdapter.converter) {
|
|
44
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Calendar "${right.calendar}" does not support conversion to absolute date.`);
|
|
45
|
+
}
|
|
46
|
+
const leftDay = leftAdapter.converter.toAbsoluteDay(left);
|
|
47
|
+
const rightDay = rightAdapter.converter.toAbsoluteDay(right);
|
|
48
|
+
return leftDay === rightDay;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/operations/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,KAAc;IAC3D,IAAI,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB;QAAE,OAAO,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB;QAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAe,EACf,KAAgB;IAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAkB,EAClB,KAAmB;IAEnB,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAkB,EAClB,KAAmB;IAEnB,MAAM,WAAW,GAAG,uBAAuB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,aAAa,CACrB,gCAAgC,EAChC,aAAa,IAAI,CAAC,QAAQ,iDAAiD,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,aAAa,CACrB,gCAAgC,EAChC,aAAa,KAAK,CAAC,QAAQ,iDAAiD,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,OAAO,KAAK,QAAQ,CAAC;AAC9B,CAAC","sourcesContent":["import { defaultCalendarRegistry } from \"../calendar/registry.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type {\n CalendarDate,\n Comparison,\n Instant,\n LocalDate,\n} from \"../public-types.js\";\n\nexport function compareInstants(left: Instant, right: Instant): Comparison {\n if (left.epochMilliseconds < right.epochMilliseconds) return -1;\n if (left.epochMilliseconds > right.epochMilliseconds) return 1;\n return 0;\n}\n\nexport function compareLocalDates(\n left: LocalDate,\n right: LocalDate,\n): Comparison {\n if (left.year !== right.year) {\n return left.year < right.year ? -1 : 1;\n }\n if (left.month !== right.month) {\n return left.month < right.month ? -1 : 1;\n }\n if (left.day !== right.day) {\n return left.day < right.day ? -1 : 1;\n }\n return 0;\n}\n\nexport function sameCalendarDate(\n left: CalendarDate,\n right: CalendarDate,\n): boolean {\n if (left.calendar !== right.calendar) return false;\n if (left.year !== right.year) return false;\n if (left.monthCode !== right.monthCode) return false;\n if (left.day !== right.day) return false;\n if (left.era !== right.era) return false;\n if (left.eraYear !== right.eraYear) return false;\n return true;\n}\n\nexport function sameAbsoluteDate(\n left: CalendarDate,\n right: CalendarDate,\n): boolean {\n const leftAdapter = defaultCalendarRegistry.getAdapter(left.calendar);\n const rightAdapter = defaultCalendarRegistry.getAdapter(right.calendar);\n\n if (!leftAdapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Calendar \"${left.calendar}\" does not support conversion to absolute date.`,\n );\n }\n if (!rightAdapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Calendar \"${right.calendar}\" does not support conversion to absolute date.`,\n );\n }\n\n const leftDay = leftAdapter.converter.toAbsoluteDay(left);\n const rightDay = rightAdapter.converter.toAbsoluteDay(right);\n return leftDay === rightDay;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CalendarConversionResult, CalendarDate, CalendarId, ConvertCalendarOptions } from "../public-types.js";
|
|
2
|
+
import type { CalendarRegistry } from "../calendar/registry.js";
|
|
3
|
+
export declare function convertCalendarDateWithRegistry(registry: CalendarRegistry, source: CalendarDate, targetCalendar: CalendarId, _options?: Readonly<ConvertCalendarOptions>): CalendarConversionResult;
|
|
4
|
+
export declare function convertCalendarDate(source: CalendarDate, targetCalendar: CalendarId, options?: Readonly<ConvertCalendarOptions>): CalendarConversionResult;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { defaultCalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
3
|
+
export function convertCalendarDateWithRegistry(registry, source, targetCalendar, _options = {}) {
|
|
4
|
+
const sourceAdapter = registry.getAdapter(source.calendar);
|
|
5
|
+
const targetAdapter = registry.getAdapter(targetCalendar);
|
|
6
|
+
const issues = sourceAdapter.validator.validate(source);
|
|
7
|
+
if (issues.length > 0) {
|
|
8
|
+
const first = issues[0];
|
|
9
|
+
throw new ChroneraError(first.code, first.message);
|
|
10
|
+
}
|
|
11
|
+
if (!sourceAdapter.converter) {
|
|
12
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Source calendar "${source.calendar}" does not support conversion to absolute date.`);
|
|
13
|
+
}
|
|
14
|
+
if (!targetAdapter.converter) {
|
|
15
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Target calendar "${targetCalendar}" does not support conversion from absolute date.`);
|
|
16
|
+
}
|
|
17
|
+
const absDay = sourceAdapter.converter.toAbsoluteDay(source);
|
|
18
|
+
const { first, last } = targetAdapter.identity.validRange;
|
|
19
|
+
if (absDay < first || absDay > last) {
|
|
20
|
+
throw new ChroneraError("CHRONERA_OUT_OF_RANGE", `Date in calendar "${source.calendar}" corresponds to absolute day ${absDay}, outside validated range [${first}, ${last}] of calendar "${targetCalendar}".`);
|
|
21
|
+
}
|
|
22
|
+
const targetDate = targetAdapter.converter.fromAbsoluteDay(absDay);
|
|
23
|
+
const targetIssues = targetAdapter.validator.validate(targetDate);
|
|
24
|
+
if (targetIssues.length > 0) {
|
|
25
|
+
const first = targetIssues[0];
|
|
26
|
+
throw new ChroneraError(first.code, first.message);
|
|
27
|
+
}
|
|
28
|
+
const engine = targetAdapter.identity.algorithm.startsWith("chronera")
|
|
29
|
+
? "chronera"
|
|
30
|
+
: "custom";
|
|
31
|
+
return {
|
|
32
|
+
value: targetDate,
|
|
33
|
+
metadata: {
|
|
34
|
+
requestedCalendar: targetCalendar,
|
|
35
|
+
resolvedCalendar: targetCalendar,
|
|
36
|
+
engine,
|
|
37
|
+
algorithm: targetAdapter.identity.algorithm,
|
|
38
|
+
deterministic: targetAdapter.identity.deterministic,
|
|
39
|
+
...(targetAdapter.identity.dataVersion !== undefined
|
|
40
|
+
? { dataVersion: targetAdapter.identity.dataVersion }
|
|
41
|
+
: {}),
|
|
42
|
+
...(targetAdapter.identity.validFrom !== undefined
|
|
43
|
+
? { validFrom: targetAdapter.identity.validFrom }
|
|
44
|
+
: {}),
|
|
45
|
+
...(targetAdapter.identity.validTo !== undefined
|
|
46
|
+
? { validTo: targetAdapter.identity.validTo }
|
|
47
|
+
: {}),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function convertCalendarDate(source, targetCalendar, options) {
|
|
52
|
+
return convertCalendarDateWithRegistry(defaultCalendarRegistry, source, targetCalendar, options);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=convert-calendar-date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-calendar-date.js","sourceRoot":"","sources":["../../src/operations/convert-calendar-date.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultCalendarRegistry } from \"../calendar/registry.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type {\n CalendarConversionResult,\n CalendarDate,\n CalendarId,\n ConvertCalendarOptions,\n} from \"../public-types.js\";\nimport type { CalendarRegistry } from \"../calendar/registry.js\";\n\nexport function convertCalendarDateWithRegistry(\n registry: CalendarRegistry,\n source: CalendarDate,\n targetCalendar: CalendarId,\n _options: Readonly<ConvertCalendarOptions> = {},\n): CalendarConversionResult {\n const sourceAdapter = registry.getAdapter(source.calendar);\n const targetAdapter = registry.getAdapter(targetCalendar);\n\n const issues = sourceAdapter.validator.validate(source);\n if (issues.length > 0) {\n const first = issues[0]!;\n throw new ChroneraError(first.code, first.message);\n }\n\n if (!sourceAdapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Source calendar \"${source.calendar}\" does not support conversion to absolute date.`,\n );\n }\n\n if (!targetAdapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Target calendar \"${targetCalendar}\" does not support conversion from absolute date.`,\n );\n }\n\n const absDay = sourceAdapter.converter.toAbsoluteDay(source);\n\n const { first, last } = targetAdapter.identity.validRange;\n if (absDay < first || absDay > last) {\n throw new ChroneraError(\n \"CHRONERA_OUT_OF_RANGE\",\n `Date in calendar \"${source.calendar}\" corresponds to absolute day ${absDay}, outside validated range [${first}, ${last}] of calendar \"${targetCalendar}\".`,\n );\n }\n\n const targetDate = targetAdapter.converter.fromAbsoluteDay(absDay);\n\n const targetIssues = targetAdapter.validator.validate(targetDate);\n if (targetIssues.length > 0) {\n const first = targetIssues[0]!;\n throw new ChroneraError(first.code, first.message);\n }\n\n const engine = targetAdapter.identity.algorithm.startsWith(\"chronera\")\n ? (\"chronera\" as const)\n : (\"custom\" as const);\n\n return {\n value: targetDate,\n metadata: {\n requestedCalendar: targetCalendar,\n resolvedCalendar: targetCalendar,\n engine,\n algorithm: targetAdapter.identity.algorithm,\n deterministic: targetAdapter.identity.deterministic,\n ...(targetAdapter.identity.dataVersion !== undefined\n ? { dataVersion: targetAdapter.identity.dataVersion }\n : {}),\n ...(targetAdapter.identity.validFrom !== undefined\n ? { validFrom: targetAdapter.identity.validFrom }\n : {}),\n ...(targetAdapter.identity.validTo !== undefined\n ? { validTo: targetAdapter.identity.validTo }\n : {}),\n },\n };\n}\n\nexport function convertCalendarDate(\n source: CalendarDate,\n targetCalendar: CalendarId,\n options?: Readonly<ConvertCalendarOptions>,\n): CalendarConversionResult {\n return convertCalendarDateWithRegistry(\n defaultCalendarRegistry,\n source,\n targetCalendar,\n options,\n );\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import type { DayOfYearFields } from "../core/day-of-year.js";
|
|
3
|
+
import type { CalendarDate, LocalDate } from "../public-types.js";
|
|
4
|
+
export type { DayOfYearFields };
|
|
5
|
+
export declare function getDayOfYearWithRegistry(registry: CalendarRegistry, input: LocalDate | CalendarDate): DayOfYearFields;
|
|
6
|
+
export declare function getDayOfYear(input: LocalDate | CalendarDate): DayOfYearFields;
|
|
7
|
+
export declare function formatOrdinalDate(input: LocalDate | CalendarDate): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defaultCalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { absoluteDayFromGregorianFields } from "../core/absolute-day.js";
|
|
3
|
+
import { formatOrdinalDate as coreFormatOrdinalDate, getDayOfYearFromAbsoluteDay, } from "../core/day-of-year.js";
|
|
4
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
5
|
+
function getAbsoluteDay(input, registry) {
|
|
6
|
+
if (input.kind === "local-date") {
|
|
7
|
+
return absoluteDayFromGregorianFields(input.year, input.month, input.day);
|
|
8
|
+
}
|
|
9
|
+
if (input.kind === "calendar-date") {
|
|
10
|
+
const adapter = registry.getAdapter(input.calendar);
|
|
11
|
+
if (!adapter.converter) {
|
|
12
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Calendar "${input.calendar}" does not support conversion to absolute day.`);
|
|
13
|
+
}
|
|
14
|
+
return adapter.converter.toAbsoluteDay(input);
|
|
15
|
+
}
|
|
16
|
+
throw new ChroneraError("CHRONERA_INVALID_DATE", "Invalid input for day-of-year calculation; expected LocalDate or CalendarDate.");
|
|
17
|
+
}
|
|
18
|
+
export function getDayOfYearWithRegistry(registry, input) {
|
|
19
|
+
const absDay = getAbsoluteDay(input, registry);
|
|
20
|
+
return getDayOfYearFromAbsoluteDay(absDay);
|
|
21
|
+
}
|
|
22
|
+
export function getDayOfYear(input) {
|
|
23
|
+
return getDayOfYearWithRegistry(defaultCalendarRegistry, input);
|
|
24
|
+
}
|
|
25
|
+
export function formatOrdinalDate(input) {
|
|
26
|
+
const { year, dayOfYear } = getDayOfYear(input);
|
|
27
|
+
return coreFormatOrdinalDate(year, dayOfYear);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=day-of-year.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"day-of-year.js","sourceRoot":"","sources":["../../src/operations/day-of-year.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,iBAAiB,IAAI,qBAAqB,EAC1C,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQpD,SAAS,cAAc,CACrB,KAA+B,EAC/B,QAA0B;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,8BAA8B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,aAAa,CACrB,gCAAgC,EAChC,aAAa,KAAK,CAAC,QAAQ,gDAAgD,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,gFAAgF,CACjF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAA0B,EAC1B,KAA+B;IAE/B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA+B;IAC1D,OAAO,wBAAwB,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA+B;IAC/D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import { defaultCalendarRegistry } from \"../calendar/registry.js\";\nimport { absoluteDayFromGregorianFields } from \"../core/absolute-day.js\";\nimport {\n formatOrdinalDate as coreFormatOrdinalDate,\n getDayOfYearFromAbsoluteDay,\n} from \"../core/day-of-year.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type { CalendarRegistry } from \"../calendar/registry.js\";\nimport type { DayOfYearFields } from \"../core/day-of-year.js\";\nimport type { CalendarDate, LocalDate } from \"../public-types.js\";\n\nexport type { DayOfYearFields };\n\nfunction getAbsoluteDay(\n input: LocalDate | CalendarDate,\n registry: CalendarRegistry,\n): number {\n if (input.kind === \"local-date\") {\n return absoluteDayFromGregorianFields(input.year, input.month, input.day);\n }\n if (input.kind === \"calendar-date\") {\n const adapter = registry.getAdapter(input.calendar);\n if (!adapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Calendar \"${input.calendar}\" does not support conversion to absolute day.`,\n );\n }\n return adapter.converter.toAbsoluteDay(input);\n }\n throw new ChroneraError(\n \"CHRONERA_INVALID_DATE\",\n \"Invalid input for day-of-year calculation; expected LocalDate or CalendarDate.\",\n );\n}\n\nexport function getDayOfYearWithRegistry(\n registry: CalendarRegistry,\n input: LocalDate | CalendarDate,\n): DayOfYearFields {\n const absDay = getAbsoluteDay(input, registry);\n return getDayOfYearFromAbsoluteDay(absDay);\n}\n\nexport function getDayOfYear(input: LocalDate | CalendarDate): DayOfYearFields {\n return getDayOfYearWithRegistry(defaultCalendarRegistry, input);\n}\n\nexport function formatOrdinalDate(input: LocalDate | CalendarDate): string {\n const { year, dayOfYear } = getDayOfYear(input);\n return coreFormatOrdinalDate(year, dayOfYear);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FiscalFields, FiscalOptions, QuarterNumber } from "../core/fiscal.js";
|
|
2
|
+
import type { CalendarDate, LocalDate } from "../public-types.js";
|
|
3
|
+
export type { FiscalFields, FiscalOptions, QuarterNumber };
|
|
4
|
+
export declare function getQuarter(input: LocalDate | CalendarDate): QuarterNumber;
|
|
5
|
+
export declare function getFiscalYear(input: LocalDate | CalendarDate, options?: FiscalOptions): FiscalFields;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getCalendarQuarter, getFiscalFields } from "../core/fiscal.js";
|
|
2
|
+
import { parseGregorianMonthCode } from "../core/gregorian-math.js";
|
|
3
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
4
|
+
function getYearAndMonth(input) {
|
|
5
|
+
if (input.kind === "local-date") {
|
|
6
|
+
return { year: input.year, month: input.month };
|
|
7
|
+
}
|
|
8
|
+
if (input.kind === "calendar-date") {
|
|
9
|
+
const m = input.month ?? parseGregorianMonthCode(input.monthCode);
|
|
10
|
+
if (m === null) {
|
|
11
|
+
throw new ChroneraError("CHRONERA_INVALID_DATE", `Invalid month code for fiscal calculations: ${input.monthCode}`);
|
|
12
|
+
}
|
|
13
|
+
return { year: input.year, month: m };
|
|
14
|
+
}
|
|
15
|
+
throw new ChroneraError("CHRONERA_INVALID_DATE", "Invalid input for fiscal calculations; expected LocalDate or CalendarDate.");
|
|
16
|
+
}
|
|
17
|
+
export function getQuarter(input) {
|
|
18
|
+
const { month } = getYearAndMonth(input);
|
|
19
|
+
return getCalendarQuarter(month);
|
|
20
|
+
}
|
|
21
|
+
export function getFiscalYear(input, options = {}) {
|
|
22
|
+
const { year, month } = getYearAndMonth(input);
|
|
23
|
+
return getFiscalFields(year, month, options);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=fiscal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiscal.js","sourceRoot":"","sources":["../../src/operations/fiscal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWpD,SAAS,eAAe,CAAC,KAA+B;IAItD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,+CAA+C,KAAK,CAAC,SAAS,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,4EAA4E,CAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA+B;IACxD,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAA+B,EAC/B,UAAyB,EAAE;IAE3B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import { getCalendarQuarter, getFiscalFields } from \"../core/fiscal.js\";\nimport { parseGregorianMonthCode } from \"../core/gregorian-math.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type {\n FiscalFields,\n FiscalOptions,\n QuarterNumber,\n} from \"../core/fiscal.js\";\nimport type { CalendarDate, LocalDate } from \"../public-types.js\";\n\nexport type { FiscalFields, FiscalOptions, QuarterNumber };\n\nfunction getYearAndMonth(input: LocalDate | CalendarDate): {\n year: number;\n month: number;\n} {\n if (input.kind === \"local-date\") {\n return { year: input.year, month: input.month };\n }\n if (input.kind === \"calendar-date\") {\n const m = input.month ?? parseGregorianMonthCode(input.monthCode);\n if (m === null) {\n throw new ChroneraError(\n \"CHRONERA_INVALID_DATE\",\n `Invalid month code for fiscal calculations: ${input.monthCode}`,\n );\n }\n return { year: input.year, month: m };\n }\n throw new ChroneraError(\n \"CHRONERA_INVALID_DATE\",\n \"Invalid input for fiscal calculations; expected LocalDate or CalendarDate.\",\n );\n}\n\nexport function getQuarter(input: LocalDate | CalendarDate): QuarterNumber {\n const { month } = getYearAndMonth(input);\n return getCalendarQuarter(month);\n}\n\nexport function getFiscalYear(\n input: LocalDate | CalendarDate,\n options: FiscalOptions = {},\n): FiscalFields {\n const { year, month } = getYearAndMonth(input);\n return getFiscalFields(year, month, options);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import type { IsoWeekFields } from "../core/iso-week.js";
|
|
3
|
+
import type { CalendarDate, LocalDate } from "../public-types.js";
|
|
4
|
+
export type { IsoWeekFields };
|
|
5
|
+
export declare function getIsoWeekWithRegistry(registry: CalendarRegistry, input: LocalDate | CalendarDate): IsoWeekFields;
|
|
6
|
+
export declare function getIsoWeek(input: LocalDate | CalendarDate): IsoWeekFields;
|
|
7
|
+
export declare function formatIsoWeek(input: LocalDate | CalendarDate, options?: {
|
|
8
|
+
includeDayOfWeek?: boolean;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defaultCalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import { absoluteDayFromGregorianFields } from "../core/absolute-day.js";
|
|
3
|
+
import { formatIsoWeekString, getIsoWeekFromAbsoluteDay, } from "../core/iso-week.js";
|
|
4
|
+
import { ChroneraError } from "../errors/errors.js";
|
|
5
|
+
function getAbsoluteDay(input, registry) {
|
|
6
|
+
if (input.kind === "local-date") {
|
|
7
|
+
return absoluteDayFromGregorianFields(input.year, input.month, input.day);
|
|
8
|
+
}
|
|
9
|
+
if (input.kind === "calendar-date") {
|
|
10
|
+
const adapter = registry.getAdapter(input.calendar);
|
|
11
|
+
if (!adapter.converter) {
|
|
12
|
+
throw new ChroneraError("CHRONERA_UNSUPPORTED_OPERATION", `Calendar "${input.calendar}" does not support conversion to absolute day.`);
|
|
13
|
+
}
|
|
14
|
+
return adapter.converter.toAbsoluteDay(input);
|
|
15
|
+
}
|
|
16
|
+
throw new ChroneraError("CHRONERA_INVALID_DATE", "Invalid input for ISO week calculation; expected LocalDate or CalendarDate.");
|
|
17
|
+
}
|
|
18
|
+
export function getIsoWeekWithRegistry(registry, input) {
|
|
19
|
+
const absoluteDay = getAbsoluteDay(input, registry);
|
|
20
|
+
return getIsoWeekFromAbsoluteDay(absoluteDay);
|
|
21
|
+
}
|
|
22
|
+
export function getIsoWeek(input) {
|
|
23
|
+
return getIsoWeekWithRegistry(defaultCalendarRegistry, input);
|
|
24
|
+
}
|
|
25
|
+
export function formatIsoWeek(input, options = {}) {
|
|
26
|
+
const fields = getIsoWeek(input);
|
|
27
|
+
return formatIsoWeekString(fields, options.includeDayOfWeek ?? true);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=iso-week.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iso-week.js","sourceRoot":"","sources":["../../src/operations/iso-week.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQpD,SAAS,cAAc,CACrB,KAA+B,EAC/B,QAA0B;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,8BAA8B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,aAAa,CACrB,gCAAgC,EAChC,aAAa,KAAK,CAAC,QAAQ,gDAAgD,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,6EAA6E,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAA0B,EAC1B,KAA+B;IAE/B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,OAAO,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA+B;IACxD,OAAO,sBAAsB,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAA+B,EAC/B,UAA0C,EAAE;IAE5C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import { defaultCalendarRegistry } from \"../calendar/registry.js\";\nimport { absoluteDayFromGregorianFields } from \"../core/absolute-day.js\";\nimport {\n formatIsoWeekString,\n getIsoWeekFromAbsoluteDay,\n} from \"../core/iso-week.js\";\nimport { ChroneraError } from \"../errors/errors.js\";\n\nimport type { CalendarRegistry } from \"../calendar/registry.js\";\nimport type { IsoWeekFields } from \"../core/iso-week.js\";\nimport type { CalendarDate, LocalDate } from \"../public-types.js\";\n\nexport type { IsoWeekFields };\n\nfunction getAbsoluteDay(\n input: LocalDate | CalendarDate,\n registry: CalendarRegistry,\n): number {\n if (input.kind === \"local-date\") {\n return absoluteDayFromGregorianFields(input.year, input.month, input.day);\n }\n if (input.kind === \"calendar-date\") {\n const adapter = registry.getAdapter(input.calendar);\n if (!adapter.converter) {\n throw new ChroneraError(\n \"CHRONERA_UNSUPPORTED_OPERATION\",\n `Calendar \"${input.calendar}\" does not support conversion to absolute day.`,\n );\n }\n return adapter.converter.toAbsoluteDay(input);\n }\n throw new ChroneraError(\n \"CHRONERA_INVALID_DATE\",\n \"Invalid input for ISO week calculation; expected LocalDate or CalendarDate.\",\n );\n}\n\nexport function getIsoWeekWithRegistry(\n registry: CalendarRegistry,\n input: LocalDate | CalendarDate,\n): IsoWeekFields {\n const absoluteDay = getAbsoluteDay(input, registry);\n return getIsoWeekFromAbsoluteDay(absoluteDay);\n}\n\nexport function getIsoWeek(input: LocalDate | CalendarDate): IsoWeekFields {\n return getIsoWeekWithRegistry(defaultCalendarRegistry, input);\n}\n\nexport function formatIsoWeek(\n input: LocalDate | CalendarDate,\n options: { includeDayOfWeek?: boolean } = {},\n): string {\n const fields = getIsoWeek(input);\n return formatIsoWeekString(fields, options.includeDayOfWeek ?? true);\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CalendarRegistry } from "../calendar/registry.js";
|
|
2
|
+
import type { CalendarDate, LocalDate } from "../public-types.js";
|
|
3
|
+
export declare function toJulianDayNumber(input: LocalDate | CalendarDate, registry?: CalendarRegistry): number;
|
|
4
|
+
export declare function toModifiedJulianDay(input: LocalDate | CalendarDate, registry?: CalendarRegistry): number;
|
|
5
|
+
export declare function localDateFromJulianDayNumber(jdn: number): LocalDate;
|
|
6
|
+
export declare function localDateFromModifiedJulianDay(mjd: number): LocalDate;
|