@reformer/builder-plugin-api 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +206 -0
  3. package/dist/index.d.ts +147 -0
  4. package/dist/index.js +76 -0
  5. package/dist/internal.d.ts +78 -0
  6. package/dist/internal.js +289 -0
  7. package/dist/permissions-BWlsUVPs.js +551 -0
  8. package/dist/plugin/bundled-modules.d.ts +25 -0
  9. package/dist/plugin/layout.d.ts +27 -0
  10. package/dist/plugin/manifest-parser.d.ts +54 -0
  11. package/dist/plugin/manifest.d.ts +320 -0
  12. package/dist/plugin/messages-bundle.d.ts +24 -0
  13. package/dist/plugin/permissions.d.ts +48 -0
  14. package/dist/plugin/plugin-exports.d.ts +10 -0
  15. package/dist/plugin/runtime-modules.d.ts +20 -0
  16. package/dist/plugin/storage.d.ts +70 -0
  17. package/dist/plugin/types.d.ts +136 -0
  18. package/dist/primitives/capability.d.ts +72 -0
  19. package/dist/primitives/command.d.ts +262 -0
  20. package/dist/primitives/disposable.d.ts +23 -0
  21. package/dist/primitives/event.d.ts +38 -0
  22. package/dist/primitives/extension-point.d.ts +53 -0
  23. package/dist/primitives/module-path.d.ts +21 -0
  24. package/dist/primitives/resource.d.ts +159 -0
  25. package/dist/primitives/semver.d.ts +93 -0
  26. package/dist/primitives/service.d.ts +68 -0
  27. package/dist/primitives/when-context.d.ts +69 -0
  28. package/dist/primitives/when-expr.d.ts +177 -0
  29. package/dist/resource-clipboard-Bdk_Is5N.js +381 -0
  30. package/dist/runtime-modules-CiUDFMIn.js +597 -0
  31. package/dist/services/context-keys.d.ts +52 -0
  32. package/dist/services/diagnostics/fixes.d.ts +40 -0
  33. package/dist/services/diagnostics/service.d.ts +34 -0
  34. package/dist/services/diagnostics/types.d.ts +148 -0
  35. package/dist/services/document-models.d.ts +20 -0
  36. package/dist/services/documents.d.ts +94 -0
  37. package/dist/services/host-messages.d.ts +10 -0
  38. package/dist/services/i18n.d.ts +43 -0
  39. package/dist/services/modules.d.ts +49 -0
  40. package/dist/services/notifications.d.ts +56 -0
  41. package/dist/services/plugin-settings.d.ts +10 -0
  42. package/dist/services/plugins-catalog.d.ts +58 -0
  43. package/dist/services/preview.d.ts +163 -0
  44. package/dist/services/prompt.d.ts +111 -0
  45. package/dist/services/resource-clipboard.d.ts +28 -0
  46. package/dist/services/selection.d.ts +46 -0
  47. package/dist/services/settings.d.ts +44 -0
  48. package/dist/services/theme.d.ts +15 -0
  49. package/dist/services/validation/types.d.ts +98 -0
  50. package/dist/services/workspace-files.d.ts +84 -0
  51. package/dist/services/workspace-resources.d.ts +41 -0
  52. package/dist/services/workspace-save.d.ts +18 -0
  53. package/dist/tooling.d.ts +28 -0
  54. package/dist/tooling.js +35 -0
  55. package/dist/ui/contributions/decorations.d.ts +55 -0
  56. package/dist/ui/contributions/editors.d.ts +58 -0
  57. package/dist/ui/contributions/plugin-settings.d.ts +54 -0
  58. package/dist/ui/keyboard/keybinding-rules.d.ts +48 -0
  59. package/dist/ui/keyboard/keybindings.d.ts +55 -0
  60. package/dist/ui/keyboard/keymap.d.ts +81 -0
  61. package/dist/ui/keyboard/scope.d.ts +38 -0
  62. package/dist/ui/menu/editor-menu.d.ts +25 -0
  63. package/dist/ui/menu/menu.d.ts +228 -0
  64. package/dist/ui/menu/palette.d.ts +36 -0
  65. package/dist/ui/menu/resource-menu.d.ts +45 -0
  66. package/dist/ui/slots.d.ts +113 -0
  67. package/dist/ui/useActiveDocument.d.ts +5 -0
  68. package/dist/ui/useLocale.d.ts +9 -0
  69. package/dist/ui/useTranslate.d.ts +4 -0
  70. package/dist/workspace/document.d.ts +42 -0
  71. package/dist/workspace/model/editor-view-states.d.ts +29 -0
  72. package/dist/workspace/model/model-document.d.ts +86 -0
  73. package/dist/workspace/model/provider.d.ts +140 -0
  74. package/dist/workspace/model/text-editor-focus.d.ts +22 -0
  75. package/dist/workspace/resource-names.d.ts +92 -0
  76. package/dist/workspace/write-options.d.ts +36 -0
  77. package/package.json +69 -0
