@medplum/core 0.10.2 → 1.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sources":["../../src/format.ts"],"sourcesContent":["import { Address, HumanName, Period, Timing } from '@medplum/fhirtypes';\nimport { capitalize } from './utils';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\nexport function formatAddress(address: Address, options?: AddressFormatOptions): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city) {\n builder.push(address.city);\n }\n\n if (address.state) {\n builder.push(address.state);\n }\n\n if (address.postalCode) {\n builder.push(address.postalCode);\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(', ').trim();\n}\n\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && options?.suffix !== false) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n\nexport function formatGivenName(name: HumanName): string {\n const builder: string[] = [];\n if (name.given) {\n builder.push(...name.given);\n }\n return builder.join(' ').trim();\n}\n\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\nexport function formatDate(date: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!date) {\n return '';\n }\n const d = new Date(date);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleDateString(undefined, options);\n}\n\nexport function formatTime(time: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!time) {\n return '';\n }\n const d = new Date('2000-01-01T' + time + 'Z');\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleTimeString(undefined, options);\n}\n\nexport function formatDateTime(dateTime: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!dateTime) {\n return '';\n }\n const d = new Date(dateTime);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleString(undefined, options);\n}\n\nexport function formatPeriod(period: Period | undefined): string {\n if (!period || (!period.start && !period.end)) {\n return '';\n }\n return formatDateTime(period.start) + ' - ' + formatDateTime(period.end);\n}\n\nconst unitAdverbForm: Record<string, string> = {\n s: 'every second',\n min: 'every minute',\n h: 'hourly',\n d: 'daily',\n wk: 'weekly',\n mo: 'monthly',\n a: 'annually',\n};\n\nconst singularUnits: Record<string, string> = {\n s: 'second',\n min: 'minute',\n h: 'hour',\n d: 'day',\n wk: 'week',\n mo: 'month',\n a: 'year',\n};\n\nconst pluralUnits: Record<string, string> = {\n s: 'seconds',\n min: 'minutes',\n h: 'hours',\n d: 'days',\n wk: 'weeks',\n mo: 'months',\n a: 'years',\n};\n\nexport function formatTiming(timing: Timing | undefined): string {\n if (!timing) {\n return '';\n }\n\n const builder: string[] = [];\n\n if (timing.repeat?.periodUnit) {\n const frequency = timing.repeat.frequency || 1;\n const period = timing.repeat.period || 1;\n const periodUnit = timing.repeat.periodUnit;\n\n if (frequency === 1 && period === 1) {\n builder.push(unitAdverbForm[periodUnit]);\n } else {\n if (frequency === 1) {\n builder.push('once');\n } else {\n builder.push(frequency + ' times');\n }\n\n if (period === 1) {\n builder.push('per ' + singularUnits[periodUnit]);\n } else {\n builder.push('per ' + period + ' ' + pluralUnits[periodUnit]);\n }\n }\n\n if (timing.repeat.dayOfWeek) {\n builder.push('on ' + timing.repeat.dayOfWeek.map(capitalize).join(', '));\n }\n\n if (timing.repeat.timeOfDay) {\n builder.push('at ' + timing.repeat.timeOfDay.map((t) => formatTime(t)).join(', '));\n }\n }\n\n if (timing.event) {\n builder.push(timing.event.map((d) => formatDateTime(d)).join(', '));\n }\n\n return capitalize(builder.join(' ').trim());\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sources":["../../src/format.ts"],"sourcesContent":["import { Address, HumanName, Period, Timing, Range, Quantity } from '@medplum/fhirtypes';\nimport { capitalize } from './utils';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\nexport function formatAddress(address: Address, options?: AddressFormatOptions): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city) {\n builder.push(address.city);\n }\n\n if (address.state) {\n builder.push(address.state);\n }\n\n if (address.postalCode) {\n builder.push(address.postalCode);\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(', ').trim();\n}\n\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && options?.suffix !== false) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n\nexport function formatGivenName(name: HumanName): string {\n const builder: string[] = [];\n if (name.given) {\n builder.push(...name.given);\n }\n return builder.join(' ').trim();\n}\n\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\nexport function formatDate(date: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!date) {\n return '';\n }\n const d = new Date(date);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleDateString(undefined, options);\n}\n\nexport function formatTime(time: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!time) {\n return '';\n }\n const d = new Date('2000-01-01T' + time + 'Z');\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleTimeString(undefined, options);\n}\n\nexport function formatDateTime(dateTime: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!dateTime) {\n return '';\n }\n const d = new Date(dateTime);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleString(undefined, options);\n}\n\nexport function formatPeriod(period: Period | undefined): string {\n if (!period || (!period.start && !period.end)) {\n return '';\n }\n return formatDateTime(period.start) + ' - ' + formatDateTime(period.end);\n}\n\nconst unitAdverbForm: Record<string, string> = {\n s: 'every second',\n min: 'every minute',\n h: 'hourly',\n d: 'daily',\n wk: 'weekly',\n mo: 'monthly',\n a: 'annually',\n};\n\nconst singularUnits: Record<string, string> = {\n s: 'second',\n min: 'minute',\n h: 'hour',\n d: 'day',\n wk: 'week',\n mo: 'month',\n a: 'year',\n};\n\nconst pluralUnits: Record<string, string> = {\n s: 'seconds',\n min: 'minutes',\n h: 'hours',\n d: 'days',\n wk: 'weeks',\n mo: 'months',\n a: 'years',\n};\n\nexport function formatTiming(timing: Timing | undefined): string {\n if (!timing) {\n return '';\n }\n\n const builder: string[] = [];\n\n if (timing.repeat?.periodUnit) {\n const frequency = timing.repeat.frequency || 1;\n const period = timing.repeat.period || 1;\n const periodUnit = timing.repeat.periodUnit;\n\n if (frequency === 1 && period === 1) {\n builder.push(unitAdverbForm[periodUnit]);\n } else {\n if (frequency === 1) {\n builder.push('once');\n } else {\n builder.push(frequency + ' times');\n }\n\n if (period === 1) {\n builder.push('per ' + singularUnits[periodUnit]);\n } else {\n builder.push('per ' + period + ' ' + pluralUnits[periodUnit]);\n }\n }\n\n if (timing.repeat.dayOfWeek) {\n builder.push('on ' + timing.repeat.dayOfWeek.map(capitalize).join(', '));\n }\n\n if (timing.repeat.timeOfDay) {\n builder.push('at ' + timing.repeat.timeOfDay.map((t) => formatTime(t)).join(', '));\n }\n }\n\n if (timing.event) {\n builder.push(timing.event.map((d) => formatDateTime(d)).join(', '));\n }\n\n return capitalize(builder.join(' ').trim());\n}\n\n/**\n * Returns a human-readable string for a FHIR Range datatype, taking into account comparators and one-sided ranges\n * @param range A FHIR Range element\n * @returns A human-readable string representation of the Range\n */\nexport function formatRange(range: Range | undefined): string {\n if (!range || (range.low?.value === undefined && range.high?.value === undefined)) {\n return '';\n }\n\n if (range.low?.value !== undefined && range.high?.value === undefined) {\n return `>= ${formatQuantity(range.low)}`;\n }\n\n if (range.low?.value === undefined && range.high?.value !== undefined) {\n return `<= ${formatQuantity(range.high)}`;\n }\n\n return `${formatQuantity(range.low)} - ${formatQuantity(range.high)}`;\n}\n\n/**\n * Returns a human-readable string for a FHIR Quantity datatype, taking into account units and comparators\n * @param quantity A FHIR Quantity element\n * @returns A human-readable string representation of the Quantity\n */\nexport function formatQuantity(quantity: Quantity | undefined, precision?: number): string {\n if (!quantity) {\n return '';\n }\n\n const result = [];\n\n if (quantity.comparator) {\n result.push(quantity.comparator);\n result.push(' ');\n }\n\n if (quantity.value !== undefined) {\n if (precision !== undefined) {\n result.push(quantity.value.toFixed(precision));\n } else {\n result.push(quantity.value);\n }\n }\n\n if (quantity.unit) {\n if (quantity.unit !== '%' && result[result.length - 1] !== ' ') {\n result.push(' ');\n }\n result.push(quantity.unit);\n }\n\n return result.join('').trim();\n}\n"],"names":[],"mappings":"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"}
package/dist/esm/hl7.d.ts CHANGED
@@ -1,43 +1,136 @@
1
- export declare const SEGMENT_SEPARATOR = "\r";
2
- export declare const FIELD_SEPARATOR = "|";
3
- export declare const COMPONENT_SEPARATOR = "^";
1
+ /**
2
+ * The Hl7Context class represents the parsing context for an HL7 message.
3
+ *
4
+ * MSH-1:
5
+ * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.1
6
+ *
7
+ * MSH-2:
8
+ * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.2
9
+ *
10
+ * See this tutorial on MSH, and why it's a bad idea to use anything other than the default values:
11
+ * https://www.hl7soup.com/HL7TutorialMSH.html
12
+ */
13
+ export declare class Hl7Context {
14
+ readonly segmentSeparator: string;
15
+ readonly fieldSeparator: string;
16
+ readonly componentSeparator: string;
17
+ readonly repetitionSeparator: string;
18
+ readonly escapeCharacter: string;
19
+ readonly subcomponentSeparator: string;
20
+ constructor(segmentSeparator?: string, fieldSeparator?: string, componentSeparator?: string, repetitionSeparator?: string, escapeCharacter?: string, subcomponentSeparator?: string);
21
+ /**
22
+ * Returns the MSH-2 field value based on the configured separators.
23
+ * @returns The HL7 MSH-2 field value.
24
+ */
25
+ getMsh2(): string;
26
+ }
4
27
  /**
5
28
  * The Hl7Message class represents one HL7 message.
6
29
  * A message is a collection of segments.
7
- * Note that we do not strictly parse messages, and only use default delimeters.
8
30
  */
