textlane 0.0.0 → 0.2.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.
Files changed (42) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +80 -2
  3. package/build/actions/addon/resolve.d.ts +7 -0
  4. package/build/actions/addon/resolve.js +22 -0
  5. package/build/actions/attacher/check.d.ts +3 -0
  6. package/build/actions/attacher/check.js +5 -0
  7. package/build/actions/host/call.d.ts +13 -0
  8. package/build/actions/host/call.js +47 -0
  9. package/build/actions/options/merge.d.ts +5 -0
  10. package/build/actions/options/merge.js +29 -0
  11. package/build/actions/pluggable/map.d.ts +8 -0
  12. package/build/actions/pluggable/map.js +29 -0
  13. package/build/actions/run/finish.d.ts +12 -0
  14. package/build/actions/run/finish.js +52 -0
  15. package/build/actions/transformer/check.d.ts +3 -0
  16. package/build/actions/transformer/check.js +5 -0
  17. package/build/generated/html.d.ts +260 -0
  18. package/build/generated/html.js +76 -0
  19. package/build/generated/md.d.ts +367 -0
  20. package/build/generated/md.js +100 -0
  21. package/build/generated/mdx.d.ts +28 -0
  22. package/build/generated/mdx.js +8 -0
  23. package/build/generated/nl.d.ts +99 -0
  24. package/build/generated/nl.js +62 -0
  25. package/build/index.d.ts +18 -0
  26. package/build/index.js +27 -0
  27. package/build/models/addon.d.ts +35 -0
  28. package/build/models/addon.js +2 -0
  29. package/build/models/file.d.ts +52 -0
  30. package/build/models/file.js +2 -0
  31. package/build/models/host.d.ts +7 -0
  32. package/build/models/host.js +2 -0
  33. package/build/models/plugin.d.ts +26 -0
  34. package/build/models/plugin.js +2 -0
  35. package/build/models/processor.d.ts +39 -0
  36. package/build/models/processor.js +154 -0
  37. package/build/models/vfile.d.ts +52 -0
  38. package/build/models/vfile.js +164 -0
  39. package/build/settings.d.ts +14 -0
  40. package/build/settings.js +17 -0
  41. package/package.json +36 -3
  42. package/skills/textlane-usage/SKILL.md +148 -0
