# moment/luxon — codebase unpack

> Canonical page: https://codevetter.com/unpack/luxon

This is a deterministic Repo Unpack scan of moment/luxon — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: f427515a38f6a671f8de663e6bcc040ed81f114e (2026-08-09)
- Last upstream commit: Rewrite Duration#shiftTo and normalize to do less "unintuitive" conversions.
- Generated by codevetter 1.15.0 on 2026-10-02
- 150 files scanned · 850 KB

Source inspection; upstream code and tests were not executed.

## Languages

- JavaScript: 96 files
- Markdown: 24 files
- HTML: 3 files
- JSON: 3 files
- CSS: 2 files
- YAML: 2 files

## Repository structure

- test/ — 60 files
- src/ — 25 files
- docs/ — 14 files
- site/ — 11 files
- scripts/ — 9 files
- tasks/ — 4 files
- docker/ — 4 files
- benchmarks/ — 4 files

Probable source entrypoint: `src/` (inferred from the tree, not upstream docs)

## Source layout — src/

- src/impl/ — 12 files
- src/zones/ — 4 files
- src/datetime.js — 1 file
- src/duration.js — 1 file
- src/errors.js — 1 file
- src/info.js — 1 file
- src/interval.js — 1 file
- src/luxon.js — 1 file
- src/package.json — 1 file
- src/settings.js — 1 file
- src/zone.js — 1 file

## Package

- package.json: luxon v3.7.2 — 20 declared dependencies

## Structural health signals