9
31
  export declare class Hl7Message {
32
+ readonly context: Hl7Context;
10
33
  readonly segments: Hl7Segment[];
11
- constructor(segments: Hl7Segment[]);
34
+ /**
35
+ * Creates a new HL7 message.
36
+ * @param segments The HL7 segments.
37
+ * @param context Optional HL7 parsing context.
38
+ */
39
+ constructor(segments: Hl7Segment[], context?: Hl7Context);
40
+ /**
41
+ * Returns an HL7 segment by index or by name.
42
+ * @param index The HL7 segment index or name.
43
+ * @returns The HL7 segment if found; otherwise, undefined.
44
+ */
12
45
  get(index: number | string): Hl7Segment | undefined;
46
+ /**
47
+ * Returns all HL7 segments of a given name.
48
+ * @param name The HL7 segment name.
49
+ * @returns An array of HL7 segments with the specified name.
50
+ */
13
51
  getAll(name: string): Hl7Segment[];
52
+ /**
53
+ * Returns the HL7 message as a string.
54
+ * @returns The HL7 message as a string.
55
+ */
14
56
  toString(): string;
57
+ /**
58
+ * Returns an HL7 "ACK" (acknowledgement) message for this message.
59
+ * @returns The HL7 "ACK" message.
60
+ */
15
61
  buildAck(): Hl7Message;
62
+ /**
63
+ * Parses an HL7 message string into an Hl7Message object.
64
+ * @param text The HL7 message text.
65
+ * @returns The parsed HL7 message.
66
+ */
16
67
  static parse(text: string): Hl7Message;
17
68
  }