@@ -0,0 +1,551 @@
1
+ class o extends Error {
2
+ /** Смещение в исходной строке — редактор подсветит место, а не всю строку. */
3
+ at;
4
+ source;
5
+ constructor(t, e, r) {
6
+ super(`условие «${e}» разобрать нельзя: ${t}`), this.name = "WhenSyntaxError", this.source = e, this.at = r;
7
+ }
8
+ }
9
+ const A = /[A-Za-z_]/, W = /[A-Za-z0-9_.-]/, j = ["&&", "||", "==", "!=", "=~", "!", "(", ")"];
10
+ function I(n) {
11
+ const t = [];
12
+ let e = 0;
13
+ for (; e < n.length; ) {
14
+ const r = n[e];
15
+ if (/\s/.test(r)) {
16
+ e += 1;
17
+ continue;
18
+ }
19
+ if (r === '"' || r === "'") {
20
+ const i = e;
21
+ e += 1;
22
+ let a = "";
23
+ for (; e < n.length && n[e] !== r; ) {
24
+ if (n[e] === "\\" && e + 1 < n.length) {
25
+ a += n[e + 1], e += 2;
26
+ continue;
27
+ }
28
+ a += n[e], e += 1;
29
+ }
30
+ if (e >= n.length) throw new o("строка не закрыта", n, i);
31
+ e += 1, t.push({ kind: "string", text: a, at: i });
32
+ continue;
33
+ }
34
+ if (r === "/") {
35
+ const i = e;
36
+ e += 1;
37
+ let a = "";
38
+ for (; e < n.length && n[e] !== "/"; ) {
39
+ if (n[e] === "\\" && e + 1 < n.length) {
40
+ a += n.slice(e, e + 2), e += 2;
41
+ continue;
42
+ }
43
+ a += n[e], e += 1;
44
+ }
45
+ if (e >= n.length) throw new o("шаблон не закрыт", n, i);
46
+ e += 1;
47
+ let c = "";
48
+ for (; e < n.length && /[a-z]/.test(n[e]); )
49
+ c += n[e], e += 1;
50
+ try {
51
+ new RegExp(a, c);
52
+ } catch {
53
+ throw new o(`шаблон «${a}» не разбирается`, n, i);
54
+ }
55
+ t.push({ kind: "regex", text: a, at: i, flags: c });
56
+ continue;
57
+ }
58
+ const s = j.find((i) => n.startsWith(i, e));
59
+ if (s !== void 0) {
60
+ t.push({ kind: "op", text: s, at: e }), e += s.length;
61
+ continue;
62
+ }
63
+ if (/[0-9]/.test(r) || r === "-" && /[0-9]/.test(n[e + 1] ?? "")) {
64
+ const i = e;
65
+ for (r === "-" && (e += 1); e < n.length && /[0-9.]/.test(n[e]); ) e += 1;
66
+ t.push({ kind: "number", text: n.slice(i, e), at: i });
67
+ continue;
68
+ }
69
+ if (A.test(r)) {
70
+ const i = e;
71
+ for (; e < n.length && W.test(n[e]); ) e += 1;
72
+ t.push({ kind: "word", text: n.slice(i, e), at: i });
73
+ continue;
74
+ }
75
+ throw new o(`непонятный символ «${r}»`, n, e);
76
+ }
77
+ return t.push({ kind: "end", text: "", at: n.length }), t;
78
+ }
79
+ const l = Object.freeze({ kind: "true" });
80
+ function m(n) {
81
+ return n.kind === "eq" || n.kind === "match" || n.kind === "in" ? { ...n, negated: !n.negated } : n.kind === "not" ? n.operand : { kind: "not", operand: n };
82
+ }
83
+ function k(n, t) {
84
+ const e = [];
85
+ for (const r of t)
86
+ r.kind === n ? e.push(...r.operands) : e.push(r);
87
+ return e.length === 1 ? e[0] : { kind: n, operands: e };
88
+ }
89
+ const _ = {
90
+ true: !0,
91
+ false: !1,
92
+ null: null
93
+ };
94
+ class P {
95
+ index = 0;
96
+ // Поля объявлены явно, а не параметрами конструктора: сборка идёт с `erasableSyntaxOnly`,
97
+ // и сокращённая запись потребовала бы генерации кода там, где типы обязаны просто стираться.
98
+ tokens;
99
+ source;
100
+ constructor(t, e) {
101
+ this.tokens = t, this.source = e;
102
+ }
103
+ parse() {
104
+ const t = this.parseOr(), e = this.peek();
105
+ if (e.kind !== "end")
106
+ throw new o(`лишнее после условия: «${e.text}»`, this.source, e.at);
107
+ return t;
108
+ }
109
+ peek() {
110
+ return this.tokens[this.index];
111
+ }
112
+ take() {
113
+ const t = this.tokens[this.index];
114
+ return this.index += 1, t;
115
+ }
116
+ eatOperator(t) {
117
+ const e = this.peek();
118
+ return e.kind === "op" && e.text === t ? (this.index += 1, !0) : !1;
119
+ }
120
+ eatWord(t) {
121
+ const e = this.peek();
122
+ return e.kind === "word" && e.text === t ? (this.index += 1, !0) : !1;
123
+ }
124
+ parseOr() {
125
+ const t = [this.parseAnd()];
126
+ for (; this.eatOperator("||"); ) t.push(this.parseAnd());
127
+ return k("or", t);
128
+ }
129
+ parseAnd() {
130
+ const t = [this.parseUnary()];
131
+ for (; this.eatOperator("&&"); ) t.push(this.parseUnary());
132
+ return k("and", t);
133
+ }
134
+ /**
135
+ * `!` связывает только primary: `!a == b` разбирается как «отрицание a, сравнённое с b»,
136
+ * а не как отрицание всего сравнения. Место спорное, и решается оно так же, как в VS Code,
137
+ * — ради переносимости привычки: человек, писавший условия там, не должен переучиваться.
138
+ */
139
+ parseUnary() {
140
+ return this.eatOperator("!") ? m(this.parseUnary()) : this.parsePrimary();
141
+ }
142
+ parsePrimary() {
143
+ if (this.eatOperator("(")) {
144
+ const e = this.parseOr();
145
+ if (!this.eatOperator(")"))
146
+ throw new o("не закрыта скобка", this.source, this.peek().at);
147
+ return e;
148
+ }
149
+ const t = this.take();
150
+ if (t.kind !== "word")
151
+ throw new o(
152
+ t.kind === "end" ? "условие обрывается" : `здесь ожидался ключ, а не «${t.text}»`,
153
+ this.source,
154
+ t.at
155
+ );
156
+ return this.isValuePosition(t.text) ? t.text === "true" ? l : m(l) : this.parseComparison(t.text);
157
+ }
158
+ /** Слово-значение, за которым НЕ идёт оператор сравнения: `true`, `false`. */
159
+ isValuePosition(t) {
160
+ if (t !== "true" && t !== "false") return !1;
161
+ const e = this.peek();
162
+ return !(e.kind === "op" && (e.text === "==" || e.text === "!=" || e.text === "=~"));
163
+ }
164
+ parseComparison(t) {
165
+ return this.eatOperator("==") ? { kind: "eq", key: t, value: this.parseLiteral(), negated: !1 } : this.eatOperator("!=") ? { kind: "eq", key: t, value: this.parseLiteral(), negated: !0 } : this.eatOperator("=~") ? this.parseMatch(t) : this.eatWord("in") ? { kind: "in", key: t, collection: this.parseKey(), negated: !1 } : this.peek().text === "not" && this.tokens[this.index + 1]?.text === "in" ? (this.index += 2, { kind: "in", key: t, collection: this.parseKey(), negated: !0 }) : { kind: "key", key: t };
166
+ }
167
+ parseKey() {
168
+ const t = this.take();
169
+ if (t.kind !== "word")
170
+ throw new o(
171
+ `справа от «in» ожидался ключ, а не «${t.text}»`,
172
+ this.source,
173
+ t.at
174
+ );
175
+ return t.text;
176
+ }
177
+ /**
178
+ * Правая часть сравнения — ВСЕГДА литерал, и голое слово там является строкой.
179
+ *
180
+ * Довод не про удобство записи. Читайся голое слово ключом, самая частая запись проекта —
181
+ * `activeResourceKind == form.schema` — молча сравнивала бы два `undefined` и была бы
182
+ * истинной ВСЕГДА. Промах выглядел бы как «клавиша работает везде», а это худший вид
183
+ * отказа: он не падает, не пишет в консоль и обнаруживается только чужой жалобой.
184
+ */
185
+ parseLiteral() {
186
+ const t = this.take();
187
+ if (t.kind === "string") return t.text;
188
+ if (t.kind === "number") return Number(t.text);
189
+ if (t.kind === "word") {
190
+ const e = _[t.text];
191
+ return e === void 0 ? t.text : e;
192
+ }
193
+ throw new o(
194
+ `справа от сравнения ожидалось значение, а не «${t.text}»`,
195
+ this.source,
196
+ t.at
197
+ );
198
+ }
199
+ parseMatch(t) {
200
+ const e = this.take();
201
+ if (e.kind !== "regex")
202
+ throw new o(
203
+ "справа от «=~» ожидается шаблон в косых чертах",
204
+ this.source,
205
+ e.at
206
+ );
207
+ return { kind: "match", key: t, pattern: e.text, flags: e.flags ?? "", negated: !1 };
208
+ }
209
+ }
210
+ const b = {
211
+ scope: 4,
212
+ scopes: 4,
213
+ focus: 3,
214
+ activeEditorId: 2,
215
+ activeResourceKind: 2
216
+ };
217
+ function h(n) {
218
+ return b[n] ?? 1;
219
+ }
220
+ function f(n) {
221
+ switch (n.kind) {
222
+ case "true":
223
+ return 0;
224
+ case "key":
225
+ return h(n.key);
226
+ case "eq":
227
+ case "match":
228
+ return h(n.key) + 1;
229
+ case "in":
230
+ return h(n.collection) + 1;
231
+ case "not":
232
+ return f(n.operand);
233
+ case "and":
234
+ return n.operands.reduce((t, e) => t + f(e), 0);
235
+ case "or":
236
+ return Math.min(...n.operands.map((t) => f(t)));
237
+ }
238
+ }
239
+ function C(n) {
240
+ const t = /* @__PURE__ */ new Set(), e = (r) => {
241
+ switch (r.kind) {
242
+ case "true":
243
+ return;
244
+ case "key":
245
+ case "eq":
246
+ case "match":
247
+ t.add(r.key);
248
+ return;
249
+ case "in":
250
+ t.add(r.key), t.add(r.collection);
251
+ return;
252
+ case "not":
253
+ e(r.operand);
254
+ return;
255
+ case "and":
256
+ case "or":
257
+ for (const s of r.operands) e(s);
258
+ }
259
+ };
260
+ return e(n), [...t].sort();
261
+ }
262
+ const w = /* @__PURE__ */ new Map();
263
+ function M(n, t) {
264
+ const e = `${t} ${n}`;
265
+ let r = w.get(e);
266
+ return r === void 0 && (r = new RegExp(n, t), w.set(e, r)), r;
267
+ }
268
+ function D(n) {
269
+ return n != null && n !== !1 && n !== "" && n !== 0;
270
+ }
271
+ function E(n, t) {
272
+ return n === t ? !0 : typeof t == "string" && (typeof n == "number" || typeof n == "boolean") ? String(n) === t : !1;
273
+ }
274
+ function K(n, t) {
275
+ return Array.isArray(n) ? n.includes(t) : typeof n == "object" && n !== null ? Object.prototype.hasOwnProperty.call(n, String(t)) : !1;
276
+ }
277
+ function B(n, t) {
278
+ const e = (r) => {
279
+ switch (r.kind) {
280
+ case "true":
281
+ return !0;
282
+ case "key":
283
+ return D(t(r.key));
284
+ case "not":
285
+ return !e(r.operand);
286
+ case "and":
287
+ return r.operands.every(e);
288
+ case "or":
289
+ return r.operands.some(e);
290
+ case "eq":
291
+ return E(t(r.key), r.value) !== r.negated;
292
+ case "match": {
293
+ const s = t(r.key);
294
+ return (s == null ? !1 : M(r.pattern, r.flags).test(String(s))) !== r.negated;
295
+ }
296
+ case "in":
297
+ return K(t(r.collection), t(r.key)) !== r.negated;
298
+ }
299
+ };
300
+ return e(n.ast);
301
+ }
302
+ function O(n, t) {
303
+ return Object.freeze({
304
+ source: n,
305
+ ast: t,
306
+ keys: C(t),
307
+ specificity: f(t)
308
+ });
309
+ }
310
+ const S = O("", l);
311
+ function d(n) {
312
+ const t = n.trim();
313
+ return t === "" ? S : O(t, new P(I(t), t).parse());
314
+ }
315
+ function J(n) {
316
+ try {
317
+ return { ok: !0, expr: d(n) };
318
+ } catch (t) {
319
+ if (t instanceof o)
320
+ return { ok: !1, error: { message: t.message, at: t.at, source: n } };
321
+ throw t;
322
+ }
323
+ }
324
+ function x(n) {
325
+ const t = /* @__PURE__ */ new Map(), e = (r) => {
326
+ if (r.kind === "eq" && !r.negated) t.set(r.key, r.value);
327
+ else if (r.kind === "and") for (const s of r.operands) e(s);
328
+ };
329
+ return e(n), t;
330
+ }
331
+ function Q(n, t) {
332
+ const e = x(n.ast);
333
+ if (e.size === 0) return !1;
334
+ const r = x(t.ast);
335
+ for (const [s, i] of e)
336
+ if (r.has(s) && !E(r.get(s), i))
337
+ return !0;
338
+ return !1;
339
+ }
340
+ class z extends Error {
341
+ kind;
342
+ /** Параметры кода: `commandId`, `keybinding`. */
343
+ params;
344
+ constructor(t, e, r = {}, s) {
345
+ super(e, s), this.name = "CommandError", this.kind = t, this.params = r;
346
+ }
347
+ }
348
+ const L = {
349
+ mod: "mod",
350
+ commandorcontrol: "mod",
351
+ cmdorctrl: "mod",
352
+ ctrl: "ctrl",
353
+ control: "ctrl",
354
+ meta: "meta",
355
+ cmd: "meta",
356
+ command: "meta",
357
+ super: "meta",
358
+ win: "meta",
359
+ alt: "alt",
360
+ option: "alt",
361
+ opt: "alt",
362
+ shift: "shift"
363
+ }, q = ["mod", "ctrl", "meta", "alt", "shift"], N = {
364
+ esc: "escape",
365
+ return: "enter",
366
+ del: "delete",
367
+ ins: "insert",
368
+ spacebar: "space",
369
+ plus: "+",
370
+ left: "arrowleft",
371
+ right: "arrowright",
372
+ up: "arrowup",
373
+ down: "arrowdown"
374
+ };
375
+ function T(n) {
376
+ const t = [];
377
+ let e = "";
378
+ for (const r of n)
379
+ r === "+" && e.trim() !== "" ? (t.push(e), e = "") : e += r;
380
+ return t.push(e), t;
381
+ }
382
+ function u(n, t) {
383
+ return new z(
384
+ "invalid-keybinding",
385
+ `сочетание «${n}» разобрать нельзя: ${t}`,
386
+ { keybinding: n }
387
+ );
388
+ }
389
+ function U(n) {
390
+ const t = /* @__PURE__ */ new Set();
391
+ let e = null;
392
+ for (const r of T(n)) {
393
+ const s = r.trim().toLowerCase();
394
+ if (s === "") throw u(n, "пустая часть");
395
+ const i = L[s];
396
+ if (i !== void 0) {
397
+ if (t.has(i))
398
+ throw u(n, `модификатор «${i}» повторён`);
399
+ t.add(i);
400
+ continue;
401
+ }
402
+ if (e !== null) throw u(n, "больше одной клавиши");
403
+ e = N[s] ?? s;
404
+ }
405
+ if (e === null) throw u(n, "нет клавиши, только модификаторы");
406
+ return [...q.filter((r) => t.has(r)), e].join("+");
407
+ }
408
+ const p = /* @__PURE__ */ new WeakMap(), V = d("false");
409
+ function tt(n) {
410
+ const t = p.get(n);
411
+ if (t !== void 0) return t;
412
+ let e;
413
+ try {
414
+ e = n.when === void 0 ? S : d(n.when);
415
+ } catch {
416
+ e = V;
417
+ }
418
+ return p.set(n, e), e;
419
+ }
420
+ function et(n, t) {
421
+ p.set(n, t);
422
+ }
423
+ const g = 2;
424
+ function nt(n) {
425
+ const t = n.replace(/\s*\+\s*/g, "+").trim().split(/\s+/);
426
+ if (t.length > g)
427
+ throw u(
428
+ n,
429
+ `в аккорде больше ${String(g)} ступеней: такое сочетание не воспроизводят по памяти`
430
+ );
431
+ return t.map((e) => U(e));
432
+ }
433
+ const H = /* @__PURE__ */ new Set(["x", "X", "*"]);
434
+ function Y(n) {
435
+ const t = $(n.trim());
436
+ return t === void 0 || t.wildcard ? void 0 : t.version;
437
+ }
438
+ function rt(n) {
439
+ return `${String(n.major)}.${String(n.minor)}.${String(n.patch)}`;
440
+ }
441
+ function v(n, t) {
442
+ return n.major !== t.major ? n.major - t.major : n.minor !== t.minor ? n.minor - t.minor : n.patch - t.patch;
443
+ }
444
+ function G(n) {
445
+ const t = n.trim();
446
+ if (t === "") return;
447
+ const e = /^(\^|~|>=|<=|>|<|=)?\s*(\S+)$/.exec(t);
448
+ if (e === null) return;
449
+ const r = e[1], s = $(e[2]);
450
+ if (s === void 0) return;
451
+ const { version: i, specified: a } = s;
452
+ if (a === 0)
453
+ return r === void 0 ? { source: t } : void 0;
454
+ switch (r) {
455
+ case "^":
456
+ return { source: t, min: { version: i, inclusive: !0 }, max: Z(i, a) };
457
+ case "~":
458
+ return { source: t, min: { version: i, inclusive: !0 }, max: y(i, a) };
459
+ case ">=":
460
+ return { source: t, min: { version: i, inclusive: !0 } };
461
+ case ">":
462
+ return { source: t, min: { version: i, inclusive: !1 } };
463
+ case "<=":
464
+ return { source: t, max: { version: i, inclusive: !0 } };
465
+ case "<":
466
+ return { source: t, max: { version: i, inclusive: !1 } };
467
+ default:
468
+ return a === 3 ? { source: t, min: { version: i, inclusive: !0 }, max: { version: i, inclusive: !0 } } : { source: t, min: { version: i, inclusive: !0 }, max: y(i, a) };
469
+ }
470
+ }
471
+ function X(n, t) {
472
+ if (t.min !== void 0) {
473
+ const e = v(n, t.min.version);
474
+ if (e < 0 || e === 0 && !t.min.inclusive) return !1;
475
+ }
476
+ if (t.max !== void 0) {
477
+ const e = v(n, t.max.version);
478
+ if (e > 0 || e === 0 && !t.max.inclusive) return !1;
479
+ }
480
+ return !0;
481
+ }
482
+ function it(n, t) {
483
+ const e = Y(n), r = G(t);
484
+ return e === void 0 || r === void 0 ? !1 : X(e, r);
485
+ }
486
+ function Z(n, t) {
487
+ const e = [n.major, n.minor, n.patch], r = e.slice(0, t).findIndex((i) => i > 0), s = r >= 0 ? r : t - 1;
488
+ return { version: R(e, s), inclusive: !1 };
489
+ }
490
+ function y(n, t) {
491
+ const e = [n.major, n.minor, n.patch];
492
+ return { version: R(e, t >= 2 ? 1 : 0), inclusive: !1 };
493
+ }
494
+ function R(n, t) {
495
+ const e = n.map((r, s) => s < t ? r : s === t ? r + 1 : 0);
496
+ return { major: e[0], minor: e[1], patch: e[2] };
497
+ }
498
+ function $(n) {
499
+ if (n === "" || n.includes("-") || n.includes("+")) return;
500
+ const t = n.split(".");
501
+ if (t.length > 3) return;
502
+ const e = [0, 0, 0];
503
+ let r = 0, s = !1;
504
+ for (const [i, a] of t.entries()) {
505
+ if (H.has(a)) {
506
+ s = !0;
507
+ continue;
508
+ }
509
+ if (s || !/^\d+$/.test(a)) return;
510
+ const c = Number.parseInt(a, 10);
511
+ if (!Number.isSafeInteger(c)) return;
512
+ e[i] = c, r += 1;
513
+ }
514
+ return {
515
+ version: { major: e[0], minor: e[1], patch: e[2] },
516
+ specified: r,
517
+ wildcard: s
518
+ };
519
+ }
520
+ const F = Object.freeze([
521
+ "workspace.save",
522
+ "workspace.resources",
523
+ "plugins.manage"
524
+ ]);
525
+ function st(n) {
526
+ return F.includes(n);
527
+ }
528
+ export {
529
+ z as C,
530
+ g as M,
531
+ F as P,
532
+ S as W,
533
+ U as a,
534
+ Y as b,
535
+ d as c,
536
+ v as d,
537
+ B as e,
538
+ rt as f,
539
+ G as g,
540
+ it as h,
541
+ st as i,
542
+ o as j,
543
+ f as k,
544
+ C as l,
545
+ Q as m,
546
+ nt as n,
547
+ J as p,
548
+ et as r,
549
+ X as s,
550
+ tt as w
551
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Пакеты, которые сборка внешнего плагина ВКЛАДЫВАЕТ в свой `main.js`, а не берёт у оболочки.
3
+ *
4
+ * ## Почему не в `PLUGIN_RUNTIME_MODULES`
5
+ *
6
+ * Модули рантайма оболочка подставляет сама — и держит их в стартовом графе. Пакеты стеков
7
+ * (модель схемы, каталог, печать модуля формы) туда не годятся: статическая регистрация втянула бы
8
+ * стек в стартовый граф оболочки, которая стека не знает (ось стеков, Ф3). А отказать внешнему
9
+ * плагину стека в них значило бы, что стек можно написать только встроенным.
10
+ *
11
+ * ## Почему второй экземпляр здесь безвреден
12
+ *
13
+ * Запрет вкладывать `@reformer/*` существует из-за второго экземпляра: вложенная копия React или
14
+ * ядра форм — два мира, которые молча не видят друг друга. У пакетов стеков мира нет: это чистые
15
+ * функции и данные, ни одного синглтона, а токены служб и точек ключуются строкой `id`, так что
16
+ * копия токена находит ту же службу. Что эти пакеты сами тянут из рантайма (`@reformer/core`,
17
+ * `@reformer/renderer-json`, React), остаётся внешним — по общему списку.
18
+ *
19
+ * @module @reformer/builder-plugin-api/plugin/bundled-modules
20
+ */
21
+ export declare const PLUGIN_BUNDLED_PACKAGES: readonly string[];
22
+ /** Имя пакета по спецификатору: `@scope/name/sub` → `@scope/name`, `name/sub` → `name`. */
23
+ export declare function packageNameOf(specifier: string): string;
24
+ /** Вкладывается ли модуль в сборку плагина (сам пакет или его подпуть). */
25
+ export declare function isBundledPluginModule(specifier: string): boolean;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Раскладка каталога плагина: где он лежит, какие файлы в нём — код и сколько их может быть.
3
+ *
4
+ * Правила загрузчика оболочки, вынесенные в контракт, потому что их проверяет ещё и
5
+ * `reformer-plugin validate`: плагин, который валидатор пропустил, а загрузчик отверг
6
+ * за лишний файл, — ровно тот отказ, ради которого валидатор существует.
7
+ *
8
+ * @module @reformer/builder-plugin-api/plugin/layout
9
+ */
10
+ /** Где в проекте лежат плагины. Путь из контракта; по образцу Obsidian. */
11
+ export declare const PLUGIN_CATALOG_DIR = ".ui_builder/plugins";
12
+ /**
13
+ * Потолок числа файлов одного плагина.
14
+ *
15
+ * Загрузка читает каталог плагина ЦЕЛИКОМ (линковщик резолвит импорты по набору файлов,
16
+ * а `require` синхронен — дочитать по требованию нельзя). Значит нужен предел: каталог
17
+ * на тысячи файлов — это не плагин, а чужое дерево, случайно оказавшееся под этим именем,
18
+ * и вычитывать его по сети или через File System Access мы не будем. Отказ, а не усечение:
19
+ * молча недочитанный плагин ломался бы «необъяснимо» на первом же импорте.
20
+ */
21
+ export declare const PLUGIN_FILE_LIMIT = 200;
22
+ /** Что вообще может быть модулем. Остальное в набор не попадает — читать его незачем. */
23
+ export declare const PLUGIN_CODE_EXTENSIONS: readonly string[];
24
+ /** Каталоги, в которые загрузчик не заходит. */
25
+ export declare const PLUGIN_SKIPPED_DIRS: readonly string[];
26
+ /** Файл кода — по расширению, без учёта регистра: `Main.TS` у автора на Windows тоже код. */
27
+ export declare function isPluginCodeFile(name: string): boolean;
@@ -0,0 +1,54 @@
1
+ import { ManifestOf, ManifestParseResult, PluginSource, PluginSourceManifest } from './manifest.js';
2
+ /**
3
+ * Разбирает текст манифеста.
4
+ *
5
+ * @param text содержимое `manifest.json`
6
+ * @param source откуда плагин — от этого зависят две проверки, см. {@link PluginSource}
7
+ * @param versions версии спрашивающего, см. {@link ShellVersions}
8
+ */
9
+ export declare function parsePluginManifest<S extends PluginSource>(text: string, source: S, versions?: ShellVersions): ManifestParseResult<ManifestOf<S>>;
10
+ /**
11
+ * Разбирает УЖЕ разобранный JSON.
12
+ *
13
+ * Отдельный вход нужен встроенным: их манифест приезжает статическим импортом, то есть
14
+ * значением, а не текстом. Обратно в строку его сериализовать только затем, чтобы тут же
15
+ * разобрать, — значит завести второй путь, который однажды разойдётся с первым. Проверки
16
+ * же обязаны быть ТЕМИ ЖЕ: «встроенные и внешние — один контракт» держится на том, что
17
+ * манифест встроенного проходит разбор каталога целиком, а не свою облегчённую копию.
18
+ */
19
+ export declare function parsePluginManifestValue<S extends PluginSource>(raw: unknown, source: S, versions?: ShellVersions): ManifestParseResult<ManifestOf<S>>;
20
+ /**
21
+ * Разбирает манифест ИСХОДНИКОВ плагина — тот, что лежит в репозитории автора.
22
+ *
23
+ * Это не третья поставка, а стадия ДО поставки: такой манифест оболочка не читает никогда,
24
+ * его читают инструменты (`reformer-plugin validate`, `build`). Правила — те же самые, одним
25
+ * кодом, и отличий ровно два, оба названы:
26
+ *
27
+ * - **имя каталога не сверяется с `id`.** Репозиторий автора зовётся как угодно (`acme-forms-plugin`),
28
+ * а каталогом с именем `id` плагин становится только при установке. Сверка возвращается
29
+ * на выходе сборки: собранный каталог проверяется разбором поставки `project` целиком.
30
+ * - **`version` обязательна и обязана быть версией.** Оболочка подставляет `0.0.0` — ей нужна
31
+ * подпись в списке, а не номер. Исходники же идут в сборку и упаковку, где версия — это
32
+ * адрес пакета, и умолчание тихо опубликовало бы `0.0.0`.
33
+ *
34
+ * `main` при этом указывает на исходник (`src/main.ts`), а не на собранный файл: проверяется
35
+ * тем же `normalizeModulePath`, поэтому выход за корень отсекается и здесь.
36
+ */
37
+ export declare function parsePluginSourceManifest(text: string, versions?: ShellVersions): ManifestParseResult<PluginSourceManifest>;
38
+ /**
39
+ * Версии того, кто спрашивает разбор.
40
+ *
41
+ * Обе необязательны, и необязательность у них разная. `api` умалчивается до
42
+ * {@link BUILDER_API_VERSION} — версия контракта известна самому пакету, и подменяют её
43
+ * только тесты. `builder` умолчания не имеет и иметь не может: пакет не знает, каким
44
+ * приложением он подан. Её отсутствие означает «спрашивающий не билдер» — так манифест
45
+ * читает CLI автора плагина, и тогда `compatibility.builder` проверяется ФОРМОЙ, без
46
+ * сверки. Подставь пакет сюда что-нибудь «по умолчанию», CLI отвергал бы плагины по версии
47
+ * приложения, которого не видел.
48
+ */
49
+ export interface ShellVersions {
50
+ /** Версия контракта плагинов. Умолчание — {@link BUILDER_API_VERSION}. */
51
+ readonly api?: string;
52
+ /** Версия приложения-билдера. Без неё `compatibility.builder` только разбирается. */
53
+ readonly builder?: string;
54
+ }