@nowline/export-msproj 0.8.5 → 0.9.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/README.md CHANGED
@@ -22,7 +22,7 @@ import { exportMsProjXml } from '@nowline/export-msproj';
22
22
 
23
23
  const xml = exportMsProjXml(inputs, {
24
24
  projectName: 'Q1 2026 Plan',
25
- startDate: '2026-01-06', // YYYY-MM-DD; anchors relative roadmaps
25
+ startDate: '2026-01-06', // YYYY-MM-DD; default: the roadmap's start:, else today
26
26
  });
27
27
 
28
28
  // `xml` is a UTF-8 XML string. Save as roadmap.xml.
@@ -47,7 +47,7 @@ because XML is ambiguous (could be SVG-XML, generic XML, etc.).
47
47
  <Name>Q1 2026 Plan</Name>
48
48
  <StartDate>2026-01-06T00:00:00</StartDate>
49
49
  <Calendars>
50
- <!-- Standard base calendar (Mon-Fri, 8h) + Standard resource calendar -->
50
+ <!-- Standard base calendar (the file's working weekdays, 8h) + Standard resource calendar -->
51
51
  </Calendars>
52
52
  <Tasks>
53
53
  <Task><UID>1</UID><Name>Auth refactor</Name>...</Task>
@@ -66,16 +66,28 @@ because XML is ambiguous (could be SVG-XML, generic XML, etc.).
66
66
  ## Calendar fidelity
67
67
 
68
68
  Per spec Resolution 6, this exporter emits a **single Standard base
69
- calendar** (`UID="1"`, Mon–Fri 08:00–12:00 / 13:00–17:00, weekends off)
69
+ calendar** (`UID="1"`, 08:00–12:00 / 13:00–17:00 on each working day)
70
70
  plus a Standard resource calendar (`UID="2"`) that every `<Resource>`
71
71
  references. This matches Microsoft's own default template and reliably
72
72
  imports across MS Project versions.
73
73
 
74
- Nowline's richer `calendar:` modes (`full` for 7-day weeks, `custom` for
75
- per-region holidays / half-days) are **not** projected into the export —
76
- duration math is recomputed against MS Project's Standard calendar so a
77
- `duration: 2w` item lands on the same 10 working days you'd see in
78
- Nowline's default `business` calendar.
74
+ The base calendar's working weekdays come from the file's calendar:
75
+ Mon–Fri under `calendar:business` (the default, weekends off), and all
76
+ seven days under `calendar:full` and `calendar:custom`. Each task's
77
+ duration is the chart's own day count for the item (sizes, `q` and
78
+ `capacity:` included) times 480 minutes, so a `duration: 2w` item lasts
79
+ `PT4800M0S` on `business` (10 working days) and `PT6720M0S` on `full`
80
+ (14). An item with no duration stays a one-day task.
81
+
82
+ Declared days off and working exceptions are written as `<Exceptions>` in
83
+ the base calendar, right after `<WeekDays>`: one `<Exception>` per run of
84
+ days the file's calendar differs from its open week, with a `<Name>` from
85
+ the titles of the dated declarations behind it. A holiday is
86
+ `<DayWorking>0</DayWorking>`; a working Saturday is `<DayWorking>1</DayWorking>`
87
+ with the usual two `<WorkingTime>` blocks. There is no `<WorkWeeks>`: a
88
+ bounded recurrence becomes one exception per run of days it changes. Half-days
89
+ are not projected. The export still starts at the export date or `--start`,
90
+ not the roadmap's `start:`.
79
91
 
80
92
  ## Lossy export policy
81
93
 
@@ -85,7 +97,7 @@ The following Nowline features are dropped from the export:
85
97
  - `footnote` annotations
86
98
  - `description` directives (the bridge to `<Notes>` is reserved for a
87
99
  future milestone)
88
- - Custom calendar configuration
100
+ - Half-days (a `non-working` declaration covers whole days only)
89
101
 
90
102
  When any drops occur, the exporter emits a single stderr summary line