18
69
  /**
19
70
  * The Hl7Segment class represents one HL7 segment.
20
71
  * A segment is a collection of fields.
21
72
  * The name field is the first field.
22
- * Note that we do not strictly parse messages, and only use default delimeters.
23
73
  */
24
74
  export declare class Hl7Segment {
75
+ readonly context: Hl7Context;
25
76
  readonly name: string;
26
77
  readonly fields: Hl7Field[];
27
- constructor(fields: Hl7Field[] | string[]);
78
+ /**
79
+ * Creates a new HL7 segment.
80
+ * @param fields The HL7 fields.
81
+ * @param context Optional HL7 parsing context.
82
+ */
83
+ constructor(fields: Hl7Field[] | string[], context?: Hl7Context);
84
+ /**
85
+ * Returns an HL7 field by index.
86
+ * @param index The HL7 field index.
87
+ * @returns The HL7 field.
88
+ */
28
89
  get(index: number): Hl7Field;
90
+ /**
91
+ * Returns the HL7 segment as a string.
92
+ * @returns The HL7 segment as a string.
93
+ */
29
94
  toString(): string;
30
- static parse(text: string): Hl7Segment;
95
+ /**
96
+ * Parses an HL7 segment string into an Hl7Segment object.
97
+ * @param text The HL7 segment text.
98
+ * @param context Optional HL7 parsing context.
99
+ * @returns The parsed HL7 segment.
100
+ */
101
+ static parse(text: string, context?: Hl7Context): Hl7Segment;
31
102
  }
32
103
  /**
33
104
  * The Hl7Field class represents one HL7 field.
34
105
  * A field is a collection of components.
35
- * Note that we do not strictly parse messages, and only use default delimeters.
36
106
  */
37
107
  export declare class Hl7Field {
38
- readonly components: string[];
39
- constructor(components: string[]);
40
- get(index: number): string;
108
+ readonly context: Hl7Context;
109
+ readonly components: string[][];
110
+ /**
111
+ * Creates a new HL7 field.
112
+ * @param components The HL7 components.
113
+ * @param context Optional HL7 parsing context.
114
+ */
115
+ constructor(components: string[][], context?: Hl7Context);
116
+ /**
117
+ * Returns an HL7 component by index.
118
+ * @param component The component index.
119
+ * @param subcomponent Optional subcomponent index.
120
+ * @param repetition Optional repetition index.
121
+ * @returns The string value of the specified component.
122
+ */
123
+ get(component: number, subcomponent?: number, repetition?: number): string;
124
+ /**
125
+ * Returns the HL7 field as a string.
126
+ * @returns The HL7 field as a string.
127
+ */
41
128
  toString(): string;
42
- static parse(text: string): Hl7Field;
129
+ /**
130
+ * Parses an HL7 field string into an Hl7Field object.
131
+ * @param text The HL7 field text.
132
+ * @param context Optional HL7 parsing context.
133
+ * @returns The parsed HL7 field.
134
+ */
135
+ static parse(text: string, context?: Hl7Context): Hl7Field;
43
136
  }
package/dist/esm/hl7.js CHANGED
@@ -1,29 +1,82 @@
1
1
  import { isStringArray } from './utils.js';
2
2
 