Average score 8.7/10 across 96 files; 4 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- f427515a38f6 (2026-08-09) Rewrite Duration#shiftTo and normalize to do less "unintuitive" conversions.
- aeb7427a8d27 (2026-08-06) fix(interval): respect endpoint zones in hasSame for empty intervals (#1790)
- f2e767dbc74f (2026-08-05) Fix a typo in toRelative JSDoc example
- aeb07e37399b (2026-08-06) Reject out-of-range 12-hour values with a meridiem in fromFormat (#1787)
- 8a798d11be62 (2026-08-06) Fix lost negative sign in Duration#toFormat when largest unit is zero (#1786)

## Overview

Luxon 3.7.2 is a JavaScript library for developers who need explicit, immutable APIs for dates, durations, and time intervals. It combines standard and token-based parsing, calendar-aware arithmetic, serialization, and localized formatting with time-zone and locale data supplied by the host's Date and Intl implementations. This brief examines commit f427515a38f6a671f8de663e6bcc040ed81f114e through public source reads; tests, builds, and CI were inspected, not executed.

## System map

The main product is an embeddable library whose public entrypoint exports temporal types and configuration APIs. Implementation modules separate parsing, calendar conversion, formatting, locale handling, and zone behavior. Runtime state consists of object fields, global defaults, and caches; serialization returns values to the caller. Build tooling produces several JavaScript distributions, while a separate static site supplies documentation and examples.
- src/luxon.js exports VERSION 3.7.2, DateTime, Duration, Interval, Info, Settings, Zone, and four concrete zone classes. — [src/luxon.js#L1-L26](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/luxon.js#L1-L26)
- The package routes imports to build/es6/luxon.mjs and require calls to build/node/luxon.js; src/package.json independently marks source files as ES modules. — [package.json#L11-L17](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L11-L17) [src/package.json#L1-L4](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/package.json#L1-L4)
- DateTime coordinates Zone and Locale state, Duration stores unit values and a conversion matrix, and Interval stores two DateTime endpoints. — [src/datetime.js#L554-L619](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L554-L619) [src/duration.js#L186-L213](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L186-L213) [src/interval.js#L44-L60](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L44-L60)
- Standard parsing uses regex/extractor pairs; custom parsing uses TokenParser; Formatter delegates localized date output through Locale formatter factories. — [src/impl/regexParser.js#L13-L20](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L13-L20) [src/impl/tokenParser.js#L439-L450](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L439-L450) [src/impl/formatter.js#L108-L122](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L108-L122) [src/impl/locale.js#L510-L525](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L510-L525)
- The host supplies time-zone behavior: SystemZone reads Date.getTimezoneOffset, while IANAZone validates names and computes offsets using Intl.DateTimeFormat. — [src/zones/systemZone.js#L28-L49](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/zones/systemZone.js#L28-L49) [src/zones/IANAZone.js#L119-L127](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/zones/IANAZone.js#L119-L127) [src/zones/IANAZone.js#L201-L232](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/zones/IANAZone.js#L201-L232)
- The inspected state boundary is in memory: Settings owns module-level defaults, Locale caches Intl instances, and DateTime exposes JSON/BSON conversion hooks rather than a storage adapter. — [src/settings.js#L10-L17](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L10-L17) [src/impl/locale.js#L9-L51](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L9-L51) [src/datetime.js#L2133-L2146](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2133-L2146)
- npm build invokes tasks/buildAll.js; buildAll concurrently generates Node, browser CommonJS, ES module, AMD, global, and global-es6 bundles with source maps. — [package.json#L18-L23](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L18-L23) [tasks/buildAll.js#L1-L2](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/tasks/buildAll.js#L1-L2) [tasks/build.js#L64-L69](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/tasks/build.js#L64-L69) [tasks/build.js#L125-L174](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/tasks/build.js#L125-L174)
- The static documentation build combines generated API documentation with docs/site copies; benchmarks run ES-module suites, and CI declares build, formatting, coverage-test, and site-generation steps. — [package.json#L24-L33](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L24-L33) [benchmarks/package.json#L1-L3](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/benchmarks/package.json#L1-L3) [benchmarks/index.js#L1-L12](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/benchmarks/index.js#L1-L12) [.github/workflows/test.yml#L33-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L33-L38)

## Feature catalog

Luxon's user-facing surface is primarily its JavaScript API. DateTime handles construction, parsing, transformations, formatting, and interoperability; Duration models quantities, and Interval models bounded spans. Info exposes locale and zone metadata, while Settings controls defaults and invalid-value policy. The companion site provides searchable guides, API documentation, runnable examples, and a persistent theme preference.
- DateTime.now reads the configured clock; fromObject accepts Gregorian, ordinal, ISO-week, and locale-week fields, rejecting conflicting representations and out-of-range values. — [src/datetime.js#L631-L633](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L631-L633) [src/datetime.js#L804-L883](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L804-L883)
- DateTime supports ISO, RFC 2822, HTTP, SQL, and explicit custom-format parsing; custom parsing also has explain and reusable-parser APIs. — [src/datetime.js#L933-L1009](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L933-L1009) [src/datetime.js#L1040-L1044](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1040-L1044) [src/datetime.js#L2363-L2399](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2363-L2399) [src/datetime.js#L2412-L2445](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2412-L2445)
- DateTime formats tokens, localized strings, and localized parts; ISO output supports precision and offset options, while JSON, BSON, numeric timestamps, and native Date provide interoperability. — [src/datetime.js#L1830-L1877](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1830-L1877) [src/datetime.js#L1897-L1917](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1897-L1917) [src/datetime.js#L2113-L2174](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2113-L2174)
- DateTime offers zone conversion with optional wall-time preservation, calendar-aware plus/minus, endOf, diff, and relative or relative-calendar descriptions. — [src/datetime.js#L1592-L1607](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1592-L1607) [src/datetime.js#L1714-L1729](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1714-L1729) [src/datetime.js#L1808-L1813](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1808-L1813) [src/datetime.js#L2194-L2327](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2194-L2327)
- Duration parses ISO quantities and ISO times, performs unit conversion with casual/longterm/custom matrices, and emits human-readable, object, ISO, JSON, or millisecond representations. — [src/duration.js#L186-L213](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L186-L213) [src/duration.js#L308-L339](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L308-L339) [src/duration.js#L471-L540](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L471-L540) [src/duration.js#L582-L613](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L582-L613)
- Interval represents half-open spans, accepts endpoint or duration-based construction, supports containment and splitting, and exposes intersection, union, merge, xor, difference, and duration conversion. — [src/interval.js#L28-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L28-L38) [src/interval.js#L89-L139](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L89-L139) [src/interval.js#L327-L406](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L327-L406) [src/interval.js#L677-L681](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L677-L681)
- Info exposes localized date labels, IANA-zone validation, DST detection, week-start/weekend metadata, and relative/localeWeek feature detection; Settings supplies defaults and throwOnInvalid. — [src/info.js#L10-L30](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/info.js#L10-L30) [src/info.js#L58-L83](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/info.js#L58-L83) [src/info.js#L189-L203](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/info.js#L189-L203) [src/settings.js#L118-L168](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L118-L168)
- The documentation site enables search and sidebar guides, the demo renders API examples, and its dark-theme plugin remembers the selected theme in localStorage. — [site/index.html#L28-L42](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/index.html#L28-L42) [site/docs/_sidebar.md#L1-L15](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/docs/_sidebar.md#L1-L15) [site/demo/demo.js#L40-L85](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/demo/demo.js#L40-L85) [site/plugins/dark-theme-toggle.js#L3-L23](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/plugins/dark-theme-toggle.js#L3-L23)

## Data flow

Inputs enter through explicit factories and are normalized into calendar fields, unit quantities, or endpoints. Parsing carries extracted zones separately from date fields before construction resolves defaults, validates data, and computes a timestamp. Transformations create new temporal objects, with calendar arithmetic distinguished from elapsed-time arithmetic. Output methods emit strings, numbers, objects, or native Dates; durable storage remains the caller's responsibility.
- normalizeObject processes own properties, skips null/undefined values, canonicalizes unit names, and coerces numbers; asNumber rejects booleans, empty strings, and non-finite results. — [src/impl/util.js#L290-L306](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/util.js#L290-L306) [src/datetime.js#L811-L813](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L811-L813) [src/duration.js#L262-L267](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L262-L267)
- ISO parsing tries anchored Gregorian, week, ordinal, and time patterns, returning fields and a Zone; parseDataToDateTime interprets in the parsed zone and converts to the requested/default zone unless setZone is true. — [src/impl/regexParser.js#L25-L54](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L25-L54) [src/impl/regexParser.js#L288-L295](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L288-L295) [src/datetime.js#L192-L205](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L192-L205)
- Custom-format input becomes parsed tokens, macro expansions, regex handlers, and matched fields; parseFromTokens forwards result, zone, specificOffset, and invalidReason into DateTime construction. — [src/impl/tokenParser.js#L439-L477](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L439-L477) [src/impl/tokenParser.js#L495-L497](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L495-L497) [src/datetime.js#L998-L1008](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L998-L1008)
- fromObject fills omitted higher-order fields from the current/reference date and lower-order fields from defaults, validates the selected calendar, then converts week/ordinal values to Gregorian fields and resolves timestamp/offset. — [src/datetime.js#L815-L823](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L815-L823) [src/datetime.js#L841-L899](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L841-L899) [src/impl/conversions.js#L146-L206](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/conversions.js#L146-L206)
- DateTime owns ts, zone, locale, calendar fields, offset, validity, and wasHole; clone carries these forward into a new instance and the constructor reuses derived fields when timestamp and zone are unchanged. — [src/datetime.js#L90-L100](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L90-L100) [src/datetime.js#L554-L619](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L554-L619)
- plus/minus normalize duration-like inputs; adjustTime changes calendar fields first, resolves DST, adds residual elapsed milliseconds, and recalculates the offset after that addition. — [src/datetime.js#L153-L187](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L153-L187) [src/datetime.js#L1714-L1729](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1714-L1729) [src/duration.js#L280-L291](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L280-L291)
- Localized output flows through Formatter, Locale.dtFormatter, and cached Intl.DateTimeFormat instances; unsupported fixed/custom zones are represented via shifted UTC Dates and substituted zone-name parts. — [src/impl/formatter.js#L108-L117](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L108-L117) [src/impl/locale.js#L21-L28](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L21-L28) [src/impl/locale.js#L223-L266](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L223-L266) [src/impl/locale.js#L269-L298](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L269-L298)
- DateTime.toJSON emits ISO text and toBSON emits a native Date; Duration.toJSON emits ISO duration text, while Interval.toISO emits start/end strings, so these paths transfer values without writing application storage. — [src/datetime.js#L2133-L2146](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2133-L2146) [src/duration.js#L582-L591](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L582-L591) [src/interval.js#L621-L624](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L621-L624)

## Behavior traces

These traces follow implementation order from public calls to outputs. Construction and parsing resolve zone, locale, validity, and timestamp before later operations run. Arithmetic revisits zone offsets after calendar and elapsed-time changes, while formatting crosses into native Intl. Serialization supplies a caller-owned persistence boundary; the documentation theme is a separate concrete browser-storage flow.
- Current-time flow: DateTime.now → new DateTime({}) → Settings.defaultZone/normalizeZone → Settings.now → zone.offset → tsToObj → Locale.create, producing an instance with derived calendar fields. — [src/datetime.js#L554-L592](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L554-L592) [src/datetime.js#L631-L633](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L631-L633) [src/settings.js#L27-L28](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L27-L28) [src/settings.js#L56-L57](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L56-L57)
- ISO flow: DateTime.fromISO → parseISODate → parse and its matching extractor → parseDataToDateTime → DateTime.fromObject → objToTS/fixOffset → optional setZone; unmatched input becomes an unparsable DateTime. — [src/datetime.js#L933-L935](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L933-L935) [src/impl/regexParser.js#L43-L54](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L43-L54) [src/impl/regexParser.js#L288-L295](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L288-L295) [src/datetime.js#L192-L205](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L192-L205) [src/datetime.js#L892-L899](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L892-L899) [src/datetime.js#L148-L150](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L148-L150) [src/datetime.js#L103-L127](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L103-L127)
- Custom-format flow: fromFormat → Locale.fromOpts(defaultToEN) → parseFromTokens → TokenParser construction → explainFromTokens → parseDataToDateTime; missing arguments throw, while parser-invalid results create an invalid DateTime. — [src/datetime.js#L993-L1009](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L993-L1009) [src/impl/tokenParser.js#L439-L477](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L439-L477) [src/impl/tokenParser.js#L490-L497](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L490-L497)
- Calendar-addition flow: plus({days: 1}) → Duration.fromDurationLike → Duration.fromObject → adjustTime → objToLocalTS → fixOffset → clone; adding hours instead contributes elapsed milliseconds after calendar resolution. — [src/datetime.js#L153-L187](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L153-L187) [src/datetime.js#L1714-L1717](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1714-L1717) [src/duration.js#L253-L267](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L253-L267) [src/duration.js#L280-L286](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L280-L286)
- Localized-format flow: toLocaleString → loc.clone → Formatter.create → formatDateTime → Locale.dtFormatter → PolyDateFormatter → getCachedDTF → format; substituted zones use formatToParts and zone.offsetName. — [src/datetime.js#L1855-L1858](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1855-L1858) [src/impl/formatter.js#L108-L113](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L108-L113) [src/impl/locale.js#L264-L298](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L264-L298) [src/impl/locale.js#L516-L517](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L516-L517)
- Interval flow: fromISO splits start/end text → parses start with setZone:true → parseISOIntervalEnd → parseDataToDateTime with start timestamp/zone as context → restores requested zones → fromDateTimes/validateStartEnd; duration alternatives use after or before. — [src/interval.js#L137-L190](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L137-L190) [src/interval.js#L13-L25](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L13-L25) [src/interval.js#L89-L126](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L89-L126) [src/impl/regexParser.js#L320-L328](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L320-L328)
- Serialization flow: DateTime.toJSON → toISO → validity check → precision normalization → toISODate/toISOTime; invalid dates emit null, and restoring ISO text uses fromISO without restoring the original Locale configuration. — [src/datetime.js#L2133-L2138](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2133-L2138) [src/datetime.js#L1897-L1917](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L1897-L1917) [src/datetime.js#L933-L935](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L933-L935) [src/datetime.js#L192-L200](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L192-L200)
- Theme-persistence flow: the Docsify plugin initializes the localStorage preference from matchMedia if absent → hook.init applies it → hook.doneEach installs controls → click invokes applyTheme(true), writes the preference, and changes stylesheet/body state. — [site/index.html#L39-L41](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/index.html#L39-L41) [site/plugins/dark-theme-toggle.js#L1-L28](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/plugins/dark-theme-toggle.js#L1-L28)

## Testing signals

Tests and CI were inspected, not executed; no passing result or measured coverage is asserted. Jest runs in Node with Babel transformation and coverage collection from source files. Inspected suites cover parsing, DST, localization, duration conversion, interval semantics, and selected fallback behavior. This inventory is bounded: browser rendering, published bundle loading, and release behavior are outside the configured source-test scope.
- Jest searches test/, uses the Node environment and babel-jest, loads setupTests.js, and collects src/**/*.js coverage except src/zone.js; these settings were inspected, not run. — [jest.config.js#L1-L10](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/jest.config.js#L1-L10) [package.json#L22-L23](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L22-L23) [test/setupTests.js#L3-L18](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/setupTests.js#L3-L18)
- CI declares Ubuntu jobs on Node 20.20.1, 22.22.1, 24.14.0, and 25.8.1 with LANG=en_US.utf8 and TZ=America/New_York, followed by install, build, format-check, coverage tests, and site generation; execution status was not inspected. — [.github/workflows/test.yml#L9-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L9-L38)
- DST tests distinguish fromObject's current-offset overlap choice from local's cached-offset choice and assert gap bumping, wasHole, and arithmetic across transitions. — [test/datetime/dst.test.js#L5-L68](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/dst.test.js#L5-L68) [test/datetime/dst.test.js#L71-L116](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/dst.test.js#L71-L116)
- Parsing tests assert ISO offset interpretation versus setZone retention, custom token fields and incompatible-input reasons, reusable-parser equivalence, and locale mismatch errors. — [test/datetime/regexParse.test.js#L10-L64](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/regexParse.test.js#L10-L64) [test/datetime/tokenParse.test.js#L10-L44](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/tokenParse.test.js#L10-L44) [test/datetime/tokenParse.test.js#L1245-L1263](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/tokenParse.test.js#L1245-L1263)
- Formatting tests cover output calendars, numbering-system overrides, IANA/fixed/custom zones, and invalid output; locale-week tests assert differing week starts and year-boundary behavior. — [test/datetime/format.test.js#L471-L547](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/format.test.js#L471-L547) [test/datetime/localeWeek.test.js#L11-L45](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/localeWeek.test.js#L11-L45)
- Duration tests distinguish casual and longterm conversion factors and exercise a custom business-time matrix, including fractional-week conversion into days, hours, and minutes. — [test/duration/accuracy.test.js#L5-L23](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/duration/accuracy.test.js#L5-L23) [test/duration/customMatrix.test.js#L6-L48](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/duration/customMatrix.test.js#L6-L48)
- Interval tests cover duration/end alternatives under throwOnInvalid, abbreviated-end inheritance, intersection/merge boundaries, positive-duration splitting, and varying month lengths; two invalid/zero-duration tests also use an already-invalid reversed interval. — [test/interval/parse.test.js#L124-L172](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/interval/parse.test.js#L124-L172) [test/interval/many.test.js#L74-L106](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/interval/many.test.js#L74-L106) [test/interval/many.test.js#L325-L375](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/interval/many.test.js#L325-L375)
- Helpers simulate missing RelativeTimeFormat and locale-week APIs and restore globals; however, Jest's configured roots and coverage targets do not exercise site scripts or build tasks as coverage subjects, and the inspected CI declares no browser test step. — [test/helpers.js#L5-L30](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/helpers.js#L5-L30) [test/datetime/degrade.test.js#L6-L12](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/degrade.test.js#L6-L12) [jest.config.js#L2-L9](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/jest.config.js#L2-L9) [.github/workflows/test.yml#L33-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L33-L38)

## Risk map

These are source observations and explicitly labeled hypotheses, not confirmed vulnerabilities. The main runtime sensitivities are host Intl behavior, shared caches/defaults, DST ambiguity, and inputs that drive interval iteration. Security-relevant execution boundaries appear in the demonstration site and CI/deployment tooling. Compatibility claims and operational scripts require separate verification before relying on them.
- CI executes a remotely fetched Codecov shell script via bash process substitution; the inspected workflow supplies no content hash for that fetched script. — [.github/workflows/test.yml#L33-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L33-L38)
- deploy-site sources .env or a supplied configuration file as shell code, accepts configurable deployment directories/remotes, rewrites Git branch/index state, and commits/pushes; it is an operational execution boundary, not a read-only helper. — [scripts/deploy-site#L28-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/deploy-site#L28-L38) [scripts/deploy-site#L67-L79](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/deploy-site#L67-L79) [scripts/deploy-site#L135-L167](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/deploy-site#L135-L167)
- The demo evaluates code and interpolates results into innerHTML, but the inspected callers supply hard-coded example strings; user-controlled execution or injection is not established by this source. — [site/demo/demo.js#L6-L36](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/demo/demo.js#L6-L36) [site/demo/demo.js#L40-L85](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/demo/demo.js#L40-L85) [site/demo/demo.js#L87-L94](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/demo/demo.js#L87-L94)
- Runtime behavior depends on host Intl support and data: IANA offsets contain formatToParts/legacy-format branches, while interval localization directly calls Intl.DateTimeFormat.formatRange without a fallback in that method. — [src/zones/IANAZone.js#L201-L232](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/zones/IANAZone.js#L201-L232) [src/impl/formatter.js#L120-L122](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L120-L122) [docs/why.md#L41-L45](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/why.md#L41-L45)
- Locale's list-formatter cache is populated separately, but Locale.resetCache clears its other listed caches without clearing intlLFCache; resetCaches therefore does not reset every formatter cache shown here. — [src/impl/locale.js#L9-L17](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L9-L17) [src/impl/locale.js#L364-L371](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L364-L371) [src/settings.js#L174-L178](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L174-L178)
- Hypothesis: splitBy with a negative duration may fail to advance toward the interval end because its guard checks invalidity and zero length, while the loop keeps moving from the original start using increasing multiples; inspected split tests do not establish negative-input handling. (inferred) — [src/interval.js#L376-L394](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L376-L394) [test/interval/many.test.js#L325-L375](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/interval/many.test.js#L325-L375)
- Ambiguous local-time resolution is coupled to constructor choice and shared offset-cache history; the DST suite explicitly expects fromObject to use the current offset and local to retain a cached choice until reset. — [src/datetime.js#L103-L127](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L103-L127) [src/datetime.js#L418-L434](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L418-L434) [test/datetime/dst.test.js#L21-L68](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/dst.test.js#L21-L68)
- Compatibility guidance has drift: package.json declares Node >=12, the install guide still says Node 6+, CONTRIBUTING says tests require Node 18, Docker uses Node 15, and CI starts at Node 20. — [package.json#L67-L69](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L67-L69) [docs/install.md#L24-L39](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/install.md#L24-L39) [CONTRIBUTING.md#L16-L18](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/CONTRIBUTING.md#L16-L18) [docker/Dockerfile#L1-L8](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docker/Dockerfile#L1-L8) [.github/workflows/test.yml#L20-L24](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L20-L24)

## Extension points

Extension primarily happens through configuration, factories, callback transformations, and explicit implementation tables. Zone is the clearest public behavioral interface, while Duration accepts custom conversion matrices and DateTime offers reusable token parsers. Parsing and formatting additions require coordinated changes rather than a dynamic registration API. Build targets and documentation plugins have separate, concrete integration points.
- Custom zones can implement Zone's behavioral interface; normalizeZone accepts Zone instances and also duck-types objects with an offset function, while localized formatting adapts custom zones through shifted UTC values. — [src/zone.js#L6-L41](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/zone.js#L6-L41) [src/impl/zoneUtil.js#L13-L33](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/zoneUtil.js#L13-L33) [src/impl/locale.js#L256-L261](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/locale.js#L256-L261)
- Settings.now is an injectable epoch-millisecond clock callback; defaultZone, locale, numbering system, output calendar, and week settings customize newly constructed instances. — [src/settings.js#L24-L57](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L24-L57) [src/settings.js#L60-L105](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L60-L105) [src/settings.js#L122-L130](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/settings.js#L122-L130)
- Duration.fromObject accepts opts.matrix, its constructor gives a supplied matrix precedence over casual/longterm presets, and reconfigure can replace conversion configuration. — [src/duration.js#L186-L192](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L186-L192) [src/duration.js#L253-L267](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L253-L267) [src/duration.js#L703-L706](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L703-L706) [test/duration/customMatrix.test.js#L6-L32](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/duration/customMatrix.test.js#L6-L32)
- DateTime.buildFormatParser constructs a reusable TokenParser; fromFormatParser checks Locale equality before consuming its explanation result and passing fields into normal construction. — [src/datetime.js#L2392-L2399](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2392-L2399) [src/datetime.js#L2412-L2445](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L2412-L2445)
- New standard date grammars fit the regex/extractor composition in regexParser.js: combineRegexes anchors patterns, combineExtractors merges fields/zones, and parse tries explicit alternatives in order. — [src/impl/regexParser.js#L13-L54](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L13-L54) [src/impl/regexParser.js#L255-L295](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L255-L295)
- Custom token additions must coordinate unitForToken's parsing switch, Formatter's output switch, and macroTokenToFormatOpts when presets are involved. — [src/impl/tokenParser.js#L57-L95](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L57-L95) [src/impl/formatter.js#L17-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L17-L38) [src/impl/formatter.js#L300-L329](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/formatter.js#L300-L329)
- Duration.mapUnits validates callback results numerically and clones the quantity; Interval.mapEndpoints applies a callback to both endpoints and reconstructs through endpoint validation. — [src/duration.js#L663-L669](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/duration.js#L663-L669) [src/interval.js#L691-L692](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L691-L692) [src/interval.js#L89-L102](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/interval.js#L89-L102)
- Distribution targets plug into buildLibrary options and buildAll's target list; documentation plugins append to $docsify.plugins, and new guide navigation belongs in the sidebar list. — [tasks/build.js#L125-L174](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/tasks/build.js#L125-L174) [site/plugins/dark-theme-toggle.js#L26-L27](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/plugins/dark-theme-toggle.js#L26-L27) [site/docs/_sidebar.md#L1-L15](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/site/docs/_sidebar.md#L1-L15)

## Contributor handoff

Begin with the public exports and actual package/test/build configuration, then follow the relevant factory through implementation helpers and its matching tests. Preserve explicit parsing, immutable transformations, half-open interval semantics, and calendar-versus-elapsed arithmetic. Tests and CI were inspected, not executed; this bounded brief supplies no passing status or exhaustive coverage guarantee. Under this task's authority, continue read-only investigation and reserve implementation or execution for a separately authorized task.
- Read src/luxon.js and package.json first to distinguish source APIs from distributed entrypoints; src/package.json and tasks/build.js explain source-module and generated-bundle boundaries. — [src/luxon.js#L1-L26](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/luxon.js#L1-L26) [package.json#L11-L21](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L11-L21) [src/package.json#L1-L4](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/package.json#L1-L4) [tasks/build.js#L125-L174](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/tasks/build.js#L125-L174)
- Preserve the documented scope: use host-native internationalization, keep APIs explicit, avoid convenience bloat, and address module-loader compatibility in build tooling rather than runtime source. — [CONTRIBUTING.md#L7-L13](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/CONTRIBUTING.md#L7-L13) [docs/why.md#L22-L31](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/why.md#L22-L31)
- For parsing work, read regexParser/tokenParser together with parseDataToDateTime and fromObject; interpretation-zone, setZone, specificOffset, missing-field defaults, and representation conflicts are separate contracts. — [src/datetime.js#L192-L205](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L192-L205) [src/datetime.js#L804-L899](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L804-L899) [src/impl/regexParser.js#L288-L295](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/regexParser.js#L288-L295) [src/impl/tokenParser.js#L495-L497](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/impl/tokenParser.js#L495-L497)
- For arithmetic work, retain higher-order calendar adjustment before elapsed-millisecond addition and protect DST gaps/overlaps; docs/math.md and dst.test.js provide the relevant semantic examples. — [src/datetime.js#L153-L187](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/src/datetime.js#L153-L187) [docs/math.md#L17-L36](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/math.md#L17-L36) [docs/math.md#L59-L74](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/math.md#L59-L74) [test/datetime/dst.test.js#L14-L68](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/dst.test.js#L14-L68)
- Restore Settings and mocked Intl APIs around tests; helpers provide try/finally patterns, and cache resets matter when testing constructor-specific overlap choices. — [test/helpers.js#L5-L42](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/helpers.js#L5-L42) [test/helpers.js#L65-L73](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/helpers.js#L65-L73) [test/datetime/dst.test.js#L40-L67](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/test/datetime/dst.test.js#L40-L67)
- If later authorized to execute checks, start with npm run jest -- --runInBand plus the relevant test file, then use npm run test for coverage and npm run format-check; this investigation inspected those scripts and CI without executing them. — [package.json#L22-L28](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L22-L28) [jest.config.js#L1-L10](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/jest.config.js#L1-L10) [.github/workflows/test.yml#L33-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L33-L38)
- Use manifest/CI evidence to resolve setup uncertainty: historical contributor instructions mention npm commands absent from the current scripts, while the declared Node minimum and CI matrix differ from older installation text. — [CONTRIBUTING.md#L64-L82](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/CONTRIBUTING.md#L64-L82) [package.json#L18-L33](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L18-L33) [package.json#L67-L69](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L67-L69) [docs/install.md#L24-L39](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/docs/install.md#L24-L39) [.github/workflows/test.yml#L20-L24](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/.github/workflows/test.yml#L20-L24)
- Keep operational boundaries explicit: release invokes npm publish, tagging, and site deployment; deploy-site sources configuration and commits/pushes, while API/site generation writes generated files under build. — [scripts/release#L1-L8](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/release#L1-L8) [scripts/deploy-site#L28-L38](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/deploy-site#L28-L38) [scripts/deploy-site#L161-L167](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/scripts/deploy-site#L161-L167) [package.json#L24-L26](https://github.com/moment/luxon/blob/f427515a38f6a671f8de663e6bcc040ed81f114e/package.json#L24-L26)

Source repository: https://github.com/moment/luxon
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/luxon.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
