@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 +1 -0
- package/lib/index.js +2 -1
- package/lib/summary/extract-summary.d.ts +56 -0
- package/lib/summary/extract-summary.js +173 -0
- package/lib/summary/index.d.ts +1 -0
- package/lib/summary/index.js +18 -0
- package/package.json +1 -1
package/lib/index.d.ts
CHANGED
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
|
-
|
|
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