@openhi/types 0.0.19 → 0.0.20

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/index.d.ts CHANGED
@@ -13,3 +13,4 @@
13
13
  */
14
14
  export * from "./data";
15
15
  export * from "./control";
16
+ export * from "./summary";
package/lib/index.js CHANGED
@@ -29,4 +29,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  */
30
30
  __exportStar(require("./data"), exports);
31
31
  __exportStar(require("./control"), exports);
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHlDQUF1QjtBQUN2Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBvcGVuaGkvdHlwZXMg4oCUIEZISVIgYW5kIE9wZW5ISSB0eXBlcyBieSBkb21haW4uXG4gKlxuICogRGF0YSBwbGFuZSBpcyBnZW5lcmF0b3Igb3V0cHV0IChgc3JjL2RhdGEvYCwgb25lIG1vZHVsZSBwZXIgRkhJUiBSNFxuICogU3RydWN0dXJlRGVmaW5pdGlvbiwgYmFycmVsIGluIGAuL2RhdGEvaW5kZXgudHNgKS4gQmFzZSByZXNvdXJjZXNcbiAqIChSZXNvdXJjZSwgRG9tYWluUmVzb3VyY2UsIEVsZW1lbnQsIEJhY2tib25lRWxlbWVudCwgRXh0ZW5zaW9uLCBldGMuKVxuICogbGl2ZSBpbiB0aGF0IHNhbWUgdHJlZSDigJQgdGhlIGdlbmVyYXRvciB0cmVhdHMgdGhlbSBsaWtlIGFueSBvdGhlciBTRC5cbiAqXG4gKiBDb250cm9sIHBsYW5lIGlzIGdlbmVyYXRvciBvdXRwdXQgKGBzcmMvY29udHJvbC9gKTogVXNlciwgVGVuYW50LFxuICogV29ya3NwYWNlLCBNZW1iZXJzaGlwLCBSb2xlQXNzaWdubWVudCwgUm9sZSwgcGx1cyB0aGVcbiAqIGBDb250cm9sUGxhbmVSb2xlQ29kZWAgdGVybWlub2xvZ3kuIEF1dGhvcmVkIGluIEZTSCB1bmRlclxuICogYGZzaC9pbnB1dC9mc2gvY29udHJvbC1wbGFuZS9gIGFuZCBlbWl0dGVkIGJ5IHRoZSBzYW1lIHBpcGVsaW5lLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250cm9sXCI7XG4iXX0=
32
+ __exportStar(require("./summary"), exports);
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHlDQUF1QjtBQUN2Qiw0Q0FBMEI7QUFDMUIsNENBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmhpL3R5cGVzIOKAlCBGSElSIGFuZCBPcGVuSEkgdHlwZXMgYnkgZG9tYWluLlxuICpcbiAqIERhdGEgcGxhbmUgaXMgZ2VuZXJhdG9yIG91dHB1dCAoYHNyYy9kYXRhL2AsIG9uZSBtb2R1bGUgcGVyIEZISVIgUjRcbiAqIFN0cnVjdHVyZURlZmluaXRpb24sIGJhcnJlbCBpbiBgLi9kYXRhL2luZGV4LnRzYCkuIEJhc2UgcmVzb3VyY2VzXG4gKiAoUmVzb3VyY2UsIERvbWFpblJlc291cmNlLCBFbGVtZW50LCBCYWNrYm9uZUVsZW1lbnQsIEV4dGVuc2lvbiwgZXRjLilcbiAqIGxpdmUgaW4gdGhhdCBzYW1lIHRyZWUg4oCUIHRoZSBnZW5lcmF0b3IgdHJlYXRzIHRoZW0gbGlrZSBhbnkgb3RoZXIgU0QuXG4gKlxuICogQ29udHJvbCBwbGFuZSBpcyBnZW5lcmF0b3Igb3V0cHV0IChgc3JjL2NvbnRyb2wvYCk6IFVzZXIsIFRlbmFudCxcbiAqIFdvcmtzcGFjZSwgTWVtYmVyc2hpcCwgUm9sZUFzc2lnbm1lbnQsIFJvbGUsIHBsdXMgdGhlXG4gKiBgQ29udHJvbFBsYW5lUm9sZUNvZGVgIHRlcm1pbm9sb2d5LiBBdXRob3JlZCBpbiBGU0ggdW5kZXJcbiAqIGBmc2gvaW5wdXQvZnNoL2NvbnRyb2wtcGxhbmUvYCBhbmQgZW1pdHRlZCBieSB0aGUgc2FtZSBwaXBlbGluZS5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3VtbWFyeVwiO1xuIl19
@@ -0,0 +1,56 @@
1
+ /** Summary exceeds the clinical-path p99; worth looking at if it's a pattern. */
2
+ export declare const DEFAULT_SUMMARY_WARN_BYTES: number;
3
+ /** Summary is outside any measured distribution; almost certainly inline attachment or unpacked Bundle. */
4
+ export declare const DEFAULT_SUMMARY_ERROR_BYTES: number;
5
+ export interface SummaryJson {
6
+ resourceType: string;
7
+ id?: string;
8
+ meta?: {
9
+ lastUpdated?: string;
10
+ versionId?: string;
11
+ };
12
+ [key: string]: unknown;
13
+ }
14
+ export interface FhirResourceLike {
15
+ resourceType: string;
16
+ id?: string;
17
+ meta?: {
18
+ lastUpdated?: string;
19
+ versionId?: string;
20
+ [key: string]: unknown;
21
+ };
22
+ [key: string]: unknown;
23
+ }
24
+ export interface ExtractSummaryLogger {
25
+ warn(...args: unknown[]): void;
26
+ error(...args: unknown[]): void;
27
+ }
28
+ export interface ExtractSummaryOptions {
29
+ /** Soft (info) warn threshold in UTF-8 bytes. Defaults to 4 KiB. */
30
+ warnThresholdBytes?: number;
31
+ /** Hard (error) warn threshold in UTF-8 bytes. Defaults to 8 KiB. */
32
+ errorThresholdBytes?: number;
33
+ /** Logger for size-guard warnings. Defaults to `console`. */
34
+ logger?: ExtractSummaryLogger;
35
+ }
36
+ /**
37
+ * Projects `resource` into its summary JSON using `SUMMARY_PATHS`.
38
+ *
39
+ * Always emits `resourceType`, `id` (if present), and
40
+ * `meta.{lastUpdated,versionId}` (if present). Then, for every path in
41
+ * `SUMMARY_PATHS[resourceType]`:
42
+ * - Simple paths (`name`) copy the whole value (arrays shallow-copied).
43
+ * - Dotted paths (`component.code`) project the named sub-field of each
44
+ * element of the container; if any sub-paths are listed for a
45
+ * container, only those sub-fields are copied (not the whole element).
46
+ * - `[x]` choice-type paths (`value[x]`) match whichever concrete
47
+ * variant (`valueQuantity`, `valueString`, …) is present.
48
+ *
49
+ * Missing fields are omitted — no nulls.
50
+ *
51
+ * If the serialized summary exceeds `warnThresholdBytes` /
52
+ * `errorThresholdBytes`, a warn / error is logged with `{ resourceType,
53
+ * id, bytes }`. The summary is always returned; the size guard never
54
+ * rejects.
55
+ */
56
+ export declare function extractSummary(resource: FhirResourceLike, options?: ExtractSummaryOptions): SummaryJson;
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_SUMMARY_ERROR_BYTES = exports.DEFAULT_SUMMARY_WARN_BYTES = void 0;
4
+ exports.extractSummary = extractSummary;
5
+ /**
6
+ * Pure projection of a FHIR R4 resource into its summary JSON — the
7
+ * GSI-friendly shape defined by ADR 2026-04-17-02 and the generated
8
+ * `SUMMARY_PATHS` table (issue #812).
9
+ *
10
+ * Consumed by the write path in #814; no I/O, no DynamoDB access here.
11
+ *
12
+ * Threshold defaults come from the #811 size benchmark across every R4
13
+ * example resource. Both thresholds are warn-only — the guard is a
14
+ * diagnostic signal, never a reason to reject a store operation.
15
+ */
16
+ const summary_paths_1 = require("../data/summary-paths");
17
+ /** Summary exceeds the clinical-path p99; worth looking at if it's a pattern. */
18
+ exports.DEFAULT_SUMMARY_WARN_BYTES = 4 * 1024;
19
+ /** Summary is outside any measured distribution; almost certainly inline attachment or unpacked Bundle. */
20
+ exports.DEFAULT_SUMMARY_ERROR_BYTES = 8 * 1024;
21
+ /**
22
+ * Projects `resource` into its summary JSON using `SUMMARY_PATHS`.
23
+ *
24
+ * Always emits `resourceType`, `id` (if present), and
25
+ * `meta.{lastUpdated,versionId}` (if present). Then, for every path in
26
+ * `SUMMARY_PATHS[resourceType]`:
27
+ * - Simple paths (`name`) copy the whole value (arrays shallow-copied).
28
+ * - Dotted paths (`component.code`) project the named sub-field of each
29
+ * element of the container; if any sub-paths are listed for a
30
+ * container, only those sub-fields are copied (not the whole element).
31
+ * - `[x]` choice-type paths (`value[x]`) match whichever concrete
32
+ * variant (`valueQuantity`, `valueString`, …) is present.
33
+ *
34
+ * Missing fields are omitted — no nulls.
35
+ *
36
+ * If the serialized summary exceeds `warnThresholdBytes` /
37
+ * `errorThresholdBytes`, a warn / error is logged with `{ resourceType,
38
+ * id, bytes }`. The summary is always returned; the size guard never
39
+ * rejects.
40
+ */
41
+ function extractSummary(resource, options = {}) {
42
+ const { resourceType, id } = resource;
43
+ const logger = options.logger ?? console;
44
+ const warnBytes = options.warnThresholdBytes ?? exports.DEFAULT_SUMMARY_WARN_BYTES;
45
+ const errorBytes = options.errorThresholdBytes ?? exports.DEFAULT_SUMMARY_ERROR_BYTES;
46
+ const result = { resourceType };
47
+ if (id !== undefined)
48
+ result.id = id;
49
+ const meta = resource.meta;
50
+ if (meta && typeof meta === "object") {
51
+ const projectedMeta = {};
52
+ if (meta.lastUpdated !== undefined) {
53
+ projectedMeta.lastUpdated = meta.lastUpdated;
54
+ }
55
+ if (meta.versionId !== undefined) {
56
+ projectedMeta.versionId = meta.versionId;
57
+ }
58
+ if (Object.keys(projectedMeta).length > 0) {
59
+ result.meta = projectedMeta;
60
+ }
61
+ }
62
+ const paths = summary_paths_1.SUMMARY_PATHS[resourceType];
63
+ if (paths && paths.length > 0) {
64
+ // `id` and `meta` are handled above with bespoke rules (meta is projected
65
+ // to just lastUpdated / versionId, not the whole Meta datatype).
66
+ const applicable = paths.filter((p) => p !== "id" && p !== "meta");
67
+ applyPaths(resource, result, applicable);
68
+ }
69
+ const bytes = utf8ByteLength(JSON.stringify(result));
70
+ if (bytes > errorBytes) {
71
+ logger.error("extractSummary: summary exceeds error threshold", {
72
+ resourceType,
73
+ id,
74
+ bytes,
75
+ thresholdBytes: errorBytes,
76
+ });
77
+ }
78
+ else if (bytes > warnBytes) {
79
+ logger.warn("extractSummary: summary exceeds warn threshold", {
80
+ resourceType,
81
+ id,
82
+ bytes,
83
+ thresholdBytes: warnBytes,
84
+ });
85
+ }
86
+ return result;
87
+ }
88
+ function applyPaths(source, target, paths) {
89
+ const groups = groupByHead(paths);
90
+ for (const [head, groupPaths] of groups) {
91
+ if (head.endsWith("[x]")) {
92
+ applyChoicePath(source, target, head);
93
+ continue;
94
+ }
95
+ const value = source[head];
96
+ if (value === undefined || value === null)
97
+ continue;
98
+ const children = [];
99
+ for (const p of groupPaths) {
100
+ if (p === head)
101
+ continue;
102
+ children.push(p.slice(head.length + 1));
103
+ }
104
+ if (children.length === 0) {
105
+ target[head] = shallowCopy(value);
106
+ continue;
107
+ }
108
+ if (Array.isArray(value)) {
109
+ const projected = [];
110
+ for (const el of value) {
111
+ if (el && typeof el === "object" && !Array.isArray(el)) {
112
+ const sub = {};
113
+ applyPaths(el, sub, children);
114
+ if (Object.keys(sub).length > 0)
115
+ projected.push(sub);
116
+ }
117
+ }
118
+ if (projected.length > 0)
119
+ target[head] = projected;
120
+ continue;
121
+ }
122
+ if (typeof value === "object") {
123
+ const sub = {};
124
+ applyPaths(value, sub, children);
125
+ if (Object.keys(sub).length > 0)
126
+ target[head] = sub;
127
+ }
128
+ }
129
+ }
130
+ function applyChoicePath(source, target, segment) {
131
+ const prefix = segment.slice(0, -"[x]".length);
132
+ for (const key of Object.keys(source)) {
133
+ if (!key.startsWith(prefix) || key.length <= prefix.length)
134
+ continue;
135
+ const nextCharCode = key.charCodeAt(prefix.length);
136
+ // Concrete FHIR variants are always `<prefix><CapitalizedType>`, e.g.
137
+ // `valueQuantity`, `effectiveDateTime`. Require an uppercase ASCII
138
+ // character immediately after the prefix to avoid false-positive
139
+ // matches against unrelated fields that happen to share the prefix.
140
+ if (nextCharCode < 65 || nextCharCode > 90)
141
+ continue;
142
+ const value = source[key];
143
+ if (value === undefined)
144
+ continue;
145
+ target[key] = shallowCopy(value);
146
+ }
147
+ }
148
+ function groupByHead(paths) {
149
+ const groups = new Map();
150
+ for (const p of paths) {
151
+ const dot = p.indexOf(".");
152
+ const head = dot === -1 ? p : p.slice(0, dot);
153
+ let bucket = groups.get(head);
154
+ if (!bucket) {
155
+ bucket = [];
156
+ groups.set(head, bucket);
157
+ }
158
+ bucket.push(p);
159
+ }
160
+ return groups;
161
+ }
162
+ function shallowCopy(value) {
163
+ if (Array.isArray(value))
164
+ return value.slice();
165
+ if (value !== null && typeof value === "object") {
166
+ return { ...value };
167
+ }
168
+ return value;
169
+ }
170
+ function utf8ByteLength(s) {
171
+ return new TextEncoder().encode(s).length;
172
+ }
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdC1zdW1tYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N1bW1hcnkvZXh0cmFjdC1zdW1tYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSx3Q0F3REM7QUFsSUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHlEQUFzRDtBQUV0RCxpRkFBaUY7QUFDcEUsUUFBQSwwQkFBMEIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRW5ELDJHQUEyRztBQUM5RixRQUFBLDJCQUEyQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFxQ3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBZ0IsY0FBYyxDQUM1QixRQUEwQixFQUMxQixVQUFpQyxFQUFFO0lBRW5DLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ3RDLE1BQU0sTUFBTSxHQUF5QixPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQztJQUMvRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksa0NBQTBCLENBQUM7SUFDM0UsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLG1DQUEyQixDQUFDO0lBRTlFLE1BQU0sTUFBTSxHQUFnQixFQUFFLFlBQVksRUFBRSxDQUFDO0lBQzdDLElBQUksRUFBRSxLQUFLLFNBQVM7UUFBRSxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVyQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQzNCLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sYUFBYSxHQUFpRCxFQUFFLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztR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QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEQsT0FBTyxFQUFFLEdBQUksS0FBaUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxDQUFTO0lBQy9CLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1cmUgcHJvamVjdGlvbiBvZiBhIEZISVIgUjQgcmVzb3VyY2UgaW50byBpdHMgc3VtbWFyeSBKU09OIOKAlCB0aGVcbiAqIEdTSS1mcmllbmRseSBzaGFwZSBkZWZpbmVkIGJ5IEFEUiAyMDI2LTA0LTE3LTAyIGFuZCB0aGUgZ2VuZXJhdGVkXG4gKiBgU1VNTUFSWV9QQVRIU2AgdGFibGUgKGlzc3VlICM4MTIpLlxuICpcbiAqIENvbnN1bWVkIGJ5IHRoZSB3cml0ZSBwYXRoIGluICM4MTQ7IG5vIEkvTywgbm8gRHluYW1vREIgYWNjZXNzIGhlcmUuXG4gKlxuICogVGhyZXNob2xkIGRlZmF1bHRzIGNvbWUgZnJvbSB0aGUgIzgxMSBzaXplIGJlbmNobWFyayBhY3Jvc3MgZXZlcnkgUjRcbiAqIGV4YW1wbGUgcmVzb3VyY2UuIEJvdGggdGhyZXNob2xkcyBhcmUgd2Fybi1vbmx5IOKAlCB0aGUgZ3VhcmQgaXMgYVxuICogZGlhZ25vc3RpYyBzaWduYWwsIG5ldmVyIGEgcmVhc29uIHRvIHJlamVjdCBhIHN0b3JlIG9wZXJhdGlvbi5cbiAqL1xuaW1wb3J0IHsgU1VNTUFSWV9QQVRIUyB9IGZyb20gXCIuLi9kYXRhL3N1bW1hcnktcGF0aHNcIjtcblxuLyoqIFN1bW1hcnkgZXhjZWVkcyB0aGUgY2xpbmljYWwtcGF0aCBwOTk7IHdvcnRoIGxvb2tpbmcgYXQgaWYgaXQncyBhIHBhdHRlcm4uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVU1NQVJZX1dBUk5fQllURVMgPSA0ICogMTAyNDtcblxuLyoqIFN1bW1hcnkgaXMgb3V0c2lkZSBhbnkgbWVhc3VyZWQgZGlzdHJpYnV0aW9uOyBhbG1vc3QgY2VydGFpbmx5IGlubGluZSBhdHRhY2htZW50IG9yIHVucGFja2VkIEJ1bmRsZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NVTU1BUllfRVJST1JfQllURVMgPSA4ICogMTAyNDtcblxuZXhwb3J0IGludGVyZmFjZSBTdW1tYXJ5SnNvbiB7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgbWV0YT86IHtcbiAgICBsYXN0VXBkYXRlZD86IHN0cmluZztcbiAgICB2ZXJzaW9uSWQ/OiBzdHJpbmc7XG4gIH07XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmhpclJlc291cmNlTGlrZSB7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgbWV0YT86IHtcbiAgICBsYXN0VXBkYXRlZD86IHN0cmluZztcbiAgICB2ZXJzaW9uSWQ/OiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfTtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0U3VtbWFyeUxvZ2dlciB7XG4gIHdhcm4oLi4uYXJnczogdW5rbm93bltdKTogdm9pZDtcbiAgZXJyb3IoLi4uYXJnczogdW5rbm93bltdKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0U3VtbWFyeU9wdGlvbnMge1xuICAvKiogU29mdCAoaW5mbykgd2FybiB0aHJlc2hvbGQgaW4gVVRGLTggYnl0ZXMuIERlZmF1bHRzIHRvIDQgS2lCLiAqL1xuICB3YXJuVGhyZXNob2xkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBIYXJkIChlcnJvcikgd2FybiB0aHJlc2hvbGQgaW4gVVRGLTggYnl0ZXMuIERlZmF1bHRzIHRvIDggS2lCLiAqL1xuICBlcnJvclRocmVzaG9sZEJ5dGVzPzogbnVtYmVyO1xuICAvKiogTG9nZ2VyIGZvciBzaXplLWd1YXJkIHdhcm5pbmdzLiBEZWZhdWx0cyB0byBgY29uc29sZWAuICovXG4gIGxvZ2dlcj86IEV4dHJhY3RTdW1tYXJ5TG9nZ2VyO1xufVxuXG4vKipcbiAqIFByb2plY3RzIGByZXNvdXJjZWAgaW50byBpdHMgc3VtbWFyeSBKU09OIHVzaW5nIGBTVU1NQVJZX1BBVEhTYC5cbiAqXG4gKiBBbHdheXMgZW1pdHMgYHJlc291cmNlVHlwZWAsIGBpZGAgKGlmIHByZXNlbnQpLCBhbmRcbiAqIGBtZXRhLntsYXN0VXBkYXRlZCx2ZXJzaW9uSWR9YCAoaWYgcHJlc2VudCkuIFRoZW4sIGZvciBldmVyeSBwYXRoIGluXG4gKiBgU1VNTUFSWV9QQVRIU1tyZXNvdXJjZVR5cGVdYDpcbiAqICAgLSBTaW1wbGUgcGF0aHMgKGBuYW1lYCkgY29weSB0aGUgd2hvbGUgdmFsdWUgKGFycmF5cyBzaGFsbG93LWNvcGllZCkuXG4gKiAgIC0gRG90dGVkIHBhdGhzIChgY29tcG9uZW50LmNvZGVgKSBwcm9qZWN0IHRoZSBuYW1lZCBzdWItZmllbGQgb2YgZWFjaFxuICogICAgIGVsZW1lbnQgb2YgdGhlIGNvbnRhaW5lcjsgaWYgYW55IHN1Yi1wYXRocyBhcmUgbGlzdGVkIGZvciBhXG4gKiAgICAgY29udGFpbmVyLCBvbmx5IHRob3NlIHN1Yi1maWVsZHMgYXJlIGNvcGllZCAobm90IHRoZSB3aG9sZSBlbGVtZW50KS5cbiAqICAgLSBgW3hdYCBjaG9pY2UtdHlwZSBwYXRocyAoYHZhbHVlW3hdYCkgbWF0Y2ggd2hpY2hldmVyIGNvbmNyZXRlXG4gKiAgICAgdmFyaWFudCAoYHZhbHVlUXVhbnRpdHlgLCBgdmFsdWVTdHJpbmdgLCDigKYpIGlzIHByZXNlbnQuXG4gKlxuICogTWlzc2luZyBmaWVsZHMgYXJlIG9taXR0ZWQg4oCUIG5vIG51bGxzLlxuICpcbiAqIElmIHRoZSBzZXJpYWxpemVkIHN1bW1hcnkgZXhjZWVkcyBgd2FyblRocmVzaG9sZEJ5dGVzYCAvXG4gKiBgZXJyb3JUaHJlc2hvbGRCeXRlc2AsIGEgd2FybiAvIGVycm9yIGlzIGxvZ2dlZCB3aXRoIGB7IHJlc291cmNlVHlwZSxcbiAqIGlkLCBieXRlcyB9YC4gVGhlIHN1bW1hcnkgaXMgYWx3YXlzIHJldHVybmVkOyB0aGUgc2l6ZSBndWFyZCBuZXZlclxuICogcmVqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdW1tYXJ5KFxuICByZXNvdXJjZTogRmhpclJlc291cmNlTGlrZSxcbiAgb3B0aW9uczogRXh0cmFjdFN1bW1hcnlPcHRpb25zID0ge30sXG4pOiBTdW1tYXJ5SnNvbiB7XG4gIGNvbnN0IHsgcmVzb3VyY2VUeXBlLCBpZCB9ID0gcmVzb3VyY2U7XG4gIGNvbnN0IGxvZ2dlcjogRXh0cmFjdFN1bW1hcnlMb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBjb25zb2xlO1xuICBjb25zdCB3YXJuQnl0ZXMgPSBvcHRpb25zLndhcm5UaHJlc2hvbGRCeXRlcyA/PyBERUZBVUxUX1NVTU1BUllfV0FSTl9CWVRFUztcbiAgY29uc3QgZXJyb3JCeXRlcyA9IG9wdGlvbnMuZXJyb3JUaHJlc2hvbGRCeXRlcyA/PyBERUZBVUxUX1NVTU1BUllfRVJST1JfQllURVM7XG5cbiAgY29uc3QgcmVzdWx0OiBTdW1tYXJ5SnNvbiA9IHsgcmVzb3VyY2VUeXBlIH07XG4gIGlmIChpZCAhPT0gdW5kZWZpbmVkKSByZXN1bHQuaWQgPSBpZDtcblxuICBjb25zdCBtZXRhID0gcmVzb3VyY2UubWV0YTtcbiAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBwcm9qZWN0ZWRNZXRhOiB7IGxhc3RVcGRhdGVkPzogc3RyaW5nOyB2ZXJzaW9uSWQ/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGlmIChtZXRhLmxhc3RVcGRhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb2plY3RlZE1ldGEubGFzdFVwZGF0ZWQgPSBtZXRhLmxhc3RVcGRhdGVkO1xuICAgIH1cbiAgICBpZiAobWV0YS52ZXJzaW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvamVjdGVkTWV0YS52ZXJzaW9uSWQgPSBtZXRhLnZlcnNpb25JZDtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb2plY3RlZE1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5tZXRhID0gcHJvamVjdGVkTWV0YTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXRocyA9IFNVTU1BUllfUEFUSFNbcmVzb3VyY2VUeXBlXTtcbiAgaWYgKHBhdGhzICYmIHBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBgaWRgIGFuZCBgbWV0YWAgYXJlIGhhbmRsZWQgYWJvdmUgd2l0aCBiZXNwb2tlIHJ1bGVzIChtZXRhIGlzIHByb2plY3RlZFxuICAgIC8vIHRvIGp1c3QgbGFzdFVwZGF0ZWQgLyB2ZXJzaW9uSWQsIG5vdCB0aGUgd2hvbGUgTWV0YSBkYXRhdHlwZSkuXG4gICAgY29uc3QgYXBwbGljYWJsZSA9IHBhdGhzLmZpbHRlcigocCkgPT4gcCAhPT0gXCJpZFwiICYmIHAgIT09IFwibWV0YVwiKTtcbiAgICBhcHBseVBhdGhzKFxuICAgICAgcmVzb3VyY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHJlc3VsdCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgYXBwbGljYWJsZSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgaWYgKGJ5dGVzID4gZXJyb3JCeXRlcykge1xuICAgIGxvZ2dlci5lcnJvcihcImV4dHJhY3RTdW1tYXJ5OiBzdW1tYXJ5IGV4Y2VlZHMgZXJyb3IgdGhyZXNob2xkXCIsIHtcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIGlkLFxuICAgICAgYnl0ZXMsXG4gICAgICB0aHJlc2hvbGRCeXRlczogZXJyb3JCeXRlcyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChieXRlcyA+IHdhcm5CeXRlcykge1xuICAgIGxvZ2dlci53YXJuKFwiZXh0cmFjdFN1bW1hcnk6IHN1bW1hcnkgZXhjZWVkcyB3YXJuIHRocmVzaG9sZFwiLCB7XG4gICAgICByZXNvdXJjZVR5cGUsXG4gICAgICBpZCxcbiAgICAgIGJ5dGVzLFxuICAgICAgdGhyZXNob2xkQnl0ZXM6IHdhcm5CeXRlcyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGF0aHMoXG4gIHNvdXJjZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQge1xuICBjb25zdCBncm91cHMgPSBncm91cEJ5SGVhZChwYXRocyk7XG4gIGZvciAoY29uc3QgW2hlYWQsIGdyb3VwUGF0aHNdIG9mIGdyb3Vwcykge1xuICAgIGlmIChoZWFkLmVuZHNXaXRoKFwiW3hdXCIpKSB7XG4gICAgICBhcHBseUNob2ljZVBhdGgoc291cmNlLCB0YXJnZXQsIGhlYWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbaGVhZF07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRyZW46IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwIG9mIGdyb3VwUGF0aHMpIHtcbiAgICAgIGlmIChwID09PSBoZWFkKSBjb250aW51ZTtcbiAgICAgIGNoaWxkcmVuLnB1c2gocC5zbGljZShoZWFkLmxlbmd0aCArIDEpKTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0YXJnZXRbaGVhZF0gPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHByb2plY3RlZDogdW5rbm93bltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVsIG9mIHZhbHVlKSB7XG4gICAgICAgIGlmIChlbCAmJiB0eXBlb2YgZWwgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZWwpKSB7XG4gICAgICAgICAgY29uc3Qgc3ViOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgIGFwcGx5UGF0aHMoZWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN1YiwgY2hpbGRyZW4pO1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzdWIpLmxlbmd0aCA+IDApIHByb2plY3RlZC5wdXNoKHN1Yik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0ZWQubGVuZ3RoID4gMCkgdGFyZ2V0W2hlYWRdID0gcHJvamVjdGVkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3Qgc3ViOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgYXBwbHlQYXRocyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3ViLCBjaGlsZHJlbik7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3ViKS5sZW5ndGggPiAwKSB0YXJnZXRbaGVhZF0gPSBzdWI7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2hvaWNlUGF0aChcbiAgc291cmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VnbWVudDogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHByZWZpeCA9IHNlZ21lbnQuc2xpY2UoMCwgLVwiW3hdXCIubGVuZ3RoKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSB8fCBrZXkubGVuZ3RoIDw9IHByZWZpeC5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGtleS5jaGFyQ29kZUF0KHByZWZpeC5sZW5ndGgpO1xuICAgIC8vIENvbmNyZXRlIEZISVIgdmFyaWFudHMgYXJlIGFsd2F5cyBgPHByZWZpeD48Q2FwaXRhbGl6ZWRUeXBlPmAsIGUuZy5cbiAgICAvLyBgdmFsdWVRdWFudGl0eWAsIGBlZmZlY3RpdmVEYXRlVGltZWAuIFJlcXVpcmUgYW4gdXBwZXJjYXNlIEFTQ0lJXG4gICAgLy8gY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcmVmaXggdG8gYXZvaWQgZmFsc2UtcG9zaXRpdmVcbiAgICAvLyBtYXRjaGVzIGFnYWluc3QgdW5yZWxhdGVkIGZpZWxkcyB0aGF0IGhhcHBlbiB0byBzaGFyZSB0aGUgcHJlZml4LlxuICAgIGlmIChuZXh0Q2hhckNvZGUgPCA2NSB8fCBuZXh0Q2hhckNvZGUgPiA5MCkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ3JvdXBCeUhlYWQocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogTWFwPHN0cmluZywgc3RyaW5nW10+IHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcbiAgICBjb25zdCBkb3QgPSBwLmluZGV4T2YoXCIuXCIpO1xuICAgIGNvbnN0IGhlYWQgPSBkb3QgPT09IC0xID8gcCA6IHAuc2xpY2UoMCwgZG90KTtcbiAgICBsZXQgYnVja2V0ID0gZ3JvdXBzLmdldChoZWFkKTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgYnVja2V0ID0gW107XG4gICAgICBncm91cHMuc2V0KGhlYWQsIGJ1Y2tldCk7XG4gICAgfVxuICAgIGJ1Y2tldC5wdXNoKHApO1xuICB9XG4gIHJldHVybiBncm91cHM7XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4geyAuLi4odmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB1dGY4Qnl0ZUxlbmd0aChzOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHMpLmxlbmd0aDtcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from "./extract-summary";
@@ -0,0 +1,18 @@
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
+ __exportStar(require("./extract-summary"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3VtbWFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZXh0cmFjdC1zdW1tYXJ5XCI7XG4iXX0=
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "publishConfig": {
37
37
  "access": "public"
38
38
  },
39
- "version": "0.0.19",
39
+ "version": "0.0.20",
40
40
  "types": "lib/index.d.ts",
41
41
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm exec projen\".",
42
42
  "scripts": {