@@ -0,0 +1,52 @@
1
+ import type { Message, MessageOptions, Place } from "./file.ts";
2
+ /**
3
+ * The file a JavaScript plugin gets, as a vfile: the document, its path, data and messages.
4
+ * Only what plugins report here reaches the result; native stages report there directly.
5
+ */
6
+ export declare class HostFile {
7
+ value: string | undefined;
8
+ data: Record<string, unknown>;
9
+ messages: HostMessage[];
10
+ history: string[];
11
+ cwd: string;
12
+ constructor(options: {
13
+ value?: string;
14
+ path?: string;
15
+ });
16
+ /** The current path; setting it adds to `history`. */
17
+ get path(): string | undefined;
18
+ set path(path: string | undefined);
19
+ get dirname(): string | undefined;
20
+ get basename(): string | undefined;
21
+ get extname(): string | undefined;
22
+ get stem(): string | undefined;
23
+ /** Report a warning against the file, as vfile's `message`; `origin` is `source:ruleId`. */
24
+ message(reason: string | Error, options?: MessageOptions | Place | null, origin?: string): HostMessage;
25
+ /** Report a note against the file, neither a warning nor an error. */
26
+ info(reason: string | Error, options?: MessageOptions | Place | null, origin?: string): HostMessage;
27
+ /** Report an error against the file and throw it. */
28
+ fail(reason: string | Error, options?: MessageOptions | Place | null, origin?: string): never;
29
+ toString(): string;
30
+ }
31
+ /** A diagnostic a JavaScript plugin reported, as vfile-message has it. */
32
+ export declare class HostMessage extends Error {
33
+ reason: string;
34
+ ruleId: string | null;
35
+ source: string | null;
36
+ place: Message["place"];
37
+ line: number | undefined;
38
+ column: number | undefined;
39
+ fatal: boolean | null | undefined;
40
+ file: string;
41
+ ancestors: unknown[] | undefined;
42
+ cause: unknown;
43
+ actual: string | undefined;
44
+ expected: string[] | undefined;
45
+ url: string | undefined;
46
+ note: string | undefined;
47
+ constructor(reason: string | Error, options?: MessageOptions | Place | null, origin?: string);
48
+ /** A message a native stage reported, as the file's other messages are. */
49
+ static fromMessage(message: Message, path: string | undefined): HostMessage;
50
+ /** The message as it crosses into the crate. */
51
+ toJSON(): Message;
52
+ }
@@ -0,0 +1,164 @@
1
+ import { basename, dirname, extname } from "node:path";
2
+ /**
3
+ * The file a JavaScript plugin gets, as a vfile: the document, its path, data and messages.
4
+ * Only what plugins report here reaches the result; native stages report there directly.
5
+ */
6
+ export class HostFile {
7
+ value;
8
+ data = {};
9
+ messages = [];
10
+ history = [];
11
+ cwd = process.cwd();
12
+ constructor(options) {
13
+ this.value = options.value;
14
+ if (options.path !== undefined)
15
+ this.history.push(options.path);
16
+ }
17
+ /** The current path; setting it adds to `history`. */
18
+ get path() {
19
+ return this.history.at(-1);
20
+ }
21
+ set path(path) {
22
+ if (path !== undefined && path !== this.path)
23
+ this.history.push(path);
24
+ }
25
+ get dirname() {
26
+ return this.path === undefined ? undefined : dirname(this.path);
27
+ }
28
+ get basename() {
29
+ return this.path === undefined ? undefined : basename(this.path);
30
+ }
31
+ get extname() {
32
+ return this.path === undefined ? undefined : extname(this.path);
33
+ }
34
+ get stem() {
35
+ return this.path === undefined ? undefined : basename(this.path, extname(this.path));
36
+ }
37
+ /** Report a warning against the file, as vfile's `message`; `origin` is `source:ruleId`. */
38
+ message(reason, options, origin) {
39
+ const message = new HostMessage(reason, options, origin);
40
+ message.file = this.path ?? "";
41
+ message.fatal = false;
42
+ this.messages.push(message);
43
+ return message;
44
+ }
45
+ /** Report a note against the file, neither a warning nor an error. */
46
+ info(reason, options, origin) {
47
+ const message = this.message(reason, options, origin);
48
+ message.fatal = null;
49
+ return message;
50
+ }
51
+ /** Report an error against the file and throw it. */
52
+ fail(reason, options, origin) {
53
+ const message = this.message(reason, options, origin);
54
+ message.fatal = true;
55
+ throw message;
56
+ }
57
+ toString() {
58
+ return this.value ?? "";
59
+ }
60
+ }
61
+ /** A diagnostic a JavaScript plugin reported, as vfile-message has it. */
62
+ export class HostMessage extends Error {
63
+ reason;
64
+ ruleId = null;
65
+ source = null;
66
+ place;
67
+ line;
68
+ column;
69
+ fatal;
70
+ file = "";
71
+ ancestors;
72
+ cause;
73
+ actual;
74
+ expected;
75
+ url;
76
+ note;
77
+ constructor(reason, options, origin) {
78
+ const text = typeof reason === "string" ? reason : reason.message;
79
+ super(text);
80
+ this.reason = text;
81
+ if (typeof reason !== "string")
82
+ this.cause = reason;
83
+ const settings = readSettings(options);
84
+ if (settings.cause !== undefined)
85
+ this.cause = settings.cause;
86
+ this.ancestors = settings.ancestors;
87
+ this.ruleId = settings.ruleId ?? null;
88
+ this.source = settings.source ?? null;
89
+ if (origin !== undefined) {
90
+ const index = origin.indexOf(":");
91
+ if (index === -1)
92
+ this.ruleId = origin;
93
+ else
94
+ [this.source, this.ruleId] = [origin.slice(0, index), origin.slice(index + 1)];
95
+ }
96
+ this.place = readPlace(settings.place ?? settings.ancestors?.at(-1));
97
+ this.line = this.place?.start.line;
98
+ this.column = this.place?.start.column;
99
+ this.name = writePlace(this.place);
100
+ }
101
+ /** A message a native stage reported, as the file's other messages are. */
102
+ static fromMessage(message, path) {
103
+ const options = {
104
+ place: message.place ?? undefined,
105
+ ruleId: message.ruleId ?? undefined,
106
+ source: message.source ?? undefined,
107
+ };
108
+ const created = new HostMessage(message.reason, options);
109
+ created.file = path ?? "";
110
+ created.fatal = false;
111
+ return created;
112
+ }
113
+ /** The message as it crosses into the crate. */
114
+ toJSON() {
115
+ return {
116
+ reason: this.reason,
117
+ ruleId: this.ruleId,
118
+ source: this.source,
119
+ place: this.place,
120
+ };
121
+ }
122
+ }
123
+ // vfile tells options from a place by their keys; anything else is the place itself
124
+ function readSettings(options) {
125
+ if (!options)
126
+ return {};
127
+ return isMessageOptions(options) ? options : { place: options };
128
+ }
129
+ function isMessageOptions(options) {
130
+ return ["ancestors", "cause", "place", "ruleId", "source"].some(key => key in options);
131
+ }
132
+ function readPlace(place) {
133
+ if (typeof place !== "object" || place === null)
134
+ return null;
135
+ if ("position" in place)
136
+ return readPlace(place.position);
137
+ if ("start" in place && "end" in place) {
138
+ const start = readPoint(place.start);
139
+ const end = readPoint(place.end);
140
+ return start && end ? { start, end } : null;
141
+ }
142
+ const point = readPoint(place);
143
+ return point ? { start: point, end: point } : null;
144
+ }
145
+ function readPoint(value) {
146
+ if (typeof value !== "object" || value === null)
147
+ return undefined;
148
+ if (!("line" in value && "column" in value))
149
+ return undefined;
150
+ const { line, column } = value;
151
+ if (typeof line !== "number" || typeof column !== "number")
152
+ return undefined;
153
+ const offset = "offset" in value && typeof value.offset === "number" ? value.offset : null;
154
+ return { line, column, offset };
155
+ }
156
+ // unist-util-stringify-position: `1:1-1:2`, or `1:1` for an unknown place
157
+ function writePlace(place) {
158
+ if (!place)
159
+ return "1:1";
160
+ const start = `${place.start.line}:${place.start.column}`;
161
+ const end = `${place.end.line}:${place.end.column}`;
162
+ return start === end ? start : `${start}-${end}`;
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9tb2RlbHMvdmZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBR3REOzs7R0FHRztBQUNILE1BQU0sT0FBTyxRQUFRO0lBQ25CLEtBQUssQ0FBb0I7SUFDekIsSUFBSSxHQUE0QixFQUFFLENBQUE7SUFDbEMsUUFBUSxHQUFrQixFQUFFLENBQUE7SUFDNUIsT0FBTyxHQUFhLEVBQUUsQ0FBQTtJQUN0QixHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBRW5CLFlBQVksT0FBMEM7UUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQzFCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUF3QjtRQUMvQixJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1Ys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O0lBQzVFLE1BQU0sTUFBTSxHQUNWLFFBQVEsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQzdFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ2pDLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUyxVQUFVLENBQUMsS0FBdUI7SUFDekMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUN4QixNQUFNLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDekQsTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ25ELE9BQU8sS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgTWVzc2FnZU9wdGlvbnMsIFBsYWNlLCBQb2ludCB9IGZyb20gXCIuL2ZpbGUudHNcIlxuXG4vKipcbiAqIFRoZSBmaWxlIGEgSmF2YVNjcmlwdCBwbHVnaW4gZ2V0cywgYXMgYSB2ZmlsZTogdGhlIGRvY3VtZW50LCBpdHMgcGF0aCwgZGF0YSBhbmQgbWVzc2FnZXMuXG4gKiBPbmx5IHdoYXQgcGx1Z2lucyByZXBvcnQgaGVyZSByZWFjaGVzIHRoZSByZXN1bHQ7IG5hdGl2ZSBzdGFnZXMgcmVwb3J0IHRoZXJlIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgSG9zdEZpbGUge1xuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgbWVzc2FnZXM6IEhvc3RNZXNzYWdlW10gPSBbXVxuICBoaXN0b3J5OiBzdHJpbmdbXSA9IFtdXG4gIGN3ZCA9IHByb2Nlc3MuY3dkKClcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IHZhbHVlPzogc3RyaW5nOyBwYXRoPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZVxuICAgIGlmIChvcHRpb25zLnBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5oaXN0b3J5LnB1c2gob3B0aW9ucy5wYXRoKVxuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IHBhdGg7IHNldHRpbmcgaXQgYWRkcyB0byBgaGlzdG9yeWAuICovXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuYXQoLTEpXG4gIH1cblxuICBzZXQgcGF0aChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkICYmIHBhdGggIT09IHRoaXMucGF0aCkgdGhpcy5oaXN0b3J5LnB1c2gocGF0aClcbiAgfVxuXG4gIGdldCBkaXJuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRpcm5hbWUodGhpcy5wYXRoKVxuICB9XG5cbiAgZ2V0IGJhc2VuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJhc2VuYW1lKHRoaXMucGF0aClcbiAgfVxuXG4gIGdldCBleHRuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGV4dG5hbWUodGhpcy5wYXRoKVxuICB9XG5cbiAgZ2V0IHN0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYmFzZW5hbWUodGhpcy5wYXRoLCBleHRuYW1lKHRoaXMucGF0aCkpXG4gIH1cblxuICAvKiogUmVwb3J0IGEgd2FybmluZyBhZ2FpbnN0IHRoZSBmaWxlLCBhcyB2ZmlsZSdzIGBtZXNzYWdlYDsgYG9yaWdpbmAgaXMgYHNvdXJjZTpydWxlSWRgLiAqL1xuICBtZXNzYWdlKFxuICAgIHJlYXNvbjogc3RyaW5nIHwgRXJyb3IsXG4gICAgb3B0aW9ucz86IE1lc3NhZ2VPcHRpb25zIHwgUGxhY2UgfCBudWxsLFxuICAgIG9yaWdpbj86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBIb3N0TWVzc2FnZShyZWFzb24sIG9wdGlvbnMsIG9yaWdpbilcbiAgICBtZXNzYWdlLmZpbGUgPSB0aGlzLnBhdGggPz8gXCJcIlxuICAgIG1lc3NhZ2UuZmF0YWwgPSBmYWxzZVxuICAgIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKVxuICAgIHJldHVybiBtZXNzYWdlXG4gIH1cblxuICAvKiogUmVwb3J0IGEgbm90ZSBhZ2FpbnN0IHRoZSBmaWxlLCBuZWl0aGVyIGEgd2FybmluZyBub3IgYW4gZXJyb3IuICovXG4gIGluZm8ocmVhc29uOiBzdHJpbmcgfCBFcnJvciwgb3B0aW9ucz86IE1lc3NhZ2VPcHRpb25zIHwgUGxhY2UgfCBudWxsLCBvcmlnaW4/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlKHJlYXNvbiwgb3B0aW9ucywgb3JpZ2luKVxuICAgIG1lc3NhZ2UuZmF0YWwgPSBudWxsXG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfVxuXG4gIC8qKiBSZXBvcnQgYW4gZXJyb3IgYWdhaW5zdCB0aGUgZmlsZSBhbmQgdGhyb3cgaXQuICovXG4gIGZhaWwoXG4gICAgcmVhc29uOiBzdHJpbmcgfCBFcnJvcixcbiAgICBvcHRpb25zPzogTWVzc2FnZU9wdGlvbnMgfCBQbGFjZSB8IG51bGwsXG4gICAgb3JpZ2luPzogc3RyaW5nLFxuICApOiBuZXZlciB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubWVzc2FnZShyZWFzb24sIG9wdGlvbnMsIG9yaWdpbilcbiAgICBtZXNzYWdlLmZhdGFsID0gdHJ1ZVxuICAgIHRocm93IG1lc3NhZ2VcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlID8/IFwiXCJcbiAgfVxufVxuXG4vKiogQSBkaWFnbm9zdGljIGEgSmF2YVNjcmlwdCBwbHVnaW4gcmVwb3J0ZWQsIGFzIHZmaWxlLW1lc3NhZ2UgaGFzIGl0LiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RNZXNzYWdlIGV4dGVuZHMgRXJyb3Ige1xuICByZWFzb246IHN0cmluZ1xuICBydWxlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIHNvdXJjZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgcGxhY2U6IE1lc3NhZ2VbXCJwbGFjZVwiXVxuICBsaW5lOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgY29sdW1uOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgZmF0YWw6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkXG4gIGZpbGUgPSBcIlwiXG4gIGFuY2VzdG9yczogdW5rbm93bltdIHwgdW5kZWZpbmVkXG4gIGNhdXNlOiB1bmtub3duXG4gIGFjdHVhbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGV4cGVjdGVkOiBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBub3RlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFzb246IHN0cmluZyB8IEVycm9yLFxuICAgIG9wdGlvbnM/OiBNZXNzYWdlT3B0aW9ucyB8IFBsYWNlIHwgbnVsbCxcbiAgICBvcmlnaW4/OiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgcmVhc29uID09PSBcInN0cmluZ1wiID8gcmVhc29uIDogcmVhc29uLm1lc3NhZ2VcbiAgICBzdXBlcih0ZXh0KVxuICAgIHRoaXMucmVhc29uID0gdGV4dFxuICAgIGlmICh0eXBlb2YgcmVhc29uICE9PSBcInN0cmluZ1wiKSB0aGlzLmNhdXNlID0gcmVhc29uXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3Mob3B0aW9ucylcbiAgICBpZiAoc2V0dGluZ3MuY2F1c2UgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXVzZSA9IHNldHRpbmdzLmNhdXNlXG4gICAgdGhpcy5hbmNlc3RvcnMgPSBzZXR0aW5ncy5hbmNlc3RvcnNcbiAgICB0aGlzLnJ1bGVJZCA9IHNldHRpbmdzLnJ1bGVJZCA/PyBudWxsXG4gICAgdGhpcy5zb3VyY2UgPSBzZXR0aW5ncy5zb3VyY2UgPz8gbnVsbFxuICAgIGlmIChvcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaW5kZXggPSBvcmlnaW4uaW5kZXhPZihcIjpcIilcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHRoaXMucnVsZUlkID0gb3JpZ2luXG4gICAgICBlbHNlIFt0aGlzLnNvdXJjZSwgdGhpcy5ydWxlSWRdID0gW29yaWdpbi5zbGljZSgwLCBpbmRleCksIG9yaWdpbi5zbGljZShpbmRleCArIDEpXVxuICAgIH1cbiAgICB0aGlzLnBsYWNlID0gcmVhZFBsYWNlKHNldHRpbmdzLnBsYWNlID8/IHNldHRpbmdzLmFuY2VzdG9ycz8uYXQoLTEpKVxuICAgIHRoaXMubGluZSA9IHRoaXMucGxhY2U/LnN0YXJ0LmxpbmVcbiAgICB0aGlzLmNvbHVtbiA9IHRoaXMucGxhY2U/LnN0YXJ0LmNvbHVtblxuICAgIHRoaXMubmFtZSA9IHdyaXRlUGxhY2UodGhpcy5wbGFjZSlcbiAgfVxuXG4gIC8qKiBBIG1lc3NhZ2UgYSBuYXRpdmUgc3RhZ2UgcmVwb3J0ZWQsIGFzIHRoZSBmaWxlJ3Mgb3RoZXIgbWVzc2FnZXMgYXJlLiAqL1xuICBzdGF0aWMgZnJvbU1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSwgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHBsYWNlOiBtZXNzYWdlLnBsYWNlID8/IHVuZGVmaW5lZCxcbiAgICAgIHJ1bGVJZDogbWVzc2FnZS5ydWxlSWQgPz8gdW5kZWZpbmVkLFxuICAgICAgc291cmNlOiBtZXNzYWdlLnNvdXJjZSA/PyB1bmRlZmluZWQsXG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZWQgPSBuZXcgSG9zdE1lc3NhZ2UobWVzc2FnZS5yZWFzb24sIG9wdGlvbnMpXG4gICAgY3JlYXRlZC5maWxlID0gcGF0aCA/PyBcIlwiXG4gICAgY3JlYXRlZC5mYXRhbCA9IGZhbHNlXG4gICAgcmV0dXJuIGNyZWF0ZWRcbiAgfVxuXG4gIC8qKiBUaGUgbWVzc2FnZSBhcyBpdCBjcm9zc2VzIGludG8gdGhlIGNyYXRlLiAqL1xuICB0b0pTT04oKTogTWVzc2FnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYXNvbjogdGhpcy5yZWFzb24sXG4gICAgICBydWxlSWQ6IHRoaXMucnVsZUlkLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIHBsYWNlOiB0aGlzLnBsYWNlLFxuICAgIH1cbiAgfVxufVxuXG4vLyB2ZmlsZSB0ZWxscyBvcHRpb25zIGZyb20gYSBwbGFjZSBieSB0aGVpciBrZXlzOyBhbnl0aGluZyBlbHNlIGlzIHRoZSBwbGFjZSBpdHNlbGZcbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhcbiAgb3B0aW9uczogTWVzc2FnZU9wdGlvbnMgfCBQbGFjZSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBNZXNzYWdlT3B0aW9ucyB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIHt9XG4gIHJldHVybiBpc01lc3NhZ2VPcHRpb25zKG9wdGlvbnMpID8gb3B0aW9ucyA6IHsgcGxhY2U6IG9wdGlvbnMgfVxufVxuXG5mdW5jdGlvbiBpc01lc3NhZ2VPcHRpb25zKG9wdGlvbnM6IE1lc3NhZ2VPcHRpb25zIHwgUGxhY2UpOiBvcHRpb25zIGlzIE1lc3NhZ2VPcHRpb25zIHtcbiAgcmV0dXJuIFtcImFuY2VzdG9yc1wiLCBcImNhdXNlXCIsIFwicGxhY2VcIiwgXCJydWxlSWRcIiwgXCJzb3VyY2VcIl0uc29tZShrZXkgPT4ga2V5IGluIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHJlYWRQbGFjZShwbGFjZTogdW5rbm93bik6IE1lc3NhZ2VbXCJwbGFjZVwiXSB7XG4gIGlmICh0eXBlb2YgcGxhY2UgIT09IFwib2JqZWN0XCIgfHwgcGxhY2UgPT09IG51bGwpIHJldHVybiBudWxsXG4gIGlmIChcInBvc2l0aW9uXCIgaW4gcGxhY2UpIHJldHVybiByZWFkUGxhY2UocGxhY2UucG9zaXRpb24pXG4gIGlmIChcInN0YXJ0XCIgaW4gcGxhY2UgJiYgXCJlbmRcIiBpbiBwbGFjZSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gcmVhZFBvaW50KHBsYWNlLnN0YXJ0KVxuICAgIGNvbnN0IGVuZCA9IHJlYWRQb2ludChwbGFjZS5lbmQpXG4gICAgcmV0dXJuIHN0YXJ0ICYmIGVuZCA/IHsgc3RhcnQsIGVuZCB9IDogbnVsbFxuICB9XG4gIGNvbnN0IHBvaW50ID0gcmVhZFBvaW50KHBsYWNlKVxuICByZXR1cm4gcG9pbnQgPyB7IHN0YXJ0OiBwb2ludCwgZW5kOiBwb2ludCB9IDogbnVsbFxufVxuXG5mdW5jdGlvbiByZWFkUG9pbnQodmFsdWU6IHVua25vd24pOiBQb2ludCB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKCEoXCJsaW5lXCIgaW4gdmFsdWUgJiYgXCJjb2x1bW5cIiBpbiB2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgeyBsaW5lLCBjb2x1bW4gfSA9IHZhbHVlXG4gIGlmICh0eXBlb2YgbGluZSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY29sdW1uICE9PSBcIm51bWJlclwiKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG9mZnNldCA9XG4gICAgXCJvZmZzZXRcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUub2Zmc2V0ID09PSBcIm51bWJlclwiID8gdmFsdWUub2Zmc2V0IDogbnVsbFxuICByZXR1cm4geyBsaW5lLCBjb2x1bW4sIG9mZnNldCB9XG59XG5cbi8vIHVuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uOiBgMToxLTE6MmAsIG9yIGAxOjFgIGZvciBhbiB1bmtub3duIHBsYWNlXG5mdW5jdGlvbiB3cml0ZVBsYWNlKHBsYWNlOiBNZXNzYWdlW1wicGxhY2VcIl0pIHtcbiAgaWYgKCFwbGFjZSkgcmV0dXJuIFwiMToxXCJcbiAgY29uc3Qgc3RhcnQgPSBgJHtwbGFjZS5zdGFydC5saW5lfToke3BsYWNlLnN0YXJ0LmNvbHVtbn1gXG4gIGNvbnN0IGVuZCA9IGAke3BsYWNlLmVuZC5saW5lfToke3BsYWNlLmVuZC5jb2x1bW59YFxuICByZXR1cm4gc3RhcnQgPT09IGVuZCA/IHN0YXJ0IDogYCR7c3RhcnR9LSR7ZW5kfWBcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ export interface Platform {
2
+ /** The npm package that carries this platform's addon. */
3
+ packageName: string;
4
+ /** The Rust target the addon is compiled for. */
5
+ target: string;
6
+ /** The addon's file name at the package's root. */
7
+ addon: string;
8
+ }
9
+ /** The npm package users install; it pulls in the one platform package that matches. */
10
+ export declare const PACKAGE_NAME = "textlane";
11
+ /** An environment variable that points at an addon to load instead of the installed one. */
12
+ export declare const ADDON_ENV = "TEXTLANE_ADDON";
13
+ /** Every published platform, keyed by `${process.platform}-${process.arch}`. */
14
+ export declare const PLATFORMS: Record<string, Platform>;
@@ -0,0 +1,17 @@
1
+ /** The npm package users install; it pulls in the one platform package that matches. */
2
+ export const PACKAGE_NAME = "textlane";
3
+ /** An environment variable that points at an addon to load instead of the installed one. */
4
+ export const ADDON_ENV = "TEXTLANE_ADDON";
5
+ /** Every published platform, keyed by `${process.platform}-${process.arch}`. */
6
+ export const PLATFORMS = {
7
+ "linux-x64": createPlatform("linux-x64", "x86_64-unknown-linux-gnu"),
8
+ "linux-arm64": createPlatform("linux-arm64", "aarch64-unknown-linux-gnu"),
9
+ "darwin-x64": createPlatform("darwin-x64", "x86_64-apple-darwin"),
10
+ "darwin-arm64": createPlatform("darwin-arm64", "aarch64-apple-darwin"),
11
+ "win32-x64": createPlatform("win32-x64", "x86_64-pc-windows-msvc"),
12
+ "win32-arm64": createPlatform("win32-arm64", "aarch64-pc-windows-msvc"),
13
+ };
14
+ function createPlatform(key, target) {
15
+ return { packageName: `@textlane/${key}`, target, addon: "textlane.node" };
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQTtBQUV0Qyw0RkFBNEY7QUFDNUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFBO0FBRXpDLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQTZCO0lBQ2pELFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLDBCQUEwQixDQUFDO0lBQ3BFLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYSxFQUFFLDJCQUEyQixDQUFDO0lBQ3pFLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDO0lBQ2pFLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDO0lBQ3RFLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLHdCQUF3QixDQUFDO0lBQ2xFLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYSxFQUFFLHlCQUF5QixDQUFDO0NBQ3hFLENBQUE7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFXLEVBQUUsTUFBYztJQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybSB7XG4gIC8qKiBUaGUgbnBtIHBhY2thZ2UgdGhhdCBjYXJyaWVzIHRoaXMgcGxhdGZvcm0ncyBhZGRvbi4gKi9cbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuICAvKiogVGhlIFJ1c3QgdGFyZ2V0IHRoZSBhZGRvbiBpcyBjb21waWxlZCBmb3IuICovXG4gIHRhcmdldDogc3RyaW5nXG4gIC8qKiBUaGUgYWRkb24ncyBmaWxlIG5hbWUgYXQgdGhlIHBhY2thZ2UncyByb290LiAqL1xuICBhZGRvbjogc3RyaW5nXG59XG5cbi8qKiBUaGUgbnBtIHBhY2thZ2UgdXNlcnMgaW5zdGFsbDsgaXQgcHVsbHMgaW4gdGhlIG9uZSBwbGF0Zm9ybSBwYWNrYWdlIHRoYXQgbWF0Y2hlcy4gKi9cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcInRleHRsYW5lXCJcblxuLyoqIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgcG9pbnRzIGF0IGFuIGFkZG9uIHRvIGxvYWQgaW5zdGVhZCBvZiB0aGUgaW5zdGFsbGVkIG9uZS4gKi9cbmV4cG9ydCBjb25zdCBBRERPTl9FTlYgPSBcIlRFWFRMQU5FX0FERE9OXCJcblxuLyoqIEV2ZXJ5IHB1Ymxpc2hlZCBwbGF0Zm9ybSwga2V5ZWQgYnkgYCR7cHJvY2Vzcy5wbGF0Zm9ybX0tJHtwcm9jZXNzLmFyY2h9YC4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STVM6IFJlY29yZDxzdHJpbmcsIFBsYXRmb3JtPiA9IHtcbiAgXCJsaW51eC14NjRcIjogY3JlYXRlUGxhdGZvcm0oXCJsaW51eC14NjRcIiwgXCJ4ODZfNjQtdW5rbm93bi1saW51eC1nbnVcIiksXG4gIFwibGludXgtYXJtNjRcIjogY3JlYXRlUGxhdGZvcm0oXCJsaW51eC1hcm02NFwiLCBcImFhcmNoNjQtdW5rbm93bi1saW51eC1nbnVcIiksXG4gIFwiZGFyd2luLXg2NFwiOiBjcmVhdGVQbGF0Zm9ybShcImRhcndpbi14NjRcIiwgXCJ4ODZfNjQtYXBwbGUtZGFyd2luXCIpLFxuICBcImRhcndpbi1hcm02NFwiOiBjcmVhdGVQbGF0Zm9ybShcImRhcndpbi1hcm02NFwiLCBcImFhcmNoNjQtYXBwbGUtZGFyd2luXCIpLFxuICBcIndpbjMyLXg2NFwiOiBjcmVhdGVQbGF0Zm9ybShcIndpbjMyLXg2NFwiLCBcIng4Nl82NC1wYy13aW5kb3dzLW1zdmNcIiksXG4gIFwid2luMzItYXJtNjRcIjogY3JlYXRlUGxhdGZvcm0oXCJ3aW4zMi1hcm02NFwiLCBcImFhcmNoNjQtcGMtd2luZG93cy1tc3ZjXCIpLFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybShrZXk6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBQbGF0Zm9ybSB7XG4gIHJldHVybiB7IHBhY2thZ2VOYW1lOiBgQHRleHRsYW5lLyR7a2V5fWAsIHRhcmdldCwgYWRkb246IFwidGV4dGxhbmUubm9kZVwiIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,12 +1,45 @@
1
1
  {
2
2
  "name": "textlane",
3
- "version": "0.0.0",
4
- "description": "Placeholder reserving the name; the first real release follows",
3
+ "version": "0.2.0",
4
+ "description": "Rust-native text processing pipeline — a unified replacement with native and JavaScript plugins",
5
+ "keywords": [
6
+ "ast",
7
+ "html",
8
+ "markdown",
9
+ "mdx",
10
+ "pipeline",
11
+ "unified"
12
+ ],
13
+ "homepage": "https://textlane.dev",
5
14
  "license": "MIT",
15
+ "author": "Evgeny Karev",
6
16
  "repository": {
7
17
  "type": "git",
8
18
  "url": "git+https://github.com/datisthq/textlane.git",
9
19
  "directory": "typescript"
10
20
  },
11
- "homepage": "https://textlane.dev"
21
+ "files": [
22
+ "build",
23
+ "skills"
24
+ ],
25
+ "type": "module",
26
+ "sideEffects": false,
27
+ "exports": {
28
+ ".": "./build/index.js",
29
+ "./md": "./build/generated/md.js",
30
+ "./html": "./build/generated/html.js",
31
+ "./mdx": "./build/generated/mdx.js",
32
+ "./nl": "./build/generated/nl.js"
33
+ },
34
+ "engines": {
35
+ "node": ">=20"
36
+ },
37
+ "optionalDependencies": {
38
+ "@textlane/linux-x64": "0.2.0",
39
+ "@textlane/linux-arm64": "0.2.0",
40
+ "@textlane/darwin-x64": "0.2.0",
41
+ "@textlane/darwin-arm64": "0.2.0",
42
+ "@textlane/win32-x64": "0.2.0",
43
+ "@textlane/win32-arm64": "0.2.0"
44
+ }
12
45
  }
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: textlane-usage
3
+ description: Use when installing textlane or calling it from Rust, Node.js or Python — which package each language uses, how to build a pipeline of native plugins, the processor API and what it does not offer yet.
4
+ ---
5
+
6
+ # Textlane Usage
7
+
8
+ Textlane is a Rust-native text processing pipeline: a replacement for unified whose plugins run
9
+ natively, with Node.js and Python bindings over the same crate. It is pre-release.
10
+
11
+ ## When to use this skill
12
+
13
+ Invoke when the user asks to:
14
+
15
+ - Install textlane in a Rust, Node.js or Python project.
16
+ - Turn Markdown into HTML (or HTML into Markdown, MDX into JavaScript, natural language into checks) with
17
+ textlane, or port a unified, remark, rehype or retext pipeline to it.
18
+ - Check which textlane version is installed.
19
+
20
+ ## Install
21
+
22
+ | Language | Package | Install |
23
+ | -------- | ---------------------- | ---------------------- |
24
+ | Rust | `textlane` (crates.io) | `cargo add textlane` |
25
+ | Node.js | `textlane` (npm) | `npm install textlane` |
26
+ | Python | `textlane` (PyPI) | `pip install textlane` |
27
+
28
+ Every channel ships the same crate at the same version. npm installs one prebuilt addon for the
29
+ current platform as an optional dependency; never install with `--omit=optional`.
30
+
31
+ ## Plugins
32
+
33
+ Plugins are grouped by domain and named `<domain>.<name>`, the name unified's ecosystem uses
34
+ spelled out: `md.parse`, `md.gfm`, `md.toHtml`, `html.stringify`, `html.toMarkdown`,
35
+ `mdx.compile`, `nl.parse`, `nl.equality`. Options take the upstream plugin's camelCase
36
+ names (`allowDangerousHtml`, as remark-rehype). A pipeline has one parser and one compiler, and
37
+ bridges such as `md.toHtml` (remark-rehype) change the tree between them.
38
+
39
+ | Domain | Node.js | Python | Rust |
40
+ | ------ | --------------- | --------------- | ---------------- |
41
+ | `md` | `textlane/md` | `textlane.md` | `textlane::md` |
42
+ | `html` | `textlane/html` | `textlane.html` | `textlane::html` |
43
+ | `mdx` | `textlane/mdx` | `textlane.mdx` | `textlane::mdx` |
44
+ | `nl` | `textlane/nl` | `textlane.nl` | `textlane::nl` |
45
+
46
+ `pluginNames()` (Node.js) and `textlane.plugin_names()` (Python) list every plugin.
47
+
48
+ ## Node.js
49
+
50
+ ```js
51
+ import { textlane } from "textlane"
52
+ import * as html from "textlane/html"
53
+ import * as md from "textlane/md"
54
+
55
+ const file = await textlane()
56
+ .use(md.parse())
57
+ .use(md.gfm())
58
+ .use(md.toHtml({ allowDangerousHtml: true }))
59
+ .use(html.stringify({ allowDangerousHtml: true }))
60
+ .process("# hi")
61
+ file.value // "<h1>hi</h1>"
62
+ file.messages // [{ reason, ruleId, source, place }]
63
+ ```
64
+
65
+ A domain function returns a descriptor, `{ name: "md.toHtml", options }`, typed from the
66
+ crate. The processor follows unified: `use(plugin | [plugin, options] | preset | list)`,
67
+ `data(key?, value?)`, `freeze()`, `parse(text)`, `run(tree, file?)` (Promise),
68
+ `runSync(tree, file?)`, `stringify(tree)`, `process(text)` (Promise) and `processSync(text)`.
69
+ Trees are plain unist JSON objects.
70
+
71
+ ## Python
72
+
73
+ ```python
74
+ from textlane import html, md, textlane
75
+
76
+ file = (
77
+ textlane()
78
+ .use(md.parse())
79
+ .use(md.gfm())
80
+ .use(md.to_html({"allowDangerousHtml": True}))
81
+ .use(html.stringify())
82
+ .process("# hi")
83
+ )
84
+ file["value"] # "<h1>hi</h1>"
85
+ ```
86
+
87
+ Functions are snake_case (`md.to_html`, `nl.indefinite_article`); their options stay the
88
+ camelCase keys the plugin takes, typed as `TypedDict`s. `process(text)` and `run(tree)`
89
+ return directly; `await processor.aprocess(text)` and `await processor.arun(tree)` are their
90
+ coroutines. A
91
+ file and a tree are dicts.
92
+
93
+ ## Rust
94
+
95
+ ```rust
96
+ use textlane::{Processor, html, md};
97
+
98
+ let processor = Processor::new()
99
+ .with(md::Parse::default())
100
+ .with(md::ToHtml::default())
101
+ .with(html::Stringify::default())
102
+ .freeze()?;
103
+ let output = processor.process("# hi")?; // output.value, output.file.messages
104
+ ```
105
+
106
+ ## Memory
107
+
108
+ A document's trees are built in working memory that each thread keeps afterwards, emptied, so
109
+ the next document reuses it instead of asking the system again. At most 256 MB is kept per
110
+ thread; a larger document's memory is freed once it finishes. Change the cap, in bytes, with
111
+ `setRetainedMemory(bytes)` (Node.js), `textlane.set_retained_memory(bytes)` (Python) or
112
+ `textlane::set_retained_memory(bytes)` (Rust), and read it back with `retainedMemory()`,
113
+ `textlane.retained_memory()` or `textlane::read_retained_memory()`. It applies to every
114
+ processor in the process. Raise it for documents of several megabytes, which need more
115
+ than 256 MB of working memory; lower it, or set `0`, when idle memory matters more than speed.
116
+
117
+ ## Errors
118
+
119
+ Failures raise an `Error` (Node.js) or `textlane.TextlaneError` (Python) whose `code` names
120
+ the case: `unknown-plugin`, `invalid-options`, `missing-parser`, `missing-compiler`,
121
+ `frozen-processor`, `async-in-sync`, `invalid-message`. Handle by code, not by message.
122
+
123
+ ## Not yet
124
+
125
+ - A JavaScript or Python plugin joins only as a transformer: `use(fn, options)` calls it at
126
+ freeze (`this` is the processor in JavaScript, the first argument in Python) and runs what it
127
+ returns over the JSON tree; its file is vfile-shaped, its path from `process({value, path})`.
128
+ The tree crosses as JSON, so non-JSON values in nodes or `data` do not survive a native
129
+ stage. Syntax plugins (remark-gfm, remark-directive, remark-math) need the native ones; do
130
+ not port a pipeline that needs one textlane lacks, say so. A remark plugin that only turns
131
+ directives, `> [!NOTE]` alerts, definition lists or fenced code into MDX JSX elements is a
132
+ rule of `md.component` instead. A file-tree directive (livemark's `:::filetree`) is a rule with `treeAs`. remark-heading-id, strip-markdown, rehype-unwrap-images and
133
+ @stefanprobst/rehype-extract-toc are `md.headingId`, `md.strip`, `html.unwrapImages` and
134
+ `html.extractToc`; the table of contents lands in the result's `data.toc`. rehype-external-links is `html.externalLinks` (JSON options, no functions), and
135
+ `md.headingId({ attributes: true })` reads `{#id .class key=value}`. vfile-matter is
136
+ `md.frontmatter({ data: true })` (add `strip: true` to drop the node, `matters` for TOML too):
137
+ the YAML lands in the result's `data.matter`, `{}` without one; bad YAML fails with
138
+ `invalid-frontmatter`. An npm2yarn-style remark plugin (`@docusaurus/remark-plugin-npm2yarn`,
139
+ npm-to-yarn tabs) is `md.packageCommand`: a fenced `npm`, `pip` or `cargo` block becomes one
140
+ `PackageTabs` element with an attribute per manager (pnpm, yarn, bun; uv, poetry, pdm;
141
+ cargo-binstall). remark-toc is
142
+ `md.toc`: `heading` and `skip` are regex source strings, `parents` a JSON unist-util-is
143
+ test, never a function; JavaScript lookaround and back references fail with
144
+ `invalid-options`.
145
+ - Asset and page URLs relative to a Markdown file are `md.pathRewrite({ root, base, pages,
146
+ markdownLinks })`; pass the document as `{ value, path }` so it knows where the file lives.
147
+ - remark-stringify reads `settings` from processor data; textlane's `md.stringify` takes its
148
+ options directly.