3
- const SEGMENT_SEPARATOR = '\r';
4
- const FIELD_SEPARATOR = '|';
5
- const COMPONENT_SEPARATOR = '^';
3
+ /**
4
+ * The Hl7Context class represents the parsing context for an HL7 message.
5
+ *
6
+ * MSH-1:
7
+ * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.1
8
+ *
9
+ * MSH-2:
10
+ * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.2
11
+ *
12
+ * See this tutorial on MSH, and why it's a bad idea to use anything other than the default values:
13
+ * https://www.hl7soup.com/HL7TutorialMSH.html
14
+ */
15
+ class Hl7Context {
16
+ constructor(segmentSeparator = '\r', fieldSeparator = '|', componentSeparator = '^', repetitionSeparator = '~', escapeCharacter = '\\', subcomponentSeparator = '&') {
17
+ this.segmentSeparator = segmentSeparator;
18
+ this.fieldSeparator = fieldSeparator;
19
+ this.componentSeparator = componentSeparator;
20
+ this.repetitionSeparator = repetitionSeparator;
21
+ this.escapeCharacter = escapeCharacter;
22
+ this.subcomponentSeparator = subcomponentSeparator;
23
+ }
24
+ /**
25
+ * Returns the MSH-2 field value based on the configured separators.
26
+ * @returns The HL7 MSH-2 field value.
27
+ */
28
+ getMsh2() {
29
+ return (this.fieldSeparator +
30
+ this.componentSeparator +
31
+ this.repetitionSeparator +
32
+ this.escapeCharacter +
33
+ this.subcomponentSeparator);
34
+ }
35
+ }
6
36
  /**
7
37
  * The Hl7Message class represents one HL7 message.
8
38
  * A message is a collection of segments.
9
- * Note that we do not strictly parse messages, and only use default delimeters.
10
39
  */