91
103
  (via the CLI; the library function returns the XML and lets the caller
@@ -1,5 +1,10 @@
1
+ import type { CalendarException } from '@nowline/layout';
1
2
  declare const DAY_NAMES: string[];
2
- export declare function buildCalendarsBlock(): string;
3
+ /**
4
+ * `workingWeekdays`: 0 = Sunday … 6 = Saturday. `exceptions`: the days the
5
+ * file's calendar differs from that week (`calendarExceptions`), ascending.
6
+ */
7
+ export declare function buildCalendarsBlock(workingWeekdays: ReadonlySet<number>, exceptions: readonly CalendarException[]): string;
3
8
  /** Resource and base calendar UIDs surfaced for cross-references. */
4
9
  export declare const STANDARD_BASE_CALENDAR_UID = 1;
5
10
  export declare const STANDARD_RESOURCE_CALENDAR_UID = 2;
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,SAAS,UAAiF,CAAC;AA0BjG,wBAAgB,mBAAmB,IAAI,MAAM,CAmB5C;AAED,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,QAAA,MAAM,SAAS,UAAiF,CAAC;AAoEjG;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACzC,MAAM,CAqBR;AAED,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,CAAC"}
package/dist/calendar.js CHANGED
@@ -1,17 +1,25 @@
1
1
  // Minimal Standard base calendar emitted on every MS Project XML export.
2
2
  //
3
- // Spec: specs/handoffs/m2c.md § 8 + Resolution 6.
4
- // - One base calendar (UID=1, Name=Standard) — Mon–Fri working
5
- // 08:00–12:00 / 13:00–17:00, Sat/Sun non-working. Matches Microsoft's
6
- // default project template; reliably accepted across MSProject versions.
3
+ // Spec: specs/handoffs/m2c.md § 8 + Resolution 6, specs/working-calendar.md §8.
4
+ // - One base calendar (UID=1, Name=Standard). Its working weekdays are the
5
+ // file calendar's open week (`WorkingCalendar.workingWeekdays`), each
6
+ // 08:00–12:00 / 13:00–17:00: Mon–Fri for business, which matches
7
+ // Microsoft's default project template, and all seven days for
8
+ // `calendar:full` and `calendar:custom`.
7
9
  // - One resource calendar (UID=2, Name=Standard, BaseCalendarUID=1).
8
10
  //
11
+ // - `<Exceptions>` in the base calendar (UID=1), right after `</WeekDays>`,
12
+ // one per `CalendarException`: a named closure, a bounded recurrence's
13
+ // closed days, or a working day the open week closes (m2p phase 5b).
14
+ // There is no `<WorkWeeks>`: a bounded recurrence becomes one exception
15
+ // per run of days it changes, and the exceptions never overlap.
16
+ //
9
17
  // Calendar UIDs are fixed (1 / 2). No timestamps in the calendar block →
10
18
  // deterministic across runs.
19
+ import { escapeXml } from './xml.js';
11
20
  const DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
12
- function dayBlock(dayIndex) {
13
- const isWeekend = dayIndex === 0 || dayIndex === 6;
14
- if (isWeekend) {
21
+ function dayBlock(dayIndex, isWorking) {
22
+ if (!isWorking) {
15
23
  return ` <WeekDay>
16
24
  <DayType>${dayIndex + 1}</DayType>
17
25
  <DayWorking>0</DayWorking>
@@ -32,8 +40,44 @@ function dayBlock(dayIndex) {
32
40
  </WorkingTimes>
33
41
  </WeekDay>`;
34
42
  }
35
- export function buildCalendarsBlock() {
36
- const weekDays = [0, 1, 2, 3, 4, 5, 6].map(dayBlock).join('\n');
43
+ function isoDate(date) {
44
+ return date.toISOString().slice(0, 10);
45
+ }
46
+ /** One `<Exception>`: element order follows the MSPDI schema. */
47
+ function exceptionBlock(exception) {
48
+ const lines = [
49
+ ' <Exception>',
50
+ ' <EnteredByOccurrences>0</EnteredByOccurrences>',
51
+ ' <TimePeriod>',
52
+ ` <FromDate>${isoDate(exception.from)}T00:00:00</FromDate>`,
53
+ ` <ToDate>${isoDate(exception.through)}T23:59:00</ToDate>`,
54
+ ' </TimePeriod>',
55
+ ' <Occurrences>1</Occurrences>',
56
+ ];
57
+ if (exception.titles && exception.titles.length > 0) {
58
+ lines.push(` <Name>${escapeXml(exception.titles.join(', '))}</Name>`);
59
+ }
60
+ lines.push(' <Type>1</Type>');
61
+ lines.push(` <DayWorking>${exception.working ? 1 : 0}</DayWorking>`);
62
+ if (exception.working) {
63
+ lines.push(' <WorkingTimes>', ' <WorkingTime>', ' <FromTime>08:00:00</FromTime>', ' <ToTime>12:00:00</ToTime>', ' </WorkingTime>', ' <WorkingTime>', ' <FromTime>13:00:00</FromTime>', ' <ToTime>17:00:00</ToTime>', ' </WorkingTime>', ' </WorkingTimes>');
64
+ }
65
+ lines.push(' </Exception>');
66
+ return lines.join('\n');
67
+ }
68
+ function exceptionsBlock(exceptions) {
69
+ if (exceptions.length === 0)
70
+ return '';
71
+ return `\n <Exceptions>\n${exceptions.map(exceptionBlock).join('\n')}\n </Exceptions>`;
72
+ }
73
+ /**
74
+ * `workingWeekdays`: 0 = Sunday … 6 = Saturday. `exceptions`: the days the
75
+ * file's calendar differs from that week (`calendarExceptions`), ascending.
76
+ */
77
+ export function buildCalendarsBlock(workingWeekdays, exceptions) {
78
+ const weekDays = [0, 1, 2, 3, 4, 5, 6]
79
+ .map((dayIndex) => dayBlock(dayIndex, workingWeekdays.has(dayIndex)))
80
+ .join('\n');
37
81
  return ` <Calendars>
38
82
  <Calendar>
39
83
  <UID>1</UID>
@@ -42,7 +86,7 @@ export function buildCalendarsBlock() {
42
86
  <BaseCalendarUID>-1</BaseCalendarUID>
43
87
  <WeekDays>
44
88
  ${weekDays}
45
- </WeekDays>
89
+ </WeekDays>${exceptionsBlock(exceptions)}
46
90
  </Calendar>
47
91
  <Calendar>
48
92
  <UID>2</UID>
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,kDAAkD;AAClD,iEAAiE;AACjE,0EAA0E;AAC1E,6EAA6E;AAC7E,uEAAuE;AACvE,EAAE;AACF,yEAAyE;AACzE,6BAA6B;AAE7B,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAEjG,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO;mBACI,QAAQ,GAAG,CAAC;;iBAEd,CAAC;IACd,CAAC;IACD,OAAO;mBACQ,QAAQ,GAAG,CAAC;;;;;;;;;;;;iBAYd,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO;;;;;;;EAOT,QAAQ;;;;;;;;;eASK,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
- export declare function durationToMsProjMinutes(literal: string | undefined): number;
1
+ /**
2
+ * Working minutes for a task of `days` working days. An item with no
3
+ * duration gets one day: a zero-length task is a milestone in MS Project.
4
+ */
5
+ export declare function workingDaysToMinutes(days: number | undefined): number;
2
6
  export declare function minutesToMsProjDuration(minutes: number): string;
3
7
  //# sourceMappingURL=duration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AA0BA,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiB3E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
package/dist/duration.js CHANGED
@@ -1,48 +1,17 @@
1
- // Convert Nowline duration tokens into MS Project's `PT...H...M...S` form.
1
+ // Task durations in MS Project's `PT<minutes>M0S` form.
2
2
  //
3
- // MS Project uses ISO 8601 duration "PT<minutes>M0S" (e.g. `PT480M0S` = 8h)
4
- // for Standard-calendar working time. We resolve every duration to working
5
- // minutes under the calendar emitted by `calendar.ts` (Mon–Fri, 8h/day).
6
- //
7
- // Size buckets resolve the same way as in @nowline/export-mermaid.
8
- const SIZE_BUCKET_DAYS = {
9
- xs: 1,
10
- sm: 3,
11
- s: 3,
12
- md: 5,
13
- m: 5,
14
- lg: 10,
15
- l: 10,
16
- xl: 15,
17
- };
18
- const NUMERIC_RE = /^(\d+(?:\.\d+)?)\s*(d|w|m|y)?$/i;
19
- const MINUTES_PER_WORKING_DAY = 8 * 60; // Standard calendar
20
- const WORKING_DAYS_PER_WEEK = 5;
21
- const WORKING_DAYS_PER_MONTH = 22;
22
- const WORKING_DAYS_PER_YEAR = 252;
23
- export function durationToMsProjMinutes(literal) {
24
- if (!literal)
25
- return MINUTES_PER_WORKING_DAY; // 1d default
26
- const trimmed = literal.trim().toLowerCase();
27
- if (!trimmed)
28
- return MINUTES_PER_WORKING_DAY;
29
- if (trimmed in SIZE_BUCKET_DAYS) {
30
- return SIZE_BUCKET_DAYS[trimmed] * MINUTES_PER_WORKING_DAY;
31
- }
32
- const match = NUMERIC_RE.exec(trimmed);
33
- if (!match)
34
- return MINUTES_PER_WORKING_DAY;
35
- const value = Number(match[1]);
36
- const unit = (match[2] ?? 'd').toLowerCase();
37
- if (!Number.isFinite(value) || value <= 0)
3
+ // The day count is engine C's `ScheduledItem.days` under the file's calendar
4
+ // (specs/working-calendar.md §8), so sizes, `capacity:` and `q` match the
5
+ // chart. Each working day is 8 hours of the Standard calendar `calendar.ts`
6
+ // emits.
7
+ const MINUTES_PER_WORKING_DAY = 8 * 60;
8
+ /**
9
+ * Working minutes for a task of `days` working days. An item with no
10
+ * duration gets one day: a zero-length task is a milestone in MS Project.
11
+ */
12
+ export function workingDaysToMinutes(days) {
13
+ if (days === undefined || !(days > 0))
38
14
  return MINUTES_PER_WORKING_DAY;
39
- let days = value;
40
- if (unit === 'w')
41
- days = value * WORKING_DAYS_PER_WEEK;
42
- else if (unit === 'm')
43
- days = value * WORKING_DAYS_PER_MONTH;
44
- else if (unit === 'y')
45
- days = value * WORKING_DAYS_PER_YEAR;
46
15
  return Math.round(days * MINUTES_PER_WORKING_DAY);
47
16
  }
48
17
  export function minutesToMsProjDuration(minutes) {
@@ -1 +1 @@
1
- {"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,EAAE;AACF,mEAAmE;AAEnE,MAAM,gBAAgB,GAAqC;IACvD,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,CAAC;IACJ,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,CAAC;IACJ,EAAE,EAAE,EAAE;IACN,CAAC,EAAE,EAAE;IACL,EAAE,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,oBAAoB;AAC5D,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,MAAM,UAAU,uBAAuB,CAAC,OAA2B;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,uBAAuB,CAAC,CAAC,aAAa;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,uBAAuB,CAAC;IAC7C,IAAI,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAC9B,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,uBAAuB,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAC1E,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,KAAK,GAAG;QAAE,IAAI,GAAG,KAAK,GAAG,qBAAqB,CAAC;SAClD,IAAI,IAAI,KAAK,GAAG;QAAE,IAAI,GAAG,KAAK,GAAG,sBAAsB,CAAC;SACxD,IAAI,IAAI,KAAK,GAAG;QAAE,IAAI,GAAG,KAAK,GAAG,qBAAqB,CAAC;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,uBAAuB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACnD,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,SAAS;AAET,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IACzD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACtE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,uBAAuB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACnD,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,10 +3,9 @@ export interface MsProjOptions {
3
3
  /** Project name attribute. Defaults to roadmap title. */
4
4
  projectName?: string;
5
5
  /**
6
- * Anchor date (YYYY-MM-DD). MS Project needs absolute Start dates;
7
- * relative-only Nowline roadmaps anchor every task here. Falls back to
8
- * `inputs.today` (UTC midnight) if absent; and if that is also absent,
9
- * to `2026-01-05` (a deterministic Monday) so tests are stable.
6
+ * Project start date (YYYY-MM-DD) written to `<StartDate>`. Defaults to
7
+ * the schedule's start, the same anchor every task date uses: the
8
+ * roadmap's `start:`, else `inputs.today` (UTC midnight).
10
9
  *
11
10
  * Documented as not round-trippable.
12
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOzD,MAAM,WAAW,aAAa;IAC1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAmCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAgFzF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQzD,MAAM,WAAW,aAAa;IAC1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAwDD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAgGzF"}