@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,597 @@
1
+ import { b as A, g as b, h as S, i as I, P, n as j, p as N } from "./permissions-BWlsUVPs.js";
2
+ const B = ".ui_builder/plugins", K = 200, _ = [
3
+ ".js",
4
+ ".mjs",
5
+ ".cjs",
6
+ ".jsx",
7
+ ".ts",
8
+ ".tsx",
9
+ ".mts",
10
+ ".cts"
11
+ ], W = ["node_modules"];
12
+ function Z(i) {
13
+ const e = i.toLowerCase();
14
+ return _.some((r) => e.endsWith(r));
15
+ }
16
+ function y(i) {
17
+ const e = [];
18
+ for (const r of i.replace(/\\/g, "/").split("/"))
19
+ if (!(r === "" || r === ".")) {
20
+ if (r === "..") {
21
+ if (e.length === 0) return;
22
+ e.pop();
23
+ continue;
24
+ }
25
+ e.push(r);
26
+ }
27
+ return e.join("/");
28
+ }
29
+ const t = "manifest.json", E = "1.0.0", O = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/, o = (i, e, r) => ({
30
+ ok: !1,
31
+ problem: { code: i, message: e, file: r?.file, cause: r?.cause }
32
+ });
33
+ function d(i, e) {
34
+ const r = i[e];
35
+ return typeof r == "string" && r.trim() !== "" ? r.trim() : void 0;
36
+ }
37
+ function H(i, e, r = {}) {
38
+ let n;
39
+ try {
40
+ n = JSON.parse(i);
41
+ } catch (s) {
42
+ return o("manifest-unreadable", `${t} не разбирается как JSON`, {
43
+ file: t,
44
+ cause: s
45
+ });
46
+ }
47
+ return q(n, e, r);
48
+ }
49
+ function q(i, e, r = {}) {
50
+ const n = h(i, e, r);
51
+ return n.ok ? { ok: !0, manifest: { ...n.manifest, source: e } } : n;
52
+ }
53
+ function X(i, e = {}) {
54
+ let r;
55
+ try {
56
+ r = JSON.parse(i);
57
+ } catch (a) {
58
+ return o("manifest-unreadable", `${t} не разбирается как JSON`, {
59
+ file: t,
60
+ cause: a
61
+ });
62
+ }
63
+ const n = h(r, { kind: "source" }, e);
64
+ if (!n.ok) return n;
65
+ const s = d(r, "version");
66
+ if (s === void 0 || A(s) === void 0)
67
+ return o(
68
+ "manifest-invalid",
69
+ `«version» исходников должна быть версией вида «1.0.0», а не «${s ?? ""}»: по ней собирается и публикуется пакет, и умолчания у неё нет`,
70
+ { file: t }
71
+ );
72
+ const { manifest: f } = n;
73
+ return "main" in f ? { ok: !0, manifest: f } : o("manifest-invalid", "в манифесте нет поля «main» или оно не строка", {
74
+ file: t
75
+ });
76
+ }
77
+ function h(i, e, r) {
78
+ const n = r.api ?? E;
79
+ if (typeof i != "object" || i === null || Array.isArray(i))
80
+ return o("manifest-invalid", `${t} должен быть объектом JSON`, {
81
+ file: t
82
+ });
83
+ const s = i, f = d(s, "id");
84
+ if (f === void 0)
85
+ return o("manifest-invalid", "в манифесте нет поля «id» или оно не строка", {
86
+ file: t
87
+ });
88
+ if (!O.test(f))
89
+ return o(
90
+ "manifest-invalid",
91
+ `«${f}» не годится в идентификаторы: допустимы буквы, цифры, «.», «_» и «-»`,
92
+ { file: t }
93
+ );
94
+ if (e.kind === "project" && f !== e.dir)
95
+ return o(
96
+ "id-mismatch",
97
+ `манифест объявляет «${f}», а каталог называется «${e.dir}». Идентификатор — ключ во всех реестрах, и он обязан совпадать с именем каталога: иначе список плагинов и команды перезагрузки говорят о разных вещах`,
98
+ { file: t }
99
+ );
100
+ const a = d(s, "apiVersion");
101
+ if (a === void 0)
102
+ return o("manifest-invalid", "в манифесте нет поля «apiVersion» или оно не строка", {
103
+ file: t
104
+ });
105
+ if (b(a) === void 0)
106
+ return o(
107
+ "manifest-invalid",
108
+ `из «apiVersion»: «${a}» не читается диапазон версий. Допустимы «^1», «~1.2», «>=1.0.0», «1.x» и точная версия; составные диапазоны и пререлизы не поддерживаются`,
109
+ { file: t }
110
+ );
111
+ if (!S(n, a))
112
+ return o(
113
+ "api-version",
114
+ `плагин написан против API «${a}», а оболочка даёт API ${n}. Совместимость между мажорами не обещана, поэтому плагин не загружается`,
115
+ { file: t }
116
+ );
117
+ const u = z(s.compatibility, r.builder);
118
+ if (u !== void 0 && "ok" in u) return u;
119
+ const l = L(s, e);
120
+ if ("ok" in l) return l;
121
+ const m = T(s.contributes);
122
+ if (m !== void 0 && "ok" in m) return m;
123
+ const c = M(s.provides);
124
+ if (c !== void 0 && "ok" in c) return c;
125
+ const v = U(s.requires);
126
+ if (v !== void 0 && "ok" in v) return v;
127
+ const p = R(s.permissions);
128
+ return p !== void 0 && "ok" in p ? p : { ok: !0, manifest: { ...{
129
+ id: f,
130
+ name: d(s, "name") ?? f,
131
+ version: d(s, "version") ?? "0.0.0",
132
+ apiVersion: a,
133
+ ...m === void 0 ? {} : { contributes: m.contributes },
134
+ ...c === void 0 ? {} : { provides: c.provides },
135
+ ...v === void 0 ? {} : { requires: v.requires },
136
+ ...p === void 0 ? {} : { permissions: p.permissions },
137
+ ...u === void 0 ? {} : { compatibility: u.compatibility }
138
+ }, ...l } };
139
+ }
140
+ function L(i, e) {
141
+ if (e.kind === "builtin") {
142
+ if (i.main !== void 0)
143
+ return o(
144
+ "manifest-invalid",
145
+ "у встроенного плагина не бывает поля «main»: его код приезжает вместе с оболочкой, и грузить из каталога нечего",
146
+ { file: t }
147
+ );
148
+ const f = x(i.builtin);
149
+ return "ok" in f ? f : { builtin: f.builtin };
150
+ }
151
+ if (i.builtin !== void 0)
152
+ return o(
153
+ "manifest-invalid",
154
+ "поле «builtin» объявляет способ доставки встроенного плагина, и у плагина каталога его быть не может: как он приезжает, решает не он",
155
+ { file: t }
156
+ );
157
+ const r = d(i, "main");
158
+ if (r === void 0)
159
+ return o("manifest-invalid", "в манифесте нет поля «main» или оно не строка", {
160
+ file: t
161
+ });
162
+ const n = y(r);
163
+ if (n === void 0 || n === "")
164
+ return o(
165
+ "manifest-invalid",
166
+ `точка входа «${r}» выходит за каталог плагина: загрузчик читает только его собственные файлы`,
167
+ { file: t }
168
+ );
169
+ const s = J(i.styles);
170
+ return s !== void 0 && "ok" in s ? s : { main: n, ...s === void 0 ? {} : { styles: s.styles } };
171
+ }
172
+ function x(i) {
173
+ const e = k(i);
174
+ if (e === void 0)
175
+ return o(
176
+ "manifest-invalid",
177
+ "в манифесте встроенного плагина нет поля «builtin» или оно не объект: способ доставки читается ДО загрузки кода и умолчания не имеет",
178
+ { file: t }
179
+ );
180
+ const r = d(e, "loading");
181
+ if (r !== "eager" && r !== "lazy")
182
+ return o(
183
+ "manifest-invalid",
184
+ `«builtin.loading» должен быть «eager» или «lazy», а не «${r ?? ""}»`,
185
+ { file: t }
186
+ );
187
+ const n = d(e, "reason");
188
+ return r === "eager" && n === void 0 ? o(
189
+ "manifest-invalid",
190
+ "статический плагин обязан объяснить себя полем «builtin.reason»: он едет в стартовом графе, и запись без довода через полгода не отличить от забытой",
191
+ { file: t }
192
+ ) : r === "lazy" && n !== void 0 ? o(
193
+ "manifest-invalid",
194
+ "у ленивого плагина «builtin.reason» лишний: ленивость — умолчание, объяснять надо отступление от него",
195
+ { file: t }
196
+ ) : { builtin: { loading: r, ...n === void 0 ? {} : { reason: n } } };
197
+ }
198
+ function R(i) {
199
+ if (i == null) return;
200
+ if (!Array.isArray(i))
201
+ return o("manifest-invalid", "поле «permissions» должно быть массивом", {
202
+ file: t
203
+ });
204
+ const e = [];
205
+ for (const [r, n] of i.entries()) {
206
+ const s = `permissions[${String(r)}]`;
207
+ if (typeof n != "string" || !I(n))
208
+ return o(
209
+ "manifest-invalid",
210
+ `${s}: «${String(n)}» не право. Оболочка знает: ${P.join(", ")}`,
211
+ { file: t }
212
+ );
213
+ if (e.includes(n))
214
+ return o("manifest-invalid", `${s}: право «${n}» названо дважды`, {
215
+ file: t
216
+ });
217
+ e.push(n);
218
+ }
219
+ return { permissions: e };
220
+ }
221
+ function z(i, e) {
222
+ if (i == null) return;
223
+ if (typeof i != "object" || Array.isArray(i))
224
+ return o("manifest-invalid", "поле «compatibility» должно быть объектом", {
225
+ file: t
226
+ });
227
+ const r = d(i, "builder");
228
+ return r === void 0 ? o(
229
+ "manifest-invalid",
230
+ "в «compatibility» нет поля «builder» или оно не строка. Пустой объект совместимости ничего не значит: либо диапазон версий билдера, либо поля нет вовсе",
231
+ { file: t }
232
+ ) : b(r) === void 0 ? o(
233
+ "manifest-invalid",
234
+ `из «compatibility.builder»: «${r}» не читается диапазон версий. Допустимы «^2», «~2.1», «>=2.0.0», «2.x» и точная версия`,
235
+ { file: t }
236
+ ) : e !== void 0 && !S(e, r) ? o(
237
+ "builder-version",
238
+ `плагину нужен билдер «${r}», а этот — ${e}. Контракт тут ни при чём: чинится обновлением билдера, а не правкой плагина`,
239
+ { file: t }
240
+ ) : { compatibility: { builder: r } };
241
+ }
242
+ function M(i) {
243
+ if (i == null) return;
244
+ if (!Array.isArray(i))
245
+ return o("manifest-invalid", "поле «provides» должно быть массивом", {
246
+ file: t
247
+ });
248
+ const e = [], r = /* @__PURE__ */ new Set();
249
+ for (const [n, s] of i.entries()) {
250
+ const f = `provides[${String(n)}]`, a = k(s);
251
+ if (a === void 0)
252
+ return o("manifest-invalid", `${f} должен быть объектом`, {
253
+ file: t
254
+ });
255
+ const u = d(a, "id");
256
+ if (u === void 0)
257
+ return o("manifest-invalid", `в ${f} нет поля «id» или оно не строка`, {
258
+ file: t
259
+ });
260
+ if (r.has(u))
261
+ return o(
262
+ "manifest-invalid",
263
+ `${f}: возможность «${u}» объявлена дважды. Слот в реестре служб один, и вторая версия не значила бы ничего`,
264
+ { file: t }
265
+ );
266
+ const l = d(a, "version");
267
+ if (l === void 0 || A(l) === void 0)
268
+ return o(
269
+ "manifest-invalid",
270
+ `${f}: «version» должна быть версией вида «1.0.0», а не «${l ?? ""}». Диапазон здесь недопустим: «provides» говорит, что ЕСТЬ, а не что требуется`,
271
+ { file: t }
272
+ );
273
+ r.add(u), e.push({ id: u, version: l });
274
+ }
275
+ return { provides: e };
276
+ }
277
+ function U(i) {
278
+ if (i == null) return;
279
+ const e = k(i);
280
+ if (e === void 0)
281
+ return o(
282
+ "manifest-invalid",
283
+ "поле «requires» должно быть объектом с полями «required» и «optional»",
284
+ { file: t }
285
+ );
286
+ const r = g(e.required, "requires.required");
287
+ if ("ok" in r) return r;
288
+ const n = g(e.optional, "requires.optional");
289
+ return "ok" in n ? n : { requires: { required: r.items, optional: n.items } };
290
+ }
291
+ function g(i, e) {
292
+ if (i == null) return { items: [] };
293
+ if (!Array.isArray(i))
294
+ return o("manifest-invalid", `поле «${e}» должно быть массивом`, {
295
+ file: t
296
+ });
297
+ const r = [];
298
+ for (const [n, s] of i.entries()) {
299
+ const f = `${e}[${String(n)}]`, a = k(s);
300
+ if (a === void 0)
301
+ return o("manifest-invalid", `${f} должен быть объектом`, {
302
+ file: t
303
+ });
304
+ const u = d(a, "id");
305
+ if (u === void 0)
306
+ return o("manifest-invalid", `в ${f} нет поля «id» или оно не строка`, {
307
+ file: t
308
+ });
309
+ const l = d(a, "range");
310
+ if (l === void 0 || b(l) === void 0)
311
+ return o(
312
+ "manifest-invalid",
313
+ `${f}: «range» должен быть диапазоном вида «^1», «~1.2», «>=1.0.0» или «*», а не «${l ?? ""}». Составные диапазоны и пререлизы не поддерживаются`,
314
+ { file: t }
315
+ );
316
+ r.push({ id: u, range: l });
317
+ }
318
+ return { items: r };
319
+ }
320
+ function k(i) {
321
+ if (!(typeof i != "object" || i === null || Array.isArray(i)))
322
+ return i;
323
+ }
324
+ function T(i) {
325
+ if (i == null) return;
326
+ if (typeof i != "object" || Array.isArray(i))
327
+ return o("manifest-invalid", "поле «contributes» должно быть объектом", {
328
+ file: t
329
+ });
330
+ const e = G(i.keybindings);
331
+ if (e !== void 0 && "ok" in e) return e;
332
+ const r = C(i.messages);
333
+ return r !== void 0 && "ok" in r ? r : {
334
+ contributes: {
335
+ ...e === void 0 ? {} : { keybindings: e.keybindings },
336
+ ...r === void 0 ? {} : { messages: r.messages }
337
+ }
338
+ };
339
+ }
340
+ function C(i) {
341
+ if (i == null) return;
342
+ if (typeof i != "object" || Array.isArray(i))
343
+ return o(
344
+ "manifest-invalid",
345
+ "поле «contributes.messages» должно быть объектом «локаль → путь к файлу словаря»",
346
+ { file: t }
347
+ );
348
+ const e = {};
349
+ for (const [r, n] of Object.entries(i)) {
350
+ if (r.trim() === "")
351
+ return o("manifest-invalid", "в «contributes.messages» есть пустое имя локали", {
352
+ file: t
353
+ });
354
+ const s = `contributes.messages[«${r}»]`;
355
+ if (typeof n != "string" || n.trim() === "")
356
+ return o("manifest-invalid", `${s}: путь к словарю должен быть непустой строкой`, {
357
+ file: t
358
+ });
359
+ const f = y(n.trim());
360
+ if (f === void 0 || f === "")
361
+ return o("manifest-invalid", `${s}: словарь «${n}» выходит за каталог плагина`, {
362
+ file: t
363
+ });
364
+ e[r] = f;
365
+ }
366
+ return { messages: e };
367
+ }
368
+ function G(i) {
369
+ if (i == null) return;
370
+ if (!Array.isArray(i))
371
+ return o("manifest-invalid", "поле «contributes.keybindings» должно быть массивом", {
372
+ file: t
373
+ });
374
+ const e = [];
375
+ for (const [r, n] of i.entries()) {
376
+ const s = `contributes.keybindings[${String(r)}]`;
377
+ if (typeof n != "object" || n === null || Array.isArray(n))
378
+ return o("manifest-invalid", `${s} должен быть объектом`, {
379
+ file: t
380
+ });
381
+ const f = n, a = d(f, "command");
382
+ if (a === void 0)
383
+ return o("manifest-invalid", `в ${s} нет поля «command» или оно не строка`, {
384
+ file: t
385
+ });
386
+ const u = d(f, "key");
387
+ if (u === void 0)
388
+ return o("manifest-invalid", `в ${s} нет поля «key» или оно не строка`, {
389
+ file: t
390
+ });
391
+ try {
392
+ j(u);
393
+ } catch (c) {
394
+ return o("manifest-invalid", `${s}: сочетание «${u}» разобрать нельзя`, {
395
+ file: t,
396
+ cause: c
397
+ });
398
+ }
399
+ const l = d(f, "when");
400
+ if (l !== void 0) {
401
+ const c = N(l);
402
+ if (!c.ok)
403
+ return o("manifest-invalid", `${s}: ${c.error.message}`, {
404
+ file: t
405
+ });
406
+ }
407
+ const m = f.allowInEditable;
408
+ if (m !== void 0 && typeof m != "boolean")
409
+ return o("manifest-invalid", `${s}: «allowInEditable» должно быть булевым`, {
410
+ file: t
411
+ });
412
+ e.push({
413
+ command: a,
414
+ key: u,
415
+ ...l === void 0 ? {} : { when: l },
416
+ ...f.args === void 0 ? {} : { args: f.args },
417
+ ...m === void 0 ? {} : { allowInEditable: m }
418
+ });
419
+ }
420
+ return { keybindings: e };
421
+ }
422
+ function J(i) {
423
+ if (i == null) return;
424
+ if (typeof i != "object" || Array.isArray(i))
425
+ return o("manifest-invalid", "поле «styles» должно быть объектом", {
426
+ file: t
427
+ });
428
+ const e = i, r = d(e, "file");
429
+ if (r === void 0)
430
+ return o("manifest-invalid", "в «styles» нет поля «file» или оно не строка", {
431
+ file: t
432
+ });
433
+ const n = y(r);
434
+ if (n === void 0 || n === "")
435
+ return o("manifest-invalid", `таблица стилей «${r}» выходит за каталог плагина`, {
436
+ file: t
437
+ });
438
+ const s = d(e, "isolation") ?? "scoped";
439
+ return s !== "scoped" ? o(
440
+ "manifest-invalid",
441
+ `«styles.isolation»: «${s}» не поддерживается, возможно только «scoped». Неизолированный чужой CSS перекрашивает оболочку — это не режим, а поломка`,
442
+ { file: t }
443
+ ) : { styles: { file: n, isolation: s } };
444
+ }
445
+ function Q(i) {
446
+ let e;
447
+ try {
448
+ e = JSON.parse(i);
449
+ } catch (r) {
450
+ return { ok: !1, reason: "не разбирается как JSON", cause: r };
451
+ }
452
+ if (typeof e != "object" || e === null || Array.isArray(e))
453
+ return { ok: !1, reason: "должен быть объектом JSON" };
454
+ for (const [r, n] of Object.entries(e))
455
+ if (typeof n != "string")
456
+ return {
457
+ ok: !1,
458
+ reason: `ключ «${r}» — не строка, а словарь обязан быть плоским «ключ → строка»`
459
+ };
460
+ return { ok: !0, bundle: e };
461
+ }
462
+ function $(i) {
463
+ if (typeof i != "object" || i === null) return;
464
+ const e = i;
465
+ if (!(typeof e.id != "string" || e.id.trim() === "") && typeof e.activate == "function")
466
+ return i;
467
+ }
468
+ function Y(i) {
469
+ const e = $(i);
470
+ if (e !== void 0) return e;
471
+ if (typeof i == "object" && i !== null)
472
+ return $(i.default);
473
+ }
474
+ const D = [
475
+ "@reformer/ui-kit/accordion",
476
+ "@reformer/ui-kit/alert",
477
+ "@reformer/ui-kit/alert-dialog",
478
+ "@reformer/ui-kit/aspect-ratio",
479
+ "@reformer/ui-kit/async-boundary",
480
+ "@reformer/ui-kit/attachment",
481
+ "@reformer/ui-kit/avatar",
482
+ "@reformer/ui-kit/badge",
483
+ "@reformer/ui-kit/box",
484
+ "@reformer/ui-kit/breadcrumb",
485
+ "@reformer/ui-kit/bubble",
486
+ "@reformer/ui-kit/button",
487
+ "@reformer/ui-kit/button-group",
488
+ "@reformer/ui-kit/calendar",
489
+ "@reformer/ui-kit/card",
490
+ "@reformer/ui-kit/carousel",
491
+ "@reformer/ui-kit/chart",
492
+ "@reformer/ui-kit/checkbox",
493
+ "@reformer/ui-kit/collapsible",
494
+ "@reformer/ui-kit/combobox",
495
+ "@reformer/ui-kit/command",
496
+ "@reformer/ui-kit/context-menu",
497
+ "@reformer/ui-kit/date-picker",
498
+ "@reformer/ui-kit/dialog",
499
+ "@reformer/ui-kit/direction",
500
+ "@reformer/ui-kit/drawer",
501
+ "@reformer/ui-kit/dropdown-menu",
502
+ "@reformer/ui-kit/empty",
503
+ "@reformer/ui-kit/example-card",
504
+ "@reformer/ui-kit/field",
505
+ "@reformer/ui-kit/fields",
506
+ "@reformer/ui-kit/file-upload",
507
+ "@reformer/ui-kit/form-array",
508
+ "@reformer/ui-kit/form-field",
509
+ "@reformer/ui-kit/form-wizard",
510
+ "@reformer/ui-kit/hover-card",
511
+ "@reformer/ui-kit/icon",
512
+ "@reformer/ui-kit/info-hint",
513
+ "@reformer/ui-kit/input",
514
+ "@reformer/ui-kit/input-group",
515
+ "@reformer/ui-kit/input-mask",
516
+ "@reformer/ui-kit/input-otp",
517
+ "@reformer/ui-kit/input-password",
518
+ "@reformer/ui-kit/item",
519
+ "@reformer/ui-kit/kbd",
520
+ "@reformer/ui-kit/label",
521
+ "@reformer/ui-kit/list",
522
+ "@reformer/ui-kit/marker",
523
+ "@reformer/ui-kit/menubar",
524
+ "@reformer/ui-kit/message",
525
+ "@reformer/ui-kit/message-scroller",
526
+ "@reformer/ui-kit/meta",
527
+ "@reformer/ui-kit/native-select",
528
+ "@reformer/ui-kit/navigation-menu",
529
+ "@reformer/ui-kit/pagination",
530
+ "@reformer/ui-kit/popover",
531
+ "@reformer/ui-kit/progress",
532
+ "@reformer/ui-kit/radio-group",
533
+ "@reformer/ui-kit/resizable",
534
+ "@reformer/ui-kit/scroll-area",
535
+ "@reformer/ui-kit/section",
536
+ "@reformer/ui-kit/select",
537
+ "@reformer/ui-kit/separator",
538
+ "@reformer/ui-kit/sheet",
539
+ "@reformer/ui-kit/sidebar",
540
+ "@reformer/ui-kit/skeleton",
541
+ "@reformer/ui-kit/slider",
542
+ "@reformer/ui-kit/sonner",
543
+ "@reformer/ui-kit/spinner",
544
+ "@reformer/ui-kit/switch",
545
+ "@reformer/ui-kit/table",
546
+ "@reformer/ui-kit/tabs",
547
+ "@reformer/ui-kit/textarea",
548
+ "@reformer/ui-kit/toggle",
549
+ "@reformer/ui-kit/toggle-group",
550
+ "@reformer/ui-kit/tooltip",
551
+ "@reformer/ui-kit/tree",
552
+ "@reformer/ui-kit/typography"
553
+ ], w = Object.freeze([
554
+ "@builder/sdk",
555
+ "@reformer/builder-plugin-api",
556
+ "react",
557
+ "react/jsx-runtime",
558
+ "react-dom",
559
+ "react-dom/client",
560
+ "@preact/signals-core",
561
+ "@reformer/core",
562
+ "@reformer/core/behaviors",
563
+ "@reformer/core/model",
564
+ "@reformer/core/signals",
565
+ "@reformer/core/validation",
566
+ "@reformer/core/validators",
567
+ "@reformer/renderer-json",
568
+ "@reformer/renderer-react",
569
+ "@reformer/form-registry",
570
+ "@reformer/form-registry/react",
571
+ "@reformer/form-registry/storage",
572
+ "@reformer/ui-kit",
573
+ ...D,
574
+ "@reformer/cdk",
575
+ "@reformer/cdk/async-boundary",
576
+ "@reformer/cdk/file-upload",
577
+ "@reformer/cdk/form-array",
578
+ "@reformer/cdk/form-field",
579
+ "@reformer/cdk/form-wizard",
580
+ "@reformer/cdk/list"
581
+ ]);
582
+ export {
583
+ E as B,
584
+ B as P,
585
+ _ as a,
586
+ K as b,
587
+ W as c,
588
+ q as d,
589
+ X as e,
590
+ Q as f,
591
+ Y as g,
592
+ t as h,
593
+ Z as i,
594
+ w as j,
595
+ y as n,
596
+ H as p
597
+ };
@@ -0,0 +1,52 @@
1
+ import { Disposable } from '../primitives/disposable.js';
2
+ import { WhenContext } from '../primitives/when-context.js';
3
+ /** Снимок состояния: одно значение, две проекции. */
4
+ export interface ContextKeySnapshot {
5
+ /** Чтение любого ключа — платформенного, областного, плагинного. */
6
+ read(key: string): unknown;
7
+ /**
8
+ * Проекция на пять полей — для `CommandRegistry.execute` и `isEnabled`, которые по
9
+ * контракту принимают {@link WhenContext}. Один снимок обслуживает обоих, поэтому
10
+ * предикат и условие видят одно и то же состояние, а не два соседних во времени.
11
+ */
12
+ whenContext(): WhenContext;
13
+ }
14
+ export interface ContextKeyReader {
15
+ /** Значение ключа. Неизвестный ключ — `undefined`, и это норма, а не отказ. */
16
+ read(key: string): unknown;
17
+ /** Снимок. Ссылка стабильна между изменениями — требование `useSyncExternalStore`. */
18
+ snapshot(): ContextKeySnapshot;
19
+ /**
20
+ * Подписка на изменения. Уведомление НЕСЁТ имена изменившихся ключей: подписчик, который
21
+ * знает читаемые ключи своих условий, сравнивает пересечение и молчит, если оно пусто.
22
+ * Ради этого свойства `WhenExpr.keys` и считается один раз при разборе.
23
+ */
24
+ subscribe(listener: (changed: ReadonlySet<string>) => void): Disposable;
25
+ }
26
+ /** Объявленный ключ. `dispose()` снимает объявление — на этом держится выключение плагина. */
27
+ export interface ContextKey<T> extends Disposable {
28
+ readonly key: string;
29
+ get(): T;
30
+ set(value: T): void;
31
+ /** Возвращает начальное значение, с которым ключ объявлен. */
32
+ reset(): void;
33
+ }
34
+ export interface ContextKeyInfo {
35
+ readonly key: string;
36
+ /** Идентификатор плагина либо `host`. */
37
+ readonly owner: string;
38
+ }
39
+ export interface ContextKeyService extends ContextKeyReader {
40
+ /**
41
+ * Объявляет ключ.
42
+ *
43
+ * @throws Error если имя зарезервировано платформой либо ключ уже объявлен. Повторное
44
+ * объявление — отказ, а не замена, по тому же доводу, что у умолчаний настроек: две
45
+ * записи одного ключа означали бы, что действующее значение зависит от порядка активации
46
+ * плагинов, а он по контракту рантайма ничего не значит.
47
+ */
48
+ createKey<T>(key: string, initial: T, owner?: string): ContextKey<T>;
49
+ /** Объявленные ключи — редактору клавиш для подсказки и диагностике «такого ключа нет». */
50
+ declared(): readonly ContextKeyInfo[];
51
+ }
52
+ export declare const ContextKeyServiceToken: import('../index.js').ServiceToken<ContextKeyService>;
@@ -0,0 +1,40 @@
1
+ import { Diagnostic, QuickFix } from './types.js';
2
+ /**
3
+ * Есть ли сейчас команда с таким идентификатором.
4
+ *
5
+ * Предикат, а не сам реестр команд: диагностика не должна знать про `CommandRegistry` (он ей
6
+ * не нужен ни для чего другого), а вызывающему проще всего отдать `(id) => commands.get(id)
7
+ * !== undefined`. Заодно это делает отбор проверяемым без единого реестра.
8
+ *
9
+ * **Применимость (`enabled`) здесь НЕ спрашивается.** «Команды нет» и «команда сейчас
10
+ * недоступна» — разные ответы: первое означает, что исправление неисполнимо в принципе,
11
+ * второе — что не в этом контексте, и второе обязано проверяться там же, где у человека, —
12
+ * в момент вызова. Смешать их значило бы прятать исправление на время, пока фокус стоит
13
+ * не в том месте.
14
+ */
15
+ export type CommandLookup = (commandId: string) => boolean;
16
+ export interface FixesOptions {
17
+ /**
18
+ * Куда сообщить об отброшенном исправлении. Необязателен, но нужен почти всем: без него
19
+ * опечатка в идентификаторе команды исчезает вместе с кнопкой.
20
+ */
21
+ readonly onUnavailable?: (fix: QuickFix, diagnostic: Diagnostic) => void;
22
+ }
23
+ /**
24
+ * Исправления диагностики, чью команду сейчас можно выполнить.
25
+ *
26
+ * Возвращает **ту же ссылку**, если отбрасывать нечего: список читают из отрисовки, и новый
27
+ * массив на каждый вызов ломал бы сравнение по ссылке ровно там, где на него рассчитывают
28
+ * (`useSyncExternalStore`, мемоизация строки панели).
29
+ */
30
+ export declare function usableFixes(diagnostic: Diagnostic, isRegistered: CommandLookup, options?: FixesOptions): readonly QuickFix[];
31
+ /**
32
+ * Тот же отбор для целого свода: диагностики с неисполнимыми исправлениями пересобираются,
33
+ * остальные остаются собой.
34
+ *
35
+ * Ссылки сохраняются по той же причине, что и в {@link usableFixes}, и на двух уровнях сразу:
36
+ * не изменившийся список отдаётся как есть, не изменившаяся запись — тоже. Свод диагностик
37
+ * читает панель проблем через подписку, и «всё новое на каждой правке» означало бы перерисовку
38
+ * всего списка на каждый набранный символ.
39
+ */
40
+ export declare function withUsableFixes(items: readonly Diagnostic[], isRegistered: CommandLookup, options?: FixesOptions): readonly Diagnostic[];