11
40
  class Hl7Message {
12
- constructor(segments) {
41
+ /**
42
+ * Creates a new HL7 message.
43
+ * @param segments The HL7 segments.
44
+ * @param context Optional HL7 parsing context.
45
+ */
46
+ constructor(segments, context = new Hl7Context()) {
47
+ this.context = context;
13
48
  this.segments = segments;
14
49
  }
50
+ /**
51
+ * Returns an HL7 segment by index or by name.
52
+ * @param index The HL7 segment index or name.
53
+ * @returns The HL7 segment if found; otherwise, undefined.
54
+ */
15
55
  get(index) {
16
56
  if (typeof index === 'number') {
17
57
  return this.segments[index];
18
58
  }
19
59
  return this.segments.find((s) => s.name === index);
20
60
  }
61
+ /**
62
+ * Returns all HL7 segments of a given name.
63
+ * @param name The HL7 segment name.
64
+ * @returns An array of HL7 segments with the specified name.
65
+ */
21
66
  getAll(name) {
22
67
  return this.segments.filter((s) => s.name === name);
23
68
  }
69
+ /**
70
+ * Returns the HL7 message as a string.
71
+ * @returns The HL7 message as a string.
72
+ */
24
73
  toString() {
25
- return this.segments.map((s) => s.toString()).join(SEGMENT_SEPARATOR);
74
+ return this.segments.map((s) => s.toString()).join(this.context.segmentSeparator);
26
75
  }
76
+ /**
77
+ * Returns an HL7 "ACK" (acknowledgement) message for this message.
78
+ * @returns The HL7 "ACK" message.
79
+ */
27
80
  buildAck() {
28
81
  var _a, _b, _c, _d, _e, _f;
29
82
  const now = new Date();
@@ -37,7 +90,7 @@ class Hl7Message {
37
90
  return new Hl7Message([
38
91
  new Hl7Segment([
39
92
  'MSH',
40
- '^~\\&',
93
+ this.context.getMsh2(),
41
94
  receivingApp,
42
95
  receivingFacility,
43
96
  sendingApp,
@@ -48,64 +101,121 @@ class Hl7Message {
48
101
  now.getTime().toString(),
49
102
  'P',
50
103
  versionId,
51
- ]),
52
- new Hl7Segment(['MSA', 'AA', controlId, 'OK']),
104
+ ], this.context),
105
+ new Hl7Segment(['MSA', 'AA', controlId, 'OK'], this.context),
53
106
  ]);
54
107
  }
108
+ /**
109
+ * Parses an HL7 message string into an Hl7Message object.
110
+ * @param text The HL7 message text.
111
+ * @returns The parsed HL7 message.
112
+ */
55
113
  static parse(text) {
56
- if (!text.startsWith('MSH|^~\\&')) {
114
+ if (!text.startsWith('MSH')) {
57
115
  const err = new Error('Invalid HL7 message');
58
116
  err.type = 'entity.parse.failed';
59
117
  throw err;
60
118
  }
61
- return new Hl7Message(text.split(/[\r\n]+/).map((line) => Hl7Segment.parse(line)));
119
+ const context = new Hl7Context('\r', text.charAt(3), // Field separator, recommended "|"
120
+ text.charAt(4), // Component separator, recommended "^"
121
+ text.charAt(5), // Repetition separator, recommended "~"
122
+ text.charAt(6), // Escape character, recommended "\"
123
+ text.charAt(7) // Subcomponent separator, recommended "&"
124
+ );
125
+ return new Hl7Message(text.split(/[\r\n]+/).map((line) => Hl7Segment.parse(line, context)), context);
62
126
  }
63
127
  }
64
128
  /**
65
129
  * The Hl7Segment class represents one HL7 segment.
66
130
  * A segment is a collection of fields.
67
131
  * The name field is the first field.
68
- * Note that we do not strictly parse messages, and only use default delimeters.
69
132
  */
70
133
  class Hl7Segment {
71
- constructor(fields) {
134
+ /**
135
+ * Creates a new HL7 segment.
136
+ * @param fields The HL7 fields.
137
+ * @param context Optional HL7 parsing context.
138
+ */
139
+ constructor(fields, context = new Hl7Context()) {
140
+ this.context = context;
72
141
  if (isStringArray(fields)) {
73
142
  this.fields = fields.map((f) => Hl7Field.parse(f));
74
143
  }
75
144
  else {
76
145
  this.fields = fields;
77
146
  }
78
- this.name = this.fields[0].components[0];
147
+ this.name = this.fields[0].components[0][0];
79
148
  }
149
+ /**
150
+ * Returns an HL7 field by index.
151
+ * @param index The HL7 field index.
152
+ * @returns The HL7 field.
153
+ */
80
154
  get(index) {
81
155
  return this.fields[index];
82
156
  }
157
+ /**
158
+ * Returns the HL7 segment as a string.
159
+ * @returns The HL7 segment as a string.
160
+ */
83
161
  toString() {
84
- return this.fields.map((f) => f.toString()).join(FIELD_SEPARATOR);
162
+ return this.fields.map((f) => f.toString()).join(this.context.fieldSeparator);
85
163
  }
86
- static parse(text) {
87
- return new Hl7Segment(text.split(FIELD_SEPARATOR).map((f) => Hl7Field.parse(f)));
164
+ /**
165
+ * Parses an HL7 segment string into an Hl7Segment object.
166
+ * @param text The HL7 segment text.
167
+ * @param context Optional HL7 parsing context.
168
+ * @returns The parsed HL7 segment.
169
+ */
170
+ static parse(text, context = new Hl7Context()) {
171
+ return new Hl7Segment(text.split(context.fieldSeparator).map((f) => Hl7Field.parse(f, context)), context);
88
172
  }
89
173
  }
90
174
  /**
91
175
  * The Hl7Field class represents one HL7 field.
92
176
  * A field is a collection of components.
93
- * Note that we do not strictly parse messages, and only use default delimeters.
94
177
  */
95
178
  class Hl7Field {
96
- constructor(components) {
179
+ /**
180
+ * Creates a new HL7 field.
181
+ * @param components The HL7 components.
182
+ * @param context Optional HL7 parsing context.
183
+ */
184
+ constructor(components, context = new Hl7Context()) {
185
+ this.context = context;
97
186
  this.components = components;
98
187
  }
99
- get(index) {
100
- return this.components[index];
188
+ /**
189
+ * Returns an HL7 component by index.
190
+ * @param component The component index.
191
+ * @param subcomponent Optional subcomponent index.
192
+ * @param repetition Optional repetition index.
193
+ * @returns The string value of the specified component.
194
+ */
195
+ get(component, subcomponent, repetition = 0) {
196
+ let value = this.components[repetition][component] || '';
197
+ if (subcomponent !== undefined) {
198
+ value = value.split(this.context.subcomponentSeparator)[subcomponent] || '';
199
+ }
200
+ return value;
101
201
  }
202
+ /**
203
+ * Returns the HL7 field as a string.
204
+ * @returns The HL7 field as a string.
205
+ */
102
206
  toString() {
103
- return this.components.join(COMPONENT_SEPARATOR);
207
+ return this.components.map((r) => r.join(this.context.componentSeparator)).join(this.context.repetitionSeparator);
104
208
  }
105
- static parse(text) {
106
- return new Hl7Field(text.split(COMPONENT_SEPARATOR));
209
+ /**
210
+ * Parses an HL7 field string into an Hl7Field object.
211
+ * @param text The HL7 field text.
212
+ * @param context Optional HL7 parsing context.
213
+ * @returns The parsed HL7 field.
214
+ */
215
+ static parse(text, context = new Hl7Context()) {
216
+ return new Hl7Field(text.split(context.repetitionSeparator).map((r) => r.split(context.componentSeparator)), context);
107
217
  }
108
218
  }
109
219
 
110
- export { COMPONENT_SEPARATOR, FIELD_SEPARATOR, Hl7Field, Hl7Message, Hl7Segment, SEGMENT_SEPARATOR };
220
+ export { Hl7Context, Hl7Field, Hl7Message, Hl7Segment };
111
221
  //# sourceMappingURL=hl7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hl7.js","sources":["../../src/hl7.ts"],"sourcesContent":["import { isStringArray } from './utils';\n\nexport const SEGMENT_SEPARATOR = '\\r';\nexport const FIELD_SEPARATOR = '|';\nexport const COMPONENT_SEPARATOR = '^';\n\n/**\n * The Hl7Message class represents one HL7 message.\n * A message is a collection of segments.\n * Note that we do not strictly parse messages, and only use default delimeters.\n */\nexport class Hl7Message {\n readonly segments: Hl7Segment[];\n\n constructor(segments: Hl7Segment[]) {\n this.segments = segments;\n }\n\n get(index: number | string): Hl7Segment | undefined {\n if (typeof index === 'number') {\n return this.segments[index];\n }\n return this.segments.find((s) => s.name === index);\n }\n\n getAll(name: string): Hl7Segment[] {\n return this.segments.filter((s) => s.name === name);\n }\n\n toString(): string {\n return this.segments.map((s) => s.toString()).join(SEGMENT_SEPARATOR);\n }\n\n buildAck(): Hl7Message {\n const now = new Date();\n const msh = this.get('MSH');\n const sendingApp = msh?.get(2)?.toString() || '';\n const sendingFacility = msh?.get(3)?.toString() || '';\n const receivingApp = msh?.get(4)?.toString() || '';\n const receivingFacility = msh?.get(5)?.toString() || '';\n const controlId = msh?.get(9)?.toString() || '';\n const versionId = msh?.get(12)?.toString() || '2.5.1';\n\n return new Hl7Message([\n new Hl7Segment([\n 'MSH',\n '^~\\\\&',\n receivingApp,\n receivingFacility,\n sendingApp,\n sendingFacility,\n now.toISOString(),\n '',\n 'ACK',\n now.getTime().toString(),\n 'P',\n versionId,\n ]),\n new Hl7Segment(['MSA', 'AA', controlId, 'OK']),\n ]);\n }\n\n static parse(text: string): Hl7Message {\n if (!text.startsWith('MSH|^~\\\\&')) {\n const err = new Error('Invalid HL7 message');\n (err as any).type = 'entity.parse.failed';\n throw err;\n }\n return new Hl7Message(text.split(/[\\r\\n]+/).map((line) => Hl7Segment.parse(line)));\n }\n}\n\n/**\n * The Hl7Segment class represents one HL7 segment.\n * A segment is a collection of fields.\n * The name field is the first field.\n * Note that we do not strictly parse messages, and only use default delimeters.\n */\nexport class Hl7Segment {\n readonly name: string;\n readonly fields: Hl7Field[];\n\n constructor(fields: Hl7Field[] | string[]) {\n if (isStringArray(fields)) {\n this.fields = fields.map((f) => Hl7Field.parse(f));\n } else {\n this.fields = fields;\n }\n this.name = this.fields[0].components[0];\n }\n\n get(index: number): Hl7Field {\n return this.fields[index];\n }\n\n toString(): string {\n return this.fields.map((f) => f.toString()).join(FIELD_SEPARATOR);\n }\n\n static parse(text: string): Hl7Segment {\n return new Hl7Segment(text.split(FIELD_SEPARATOR).map((f) => Hl7Field.parse(f)));\n }\n}\n\n/**\n * The Hl7Field class represents one HL7 field.\n * A field is a collection of components.\n * Note that we do not strictly parse messages, and only use default delimeters.\n */\nexport class Hl7Field {\n readonly components: string[];\n\n constructor(components: string[]) {\n this.components = components;\n }\n\n get(index: number): string {\n return this.components[index];\n }\n\n toString(): string {\n return this.components.join(COMPONENT_SEPARATOR);\n }\n\n static parse(text: string): Hl7Field {\n return new Hl7Field(text.split(COMPONENT_SEPARATOR));\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hl7.js","sources":["../../src/hl7.ts"],"sourcesContent":["import { isStringArray } from './utils';\n\n/**\n * The Hl7Context class represents the parsing context for an HL7 message.\n *\n * MSH-1:\n * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.1\n *\n * MSH-2:\n * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.2\n *\n * See this tutorial on MSH, and why it's a bad idea to use anything other than the default values:\n * https://www.hl7soup.com/HL7TutorialMSH.html\n */\nexport class Hl7Context {\n constructor(\n public readonly segmentSeparator = '\\r',\n public readonly fieldSeparator = '|',\n public readonly componentSeparator = '^',\n public readonly repetitionSeparator = '~',\n public readonly escapeCharacter = '\\\\',\n public readonly subcomponentSeparator = '&'\n ) {}\n\n /**\n * Returns the MSH-2 field value based on the configured separators.\n * @returns The HL7 MSH-2 field value.\n */\n getMsh2(): string {\n return (\n this.fieldSeparator +\n this.componentSeparator +\n this.repetitionSeparator +\n this.escapeCharacter +\n this.subcomponentSeparator\n );\n }\n}\n\n/**\n * The Hl7Message class represents one HL7 message.\n * A message is a collection of segments.\n */\nexport class Hl7Message {\n readonly context: Hl7Context;\n readonly segments: Hl7Segment[];\n\n /**\n * Creates a new HL7 message.\n * @param segments The HL7 segments.\n * @param context Optional HL7 parsing context.\n */\n constructor(segments: Hl7Segment[], context = new Hl7Context()) {\n this.context = context;\n this.segments = segments;\n }\n\n /**\n * Returns an HL7 segment by index or by name.\n * @param index The HL7 segment index or name.\n * @returns The HL7 segment if found; otherwise, undefined.\n */\n get(index: number | string): Hl7Segment | undefined {\n if (typeof index === 'number') {\n return this.segments[index];\n }\n return this.segments.find((s) => s.name === index);\n }\n\n /**\n * Returns all HL7 segments of a given name.\n * @param name The HL7 segment name.\n * @returns An array of HL7 segments with the specified name.\n */\n getAll(name: string): Hl7Segment[] {\n return this.segments.filter((s) => s.name === name);\n }\n\n /**\n * Returns the HL7 message as a string.\n * @returns The HL7 message as a string.\n */\n toString(): string {\n return this.segments.map((s) => s.toString()).join(this.context.segmentSeparator);\n }\n\n /**\n * Returns an HL7 \"ACK\" (acknowledgement) message for this message.\n * @returns The HL7 \"ACK\" message.\n */\n buildAck(): Hl7Message {\n const now = new Date();\n const msh = this.get('MSH');\n const sendingApp = msh?.get(2)?.toString() || '';\n const sendingFacility = msh?.get(3)?.toString() || '';\n const receivingApp = msh?.get(4)?.toString() || '';\n const receivingFacility = msh?.get(5)?.toString() || '';\n const controlId = msh?.get(9)?.toString() || '';\n const versionId = msh?.get(12)?.toString() || '2.5.1';\n\n return new Hl7Message([\n new Hl7Segment(\n [\n 'MSH',\n this.context.getMsh2(),\n receivingApp,\n receivingFacility,\n sendingApp,\n sendingFacility,\n now.toISOString(),\n '',\n 'ACK',\n now.getTime().toString(),\n 'P',\n versionId,\n ],\n this.context\n ),\n new Hl7Segment(['MSA', 'AA', controlId, 'OK'], this.context),\n ]);\n }\n\n /**\n * Parses an HL7 message string into an Hl7Message object.\n * @param text The HL7 message text.\n * @returns The parsed HL7 message.\n */\n static parse(text: string): Hl7Message {\n if (!text.startsWith('MSH')) {\n const err = new Error('Invalid HL7 message');\n (err as any).type = 'entity.parse.failed';\n throw err;\n }\n const context = new Hl7Context(\n '\\r',\n text.charAt(3), // Field separator, recommended \"|\"\n text.charAt(4), // Component separator, recommended \"^\"\n text.charAt(5), // Repetition separator, recommended \"~\"\n text.charAt(6), // Escape character, recommended \"\\\"\n text.charAt(7) // Subcomponent separator, recommended \"&\"\n );\n return new Hl7Message(\n text.split(/[\\r\\n]+/).map((line) => Hl7Segment.parse(line, context)),\n context\n );\n }\n}\n\n/**\n * The Hl7Segment class represents one HL7 segment.\n * A segment is a collection of fields.\n * The name field is the first field.\n */\nexport class Hl7Segment {\n readonly context: Hl7Context;\n readonly name: string;\n readonly fields: Hl7Field[];\n\n /**\n * Creates a new HL7 segment.\n * @param fields The HL7 fields.\n * @param context Optional HL7 parsing context.\n */\n constructor(fields: Hl7Field[] | string[], context = new Hl7Context()) {\n this.context = context;\n if (isStringArray(fields)) {\n this.fields = fields.map((f) => Hl7Field.parse(f));\n } else {\n this.fields = fields;\n }\n this.name = this.fields[0].components[0][0];\n }\n\n /**\n * Returns an HL7 field by index.\n * @param index The HL7 field index.\n * @returns The HL7 field.\n */\n get(index: number): Hl7Field {\n return this.fields[index];\n }\n\n /**\n * Returns the HL7 segment as a string.\n * @returns The HL7 segment as a string.\n */\n toString(): string {\n return this.fields.map((f) => f.toString()).join(this.context.fieldSeparator);\n }\n\n /**\n * Parses an HL7 segment string into an Hl7Segment object.\n * @param text The HL7 segment text.\n * @param context Optional HL7 parsing context.\n * @returns The parsed HL7 segment.\n */\n static parse(text: string, context = new Hl7Context()): Hl7Segment {\n return new Hl7Segment(\n text.split(context.fieldSeparator).map((f) => Hl7Field.parse(f, context)),\n context\n );\n }\n}\n\n/**\n * The Hl7Field class represents one HL7 field.\n * A field is a collection of components.\n */\nexport class Hl7Field {\n readonly context: Hl7Context;\n readonly components: string[][];\n\n /**\n * Creates a new HL7 field.\n * @param components The HL7 components.\n * @param context Optional HL7 parsing context.\n */\n constructor(components: string[][], context = new Hl7Context()) {\n this.context = context;\n this.components = components;\n }\n\n /**\n * Returns an HL7 component by index.\n * @param component The component index.\n * @param subcomponent Optional subcomponent index.\n * @param repetition Optional repetition index.\n * @returns The string value of the specified component.\n */\n get(component: number, subcomponent?: number, repetition = 0): string {\n let value = this.components[repetition][component] || '';\n\n if (subcomponent !== undefined) {\n value = value.split(this.context.subcomponentSeparator)[subcomponent] || '';\n }\n\n return value;\n }\n\n /**\n * Returns the HL7 field as a string.\n * @returns The HL7 field as a string.\n */\n toString(): string {\n return this.components.map((r) => r.join(this.context.componentSeparator)).join(this.context.repetitionSeparator);\n }\n\n /**\n * Parses an HL7 field string into an Hl7Field object.\n * @param text The HL7 field text.\n * @param context Optional HL7 parsing context.\n * @returns The parsed HL7 field.\n */\n static parse(text: string, context = new Hl7Context()): Hl7Field {\n return new Hl7Field(\n text.split(context.repetitionSeparator).map((r) => r.split(context.componentSeparator)),\n context\n );\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -4,8 +4,8 @@ export { AndAtom, ArithemticOperatorAtom, AsAtom, ConcatAtom, ContainsAtom, DotA
4
4
  export { evalFhirPath, evalFhirPathTyped, initFhirPathParserBuilder, parseFhirPath } from './fhirpath/parse.js';
5
5
  export { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS, tokenize } from './fhirpath/tokenize.js';
6
6
  export { booleanToTypedValue, fhirPathArrayEquals, fhirPathArrayEquivalent, fhirPathEquals, fhirPathEquivalent, fhirPathIs, fhirPathNot, getTypedPropertyValue, isPeriod, isQuantity, isQuantityEquivalent, removeDuplicates, toJsBoolean, toTypedValue } from './fhirpath/utils.js';
7
- export { formatAddress, formatDate, formatDateTime, formatFamilyName, formatGivenName, formatHumanName, formatPeriod, formatTime, formatTiming, isValidDate } from './format.js';
8
- export { COMPONENT_SEPARATOR, FIELD_SEPARATOR, Hl7Field, Hl7Message, Hl7Segment, SEGMENT_SEPARATOR } from './hl7.js';
7
+ export { formatAddress, formatDate, formatDateTime, formatFamilyName, formatGivenName, formatHumanName, formatPeriod, formatQuantity, formatRange, formatTime, formatTiming, isValidDate } from './format.js';
8
+ export { Hl7Context, Hl7Field, Hl7Message, Hl7Segment } from './hl7.js';
9
9
  export { parseJWTPayload } from './jwt.js';
10
10
  export { matchesSearchRequest } from './match.js';
11
11
  export { OperationOutcomeError, allOk, assertOk, badRequest, created, forbidden, getStatus, gone, isGone, isNotFound, isOk, normalizeErrorString, notFound, notModified, tooManyRequests, unauthorized } from './outcomes.js';
@@ -13,5 +13,5 @@ export { ReadablePromise } from './readablepromise.js';
13
13
  export { DEFAULT_SEARCH_COUNT, Operator, formatSearchQuery, parseSearchDefinition } from './search.js';
14
14
  export { SearchParameterType, getExpressionForResourceType, getSearchParameterDetails } from './searchparams.js';
15
15
  export { PropertyType, buildTypeName, createSchema, getElementDefinition, getPropertyDisplayName, globalSchema, indexSearchParameter, indexSearchParameterBundle, indexStructureDefinition, indexStructureDefinitionBundle } from './types.js';
16
- export { arrayBufferToBase64, arrayBufferToHex, calculateAge, calculateAgeString, capitalize, createReference, deepClone, deepEquals, findObservationInterval, findObservationReferenceRange, getCodeBySystem, getDateProperty, getDisplayString, getExtensionValue, getIdentifier, getImageSrc, getQuestionnaireAnswers, getReferenceString, isEmpty, isLowerCase, isObject, isProfileResource, isStringArray, isUUID, matchesRange, preciseEquals, preciseGreaterThan, preciseGreaterThanOrEquals, preciseLessThan, preciseLessThanOrEquals, resolveId, setCodeBySystem, stringify } from './utils.js';
16
+ export { arrayBufferToBase64, arrayBufferToHex, calculateAge, calculateAgeString, capitalize, createReference, deepClone, deepEquals, findObservationInterval, findObservationReferenceRange, getCodeBySystem, getDateProperty, getDisplayString, getExtensionValue, getIdentifier, getImageSrc, getQuestionnaireAnswers, getReferenceString, isEmpty, isLowerCase, isObject, isProfileResource, isStringArray, isUUID, matchesRange, preciseEquals, preciseGreaterThan, preciseGreaterThanOrEquals, preciseLessThan, preciseLessThanOrEquals, preciseRound, resolveId, setCodeBySystem, stringify } from './utils.js';
17
17
  //# sourceMappingURL=index.js.map