textlane 0.2.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/actions/addon/resolve.d.ts +1 -0
- package/build/actions/addon/resolve.js +3 -2
- package/build/actions/libc/detect.d.ts +5 -0
- package/build/actions/libc/detect.js +11 -0
- package/build/actions/run/finish.d.ts +1 -1
- package/build/actions/run/finish.js +7 -3
- package/build/generated/html.d.ts +35 -2
- package/build/generated/html.js +1 -1
- package/build/generated/md.d.ts +64 -3
- package/build/generated/md.js +21 -3
- package/build/generated/nl.d.ts +3 -2
- package/build/generated/nl.js +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.js +6 -1
- package/build/models/addon.d.ts +30 -15
- package/build/models/addon.js +1 -1
- package/build/models/file.d.ts +3 -2
- package/build/models/file.js +1 -1
- package/build/models/plugin.d.ts +7 -0
- package/build/models/plugin.js +1 -1
- package/build/models/processor.d.ts +11 -7
- package/build/models/processor.js +54 -25
- package/build/settings.d.ts +3 -1
- package/build/settings.js +14 -3
- package/package.json +15 -7
- package/skills/textlane-usage/SKILL.md +16 -4
|
@@ -3,7 +3,7 @@ import { isPlainObject, mergeOptions } from "../actions/options/merge.js";
|
|
|
3
3
|
import { mapPluggable } from "../actions/pluggable/map.js";
|
|
4
4
|
import { finishRun } from "../actions/run/finish.js";
|
|
5
5
|
import { isTransformer } from "../actions/transformer/check.js";
|
|
6
|
-
import { HostFile } from "./vfile.js";
|
|
6
|
+
import { HostFile, HostMessage } from "./vfile.js";
|
|
7
7
|
/**
|
|
8
8
|
* unified's processor over the native pipeline; every call is the crate's, except that
|
|
9
9
|
* JavaScript plugins run here when a run pauses before them.
|
|
@@ -13,13 +13,11 @@ export class Processor {
|
|
|
13
13
|
#ids = new Map();
|
|
14
14
|
#hosts = new Map();
|
|
15
15
|
#attached = false;
|
|
16
|
+
#frozen = false;
|
|
16
17
|
constructor(native) {
|
|
17
18
|
this.#native = native;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
* Add a plugin, a list of them or a preset; a plugin used again is reconfigured. A
|
|
21
|
-
* JavaScript plugin is an attacher, called with the processor and its options at freeze.
|
|
22
|
-
*/
|
|
20
|
+
// a parser retypes this same processor: the tree it parses lives in the type alone
|
|
23
21
|
use(value, ...options) {
|
|
24
22
|
if (isAttacher(value)) {
|
|
25
23
|
this.#native.use([this.#register(value, options)]);
|
|
@@ -43,13 +41,14 @@ export class Processor {
|
|
|
43
41
|
/** Attach every plugin; later `use` and `data` setters fail. */
|
|
44
42
|
freeze() {
|
|
45
43
|
this.#attach();
|
|
46
|
-
this.#
|
|
44
|
+
this.#freezeNative();
|
|
47
45
|
return this;
|
|
48
46
|
}
|
|
49
47
|
/** Parse a document into a tree. */
|
|
50
48
|
parse(document) {
|
|
51
49
|
this.#attach();
|
|
52
|
-
|
|
50
|
+
const tree = JSON.parse(this.#native.parse(readValue(document) ?? ""));
|
|
51
|
+
return tree;
|
|
53
52
|
}
|
|
54
53
|
/**
|
|
55
54
|
* Run the transforms, finishing asynchronous stages; `file`, the text `tree` was parsed
|
|
@@ -58,46 +57,61 @@ export class Processor {
|
|
|
58
57
|
async run(tree, file) {
|
|
59
58
|
const value = readValue(file);
|
|
60
59
|
if (!this.#attach())
|
|
61
|
-
return this.#native.run(tree, value);
|
|
62
|
-
const run = this.#native.startRun(tree, value, false);
|
|
60
|
+
return readNode(this.#native.run(JSON.stringify(tree), value));
|
|
61
|
+
const run = this.#native.startRun(JSON.stringify(tree), value, false);
|
|
63
62
|
const host = new HostFile({ value, path: readPath(file) });
|
|
64
63
|
await finishRun({ run, hosts: this.#hosts, file: host, sync: false, call: "run" });
|
|
65
|
-
return run.result();
|
|
64
|
+
return readNode(run.result());
|
|
66
65
|
}
|
|
67
66
|
/** Run the transforms; fails with `async-in-sync` on an asynchronous stage. */
|
|
68
67
|
runSync(tree, file) {
|
|
69
68
|
const value = readValue(file);
|
|
70
69
|
if (!this.#attach())
|
|
71
|
-
return this.#native.runSync(tree, value);
|
|
72
|
-
const run = this.#native.startRun(tree, value, true);
|
|
70
|
+
return readNode(this.#native.runSync(JSON.stringify(tree), value));
|
|
71
|
+
const run = this.#native.startRun(JSON.stringify(tree), value, true);
|
|
73
72
|
const host = new HostFile({ value, path: readPath(file) });
|
|
74
73
|
void finishRun({ run, hosts: this.#hosts, file: host, sync: true, call: "run" });
|
|
75
|
-
return run.result();
|
|
74
|
+
return readNode(run.result());
|
|
76
75
|
}
|
|
77
76
|
/** Compile a tree, running no transform. */
|
|
78
77
|
stringify(tree) {
|
|
79
78
|
this.#attach();
|
|
80
|
-
return this.#native.stringify(tree);
|
|
79
|
+
return this.#native.stringify(JSON.stringify(tree));
|
|
81
80
|
}
|
|
82
81
|
/** Parse, run and compile a document, finishing asynchronous stages. */
|
|
83
82
|
async process(document) {
|
|
84
83
|
const text = readValue(document) ?? "";
|
|
85
|
-
if (!this.#attach())
|
|
86
|
-
|
|
84
|
+
if (!this.#attach()) {
|
|
85
|
+
this.#freezeNative();
|
|
86
|
+
const outcome = await this.#native.process(text, readPath(document));
|
|
87
|
+
if (outcome.error)
|
|
88
|
+
throw Object.assign(new Error(outcome.error.message), outcome.error);
|
|
89
|
+
if (!outcome.file)
|
|
90
|
+
throw new Error("process settled with neither a file nor an error");
|
|
91
|
+
return readResult(outcome.file, document);
|
|
92
|
+
}
|
|
87
93
|
const run = this.#native.startProcess(text, false, readPath(document));
|
|
88
94
|
const file = new HostFile({ value: run.value() ?? text, path: readPath(document) });
|
|
89
95
|
await finishRun({ run, hosts: this.#hosts, file, sync: false, call: "process" });
|
|
90
|
-
return
|
|
96
|
+
return readResult(readFile(run.result()), document, file);
|
|
91
97
|
}
|
|
92
98
|
/** Parse, run and compile a document; fails with `async-in-sync` on an asynchronous stage. */
|
|
93
99
|
processSync(document) {
|
|
94
100
|
const text = readValue(document) ?? "";
|
|
95
101
|
if (!this.#attach())
|
|
96
|
-
return
|
|
102
|
+
return readResult(this.#native.processSync(text, readPath(document)), document);
|
|
97
103
|
const run = this.#native.startProcess(text, true, readPath(document));
|
|
98
104
|
const file = new HostFile({ value: run.value() ?? text, path: readPath(document) });
|
|
99
105
|
void finishRun({ run, hosts: this.#hosts, file, sync: true, call: "process" });
|
|
100
|
-
return
|
|
106
|
+
return readResult(readFile(run.result()), document, file);
|
|
107
|
+
}
|
|
108
|
+
// Once only: `freeze` borrows the native pipeline mutably, which napi refuses while an
|
|
109
|
+
// async `process` still holds it
|
|
110
|
+
#freezeNative() {
|
|
111
|
+
if (this.#frozen)
|
|
112
|
+
return;
|
|
113
|
+
this.#frozen = true;
|
|
114
|
+
this.#native.freeze();
|
|
101
115
|
}
|
|
102
116
|
// unified's addPlugin: the same attacher is one plugin, its object options merged
|
|
103
117
|
#register(attacher, parameters) {
|
|
@@ -137,18 +151,33 @@ export class Processor {
|
|
|
137
151
|
return this.#native.hosts().length > 0;
|
|
138
152
|
}
|
|
139
153
|
}
|
|
154
|
+
function readNode(text) {
|
|
155
|
+
const node = JSON.parse(text);
|
|
156
|
+
return node;
|
|
157
|
+
}
|
|
158
|
+
function readFile(text) {
|
|
159
|
+
const file = JSON.parse(text);
|
|
160
|
+
return file;
|
|
161
|
+
}
|
|
140
162
|
function readValue(file) {
|
|
141
163
|
return typeof file === "string" ? file : file?.value;
|
|
142
164
|
}
|
|
143
165
|
function readPath(file) {
|
|
144
166
|
return typeof file === "string" ? undefined : file?.path;
|
|
145
167
|
}
|
|
146
|
-
//
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
function withPath(file, document) {
|
|
168
|
+
// The crate's messages start with the host file's, in order: the plugins' own objects
|
|
169
|
+
// stay, so `fatal`, `url` and `note` survive; native data first, plugins' data over it
|
|
170
|
+
function readResult(native, document, host) {
|
|
151
171
|
const path = readPath(document);
|
|
172
|
+
const known = host?.messages ?? [];
|
|
173
|
+
const reported = native.messages
|
|
174
|
+
.slice(known.length)
|
|
175
|
+
.map(message => HostMessage.fromMessage(message, path));
|
|
176
|
+
const file = {
|
|
177
|
+
value: native.value,
|
|
178
|
+
messages: [...known, ...reported],
|
|
179
|
+
data: { ...native.data, ...host?.data },
|
|
180
|
+
};
|
|
152
181
|
return path === undefined ? file : { ...file, path };
|
|
153
182
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbW9kZWxzL3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUN6RSxPQUFPLEVBQWtCLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFLL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNwQixPQUFPLENBQWdCO0lBQ3ZCLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQTtJQUNsQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWdCLENBQUE7SUFDaEMsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQ0QsS0FBNEQsRUFDNUQsR0FBRyxPQUFrQjtRQUVyQixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBa0IsRUFBRSxVQUFxQixFQUFFLEVBQUUsQ0FDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUs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QUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFBO0FBQzFELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBUyxTQUFTLENBQUMsTUFBYSxFQUFFLElBQTZCO0lBQzdELE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFBO0FBQ3pELENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFXLEVBQUUsUUFBb0I7SUFDakQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0F0dGFjaGVyIH0gZnJvbSBcIi4uL2FjdGlvbnMvYXR0YWNoZXIvY2hlY2sudHNcIlxuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgbWVyZ2VPcHRpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvb3B0aW9ucy9tZXJnZS50c1wiXG5pbXBvcnQgeyB0eXBlIEhvc3RFbnRyeSwgbWFwUGx1Z2dhYmxlIH0gZnJvbSBcIi4uL2FjdGlvbnMvcGx1Z2dhYmxlL21hcC50c1wiXG5pbXBvcnQgeyBmaW5pc2hSdW4gfSBmcm9tIFwiLi4vYWN0aW9ucy9ydW4vZmluaXNoLnRzXCJcbmltcG9ydCB7IGlzVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy90cmFuc2Zvcm1lci9jaGVjay50c1wiXG5pbXBvcnQgdHlwZSB7IE5hdGl2ZVBpcGVsaW5lIH0gZnJvbSBcIi4vYWRkb24udHNcIlxuaW1wb3J0IHR5cGUgeyBDb21wYXRpYmxlLCBOb2RlLCBWRmlsZSB9IGZyb20gXCIuL2ZpbGUudHNcIlxuaW1wb3J0IHR5cGUgeyBIb3N0IH0gZnJvbSBcIi4vaG9zdC50c1wiXG5pbXBvcnQgdHlwZSB7IEF0dGFjaGVyLCBQbHVnZ2FibGUsIFBsdWdnYWJsZUxpc3QsIFByZXNldCB9IGZyb20gXCIuL3BsdWdpbi50c1wiXG5pbXBvcnQgeyBIb3N0RmlsZSB9IGZyb20gXCIuL3ZmaWxlLnRzXCJcblxuLyoqXG4gKiB1bmlmaWVkJ3MgcHJvY2Vzc29yIG92ZXIgdGhlIG5hdGl2ZSBwaXBlbGluZTsgZXZlcnkgY2FsbCBpcyB0aGUgY3JhdGUncywgZXhjZXB0IHRoYXRcbiAqIEphdmFTY3JpcHQgcGx1Z2lucyBydW4gaGVyZSB3aGVuIGEgcnVuIHBhdXNlcyBiZWZvcmUgdGhlbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NvciB7XG4gICNuYXRpdmU6IE5hdGl2ZVBpcGVsaW5lXG4gICNpZHMgPSBuZXcgTWFwPEF0dGFjaGVyLCBudW1iZXI+KClcbiAgI2hvc3RzID0gbmV3IE1hcDxudW1iZXIsIEhvc3Q+KClcbiAgI2F0dGFjaGVkID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcihuYXRpdmU6IE5hdGl2ZVBpcGVsaW5lKSB7XG4gICAgdGhpcy4jbmF0aXZlID0gbmF0aXZlXG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGx1Z2luLCBhIGxpc3Qgb2YgdGhlbSBvciBhIHByZXNldDsgYSBwbHVnaW4gdXNlZCBhZ2FpbiBpcyByZWNvbmZpZ3VyZWQuIEFcbiAgICogSmF2YVNjcmlwdCBwbHVnaW4gaXMgYW4gYXR0YWNoZXIsIGNhbGxlZCB3aXRoIHRoZSBwcm9jZXNzb3IgYW5kIGl0cyBvcHRpb25zIGF0IGZyZWV6ZS5cbiAgICovXG4gIHVzZShcbiAgICB2YWx1ZTogUGx1Z2dhYmxlIHwgUGx1Z2dhYmxlTGlzdCB8IFByZXNldCB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgLi4ub3B0aW9uczogdW5rbm93bltdXG4gICkge1xuICAgIGlmIChpc0F0dGFjaGVyKHZhbHVlKSkge1xuICAgICAgdGhpcy4jbmF0aXZlLnVzZShbdGhpcy4jcmVnaXN0ZXIodmFsdWUsIG9wdGlvbnMpXSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyID0gKGF0dGFjaGVyOiBBdHRhY2hlciwgcGFyYW1ldGVyczogdW5rbm93bltdKSA9PlxuICAgICAgdGhpcy4jcmVnaXN0ZXIoYXR0YWNoZXIsIHBhcmFtZXRlcnMpXG4gICAgdGhpcy4jbmF0aXZlLnVzZShtYXBQbHVnZ2FibGUodmFsdWUgPz8gbnVsbCwgcmVnaXN0ZXIpLCBvcHRpb25zWzBdKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKiogQWxsIGRhdGEsIG9yIHRoZSB2YWx1ZSB1bmRlciBga2V5YC4gKi9cbiAgZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBkYXRhKGtleTogc3RyaW5nKTogdW5rbm93blxuICAvKiogU2V0IHRoZSB2YWx1ZSB1bmRlciBga2V5YCwgb3IgcmVwbGFjZSBhbGwgZGF0YS4gKi9cbiAgZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB0aGlzXG4gIGRhdGEoZGF0YXNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB0aGlzXG4gIGRhdGEoa2V5Pzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIC4uLnZhbHVlOiB1bmtub3duW10pIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy4jbmF0aXZlLnJlcGxhY2VEYXRhKGtleSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLiNuYXRpdmUuc2V0RGF0YShrZXksIHZhbHVlWzBdKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZS5kYXRhKGtleSlcbiAgfVxuXG4gIC8qKiBBdHRhY2ggZXZlcnkgcGx1Z2luOyBsYXRlciBgdXNlYCBhbmQgYGRhdGFgIHNldHRlcnMgZmFpbC4gKi9cbiAgZnJlZXplKCkge1xuICAgIHRoaXMuI2F0dGFjaCgpXG4gICAgdGhpcy4jbmF0aXZlLmZyZWV6ZSgpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKiBQYXJzZSBhIGRvY3VtZW50IGludG8gYSB0cmVlLiAqL1xuICBwYXJzZShkb2N1bWVudDogQ29tcGF0aWJsZSkge1xuICAgIHRoaXMuI2F0dGFjaCgpXG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZS5wYXJzZShyZWFkVmFsdWUoZG9jdW1lbnQpID8/IFwiXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSB0cmFuc2Zvcm1zLCBmaW5pc2hpbmcgYXN5bmNocm9ub3VzIHN0YWdlczsgYGZpbGVgLCB0aGUgdGV4dCBgdHJlZWAgd2FzIHBhcnNlZFxuICAgKiBmcm9tLCBsZXRzIGJyaWRnZXMgcmVhZCBpdCBhbmQga2VlcHMgcG9zaXRpb25zIGluIHRoZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW4odHJlZTogTm9kZSwgZmlsZT86IENvbXBhdGlibGUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlYWRWYWx1ZShmaWxlKVxuICAgIGlmICghdGhpcy4jYXR0YWNoKCkpIHJldHVybiB0aGlzLiNuYXRpdmUucnVuKHRyZWUsIHZhbHVlKVxuICAgIGNvbnN0IHJ1biA9IHRoaXMuI25hdGl2ZS5zdGFydFJ1bih0cmVlLCB2YWx1ZSwgZmFsc2UpXG4gICAgY29uc3QgaG9zdCA9IG5ldyBIb3N0RmlsZSh7IHZhbHVlLCBwYXRoOiByZWFkUGF0aChmaWxlKSB9KVxuICAgIGF3YWl0IGZpbmlzaFJ1bih7IHJ1biwgaG9zdHM6IHRoaXMuI2hvc3RzLCBmaWxlOiBob3N0LCBzeW5jOiBmYWxzZSwgY2FsbDogXCJydW5cIiB9KVxuICAgIHJldHVybiBydW4ucmVzdWx0KClcbiAgfVxuXG4gIC8qKiBSdW4gdGhlIHRyYW5zZm9ybXM7IGZhaWxzIHdpdGggYGFzeW5jLWluLXN5bmNgIG9uIGFuIGFzeW5jaHJvbm91cyBzdGFnZS4gKi9cbiAgcnVuU3luYyh0cmVlOiBOb2RlLCBmaWxlPzogQ29tcGF0aWJsZSkge1xuICAgIGNvbnN0IHZhbHVlID0gcmVhZFZhbHVlKGZpbGUpXG4gICAgaWYgKCF0aGlzLiNhdHRhY2goKSkgcmV0dXJuIHRoaXMuI25hdGl2ZS5ydW5TeW5jKHRyZWUsIHZhbHVlKVxuICAgIGNvbnN0IHJ1biA9IHRoaXMuI25hdGl2ZS5zdGFydFJ1bih0cmVlLCB2YWx1ZSwgdHJ1ZSlcbiAgICBjb25zdCBob3N0ID0gbmV3IEhvc3RGaWxlKHsgdmFsdWUsIHBhdGg6IHJlYWRQYXRoKGZpbGUpIH0pXG4gICAgdm9pZCBmaW5pc2hSdW4oeyBydW4sIGhvc3RzOiB0aGlzLiNob3N0cywgZmlsZTogaG9zdCwgc3luYzogdHJ1ZSwgY2FsbDogXCJydW5cIiB9KVxuICAgIHJldHVybiBydW4ucmVzdWx0KClcbiAgfVxuXG4gIC8qKiBDb21waWxlIGEgdHJlZSwgcnVubmluZyBubyB0cmFuc2Zvcm0uICovXG4gIHN0cmluZ2lmeSh0cmVlOiBOb2RlKSB7XG4gICAgdGhpcy4jYXR0YWNoKClcbiAgICByZXR1cm4gdGhpcy4jbmF0aXZlLnN0cmluZ2lmeSh0cmVlKVxuICB9XG5cbiAgLyoqIFBhcnNlLCBydW4gYW5kIGNvbXBpbGUgYSBkb2N1bWVudCwgZmluaXNoaW5nIGFzeW5jaHJvbm91cyBzdGFnZXMuICovXG4gIGFzeW5jIHByb2Nlc3MoZG9jdW1lbnQ6IENvbXBhdGlibGUpOiBQcm9taXNlPFZGaWxlPiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRWYWx1ZShkb2N1bWVudCkgPz8gXCJcIlxuICAgIGlmICghdGhpcy4jYXR0YWNoKCkpXG4gICAgICByZXR1cm4gd2l0aFBhdGgodGhpcy4jbmF0aXZlLnByb2Nlc3ModGV4dCwgcmVhZFBhdGgoZG9jdW1lbnQpKSwgZG9jdW1lbnQpXG4gICAgY29uc3QgcnVuID0gdGhpcy4jbmF0aXZlLnN0YXJ0UHJvY2Vzcyh0ZXh0LCBmYWxzZSwgcmVhZFBhdGgoZG9jdW1lbnQpKVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgSG9zdEZpbGUoeyB2YWx1ZTogcnVuLnZhbHVlKCkgPz8gdGV4dCwgcGF0aDogcmVhZFBhdGgoZG9jdW1lbnQpIH0pXG4gICAgYXdhaXQgZmluaXNoUnVuKHsgcnVuLCBob3N0czogdGhpcy4jaG9zdHMsIGZpbGUsIHN5bmM6IGZhbHNlLCBjYWxsOiBcInByb2Nlc3NcIiB9KVxuICAgIHJldHVybiB3aXRoUGF0aChtZXJnZURhdGEocnVuLnJlc3VsdCgpLCBmaWxlLmRhdGEpLCBkb2N1bWVudClcbiAgfVxuXG4gIC8qKiBQYXJzZSwgcnVuIGFuZCBjb21waWxlIGEgZG9jdW1lbnQ7IGZhaWxzIHdpdGggYGFzeW5jLWluLXN5bmNgIG9uIGFuIGFzeW5jaHJvbm91cyBzdGFnZS4gKi9cbiAgcHJvY2Vzc1N5bmMoZG9jdW1lbnQ6IENvbXBhdGlibGUpOiBWRmlsZSB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRWYWx1ZShkb2N1bWVudCkgPz8gXCJcIlxuICAgIGlmICghdGhpcy4jYXR0YWNoKCkpXG4gICAgICByZXR1cm4gd2l0aFBhdGgodGhpcy4jbmF0aXZlLnByb2Nlc3NTeW5jKHRleHQsIHJlYWRQYXRoKGRvY3VtZW50KSksIGRvY3VtZW50KVxuICAgIGNvbnN0IHJ1biA9IHRoaXMuI25hdGl2ZS5zdGFydFByb2Nlc3ModGV4dCwgdHJ1ZSwgcmVhZFBhdGgoZG9jdW1lbnQpKVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgSG9zdEZpbGUoeyB2YWx1ZTogcnVuLnZhbHVlKCkgPz8gdGV4dCwgcGF0aDogcmVhZFBhdGgoZG9jdW1lbnQpIH0pXG4gICAgdm9pZCBmaW5pc2hSdW4oeyBydW4sIGhvc3RzOiB0aGlzLiNob3N0cywgZmlsZSwgc3luYzogdHJ1ZSwgY2FsbDogXCJwcm9jZXNzXCIgfSlcbiAgICByZXR1cm4gd2l0aFBhdGgobWVyZ2VEYXRhKHJ1bi5yZXN1bHQoKSwgZmlsZS5kYXRhKSwgZG9jdW1lbnQpXG4gIH1cblxuICAvLyB1bmlmaWVkJ3MgYWRkUGx1Z2luOiB0aGUgc2FtZSBhdHRhY2hlciBpcyBvbmUgcGx1Z2luLCBpdHMgb2JqZWN0IG9wdGlvbnMgbWVyZ2VkXG4gICNyZWdpc3RlcihhdHRhY2hlcjogQXR0YWNoZXIsIHBhcmFtZXRlcnM6IHVua25vd25bXSk6IEhvc3RFbnRyeSB7XG4gICAgbGV0IGlkID0gdGhpcy4jaWRzLmdldChhdHRhY2hlcilcbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWQgPSB0aGlzLiNpZHMuc2l6ZVxuICAgICAgdGhpcy4jaWRzLnNldChhdHRhY2hlciwgaWQpXG4gICAgICB0aGlzLiNob3N0cy5zZXQoaWQsIHsgYXR0YWNoZXIsIHBhcmFtZXRlcnMgfSlcbiAgICAgIHJldHVybiBbeyBob3N0OiBpZCB9LCBwYXJhbWV0ZXJzWzBdICE9PSBmYWxzZV1cbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuI2hvc3RzLmdldChpZClcbiAgICBpZiAoIWhvc3QgfHwgcGFyYW1ldGVycy5sZW5ndGggPT09IDApIHJldHVybiBbeyBob3N0OiBpZCB9XVxuICAgIGNvbnN0IFtwcmltYXJ5LCAuLi5yZXN0XSA9IHBhcmFtZXRlcnNcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgaXNQbGFpbk9iamVjdChob3N0LnBhcmFtZXRlcnNbMF0pICYmIGlzUGxhaW5PYmplY3QocHJpbWFyeSlcbiAgICAgICAgPyBtZXJnZU9wdGlvbnMoaG9zdC5wYXJhbWV0ZXJzWzBdLCBwcmltYXJ5KVxuICAgICAgICA6IHByaW1hcnlcbiAgICBob3N0LnBhcmFtZXRlcnMgPSBbbWVyZ2VkLCAuLi5yZXN0XVxuICAgIHJldHVybiBbeyBob3N0OiBpZCB9LCBtZXJnZWQgIT09IGZhbHNlXVxuICB9XG5cbiAgLy8gQXR0YWNoZXJzIHJ1biBvbmNlLCBiZWZvcmUgdGhlIG5hdGl2ZSBwaXBlbGluZSBmcmVlemVzLCBzbyB0aGV5IGNhbiBzdGlsbCBzZXQgZGF0YTtcbiAgLy8gd2hldGhlciBhbnkgSmF2YVNjcmlwdCBwbHVnaW4gaXMgb24gZGVjaWRlcyBpZiBydW5zIHBhdXNlIGZvciB0aGVtXG4gICNhdHRhY2goKSB7XG4gICAgaWYgKCF0aGlzLiNhdHRhY2hlZCkge1xuICAgICAgdGhpcy4jYXR0YWNoZWQgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMuI25hdGl2ZS5ob3N0cygpKSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLiNob3N0cy5nZXQoaWQpXG4gICAgICAgIGlmICghaG9zdCkgY29udGludWVcbiAgICAgICAgY29uc3QgW3ByaW1hcnksIC4uLnJlc3RdID0gaG9zdC5wYXJhbWV0ZXJzXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwcmltYXJ5ID09PSB0cnVlID8gW3VuZGVmaW5lZCwgLi4ucmVzdF0gOiBob3N0LnBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXI6IHVua25vd24gPSBSZWZsZWN0LmFwcGx5KGhvc3QuYXR0YWNoZXIsIHRoaXMsIHBhcmFtZXRlcnMpXG4gICAgICAgIGlmIChpc1RyYW5zZm9ybWVyKHRyYW5zZm9ybWVyKSkgaG9zdC50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNuYXRpdmUuaG9zdHMoKS5sZW5ndGggPiAwXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlKGZpbGU6IENvbXBhdGlibGUgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHR5cGVvZiBmaWxlID09PSBcInN0cmluZ1wiID8gZmlsZSA6IGZpbGU/LnZhbHVlXG59XG5cbmZ1bmN0aW9uIHJlYWRQYXRoKGZpbGU6IENvbXBhdGlibGUgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHR5cGVvZiBmaWxlID09PSBcInN0cmluZ1wiID8gdW5kZWZpbmVkIDogZmlsZT8ucGF0aFxufVxuXG4vLyBOYXRpdmUgc3RhZ2VzJyBkYXRhIGZpcnN0LCB0aGVuIHdoYXQgSmF2YVNjcmlwdCBwbHVnaW5zIHN0b3JlZCBvdmVyIGl0XG5mdW5jdGlvbiBtZXJnZURhdGEocmVzdWx0OiBWRmlsZSwgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBWRmlsZSB7XG4gIHJldHVybiB7IC4uLnJlc3VsdCwgZGF0YTogeyAuLi5yZXN1bHQuZGF0YSwgLi4uZGF0YSB9IH1cbn1cblxuZnVuY3Rpb24gd2l0aFBhdGgoZmlsZTogVkZpbGUsIGRvY3VtZW50OiBDb21wYXRpYmxlKSB7XG4gIGNvbnN0IHBhdGggPSByZWFkUGF0aChkb2N1bWVudClcbiAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IGZpbGUgOiB7IC4uLmZpbGUsIHBhdGggfVxufVxuIl19
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbW9kZWxzL3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUN6RSxPQUFPLEVBQWtCLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFNL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFbEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEIsT0FBTyxDQUFnQjtJQUN2QixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUE7SUFDbEMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFBO0lBQ2hDLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDakIsT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUVmLFlBQVksTUFBc0I7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQVdELG1GQUFtRjtJQUNuRixHQUFHLENBQ0QsS0FBNEQsRUFDNUQsR0FBRyxPQUFrQjtRQUVyQixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBa0IsRUFBRSxVQUFxQixFQUFFLEVBQUUs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LFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFBO0FBQzFELENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsdUZBQXVGO0FBQ3ZGLFNBQVMsVUFBVSxDQUFDLE1BQWtCLEVBQUUsUUFBb0IsRUFBRSxJQUFlO0lBQzNFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUTtTQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sSUFBSSxHQUFVO1FBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixRQUFRLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUNqQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQ3hDLENBQUE7SUFDRCxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBdHRhY2hlciB9IGZyb20gXCIuLi9hY3Rpb25zL2F0dGFjaGVyL2NoZWNrLnRzXCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QsIG1lcmdlT3B0aW9ucyB9IGZyb20gXCIuLi9hY3Rpb25zL29wdGlvbnMvbWVyZ2UudHNcIlxuaW1wb3J0IHsgdHlwZSBIb3N0RW50cnksIG1hcFBsdWdnYWJsZSB9IGZyb20gXCIuLi9hY3Rpb25zL3BsdWdnYWJsZS9tYXAudHNcIlxuaW1wb3J0IHsgZmluaXNoUnVuIH0gZnJvbSBcIi4uL2FjdGlvbnMvcnVuL2ZpbmlzaC50c1wiXG5pbXBvcnQgeyBpc1RyYW5zZm9ybWVyIH0gZnJvbSBcIi4uL2FjdGlvbnMvdHJhbnNmb3JtZXIvY2hlY2sudHNcIlxuaW1wb3J0IHR5cGUgeyBOb2RlIGFzIFVuaXN0Tm9kZSB9IGZyb20gXCJ1bmlzdFwiXG5pbXBvcnQgdHlwZSB7IE5hdGl2ZUZpbGUsIE5hdGl2ZVBpcGVsaW5lIH0gZnJvbSBcIi4vYWRkb24udHNcIlxuaW1wb3J0IHR5cGUgeyBDb21wYXRpYmxlLCBOb2RlLCBWRmlsZSB9IGZyb20gXCIuL2ZpbGUudHNcIlxuaW1wb3J0IHR5cGUgeyBIb3N0IH0gZnJvbSBcIi4vaG9zdC50c1wiXG5pbXBvcnQgdHlwZSB7IEF0dGFjaGVyLCBQYXJzZXIsIFBsdWdnYWJsZSwgUGx1Z2dhYmxlTGlzdCwgUHJlc2V0IH0gZnJvbSBcIi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IEhvc3RGaWxlLCBIb3N0TWVzc2FnZSB9IGZyb20gXCIuL3ZmaWxlLnRzXCJcblxuLyoqXG4gKiB1bmlmaWVkJ3MgcHJvY2Vzc29yIG92ZXIgdGhlIG5hdGl2ZSBwaXBlbGluZTsgZXZlcnkgY2FsbCBpcyB0aGUgY3JhdGUncywgZXhjZXB0IHRoYXRcbiAqIEphdmFTY3JpcHQgcGx1Z2lucyBydW4gaGVyZSB3aGVuIGEgcnVuIHBhdXNlcyBiZWZvcmUgdGhlbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NvcjxUcmVlIGV4dGVuZHMgVW5pc3ROb2RlID0gTm9kZT4ge1xuICAjbmF0aXZlOiBOYXRpdmVQaXBlbGluZVxuICAjaWRzID0gbmV3IE1hcDxBdHRhY2hlciwgbnVtYmVyPigpXG4gICNob3N0cyA9IG5ldyBNYXA8bnVtYmVyLCBIb3N0PigpXG4gICNhdHRhY2hlZCA9IGZhbHNlXG4gICNmcm96ZW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKG5hdGl2ZTogTmF0aXZlUGlwZWxpbmUpIHtcbiAgICB0aGlzLiNuYXRpdmUgPSBuYXRpdmVcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwbHVnaW4sIGEgbGlzdCBvZiB0aGVtIG9yIGEgcHJlc2V0OyBhIHBsdWdpbiB1c2VkIGFnYWluIGlzIHJlY29uZmlndXJlZC4gQVxuICAgKiBKYXZhU2NyaXB0IHBsdWdpbiBpcyBhbiBhdHRhY2hlciwgY2FsbGVkIHdpdGggdGhlIHByb2Nlc3NvciBhbmQgaXRzIG9wdGlvbnMgYXQgZnJlZXplLlxuICAgKiBBIHBhcnNlciwgc3VjaCBhcyBgbWQucGFyc2UoKWAsIHR5cGVzIHRoZSB0cmVlIGBwYXJzZWAgcmV0dXJucy5cbiAgICovXG4gIHVzZTxWYWx1ZSBleHRlbmRzIFBsdWdnYWJsZSB8IFBsdWdnYWJsZUxpc3QgfCBQcmVzZXQgfCBudWxsIHwgdW5kZWZpbmVkPihcbiAgICB2YWx1ZTogVmFsdWUsXG4gICAgLi4ub3B0aW9uczogdW5rbm93bltdXG4gICk6IFByb2Nlc3NvcjxQYXJzZWRUcmVlPFZhbHVlLCBUcmVlPj5cbiAgLy8gYSBwYXJzZXIgcmV0eXBlcyB0aGlzIHNhbWUgcHJvY2Vzc29yOiB0aGUgdHJlZSBpdCBwYXJzZXMgbGl2ZXMgaW4gdGhlIHR5cGUgYWxvbmVcbiAgdXNlKFxuICAgIHZhbHVlOiBQbHVnZ2FibGUgfCBQbHVnZ2FibGVMaXN0IHwgUHJlc2V0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAuLi5vcHRpb25zOiB1bmtub3duW11cbiAgKTogUHJvY2Vzc29yPFVuaXN0Tm9kZT4ge1xuICAgIGlmIChpc0F0dGFjaGVyKHZhbHVlKSkge1xuICAgICAgdGhpcy4jbmF0aXZlLnVzZShbdGhpcy4jcmVnaXN0ZXIodmFsdWUsIG9wdGlvbnMpXSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyID0gKGF0dGFjaGVyOiBBdHRhY2hlciwgcGFyYW1ldGVyczogdW5rbm93bltdKSA9PlxuICAgICAgdGhpcy4jcmVnaXN0ZXIoYXR0YWNoZXIsIHBhcmFtZXRlcnMpXG4gICAgdGhpcy4jbmF0aXZlLnVzZShtYXBQbHVnZ2FibGUodmFsdWUgPz8gbnVsbCwgcmVnaXN0ZXIpLCBvcHRpb25zWzBdKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKiogQWxsIGRhdGEsIG9yIHRoZSB2YWx1ZSB1bmRlciBga2V5YC4gKi9cbiAgZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBkYXRhKGtleTogc3RyaW5nKTogdW5rbm93blxuICAvKiogU2V0IHRoZSB2YWx1ZSB1bmRlciBga2V5YCwgb3IgcmVwbGFjZSBhbGwgZGF0YS4gKi9cbiAgZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB0aGlzXG4gIGRhdGEoZGF0YXNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB0aGlzXG4gIGRhdGEoa2V5Pzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIC4uLnZhbHVlOiB1bmtub3duW10pIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy4jbmF0aXZlLnJlcGxhY2VEYXRhKGtleSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLiNuYXRpdmUuc2V0RGF0YShrZXksIHZhbHVlWzBdKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZS5kYXRhKGtleSlcbiAgfVxuXG4gIC8qKiBBdHRhY2ggZXZlcnkgcGx1Z2luOyBsYXRlciBgdXNlYCBhbmQgYGRhdGFgIHNldHRlcnMgZmFpbC4gKi9cbiAgZnJlZXplKCkge1xuICAgIHRoaXMuI2F0dGFjaCgpXG4gICAgdGhpcy4jZnJlZXplTmF0aXZlKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqIFBhcnNlIGEgZG9jdW1lbnQgaW50byBhIHRyZWUuICovXG4gIHBhcnNlKGRvY3VtZW50OiBDb21wYXRpYmxlKSB7XG4gICAgdGhpcy4jYXR0YWNoKClcbiAgICBjb25zdCB0cmVlOiBUcmVlID0gSlNPTi5wYXJzZSh0aGlzLiNuYXRpdmUucGFyc2UocmVhZFZhbHVlKGRvY3VtZW50KSA/PyBcIlwiKSlcbiAgICByZXR1cm4gdHJlZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgdHJhbnNmb3JtcywgZmluaXNoaW5nIGFzeW5jaHJvbm91cyBzdGFnZXM7IGBmaWxlYCwgdGhlIHRleHQgYHRyZWVgIHdhcyBwYXJzZWRcbiAgICogZnJvbSwgbGV0cyBicmlkZ2VzIHJlYWQgaXQgYW5kIGtlZXBzIHBvc2l0aW9ucyBpbiB0aGUgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuKHRyZWU6IFVuaXN0Tm9kZSwgZmlsZT86IENvbXBhdGlibGUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlYWRWYWx1ZShmaWxlKVxuICAgIGlmICghdGhpcy4jYXR0YWNoKCkpIHJldHVybiByZWFkTm9kZSh0aGlzLiNuYXRpdmUucnVuKEpTT04uc3RyaW5naWZ5KHRyZWUpLCB2YWx1ZSkpXG4gICAgY29uc3QgcnVuID0gdGhpcy4jbmF0aXZlLnN0YXJ0UnVuKEpTT04uc3RyaW5naWZ5KHRyZWUpLCB2YWx1ZSwgZmFsc2UpXG4gICAgY29uc3QgaG9zdCA9IG5ldyBIb3N0RmlsZSh7IHZhbHVlLCBwYXRoOiByZWFkUGF0aChmaWxlKSB9KVxuICAgIGF3YWl0IGZpbmlzaFJ1bih7IHJ1biwgaG9zdHM6IHRoaXMuI2hvc3RzLCBmaWxlOiBob3N0LCBzeW5jOiBmYWxzZSwgY2FsbDogXCJydW5cIiB9KVxuICAgIHJldHVybiByZWFkTm9kZShydW4ucmVzdWx0KCkpXG4gIH1cblxuICAvKiogUnVuIHRoZSB0cmFuc2Zvcm1zOyBmYWlscyB3aXRoIGBhc3luYy1pbi1zeW5jYCBvbiBhbiBhc3luY2hyb25vdXMgc3RhZ2UuICovXG4gIHJ1blN5bmModHJlZTogVW5pc3ROb2RlLCBmaWxlPzogQ29tcGF0aWJsZSkge1xuICAgIGNvbnN0IHZhbHVlID0gcmVhZFZhbHVlKGZpbGUpXG4gICAgaWYgKCF0aGlzLiNhdHRhY2goKSlcbiAgICAgIHJldHVybiByZWFkTm9kZSh0aGlzLiNuYXRpdmUucnVuU3luYyhKU09OLnN0cmluZ2lmeSh0cmVlKSwgdmFsdWUpKVxuICAgIGNvbnN0IHJ1biA9IHRoaXMuI25hdGl2ZS5zdGFydFJ1bihKU09OLnN0cmluZ2lmeSh0cmVlKSwgdmFsdWUsIHRydWUpXG4gICAgY29uc3QgaG9zdCA9IG5ldyBIb3N0RmlsZSh7IHZhbHVlLCBwYXRoOiByZWFkUGF0aChmaWxlKSB9KVxuICAgIHZvaWQgZmluaXNoUnVuKHsgcnVuLCBob3N0czogdGhpcy4jaG9zdHMsIGZpbGU6IGhvc3QsIHN5bmM6IHRydWUsIGNhbGw6IFwicnVuXCIgfSlcbiAgICByZXR1cm4gcmVhZE5vZGUocnVuLnJlc3VsdCgpKVxuICB9XG5cbiAgLyoqIENvbXBpbGUgYSB0cmVlLCBydW5uaW5nIG5vIHRyYW5zZm9ybS4gKi9cbiAgc3RyaW5naWZ5KHRyZWU6IFVuaXN0Tm9kZSkge1xuICAgIHRoaXMuI2F0dGFjaCgpXG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZS5zdHJpbmdpZnkoSlNPTi5zdHJpbmdpZnkodHJlZSkpXG4gIH1cblxuICAvKiogUGFyc2UsIHJ1biBhbmQgY29tcGlsZSBhIGRvY3VtZW50LCBmaW5pc2hpbmcgYXN5bmNocm9ub3VzIHN0YWdlcy4gKi9cbiAgYXN5bmMgcHJvY2Vzcyhkb2N1bWVudDogQ29tcGF0aWJsZSk6IFByb21pc2U8VkZpbGU+IHtcbiAgICBjb25zdCB0ZXh0ID0gcmVhZFZhbHVlKGRvY3VtZW50KSA/PyBcIlwiXG4gICAgaWYgKCF0aGlzLiNhdHRhY2goKSkge1xuICAgICAgdGhpcy4jZnJlZXplTmF0aXZlKClcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBhd2FpdCB0aGlzLiNuYXRpdmUucHJvY2Vzcyh0ZXh0LCByZWFkUGF0aChkb2N1bWVudCkpXG4gICAgICBpZiAob3V0Y29tZS5lcnJvcilcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3Iob3V0Y29tZS5lcnJvci5tZXNzYWdlKSwgb3V0Y29tZS5lcnJvcilcbiAgICAgIGlmICghb3V0Y29tZS5maWxlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzIHNldHRsZWQgd2l0aCBuZWl0aGVyIGEgZmlsZSBub3IgYW4gZXJyb3JcIilcbiAgICAgIHJldHVybiByZWFkUmVzdWx0KG91dGNvbWUuZmlsZSwgZG9jdW1lbnQpXG4gICAgfVxuICAgIGNvbnN0IHJ1biA9IHRoaXMuI25hdGl2ZS5zdGFydFByb2Nlc3ModGV4dCwgZmFsc2UsIHJlYWRQYXRoKGRvY3VtZW50KSlcbiAgICBjb25zdCBmaWxlID0gbmV3IEhvc3RGaWxlKHsgdmFsdWU6IHJ1bi52YWx1ZSgpID8/IHRleHQsIHBhdGg6IHJlYWRQYXRoKGRvY3VtZW50KSB9KVxuICAgIGF3YWl0IGZpbmlzaFJ1bih7IHJ1biwgaG9zdHM6IHRoaXMuI2hvc3RzLCBmaWxlLCBzeW5jOiBmYWxzZSwgY2FsbDogXCJwcm9jZXNzXCIgfSlcbiAgICByZXR1cm4gcmVhZFJlc3VsdChyZWFkRmlsZShydW4ucmVzdWx0KCkpLCBkb2N1bWVudCwgZmlsZSlcbiAgfVxuXG4gIC8qKiBQYXJzZSwgcnVuIGFuZCBjb21waWxlIGEgZG9jdW1lbnQ7IGZhaWxzIHdpdGggYGFzeW5jLWluLXN5bmNgIG9uIGFuIGFzeW5jaHJvbm91cyBzdGFnZS4gKi9cbiAgcHJvY2Vzc1N5bmMoZG9jdW1lbnQ6IENvbXBhdGlibGUpOiBWRmlsZSB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRWYWx1ZShkb2N1bWVudCkgPz8gXCJcIlxuICAgIGlmICghdGhpcy4jYXR0YWNoKCkpXG4gICAgICByZXR1cm4gcmVhZFJlc3VsdCh0aGlzLiNuYXRpdmUucHJvY2Vzc1N5bmModGV4dCwgcmVhZFBhdGgoZG9jdW1lbnQpKSwgZG9jdW1lbnQpXG4gICAgY29uc3QgcnVuID0gdGhpcy4jbmF0aXZlLnN0YXJ0UHJvY2Vzcyh0ZXh0LCB0cnVlLCByZWFkUGF0aChkb2N1bWVudCkpXG4gICAgY29uc3QgZmlsZSA9IG5ldyBIb3N0RmlsZSh7IHZhbHVlOiBydW4udmFsdWUoKSA/PyB0ZXh0LCBwYXRoOiByZWFkUGF0aChkb2N1bWVudCkgfSlcbiAgICB2b2lkIGZpbmlzaFJ1bih7IHJ1biwgaG9zdHM6IHRoaXMuI2hvc3RzLCBmaWxlLCBzeW5jOiB0cnVlLCBjYWxsOiBcInByb2Nlc3NcIiB9KVxuICAgIHJldHVybiByZWFkUmVzdWx0KHJlYWRGaWxlKHJ1bi5yZXN1bHQoKSksIGRvY3VtZW50LCBmaWxlKVxuICB9XG5cbiAgLy8gT25jZSBvbmx5OiBgZnJlZXplYCBib3Jyb3dzIHRoZSBuYXRpdmUgcGlwZWxpbmUgbXV0YWJseSwgd2hpY2ggbmFwaSByZWZ1c2VzIHdoaWxlIGFuXG4gIC8vIGFzeW5jIGBwcm9jZXNzYCBzdGlsbCBob2xkcyBpdFxuICAjZnJlZXplTmF0aXZlKCkge1xuICAgIGlmICh0aGlzLiNmcm96ZW4pIHJldHVyblxuICAgIHRoaXMuI2Zyb3plbiA9IHRydWVcbiAgICB0aGlzLiNuYXRpdmUuZnJlZXplKClcbiAgfVxuXG4gIC8vIHVuaWZpZWQncyBhZGRQbHVnaW46IHRoZSBzYW1lIGF0dGFjaGVyIGlzIG9uZSBwbHVnaW4sIGl0cyBvYmplY3Qgb3B0aW9ucyBtZXJnZWRcbiAgI3JlZ2lzdGVyKGF0dGFjaGVyOiBBdHRhY2hlciwgcGFyYW1ldGVyczogdW5rbm93bltdKTogSG9zdEVudHJ5IHtcbiAgICBsZXQgaWQgPSB0aGlzLiNpZHMuZ2V0KGF0dGFjaGVyKVxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZCA9IHRoaXMuI2lkcy5zaXplXG4gICAgICB0aGlzLiNpZHMuc2V0KGF0dGFjaGVyLCBpZClcbiAgICAgIHRoaXMuI2hvc3RzLnNldChpZCwgeyBhdHRhY2hlciwgcGFyYW1ldGVycyB9KVxuICAgICAgcmV0dXJuIFt7IGhvc3Q6IGlkIH0sIHBhcmFtZXRlcnNbMF0gIT09IGZhbHNlXVxuICAgIH1cbiAgICBjb25zdCBob3N0ID0gdGhpcy4jaG9zdHMuZ2V0KGlkKVxuICAgIGlmICghaG9zdCB8fCBwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFt7IGhvc3Q6IGlkIH1dXG4gICAgY29uc3QgW3ByaW1hcnksIC4uLnJlc3RdID0gcGFyYW1ldGVyc1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBpc1BsYWluT2JqZWN0KGhvc3QucGFyYW1ldGVyc1swXSkgJiYgaXNQbGFpbk9iamVjdChwcmltYXJ5KVxuICAgICAgICA/IG1lcmdlT3B0aW9ucyhob3N0LnBhcmFtZXRlcnNbMF0sIHByaW1hcnkpXG4gICAgICAgIDogcHJpbWFyeVxuICAgIGhvc3QucGFyYW1ldGVycyA9IFttZXJnZWQsIC4uLnJlc3RdXG4gICAgcmV0dXJuIFt7IGhvc3Q6IGlkIH0sIG1lcmdlZCAhPT0gZmFsc2VdXG4gIH1cblxuICAvLyBBdHRhY2hlcnMgcnVuIG9uY2UsIGJlZm9yZSB0aGUgbmF0aXZlIHBpcGVsaW5lIGZyZWV6ZXMsIHNvIHRoZXkgY2FuIHN0aWxsIHNldCBkYXRhO1xuICAvLyB3aGV0aGVyIGFueSBKYXZhU2NyaXB0IHBsdWdpbiBpcyBvbiBkZWNpZGVzIGlmIHJ1bnMgcGF1c2UgZm9yIHRoZW1cbiAgI2F0dGFjaCgpIHtcbiAgICBpZiAoIXRoaXMuI2F0dGFjaGVkKSB7XG4gICAgICB0aGlzLiNhdHRhY2hlZCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy4jbmF0aXZlLmhvc3RzKCkpIHtcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuI2hvc3RzLmdldChpZClcbiAgICAgICAgaWYgKCFob3N0KSBjb250aW51ZVxuICAgICAgICBjb25zdCBbcHJpbWFyeSwgLi4ucmVzdF0gPSBob3N0LnBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHByaW1hcnkgPT09IHRydWUgPyBbdW5kZWZpbmVkLCAuLi5yZXN0XSA6IGhvc3QucGFyYW1ldGVyc1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lcjogdW5rbm93biA9IFJlZmxlY3QuYXBwbHkoaG9zdC5hdHRhY2hlciwgdGhpcywgcGFyYW1ldGVycylcbiAgICAgICAgaWYgKGlzVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpKSBob3N0LnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZS5ob3N0cygpLmxlbmd0aCA+IDBcbiAgfVxufVxuXG4vLyBBIHBsdWdpbiB3aXRob3V0IHRoZSBtYXJrZXIgaW5mZXJzIGB1bmtub3duYCBmcm9tIHRoZSBvcHRpb25hbCBrZXksIGtlZXBpbmcgdGhlIHRyZWVcbnR5cGUgUGFyc2VkVHJlZTxWYWx1ZSwgQ3VycmVudD4gPVxuICBWYWx1ZSBleHRlbmRzIFBhcnNlcjxpbmZlciBQYXJzZWQ+XG4gICAgPyBQYXJzZWQgZXh0ZW5kcyBVbmlzdE5vZGVcbiAgICAgID8gUGFyc2VkXG4gICAgICA6IEN1cnJlbnRcbiAgICA6IEN1cnJlbnRcblxuZnVuY3Rpb24gcmVhZE5vZGUodGV4dDogc3RyaW5nKSB7XG4gIGNvbnN0IG5vZGU6IE5vZGUgPSBKU09OLnBhcnNlKHRleHQpXG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlYWRGaWxlKHRleHQ6IHN0cmluZykge1xuICBjb25zdCBmaWxlOiBOYXRpdmVGaWxlID0gSlNPTi5wYXJzZSh0ZXh0KVxuICByZXR1cm4gZmlsZVxufVxuXG5mdW5jdGlvbiByZWFkVmFsdWUoZmlsZTogQ29tcGF0aWJsZSB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gdHlwZW9mIGZpbGUgPT09IFwic3RyaW5nXCIgPyBmaWxlIDogZmlsZT8udmFsdWVcbn1cblxuZnVuY3Rpb24gcmVhZFBhdGgoZmlsZTogQ29tcGF0aWJsZSB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gdHlwZW9mIGZpbGUgPT09IFwic3RyaW5nXCIgPyB1bmRlZmluZWQgOiBmaWxlPy5wYXRoXG59XG5cbi8vIFRoZSBjcmF0ZSdzIG1lc3NhZ2VzIHN0YXJ0IHdpdGggdGhlIGhvc3QgZmlsZSdzLCBpbiBvcmRlcjogdGhlIHBsdWdpbnMnIG93biBvYmplY3RzXG4vLyBzdGF5LCBzbyBgZmF0YWxgLCBgdXJsYCBhbmQgYG5vdGVgIHN1cnZpdmU7IG5hdGl2ZSBkYXRhIGZpcnN0LCBwbHVnaW5zJyBkYXRhIG92ZXIgaXRcbmZ1bmN0aW9uIHJlYWRSZXN1bHQobmF0aXZlOiBOYXRpdmVGaWxlLCBkb2N1bWVudDogQ29tcGF0aWJsZSwgaG9zdD86IEhvc3RGaWxlKTogVkZpbGUge1xuICBjb25zdCBwYXRoID0gcmVhZFBhdGgoZG9jdW1lbnQpXG4gIGNvbnN0IGtub3duID0gaG9zdD8ubWVzc2FnZXMgPz8gW11cbiAgY29uc3QgcmVwb3J0ZWQgPSBuYXRpdmUubWVzc2FnZXNcbiAgICAuc2xpY2Uoa25vd24ubGVuZ3RoKVxuICAgIC5tYXAobWVzc2FnZSA9PiBIb3N0TWVzc2FnZS5mcm9tTWVzc2FnZShtZXNzYWdlLCBwYXRoKSlcbiAgY29uc3QgZmlsZTogVkZpbGUgPSB7XG4gICAgdmFsdWU6IG5hdGl2ZS52YWx1ZSxcbiAgICBtZXNzYWdlczogWy4uLmtub3duLCAuLi5yZXBvcnRlZF0sXG4gICAgZGF0YTogeyAuLi5uYXRpdmUuZGF0YSwgLi4uaG9zdD8uZGF0YSB9LFxuICB9XG4gIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyBmaWxlIDogeyAuLi5maWxlLCBwYXRoIH1cbn1cbiJdfQ==
|
package/build/settings.d.ts
CHANGED
|
@@ -5,10 +5,12 @@ export interface Platform {
|
|
|
5
5
|
target: string;
|
|
6
6
|
/** The addon's file name at the package's root. */
|
|
7
7
|
addon: string;
|
|
8
|
+
/** The C library a Linux addon links against; npm skips the package on the other one. */
|
|
9
|
+
libc?: "glibc" | "musl";
|
|
8
10
|
}
|
|
9
11
|
/** The npm package users install; it pulls in the one platform package that matches. */
|
|
10
12
|
export declare const PACKAGE_NAME = "textlane";
|
|
11
13
|
/** An environment variable that points at an addon to load instead of the installed one. */
|
|
12
14
|
export declare const ADDON_ENV = "TEXTLANE_ADDON";
|
|
13
|
-
/** Every published platform, keyed by `${process.platform}-${process.arch}`. */
|
|
15
|
+
/** Every published platform, keyed by `${process.platform}-${process.arch}`, plus `-musl`. */
|
|
14
16
|
export declare const PLATFORMS: Record<string, Platform>;
|
package/build/settings.js
CHANGED
|
@@ -2,16 +2,27 @@
|
|
|
2
2
|
export const PACKAGE_NAME = "textlane";
|
|
3
3
|
/** An environment variable that points at an addon to load instead of the installed one. */
|
|
4
4
|
export const ADDON_ENV = "TEXTLANE_ADDON";
|
|
5
|
-
/** Every published platform, keyed by `${process.platform}-${process.arch}`. */
|
|
5
|
+
/** Every published platform, keyed by `${process.platform}-${process.arch}`, plus `-musl`. */
|
|
6
6
|
export const PLATFORMS = {
|
|
7
7
|
"linux-x64": createPlatform("linux-x64", "x86_64-unknown-linux-gnu"),
|
|
8
8
|
"linux-arm64": createPlatform("linux-arm64", "aarch64-unknown-linux-gnu"),
|
|
9
|
+
"linux-x64-musl": createPlatform("linux-x64-musl", "x86_64-unknown-linux-musl"),
|
|
10
|
+
"linux-arm64-musl": createPlatform("linux-arm64-musl", "aarch64-unknown-linux-musl"),
|
|
9
11
|
"darwin-x64": createPlatform("darwin-x64", "x86_64-apple-darwin"),
|
|
10
12
|
"darwin-arm64": createPlatform("darwin-arm64", "aarch64-apple-darwin"),
|
|
11
13
|
"win32-x64": createPlatform("win32-x64", "x86_64-pc-windows-msvc"),
|
|
12
14
|
"win32-arm64": createPlatform("win32-arm64", "aarch64-pc-windows-msvc"),
|
|
13
15
|
};
|
|
14
16
|
function createPlatform(key, target) {
|
|
15
|
-
|
|
17
|
+
const platform = {
|
|
18
|
+
packageName: `@textlane/${key}`,
|
|
19
|
+
target,
|
|
20
|
+
addon: "textlane.node",
|
|
21
|
+
};
|
|
22
|
+
if (target.endsWith("-linux-gnu"))
|
|
23
|
+
platform.libc = "glibc";
|
|
24
|
+
if (target.endsWith("-linux-musl"))
|
|
25
|
+
platform.libc = "musl";
|
|
26
|
+
return platform;
|
|
16
27
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQTtBQUV0Qyw0RkFBNEY7QUFDNUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFBO0FBRXpDLDhGQUE4RjtBQUM5RixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQTZCO0lBQ2pELFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLDBCQUEwQixDQUFDO0lBQ3BFLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYSxFQUFFLDJCQUEyQixDQUFDO0lBQ3pFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSwyQkFBMkIsQ0FBQztJQUMvRSxrQkFBa0IsRUFBRSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsNEJBQTRCLENBQUM7SUFDcEYsWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLENBQUM7SUFDakUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUM7SUFDdEUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCLENBQUM7SUFDbEUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUseUJBQXlCLENBQUM7Q0FDeEUsQ0FBQTtBQUVELFNBQVMsY0FBYyxDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQ2pELE1BQU0sUUFBUSxHQUFhO1FBQ3pCLFdBQVcsRUFBRSxhQUFhLEdBQUcsRUFBRTtRQUMvQixNQUFNO1FBQ04sS0FBSyxFQUFFLGVBQWU7S0FDdkIsQ0FBQTtJQUNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQTtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUE7SUFDMUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm0ge1xuICAvKiogVGhlIG5wbSBwYWNrYWdlIHRoYXQgY2FycmllcyB0aGlzIHBsYXRmb3JtJ3MgYWRkb24uICovXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmdcbiAgLyoqIFRoZSBSdXN0IHRhcmdldCB0aGUgYWRkb24gaXMgY29tcGlsZWQgZm9yLiAqL1xuICB0YXJnZXQ6IHN0cmluZ1xuICAvKiogVGhlIGFkZG9uJ3MgZmlsZSBuYW1lIGF0IHRoZSBwYWNrYWdlJ3Mgcm9vdC4gKi9cbiAgYWRkb246IHN0cmluZ1xuICAvKiogVGhlIEMgbGlicmFyeSBhIExpbnV4IGFkZG9uIGxpbmtzIGFnYWluc3Q7IG5wbSBza2lwcyB0aGUgcGFja2FnZSBvbiB0aGUgb3RoZXIgb25lLiAqL1xuICBsaWJjPzogXCJnbGliY1wiIHwgXCJtdXNsXCJcbn1cblxuLyoqIFRoZSBucG0gcGFja2FnZSB1c2VycyBpbnN0YWxsOyBpdCBwdWxscyBpbiB0aGUgb25lIHBsYXRmb3JtIHBhY2thZ2UgdGhhdCBtYXRjaGVzLiAqL1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwidGV4dGxhbmVcIlxuXG4vKiogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCBwb2ludHMgYXQgYW4gYWRkb24gdG8gbG9hZCBpbnN0ZWFkIG9mIHRoZSBpbnN0YWxsZWQgb25lLiAqL1xuZXhwb3J0IGNvbnN0IEFERE9OX0VOViA9IFwiVEVYVExBTkVfQURET05cIlxuXG4vKiogRXZlcnkgcHVibGlzaGVkIHBsYXRmb3JtLCBrZXllZCBieSBgJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1gLCBwbHVzIGAtbXVzbGAuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1TOiBSZWNvcmQ8c3RyaW5nLCBQbGF0Zm9ybT4gPSB7XG4gIFwibGludXgteDY0XCI6IGNyZWF0ZVBsYXRmb3JtKFwibGludXgteDY0XCIsIFwieDg2XzY0LXVua25vd24tbGludXgtZ251XCIpLFxuICBcImxpbnV4LWFybTY0XCI6IGNyZWF0ZVBsYXRmb3JtKFwibGludXgtYXJtNjRcIiwgXCJhYXJjaDY0LXVua25vd24tbGludXgtZ251XCIpLFxuICBcImxpbnV4LXg2NC1tdXNsXCI6IGNyZWF0ZVBsYXRmb3JtKFwibGludXgteDY0LW11c2xcIiwgXCJ4ODZfNjQtdW5rbm93bi1saW51eC1tdXNsXCIpLFxuICBcImxpbnV4LWFybTY0LW11c2xcIjogY3JlYXRlUGxhdGZvcm0oXCJsaW51eC1hcm02NC1tdXNsXCIsIFwiYWFyY2g2NC11bmtub3duLWxpbnV4LW11c2xcIiksXG4gIFwiZGFyd2luLXg2NFwiOiBjcmVhdGVQbGF0Zm9ybShcImRhcndpbi14NjRcIiwgXCJ4ODZfNjQtYXBwbGUtZGFyd2luXCIpLFxuICBcImRhcndpbi1hcm02NFwiOiBjcmVhdGVQbGF0Zm9ybShcImRhcndpbi1hcm02NFwiLCBcImFhcmNoNjQtYXBwbGUtZGFyd2luXCIpLFxuICBcIndpbjMyLXg2NFwiOiBjcmVhdGVQbGF0Zm9ybShcIndpbjMyLXg2NFwiLCBcIng4Nl82NC1wYy13aW5kb3dzLW1zdmNcIiksXG4gIFwid2luMzItYXJtNjRcIjogY3JlYXRlUGxhdGZvcm0oXCJ3aW4zMi1hcm02NFwiLCBcImFhcmNoNjQtcGMtd2luZG93cy1tc3ZjXCIpLFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybShrZXk6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBQbGF0Zm9ybSB7XG4gIGNvbnN0IHBsYXRmb3JtOiBQbGF0Zm9ybSA9IHtcbiAgICBwYWNrYWdlTmFtZTogYEB0ZXh0bGFuZS8ke2tleX1gLFxuICAgIHRhcmdldCxcbiAgICBhZGRvbjogXCJ0ZXh0bGFuZS5ub2RlXCIsXG4gIH1cbiAgaWYgKHRhcmdldC5lbmRzV2l0aChcIi1saW51eC1nbnVcIikpIHBsYXRmb3JtLmxpYmMgPSBcImdsaWJjXCJcbiAgaWYgKHRhcmdldC5lbmRzV2l0aChcIi1saW51eC1tdXNsXCIpKSBwbGF0Zm9ybS5saWJjID0gXCJtdXNsXCJcbiAgcmV0dXJuIHBsYXRmb3JtXG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "textlane",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Rust-native text processing pipeline — a unified replacement with native and JavaScript plugins",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ast",
|
|
@@ -31,15 +31,23 @@
|
|
|
31
31
|
"./mdx": "./build/generated/mdx.js",
|
|
32
32
|
"./nl": "./build/generated/nl.js"
|
|
33
33
|
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@types/hast": "^3.0.5",
|
|
36
|
+
"@types/mdast": "^4.0.4",
|
|
37
|
+
"@types/nlcst": "^2.0.3",
|
|
38
|
+
"@types/unist": "^3.0.3"
|
|
39
|
+
},
|
|
34
40
|
"engines": {
|
|
35
41
|
"node": ">=20"
|
|
36
42
|
},
|
|
37
43
|
"optionalDependencies": {
|
|
38
|
-
"@textlane/linux-x64": "0.
|
|
39
|
-
"@textlane/linux-arm64": "0.
|
|
40
|
-
"@textlane/
|
|
41
|
-
"@textlane/
|
|
42
|
-
"@textlane/
|
|
43
|
-
"@textlane/
|
|
44
|
+
"@textlane/linux-x64": "0.5.0",
|
|
45
|
+
"@textlane/linux-arm64": "0.5.0",
|
|
46
|
+
"@textlane/linux-x64-musl": "0.5.0",
|
|
47
|
+
"@textlane/linux-arm64-musl": "0.5.0",
|
|
48
|
+
"@textlane/darwin-x64": "0.5.0",
|
|
49
|
+
"@textlane/darwin-arm64": "0.5.0",
|
|
50
|
+
"@textlane/win32-x64": "0.5.0",
|
|
51
|
+
"@textlane/win32-arm64": "0.5.0"
|
|
44
52
|
}
|
|
45
53
|
}
|
|
@@ -59,14 +59,18 @@ const file = await textlane()
|
|
|
59
59
|
.use(html.stringify({ allowDangerousHtml: true }))
|
|
60
60
|
.process("# hi")
|
|
61
61
|
file.value // "<h1>hi</h1>"
|
|
62
|
-
file.messages //
|
|
62
|
+
file.messages // vfile-messages: reason, ruleId, source, place, line, column, fatal
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
A domain function returns a descriptor, `{ name: "md.toHtml", options }`, typed from the
|
|
66
66
|
crate. The processor follows unified: `use(plugin | [plugin, options] | preset | list)`,
|
|
67
67
|
`data(key?, value?)`, `freeze()`, `parse(text)`, `run(tree, file?)` (Promise),
|
|
68
68
|
`runSync(tree, file?)`, `stringify(tree)`, `process(text)` (Promise) and `processSync(text)`.
|
|
69
|
-
Trees are plain unist JSON objects.
|
|
69
|
+
Trees are plain unist JSON objects: after `use(md.parse())`, `html.parse()` or `nl.parse()`,
|
|
70
|
+
`parse` is typed as `@types/mdast`, `hast` or `nlcst`'s `Root`, and `run` and `stringify` take
|
|
71
|
+
any unist node, so no cast is needed between them and unified utilities. Without
|
|
72
|
+
JavaScript plugins, `process` runs off the main thread: process many documents with
|
|
73
|
+
`Promise.all` over one frozen processor, not one by one.
|
|
70
74
|
|
|
71
75
|
## Python
|
|
72
76
|
|
|
@@ -87,8 +91,13 @@ file["value"] # "<h1>hi</h1>"
|
|
|
87
91
|
Functions are snake_case (`md.to_html`, `nl.indefinite_article`); their options stay the
|
|
88
92
|
camelCase keys the plugin takes, typed as `TypedDict`s. `process(text)` and `run(tree)`
|
|
89
93
|
return directly; `await processor.aprocess(text)` and `await processor.arun(tree)` are their
|
|
90
|
-
coroutines. A
|
|
91
|
-
|
|
94
|
+
coroutines. A file and a tree are dicts: after `use(md.parse())`, `html.parse()` or
|
|
95
|
+
`nl.parse()`, `parse` is typed as the `Root` of `textlane.mdast`, `textlane.hast` or
|
|
96
|
+
`textlane.nlcst`, `TypedDict`s named as `@types/mdast`, `hast` and `nlcst` name them (MDX's
|
|
97
|
+
`data.estree` as `textlane.estree.Program`); narrow by comparing `node["type"]`, since a
|
|
98
|
+
checker does not narrow on `"key" in node`. Without Python plugins, `process` releases the GIL:
|
|
99
|
+
process many documents through one frozen processor from a thread pool, or `asyncio.gather`
|
|
100
|
+
their `aprocess` calls.
|
|
92
101
|
|
|
93
102
|
## Rust
|
|
94
103
|
|
|
@@ -142,6 +151,9 @@ the case: `unknown-plugin`, `invalid-options`, `missing-parser`, `missing-compil
|
|
|
142
151
|
`md.toc`: `heading` and `skip` are regex source strings, `parents` a JSON unist-util-is
|
|
143
152
|
test, never a function; JavaScript lookaround and back references fail with
|
|
144
153
|
`invalid-options`.
|
|
154
|
+
- Shifting heading levels (remark/rehype-shift-heading) is `md.shiftHeading({ shift: -1 })`,
|
|
155
|
+
clamped to 1–6; `dropTitle: true` first drops a leading h1 (past frontmatter and ESM), as a
|
|
156
|
+
page whose title renders separately needs.
|
|
145
157
|
- Asset and page URLs relative to a Markdown file are `md.pathRewrite({ root, base, pages,
|
|
146
158
|
markdownLinks })`; pass the document as `{ value, path }` so it knows where the file lives.
|
|
147
159
|
- remark-stringify reads `settings` from processor data; textlane's `md.stringify` takes its
|