@openhi/types 0.0.43 → 0.0.44
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/lib/extensions/index.d.ts +1 -0
- package/lib/extensions/index.js +2 -1
- package/lib/extensions/on-site-medical/appointment-series.d.ts +124 -0
- package/lib/extensions/on-site-medical/appointment-series.js +169 -0
- package/lib/extensions/on-site-medical/index.d.ts +8 -0
- package/lib/extensions/on-site-medical/index.js +25 -0
- package/package.json +1 -1
package/lib/extensions/index.js
CHANGED
|
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./on-site-medical"), exports);
|
|
17
18
|
__exportStar(require("./openhi"), exports);
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQWtDO0FBQ2xDLDJDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL29uLXNpdGUtbWVkaWNhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlbmhpXCI7XG4iXX0=
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hand-authored identifier systems, extension URLs, schemas, and accessors
|
|
3
|
+
* for the recurring-appointment series contract.
|
|
4
|
+
*
|
|
5
|
+
* **Namespace provenance:** these URLs live in the `on-site-medical.app`
|
|
6
|
+
* namespace because the contract originated in the on-site-medical
|
|
7
|
+
* frontend (its ADR `docs/fhir-mapping/adr-recurring-appointments.md`) and
|
|
8
|
+
* live data already carries them — they are frozen. The concepts are not
|
|
9
|
+
* customer-specific: if recurring-series support is later promoted to a
|
|
10
|
+
* platform-level feature, the path is minting `hl7.openhi.org` URLs and
|
|
11
|
+
* migrating stored data, not re-typing. Until then this module is the
|
|
12
|
+
* single shared definition for both the OpenHI backend (series operations,
|
|
13
|
+
* `@openhi/constructs` `src/data/recurrence/`) and the on-site-medical
|
|
14
|
+
* frontend.
|
|
15
|
+
*
|
|
16
|
+
* A recurring series is N independent Appointments sharing the series
|
|
17
|
+
* identifier; each instance also carries a deterministic per-occurrence
|
|
18
|
+
* identifier (`<seriesId>/<occurrence instant ISO>` — the generated slot,
|
|
19
|
+
* stable across reschedules) and three re-expansion extensions (RRULE,
|
|
20
|
+
* IANA timezone, series anchor). Instances individually edited away from
|
|
21
|
+
* the series template are flagged `series-instance-overridden` so
|
|
22
|
+
* series-wide edits skip them.
|
|
23
|
+
*/
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
import type { Appointment } from "../../data/appointment";
|
|
26
|
+
import type { Extension } from "../../data/extension";
|
|
27
|
+
import type { Identifier } from "../../data/identifier";
|
|
28
|
+
/** Identifier system shared by every instance of one series. */
|
|
29
|
+
export declare const APPOINTMENT_SERIES_SYSTEM: "https://on-site-medical.app/fhir/NamingSystem/appointment-series";
|
|
30
|
+
/** Identifier system for the deterministic per-occurrence key. */
|
|
31
|
+
export declare const APPOINTMENT_SERIES_OCCURRENCE_SYSTEM: "https://on-site-medical.app/fhir/NamingSystem/appointment-series-occurrence";
|
|
32
|
+
/** Extension carrying the RFC 5545 RRULE string (subset). */
|
|
33
|
+
export declare const RECURRENCE_RULE_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule";
|
|
34
|
+
/** Extension carrying the series' IANA time zone. */
|
|
35
|
+
export declare const RECURRENCE_TIMEZONE_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone";
|
|
36
|
+
/** Extension carrying the series anchor (first-occurrence instant, DTSTART). */
|
|
37
|
+
export declare const RECURRENCE_ANCHOR_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor";
|
|
38
|
+
/** Extension flagging an instance as diverged from its series template. */
|
|
39
|
+
export declare const SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden";
|
|
40
|
+
export declare const recurrenceRuleExtensionSchema: z.ZodObject<{
|
|
41
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
|
|
42
|
+
valueString: z.ZodString;
|
|
43
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
44
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
|
|
45
|
+
valueString: z.ZodString;
|
|
46
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
47
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
|
|
48
|
+
valueString: z.ZodString;
|
|
49
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
50
|
+
export type RecurrenceRuleExtension = z.infer<typeof recurrenceRuleExtensionSchema>;
|
|
51
|
+
export declare const recurrenceTimezoneExtensionSchema: z.ZodObject<{
|
|
52
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
|
|
53
|
+
valueString: z.ZodString;
|
|
54
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
55
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
|
|
56
|
+
valueString: z.ZodString;
|
|
57
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
58
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
|
|
59
|
+
valueString: z.ZodString;
|
|
60
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
61
|
+
export type RecurrenceTimezoneExtension = z.infer<typeof recurrenceTimezoneExtensionSchema>;
|
|
62
|
+
export declare const recurrenceAnchorExtensionSchema: z.ZodObject<{
|
|
63
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
|
|
64
|
+
valueDateTime: z.ZodString;
|
|
65
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
66
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
|
|
67
|
+
valueDateTime: z.ZodString;
|
|
68
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
69
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
|
|
70
|
+
valueDateTime: z.ZodString;
|
|
71
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
72
|
+
export type RecurrenceAnchorExtension = z.infer<typeof recurrenceAnchorExtensionSchema>;
|
|
73
|
+
export declare const seriesInstanceOverriddenExtensionSchema: z.ZodObject<{
|
|
74
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
|
|
75
|
+
valueBoolean: z.ZodBoolean;
|
|
76
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
77
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
|
|
78
|
+
valueBoolean: z.ZodBoolean;
|
|
79
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
80
|
+
url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
|
|
81
|
+
valueBoolean: z.ZodBoolean;
|
|
82
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
83
|
+
export type SeriesInstanceOverriddenExtension = z.infer<typeof seriesInstanceOverriddenExtensionSchema>;
|
|
84
|
+
/** Builds the shared series identifier stamped on every instance of a series. */
|
|
85
|
+
export declare function buildSeriesIdentifier(seriesId: string): Identifier;
|
|
86
|
+
/**
|
|
87
|
+
* Builds the deterministic per-occurrence identifier
|
|
88
|
+
* (`<seriesId>/<occurrence instant>`). The occurrence instant is the slot the
|
|
89
|
+
* instance was generated for; it stays stable if the instance is later
|
|
90
|
+
* rescheduled.
|
|
91
|
+
*/
|
|
92
|
+
export declare function buildOccurrenceIdentifier(seriesId: string, occurrence: Date): Identifier;
|
|
93
|
+
/** Builds the extension carrying the RFC 5545 RRULE string. */
|
|
94
|
+
export declare function buildRecurrenceRuleExtension(rrule: string): Extension;
|
|
95
|
+
/** Builds the extension carrying the series' IANA time zone. */
|
|
96
|
+
export declare function buildRecurrenceTimezoneExtension(timezone: string): Extension;
|
|
97
|
+
/** Builds the extension carrying the series anchor (first-occurrence instant). */
|
|
98
|
+
export declare function buildRecurrenceAnchorExtension(anchor: Date): Extension;
|
|
99
|
+
/** Builds the extension that marks an instance as diverged from its series. */
|
|
100
|
+
export declare function buildSeriesInstanceOverriddenExtension(): Extension;
|
|
101
|
+
/** Returns the series id an Appointment belongs to, or null if it is standalone. */
|
|
102
|
+
export declare function getSeriesId(appointment: Appointment): string | null;
|
|
103
|
+
/** Returns the per-occurrence identifier value, or null. */
|
|
104
|
+
export declare function getOccurrenceIdentifier(appointment: Appointment): string | null;
|
|
105
|
+
/**
|
|
106
|
+
* Returns the occurrence's original slot instant (ISO string) parsed from the
|
|
107
|
+
* per-occurrence identifier (`<seriesId>/<instant>`), or null. Unlike the
|
|
108
|
+
* live `start`, this survives reschedules — it identifies the slot the
|
|
109
|
+
* instance was generated for, so it's the right key for "this and following"
|
|
110
|
+
* boundaries and append points.
|
|
111
|
+
*/
|
|
112
|
+
export declare function getOccurrenceInstant(appointment: Appointment): string | null;
|
|
113
|
+
/** Returns the RRULE string carried on an Appointment, or null. */
|
|
114
|
+
export declare function getRecurrenceRule(appointment: Appointment): string | null;
|
|
115
|
+
/** Returns the series' IANA time zone, or null. */
|
|
116
|
+
export declare function getRecurrenceTimezone(appointment: Appointment): string | null;
|
|
117
|
+
/**
|
|
118
|
+
* Returns the series anchor (first-occurrence instant), or null when absent.
|
|
119
|
+
* Throws on a malformed stored value — that's a producer bug to surface, not
|
|
120
|
+
* a state to paper over.
|
|
121
|
+
*/
|
|
122
|
+
export declare function getRecurrenceAnchor(appointment: Appointment): Date | null;
|
|
123
|
+
/** True when this instance has been edited away from its series template. */
|
|
124
|
+
export declare function isSeriesInstanceOverridden(appointment: Appointment): boolean;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seriesInstanceOverriddenExtensionSchema = exports.recurrenceAnchorExtensionSchema = exports.recurrenceTimezoneExtensionSchema = exports.recurrenceRuleExtensionSchema = exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL = exports.RECURRENCE_ANCHOR_EXTENSION_URL = exports.RECURRENCE_TIMEZONE_EXTENSION_URL = exports.RECURRENCE_RULE_EXTENSION_URL = exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM = exports.APPOINTMENT_SERIES_SYSTEM = void 0;
|
|
4
|
+
exports.buildSeriesIdentifier = buildSeriesIdentifier;
|
|
5
|
+
exports.buildOccurrenceIdentifier = buildOccurrenceIdentifier;
|
|
6
|
+
exports.buildRecurrenceRuleExtension = buildRecurrenceRuleExtension;
|
|
7
|
+
exports.buildRecurrenceTimezoneExtension = buildRecurrenceTimezoneExtension;
|
|
8
|
+
exports.buildRecurrenceAnchorExtension = buildRecurrenceAnchorExtension;
|
|
9
|
+
exports.buildSeriesInstanceOverriddenExtension = buildSeriesInstanceOverriddenExtension;
|
|
10
|
+
exports.getSeriesId = getSeriesId;
|
|
11
|
+
exports.getOccurrenceIdentifier = getOccurrenceIdentifier;
|
|
12
|
+
exports.getOccurrenceInstant = getOccurrenceInstant;
|
|
13
|
+
exports.getRecurrenceRule = getRecurrenceRule;
|
|
14
|
+
exports.getRecurrenceTimezone = getRecurrenceTimezone;
|
|
15
|
+
exports.getRecurrenceAnchor = getRecurrenceAnchor;
|
|
16
|
+
exports.isSeriesInstanceOverridden = isSeriesInstanceOverridden;
|
|
17
|
+
/**
|
|
18
|
+
* Hand-authored identifier systems, extension URLs, schemas, and accessors
|
|
19
|
+
* for the recurring-appointment series contract.
|
|
20
|
+
*
|
|
21
|
+
* **Namespace provenance:** these URLs live in the `on-site-medical.app`
|
|
22
|
+
* namespace because the contract originated in the on-site-medical
|
|
23
|
+
* frontend (its ADR `docs/fhir-mapping/adr-recurring-appointments.md`) and
|
|
24
|
+
* live data already carries them — they are frozen. The concepts are not
|
|
25
|
+
* customer-specific: if recurring-series support is later promoted to a
|
|
26
|
+
* platform-level feature, the path is minting `hl7.openhi.org` URLs and
|
|
27
|
+
* migrating stored data, not re-typing. Until then this module is the
|
|
28
|
+
* single shared definition for both the OpenHI backend (series operations,
|
|
29
|
+
* `@openhi/constructs` `src/data/recurrence/`) and the on-site-medical
|
|
30
|
+
* frontend.
|
|
31
|
+
*
|
|
32
|
+
* A recurring series is N independent Appointments sharing the series
|
|
33
|
+
* identifier; each instance also carries a deterministic per-occurrence
|
|
34
|
+
* identifier (`<seriesId>/<occurrence instant ISO>` — the generated slot,
|
|
35
|
+
* stable across reschedules) and three re-expansion extensions (RRULE,
|
|
36
|
+
* IANA timezone, series anchor). Instances individually edited away from
|
|
37
|
+
* the series template are flagged `series-instance-overridden` so
|
|
38
|
+
* series-wide edits skip them.
|
|
39
|
+
*/
|
|
40
|
+
const zod_1 = require("zod");
|
|
41
|
+
/** Identifier system shared by every instance of one series. */
|
|
42
|
+
exports.APPOINTMENT_SERIES_SYSTEM = "https://on-site-medical.app/fhir/NamingSystem/appointment-series";
|
|
43
|
+
/** Identifier system for the deterministic per-occurrence key. */
|
|
44
|
+
exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM = "https://on-site-medical.app/fhir/NamingSystem/appointment-series-occurrence";
|
|
45
|
+
/** Extension carrying the RFC 5545 RRULE string (subset). */
|
|
46
|
+
exports.RECURRENCE_RULE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule";
|
|
47
|
+
/** Extension carrying the series' IANA time zone. */
|
|
48
|
+
exports.RECURRENCE_TIMEZONE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone";
|
|
49
|
+
/** Extension carrying the series anchor (first-occurrence instant, DTSTART). */
|
|
50
|
+
exports.RECURRENCE_ANCHOR_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor";
|
|
51
|
+
/** Extension flagging an instance as diverged from its series template. */
|
|
52
|
+
exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden";
|
|
53
|
+
exports.recurrenceRuleExtensionSchema = zod_1.z
|
|
54
|
+
.object({
|
|
55
|
+
url: zod_1.z.literal(exports.RECURRENCE_RULE_EXTENSION_URL),
|
|
56
|
+
valueString: zod_1.z.string(),
|
|
57
|
+
})
|
|
58
|
+
.passthrough();
|
|
59
|
+
exports.recurrenceTimezoneExtensionSchema = zod_1.z
|
|
60
|
+
.object({
|
|
61
|
+
url: zod_1.z.literal(exports.RECURRENCE_TIMEZONE_EXTENSION_URL),
|
|
62
|
+
valueString: zod_1.z.string(),
|
|
63
|
+
})
|
|
64
|
+
.passthrough();
|
|
65
|
+
exports.recurrenceAnchorExtensionSchema = zod_1.z
|
|
66
|
+
.object({
|
|
67
|
+
url: zod_1.z.literal(exports.RECURRENCE_ANCHOR_EXTENSION_URL),
|
|
68
|
+
valueDateTime: zod_1.z.string(),
|
|
69
|
+
})
|
|
70
|
+
.passthrough();
|
|
71
|
+
exports.seriesInstanceOverriddenExtensionSchema = zod_1.z
|
|
72
|
+
.object({
|
|
73
|
+
url: zod_1.z.literal(exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL),
|
|
74
|
+
valueBoolean: zod_1.z.boolean(),
|
|
75
|
+
})
|
|
76
|
+
.passthrough();
|
|
77
|
+
/** Builds the shared series identifier stamped on every instance of a series. */
|
|
78
|
+
function buildSeriesIdentifier(seriesId) {
|
|
79
|
+
return { system: exports.APPOINTMENT_SERIES_SYSTEM, value: seriesId };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Builds the deterministic per-occurrence identifier
|
|
83
|
+
* (`<seriesId>/<occurrence instant>`). The occurrence instant is the slot the
|
|
84
|
+
* instance was generated for; it stays stable if the instance is later
|
|
85
|
+
* rescheduled.
|
|
86
|
+
*/
|
|
87
|
+
function buildOccurrenceIdentifier(seriesId, occurrence) {
|
|
88
|
+
return {
|
|
89
|
+
system: exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM,
|
|
90
|
+
value: `${seriesId}/${occurrence.toISOString()}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Builds the extension carrying the RFC 5545 RRULE string. */
|
|
94
|
+
function buildRecurrenceRuleExtension(rrule) {
|
|
95
|
+
return { url: exports.RECURRENCE_RULE_EXTENSION_URL, valueString: rrule };
|
|
96
|
+
}
|
|
97
|
+
/** Builds the extension carrying the series' IANA time zone. */
|
|
98
|
+
function buildRecurrenceTimezoneExtension(timezone) {
|
|
99
|
+
return { url: exports.RECURRENCE_TIMEZONE_EXTENSION_URL, valueString: timezone };
|
|
100
|
+
}
|
|
101
|
+
/** Builds the extension carrying the series anchor (first-occurrence instant). */
|
|
102
|
+
function buildRecurrenceAnchorExtension(anchor) {
|
|
103
|
+
return {
|
|
104
|
+
url: exports.RECURRENCE_ANCHOR_EXTENSION_URL,
|
|
105
|
+
valueDateTime: anchor.toISOString(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Builds the extension that marks an instance as diverged from its series. */
|
|
109
|
+
function buildSeriesInstanceOverriddenExtension() {
|
|
110
|
+
return { url: exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL, valueBoolean: true };
|
|
111
|
+
}
|
|
112
|
+
/** Returns the series id an Appointment belongs to, or null if it is standalone. */
|
|
113
|
+
function getSeriesId(appointment) {
|
|
114
|
+
const identifier = appointment.identifier?.find((id) => id.system === exports.APPOINTMENT_SERIES_SYSTEM);
|
|
115
|
+
return identifier?.value ?? null;
|
|
116
|
+
}
|
|
117
|
+
/** Returns the per-occurrence identifier value, or null. */
|
|
118
|
+
function getOccurrenceIdentifier(appointment) {
|
|
119
|
+
const identifier = appointment.identifier?.find((id) => id.system === exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM);
|
|
120
|
+
return identifier?.value ?? null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Returns the occurrence's original slot instant (ISO string) parsed from the
|
|
124
|
+
* per-occurrence identifier (`<seriesId>/<instant>`), or null. Unlike the
|
|
125
|
+
* live `start`, this survives reschedules — it identifies the slot the
|
|
126
|
+
* instance was generated for, so it's the right key for "this and following"
|
|
127
|
+
* boundaries and append points.
|
|
128
|
+
*/
|
|
129
|
+
function getOccurrenceInstant(appointment) {
|
|
130
|
+
const value = getOccurrenceIdentifier(appointment);
|
|
131
|
+
if (!value)
|
|
132
|
+
return null;
|
|
133
|
+
const slash = value.indexOf("/");
|
|
134
|
+
if (slash === -1 || slash === value.length - 1) {
|
|
135
|
+
throw new Error(`Malformed occurrence identifier: ${value}`);
|
|
136
|
+
}
|
|
137
|
+
return value.slice(slash + 1);
|
|
138
|
+
}
|
|
139
|
+
/** Returns the RRULE string carried on an Appointment, or null. */
|
|
140
|
+
function getRecurrenceRule(appointment) {
|
|
141
|
+
const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_RULE_EXTENSION_URL);
|
|
142
|
+
return extension?.valueString ?? null;
|
|
143
|
+
}
|
|
144
|
+
/** Returns the series' IANA time zone, or null. */
|
|
145
|
+
function getRecurrenceTimezone(appointment) {
|
|
146
|
+
const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_TIMEZONE_EXTENSION_URL);
|
|
147
|
+
return extension?.valueString ?? null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns the series anchor (first-occurrence instant), or null when absent.
|
|
151
|
+
* Throws on a malformed stored value — that's a producer bug to surface, not
|
|
152
|
+
* a state to paper over.
|
|
153
|
+
*/
|
|
154
|
+
function getRecurrenceAnchor(appointment) {
|
|
155
|
+
const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_ANCHOR_EXTENSION_URL);
|
|
156
|
+
if (!extension?.valueDateTime)
|
|
157
|
+
return null;
|
|
158
|
+
const anchor = new Date(extension.valueDateTime);
|
|
159
|
+
if (Number.isNaN(anchor.getTime())) {
|
|
160
|
+
throw new Error(`Invalid recurrence anchor on Appointment: ${extension.valueDateTime}`);
|
|
161
|
+
}
|
|
162
|
+
return anchor;
|
|
163
|
+
}
|
|
164
|
+
/** True when this instance has been edited away from its series template. */
|
|
165
|
+
function isSeriesInstanceOverridden(appointment) {
|
|
166
|
+
const extension = appointment.extension?.find((ext) => ext.url === exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL);
|
|
167
|
+
return extension?.valueBoolean === true;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtc2VyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvb24tc2l0ZS1tZWRpY2FsL2FwcG9pbnRtZW50LXNlcmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2RkEsc0RBRUM7QUFRRCw4REFRQztBQUdELG9FQUVDO0FBR0QsNEVBRUM7QUFHRCx3RUFLQztBQUdELHdGQUVDO0FBR0Qsa0NBS0M7QUFHRCwwREFPQztBQVNELG9EQVFDO0FBR0QsOENBS0M7QUFHRCxzREFLQztBQU9ELGtEQVlDO0FBR0QsZ0VBS0M7QUFwTkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCw2QkFBd0I7QUFLeEIsZ0VBQWdFO0FBQ25ELFFBQUEseUJBQXlCLEdBQ3BDLGtFQUEyRSxDQUFDO0FBRTlFLGtFQUFrRTtBQUNyRCxRQUFBLG9DQUFvQyxHQUMvQyw2RUFBc0YsQ0FBQztBQUV6Riw2REFBNkQ7QUFDaEQsUUFBQSw2QkFBNkIsR0FDeEMsc0VBQStFLENBQUM7QUFFbEYscURBQXFEO0FBQ3hDLFFBQUEsaUNBQWlDLEdBQzVDLDBFQUFtRixDQUFDO0FBRXRGLGdGQUFnRjtBQUNuRSxRQUFBLCtCQUErQixHQUMxQyx3RUFBaUYsQ0FBQztBQUVwRiwyRUFBMkU7QUFDOUQsUUFBQSx3Q0FBd0MsR0FDbkQsaUZBQTBGLENBQUM7QUFFaEYsUUFBQSw2QkFBNkIsR0FBRyxPQUFDO0tBQzNDLE1BQU0sQ0FBQztJQUNOLEdBQUcsRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLHFDQUE2QixDQUFDO0lBQzdDLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3hCLENBQUM7S0FDRCxXQUFXLEVBQUUsQ0FBQztBQUtKLFFBQUEsaUNBQWlDLEdBQUcsT0FBQztLQUMvQyxNQUFNLENBQUM7SUFDTixHQUFHLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyx5Q0FBaUMsQ0FBQztJQUNqRCxX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SUFBSSxLQUFLLENBQ2IsNkNBQTZDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQWdCLDBCQUEwQixDQUFDLFdBQXdCO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUMzQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxnREFBd0MsQ0FDOUQsQ0FBQztJQUNGLE9BQU8sU0FBUyxFQUFFLFlBQVksS0FBSyxJQUFJLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGFuZC1hdXRob3JlZCBpZGVudGlmaWVyIHN5c3RlbXMsIGV4dGVuc2lvbiBVUkxzLCBzY2hlbWFzLCBhbmQgYWNjZXNzb3JzXG4gKiBmb3IgdGhlIHJlY3VycmluZy1hcHBvaW50bWVudCBzZXJpZXMgY29udHJhY3QuXG4gKlxuICogKipOYW1lc3BhY2UgcHJvdmVuYW5jZToqKiB0aGVzZSBVUkxzIGxpdmUgaW4gdGhlIGBvbi1zaXRlLW1lZGljYWwuYXBwYFxuICogbmFtZXNwYWNlIGJlY2F1c2UgdGhlIGNvbnRyYWN0IG9yaWdpbmF0ZWQgaW4gdGhlIG9uLXNpdGUtbWVkaWNhbFxuICogZnJvbnRlbmQgKGl0cyBBRFIgYGRvY3MvZmhpci1tYXBwaW5nL2Fkci1yZWN1cnJpbmctYXBwb2ludG1lbnRzLm1kYCkgYW5kXG4gKiBsaXZlIGRhdGEgYWxyZWFkeSBjYXJyaWVzIHRoZW0g4oCUIHRoZXkgYXJlIGZyb3plbi4gVGhlIGNvbmNlcHRzIGFyZSBub3RcbiAqIGN1c3RvbWVyLXNwZWNpZmljOiBpZiByZWN1cnJpbmctc2VyaWVzIHN1cHBvcnQgaXMgbGF0ZXIgcHJvbW90ZWQgdG8gYVxuICogcGxhdGZvcm0tbGV2ZWwgZmVhdHVyZSwgdGhlIHBhdGggaXMgbWludGluZyBgaGw3Lm9wZW5oaS5vcmdgIFVSTHMgYW5kXG4gKiBtaWdyYXRpbmcgc3RvcmVkIGRhdGEsIG5vdCByZS10eXBpbmcuIFVudGlsIHRoZW4gdGhpcyBtb2R1bGUgaXMgdGhlXG4gKiBzaW5nbGUgc2hhcmVkIGRlZmluaXRpb24gZm9yIGJvdGggdGhlIE9wZW5ISSBiYWNrZW5kIChzZXJpZXMgb3BlcmF0aW9ucyxcbiAqIGBAb3BlbmhpL2NvbnN0cnVjdHNgIGBzcmMvZGF0YS9yZWN1cnJlbmNlL2ApIGFuZCB0aGUgb24tc2l0ZS1tZWRpY2FsXG4gKiBmcm9udGVuZC5cbiAqXG4gKiBBIHJlY3VycmluZyBzZXJpZXMgaXMgTiBpbmRlcGVuZGVudCBBcHBvaW50bWVudHMgc2hhcmluZyB0aGUgc2VyaWVzXG4gKiBpZGVudGlmaWVyOyBlYWNoIGluc3RhbmNlIGFsc28gY2FycmllcyBhIGRldGVybWluaXN0aWMgcGVyLW9jY3VycmVuY2VcbiAqIGlkZW50aWZpZXIgKGA8c2VyaWVzSWQ+LzxvY2N1cnJlbmNlIGluc3RhbnQgSVNPPmAg4oCUIHRoZSBnZW5lcmF0ZWQgc2xvdCxcbiAqIHN0YWJsZSBhY3Jvc3MgcmVzY2hlZHVsZXMpIGFuZCB0aHJlZSByZS1leHBhbnNpb24gZXh0ZW5zaW9ucyAoUlJVTEUsXG4gKiBJQU5BIHRpbWV6b25lLCBzZXJpZXMgYW5jaG9yKS4gSW5zdGFuY2VzIGluZGl2aWR1YWxseSBlZGl0ZWQgYXdheSBmcm9tXG4gKiB0aGUgc2VyaWVzIHRlbXBsYXRlIGFyZSBmbGFnZ2VkIGBzZXJpZXMtaW5zdGFuY2Utb3ZlcnJpZGRlbmAgc29cbiAqIHNlcmllcy13aWRlIGVkaXRzIHNraXAgdGhlbS5cbiAqL1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQXBwb2ludG1lbnQgfSBmcm9tIFwiLi4vLi4vZGF0YS9hcHBvaW50bWVudFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbnNpb25cIjtcbmltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9kYXRhL2lkZW50aWZpZXJcIjtcblxuLyoqIElkZW50aWZpZXIgc3lzdGVtIHNoYXJlZCBieSBldmVyeSBpbnN0YW5jZSBvZiBvbmUgc2VyaWVzLiAqL1xuZXhwb3J0IGNvbnN0IEFQUE9JTlRNRU5UX1NFUklFU19TWVNURU0gPVxuICBcImh0dHBzOi8vb24tc2l0ZS1tZWRpY2FsLmFwcC9maGlyL05hbWluZ1N5c3RlbS9hcHBvaW50bWVudC1zZXJpZXNcIiBhcyBjb25zdDtcblxuLyoqIElkZW50aWZpZXIgc3lzdGVtIGZvciB0aGUgZGV0ZXJtaW5pc3RpYyBwZXItb2NjdXJyZW5jZSBrZXkuICovXG5leHBvcnQgY29uc3QgQVBQT0lOVE1FTlRfU0VSSUVTX09DQ1VSUkVOQ0VfU1lTVEVNID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9OYW1pbmdTeXN0ZW0vYXBwb2ludG1lbnQtc2VyaWVzLW9jY3VycmVuY2VcIiBhcyBjb25zdDtcblxuLyoqIEV4dGVuc2lvbiBjYXJyeWluZyB0aGUgUkZDIDU1NDUgUlJVTEUgc3RyaW5nIChzdWJzZXQpLiAqL1xuZXhwb3J0IGNvbnN0IFJFQ1VSUkVOQ0VfUlVMRV9FWFRFTlNJT05fVVJMID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3JlY3VycmVuY2UtcnVsZVwiIGFzIGNvbnN0O1xuXG4vKiogRXh0ZW5zaW9uIGNhcnJ5aW5nIHRoZSBzZXJpZXMnIElBTkEgdGltZSB6b25lLiAqL1xuZXhwb3J0IGNvbnN0IFJFQ1VSUkVOQ0VfVElNRVpPTkVfRVhURU5TSU9OX1VSTCA9XG4gIFwiaHR0cHM6Ly9vbi1zaXRlLW1lZGljYWwuYXBwL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9yZWN1cnJlbmNlLXRpbWV6b25lXCIgYXMgY29uc3Q7XG5cbi8qKiBFeHRlbnNpb24gY2FycnlpbmcgdGhlIHNlcmllcyBhbmNob3IgKGZpcnN0LW9jY3VycmVuY2UgaW5zdGFudCwgRFRTVEFSVCkuICovXG5leHBvcnQgY29uc3QgUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCA9XG4gIFwiaHR0cHM6Ly9vbi1zaXRlLW1lZGljYWwuYXBwL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9yZWN1cnJlbmNlLWFuY2hvclwiIGFzIGNvbnN0O1xuXG4vKiogRXh0ZW5zaW9uIGZsYWdnaW5nIGFuIGluc3RhbmNlIGFzIGRpdmVyZ2VkIGZyb20gaXRzIHNlcmllcyB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBTRVJJRVNfSU5TVEFOQ0VfT1ZFUlJJRERFTl9FWFRFTlNJT05fVVJMID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3Nlcmllcy1pbnN0YW5jZS1vdmVycmlkZGVuXCIgYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZWN1cnJlbmNlUnVsZUV4dGVuc2lvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXJsOiB6LmxpdGVyYWwoUkVDVVJSRU5DRV9SVUxFX0VYVEVOU0lPTl9VUkwpLFxuICAgIHZhbHVlU3RyaW5nOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VSdWxlRXh0ZW5zaW9uID0gei5pbmZlcjxcbiAgdHlwZW9mIHJlY3VycmVuY2VSdWxlRXh0ZW5zaW9uU2NoZW1hXG4+O1xuXG5leHBvcnQgY29uc3QgcmVjdXJyZW5jZVRpbWV6b25lRXh0ZW5zaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB1cmw6IHoubGl0ZXJhbChSRUNVUlJFTkNFX1RJTUVaT05FX0VYVEVOU0lPTl9VUkwpLFxuICAgIHZhbHVlU3RyaW5nOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VUaW1lem9uZUV4dGVuc2lvbiA9IHouaW5mZXI8XG4gIHR5cGVvZiByZWN1cnJlbmNlVGltZXpvbmVFeHRlbnNpb25TY2hlbWFcbj47XG5cbmV4cG9ydCBjb25zdCByZWN1cnJlbmNlQW5jaG9yRXh0ZW5zaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB1cmw6IHoubGl0ZXJhbChSRUNVUlJFTkNFX0FOQ0hPUl9FWFRFTlNJT05fVVJMKSxcbiAgICB2YWx1ZURhdGVUaW1lOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VBbmNob3JFeHRlbnNpb24gPSB6LmluZmVyPFxuICB0eXBlb2YgcmVjdXJyZW5jZUFuY2hvckV4dGVuc2lvblNjaGVtYVxuPjtcblxuZXhwb3J0IGNvbnN0IHNlcmllc0luc3RhbmNlT3ZlcnJpZGRlbkV4dGVuc2lvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXJsOiB6LmxpdGVyYWwoU0VSSUVTX0lOU1RBTkNFX09WRVJSSURERU5fRVhURU5TSU9OX1VSTCksXG4gICAgdmFsdWVCb29sZWFuOiB6LmJvb2xlYW4oKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKCk7XG5leHBvcnQgdHlwZSBTZXJpZXNJbnN0YW5jZU92ZXJyaWRkZW5FeHRlbnNpb24gPSB6LmluZmVyPFxuICB0eXBlb2Ygc2VyaWVzSW5zdGFuY2VPdmVycmlkZGVuRXh0ZW5zaW9uU2NoZW1hXG4+O1xuXG4vKiogQnVpbGRzIHRoZSBzaGFyZWQgc2VyaWVzIGlkZW50aWZpZXIgc3RhbXBlZCBvbiBldmVyeSBpbnN0YW5jZSBvZiBhIHNlcmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNlcmllc0lkZW50aWZpZXIoc2VyaWVzSWQ6IHN0cmluZyk6IElkZW50aWZpZXIge1xuICByZXR1cm4geyBzeXN0ZW06IEFQUE9JTlRNRU5UX1NFUklFU19TWVNURU0sIHZhbHVlOiBzZXJpZXNJZCB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZGV0ZXJtaW5pc3RpYyBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyXG4gKiAoYDxzZXJpZXNJZD4vPG9jY3VycmVuY2UgaW5zdGFudD5gKS4gVGhlIG9jY3VycmVuY2UgaW5zdGFudCBpcyB0aGUgc2xvdCB0aGVcbiAqIGluc3RhbmNlIHdhcyBnZW5lcmF0ZWQgZm9yOyBpdCBzdGF5cyBzdGFibGUgaWYgdGhlIGluc3RhbmNlIGlzIGxhdGVyXG4gKiByZXNjaGVkdWxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT2NjdXJyZW5jZUlkZW50aWZpZXIoXG4gIHNlcmllc0lkOiBzdHJpbmcsXG4gIG9jY3VycmVuY2U6IERhdGUsXG4pOiBJZGVudGlmaWVyIHtcbiAgcmV0dXJuIHtcbiAgICBzeXN0ZW06IEFQUE9JTlRNRU5UX1NFUklFU19PQ0NVUlJFTkNFX1NZU1RFTSxcbiAgICB2YWx1ZTogYCR7c2VyaWVzSWR9LyR7b2NjdXJyZW5jZS50b0lTT1N0cmluZygpfWAsXG4gIH07XG59XG5cbi8qKiBCdWlsZHMgdGhlIGV4dGVuc2lvbiBjYXJyeWluZyB0aGUgUkZDIDU1NDUgUlJVTEUgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVjdXJyZW5jZVJ1bGVFeHRlbnNpb24ocnJ1bGU6IHN0cmluZyk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogUkVDVVJSRU5DRV9SVUxFX0VYVEVOU0lPTl9VUkwsIHZhbHVlU3RyaW5nOiBycnVsZSB9O1xufVxuXG4vKiogQnVpbGRzIHRoZSBleHRlbnNpb24gY2FycnlpbmcgdGhlIHNlcmllcycgSUFOQSB0aW1lIHpvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZWN1cnJlbmNlVGltZXpvbmVFeHRlbnNpb24odGltZXpvbmU6IHN0cmluZyk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogUkVDVVJSRU5DRV9USU1FWk9ORV9FWFRFTlNJT05fVVJMLCB2YWx1ZVN0cmluZzogdGltZXpvbmUgfTtcbn1cblxuLyoqIEJ1aWxkcyB0aGUgZXh0ZW5zaW9uIGNhcnJ5aW5nIHRoZSBzZXJpZXMgYW5jaG9yIChmaXJzdC1vY2N1cnJlbmNlIGluc3RhbnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVjdXJyZW5jZUFuY2hvckV4dGVuc2lvbihhbmNob3I6IERhdGUpOiBFeHRlbnNpb24ge1xuICByZXR1cm4ge1xuICAgIHVybDogUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCxcbiAgICB2YWx1ZURhdGVUaW1lOiBhbmNob3IudG9JU09TdHJpbmcoKSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkcyB0aGUgZXh0ZW5zaW9uIHRoYXQgbWFya3MgYW4gaW5zdGFuY2UgYXMgZGl2ZXJnZWQgZnJvbSBpdHMgc2VyaWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VyaWVzSW5zdGFuY2VPdmVycmlkZGVuRXh0ZW5zaW9uKCk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogU0VSSUVTX0lOU1RBTkNFX09WRVJSSURERU5fRVhURU5TSU9OX1VSTCwgdmFsdWVCb29sZWFuOiB0cnVlIH07XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBzZXJpZXMgaWQgYW4gQXBwb2ludG1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiBpdCBpcyBzdGFuZGFsb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmllc0lkKGFwcG9pbnRtZW50OiBBcHBvaW50bWVudCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBpZGVudGlmaWVyID0gYXBwb2ludG1lbnQuaWRlbnRpZmllcj8uZmluZChcbiAgICAoaWQpID0+IGlkLnN5c3RlbSA9PT0gQVBQT0lOVE1FTlRfU0VSSUVTX1NZU1RFTSxcbiAgKTtcbiAgcmV0dXJuIGlkZW50aWZpZXI/LnZhbHVlID8/IG51bGw7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyIHZhbHVlLCBvciBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jY3VycmVuY2VJZGVudGlmaWVyKFxuICBhcHBvaW50bWVudDogQXBwb2ludG1lbnQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaWRlbnRpZmllciA9IGFwcG9pbnRtZW50LmlkZW50aWZpZXI/LmZpbmQoXG4gICAgKGlkKSA9PiBpZC5zeXN0ZW0gPT09IEFQUE9JTlRNRU5UX1NFUklFU19PQ0NVUlJFTkNFX1NZU1RFTSxcbiAgKTtcbiAgcmV0dXJuIGlkZW50aWZpZXI/LnZhbHVlID8/IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2NjdXJyZW5jZSdzIG9yaWdpbmFsIHNsb3QgaW5zdGFudCAoSVNPIHN0cmluZykgcGFyc2VkIGZyb20gdGhlXG4gKiBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyIChgPHNlcmllc0lkPi88aW5zdGFudD5gKSwgb3IgbnVsbC4gVW5saWtlIHRoZVxuICogbGl2ZSBgc3RhcnRgLCB0aGlzIHN1cnZpdmVzIHJlc2NoZWR1bGVzIOKAlCBpdCBpZGVudGlmaWVzIHRoZSBzbG90IHRoZVxuICogaW5zdGFuY2Ugd2FzIGdlbmVyYXRlZCBmb3IsIHNvIGl0J3MgdGhlIHJpZ2h0IGtleSBmb3IgXCJ0aGlzIGFuZCBmb2xsb3dpbmdcIlxuICogYm91bmRhcmllcyBhbmQgYXBwZW5kIHBvaW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jY3VycmVuY2VJbnN0YW50KGFwcG9pbnRtZW50OiBBcHBvaW50bWVudCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IGdldE9jY3VycmVuY2VJZGVudGlmaWVyKGFwcG9pbnRtZW50KTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHNsYXNoID0gdmFsdWUuaW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaCA9PT0gLTEgfHwgc2xhc2ggPT09IHZhbHVlLmxlbmd0aCAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBvY2N1cnJlbmNlIGlkZW50aWZpZXI6ICR7dmFsdWV9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnNsaWNlKHNsYXNoICsgMSk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBSUlVMRSBzdHJpbmcgY2FycmllZCBvbiBhbiBBcHBvaW50bWVudCwgb3IgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN1cnJlbmNlUnVsZShhcHBvaW50bWVudDogQXBwb2ludG1lbnQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gYXBwb2ludG1lbnQuZXh0ZW5zaW9uPy5maW5kKFxuICAgIChleHQpID0+IGV4dC51cmwgPT09IFJFQ1VSUkVOQ0VfUlVMRV9FWFRFTlNJT05fVVJMLFxuICApO1xuICByZXR1cm4gZXh0ZW5zaW9uPy52YWx1ZVN0cmluZyA/PyBudWxsO1xufVxuXG4vKiogUmV0dXJucyB0aGUgc2VyaWVzJyBJQU5BIHRpbWUgem9uZSwgb3IgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN1cnJlbmNlVGltZXpvbmUoYXBwb2ludG1lbnQ6IEFwcG9pbnRtZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGFwcG9pbnRtZW50LmV4dGVuc2lvbj8uZmluZChcbiAgICAoZXh0KSA9PiBleHQudXJsID09PSBSRUNVUlJFTkNFX1RJTUVaT05FX0VYVEVOU0lPTl9VUkwsXG4gICk7XG4gIHJldHVybiBleHRlbnNpb24/LnZhbHVlU3RyaW5nID8/IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2VyaWVzIGFuY2hvciAoZmlyc3Qtb2NjdXJyZW5jZSBpbnN0YW50KSwgb3IgbnVsbCB3aGVuIGFic2VudC5cbiAqIFRocm93cyBvbiBhIG1hbGZvcm1lZCBzdG9yZWQgdmFsdWUg4oCUIHRoYXQncyBhIHByb2R1Y2VyIGJ1ZyB0byBzdXJmYWNlLCBub3RcbiAqIGEgc3RhdGUgdG8gcGFwZXIgb3Zlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY3VycmVuY2VBbmNob3IoYXBwb2ludG1lbnQ6IEFwcG9pbnRtZW50KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBleHRlbnNpb24gPSBhcHBvaW50bWVudC5leHRlbnNpb24/LmZpbmQoXG4gICAgKGV4dCkgPT4gZXh0LnVybCA9PT0gUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCxcbiAgKTtcbiAgaWYgKCFleHRlbnNpb24/LnZhbHVlRGF0ZVRpbWUpIHJldHVybiBudWxsO1xuICBjb25zdCBhbmNob3IgPSBuZXcgRGF0ZShleHRlbnNpb24udmFsdWVEYXRlVGltZSk7XG4gIGlmIChOdW1iZXIuaXNOYU4oYW5jaG9yLmdldFRpbWUoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCByZWN1cnJlbmNlIGFuY2hvciBvbiBBcHBvaW50bWVudDogJHtleHRlbnNpb24udmFsdWVEYXRlVGltZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFuY2hvcjtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGlzIGluc3RhbmNlIGhhcyBiZWVuIGVkaXRlZCBhd2F5IGZyb20gaXRzIHNlcmllcyB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nlcmllc0luc3RhbmNlT3ZlcnJpZGRlbihhcHBvaW50bWVudDogQXBwb2ludG1lbnQpOiBib29sZWFuIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gYXBwb2ludG1lbnQuZXh0ZW5zaW9uPy5maW5kKFxuICAgIChleHQpID0+IGV4dC51cmwgPT09IFNFUklFU19JTlNUQU5DRV9PVkVSUklEREVOX0VYVEVOU0lPTl9VUkwsXG4gICk7XG4gIHJldHVybiBleHRlbnNpb24/LnZhbHVlQm9vbGVhbiA9PT0gdHJ1ZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Customer-namespaced (`on-site-medical.app`) extension and identifier
|
|
3
|
+
* contracts. Hand-authored, like `../openhi`. See the provenance note in
|
|
4
|
+
* each module — these are frozen wire contracts shared by the OpenHI
|
|
5
|
+
* backend and the on-site-medical frontend, candidates for promotion to
|
|
6
|
+
* platform (`hl7.openhi.org`) namespacing via a future data migration.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./appointment-series";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Customer-namespaced (`on-site-medical.app`) extension and identifier
|
|
19
|
+
* contracts. Hand-authored, like `../openhi`. See the provenance note in
|
|
20
|
+
* each module — these are frozen wire contracts shared by the OpenHI
|
|
21
|
+
* backend and the on-site-medical frontend, candidates for promotion to
|
|
22
|
+
* platform (`hl7.openhi.org`) namespacing via a future data migration.
|
|
23
|
+
*/
|
|
24
|
+
__exportStar(require("./appointment-series"), exports);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXh0ZW5zaW9ucy9vbi1zaXRlLW1lZGljYWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7R0FNRztBQUNILHVEQUFxQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3VzdG9tZXItbmFtZXNwYWNlZCAoYG9uLXNpdGUtbWVkaWNhbC5hcHBgKSBleHRlbnNpb24gYW5kIGlkZW50aWZpZXJcbiAqIGNvbnRyYWN0cy4gSGFuZC1hdXRob3JlZCwgbGlrZSBgLi4vb3BlbmhpYC4gU2VlIHRoZSBwcm92ZW5hbmNlIG5vdGUgaW5cbiAqIGVhY2ggbW9kdWxlIOKAlCB0aGVzZSBhcmUgZnJvemVuIHdpcmUgY29udHJhY3RzIHNoYXJlZCBieSB0aGUgT3BlbkhJXG4gKiBiYWNrZW5kIGFuZCB0aGUgb24tc2l0ZS1tZWRpY2FsIGZyb250ZW5kLCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG9cbiAqIHBsYXRmb3JtIChgaGw3Lm9wZW5oaS5vcmdgKSBuYW1lc3BhY2luZyB2aWEgYSBmdXR1cmUgZGF0YSBtaWdyYXRpb24uXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL2FwcG9pbnRtZW50LXNlcmllc1wiO1xuIl19
|
package/package.json
CHANGED