ose-plugin 0.1.3 → 0.1.4

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/README.md CHANGED
@@ -313,8 +313,9 @@ npx ose-plugin check <папка> --json # для скриптов и CI
313
313
 
314
314
  - Код пакета живёт в рамке-песочнице (`iframe` без доступа к странице оверлея),
315
315
  но сеть ей доступна — ставить можно только доверенный код.
316
- - Только 2D-виджеты; 3D-наборы и `threeDWidgets` у тем ещё не читаются.
317
- - Установка — папкой; zip, обновления и подписи — следующий этап.
316
+ - 3D-виджет и его тема — два пакета: в одном каталоге один манифест, а тема
317
+ ссылается на тип виджета через `threeDWidgets`.
318
+ - Установка — папкой или zip; обновления и подписи — следующий этап.
318
319
 
319
320
  ## Публикация в npm
320
321
 
package/index.d.ts CHANGED
@@ -260,6 +260,10 @@ declare namespace Ose {
260
260
  entry: string;
261
261
  styles?: string[];
262
262
  icon?: string;
263
+ /** 3D-виджет: canvas или 3d-webgl. По умолчанию — обычный DOM-виджет. */
264
+ renderType?: "2d" | "canvas" | "3d-webgl";
265
+ /** Семейство темы; обязательно для 3D-виджета. */
266
+ theme?: string;
263
267
  defaultGeometry?: Partial<Pick<Geometry, "x" | "y" | "w" | "h">>;
264
268
  minW?: number;
265
269
  minH?: number;
@@ -270,6 +274,8 @@ declare namespace Ose {
270
274
  kind: "theme";
271
275
  tokens: Record<`--${string}`, string>;
272
276
  css?: string;
277
+ /** Типы 3D-виджетов этой темы: включаются тумблером «3D» на карточке. */
278
+ threeDWidgets?: string[];
273
279
  }
274
280
  }
275
281
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ose-plugin",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Scaffold and validate Open Stream Environment widget and theme packages, with types for window.OSE.",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "type": "module",
@@ -52,6 +52,11 @@
52
52
  "type": "string",
53
53
  "pattern": "\\.css$",
54
54
  "description": "CSS-файл внутри пакета; правила пишутся под [data-theme=\"plugin:<id>\"]."
55
+ },
56
+ "threeDWidgets": {
57
+ "type": "array",
58
+ "description": "Типы 3D-виджетов этой темы (plugin:<id>): на карточке появится тумблер «3D», и они включатся вместе с ним.",
59
+ "items": { "type": "string" }
55
60
  }
56
61
  },
57
62
  "additionalProperties": true
@@ -55,6 +55,15 @@
55
55
  "type": "string",
56
56
  "description": "Ключ из shared/icons.js; неизвестный заменяется на widgetCustom."
57
57
  },
58
+ "renderType": {
59
+ "enum": ["2d", "canvas", "3d-webgl"],
60
+ "description": "canvas и 3d-webgl — 3D-виджет: он попадает в набор темы и рисуется на холсте внутри песочницы."
61
+ },
62
+ "theme": {
63
+ "type": "string",
64
+ "minLength": 1,
65
+ "description": "Семейство темы. Обязательно для 3D-виджета: по нему он включается и выключается вместе с набором."
66
+ },
58
67
  "defaultGeometry": {
59
68
  "type": "object",
60
69
  "description": "Положение и размер в процентах холста (0–100).",
package/validate.mjs CHANGED
@@ -179,6 +179,15 @@ function checkWidget(packageDir, manifest, errors, warnings) {
179
179
 
180
180
  checkGeometry(manifest, errors, warnings);
181
181
  checkSettings(manifest, errors, warnings);
182
+
183
+ // 3D-виджет рисует на canvas: приложение отличит его от обычного по этим
184
+ // полям и включит вместе с набором темы.
185
+ const renderType = manifest.renderType === undefined ? "2d" : manifest.renderType;
186
+ if (!["2d", "canvas", "3d-webgl"].includes(renderType)) {
187
+ errors.push(`renderType «${String(manifest.renderType)}» неизвестен: 2d, canvas или 3d-webgl`);
188
+ } else if (renderType !== "2d" && !text(manifest.theme)) {
189
+ errors.push("3D-виджету (canvas или 3d-webgl) нужно поле theme — семейство темы");
190
+ }
182
191
  }
183
192
 
184
193
  function checkTheme(packageDir, manifest, errors, warnings) {
@@ -200,6 +209,17 @@ function checkTheme(packageDir, manifest, errors, warnings) {
200
209
  checkFile(packageDir, manifest.css, ".css", "css", errors);
201
210
  }
202
211
  }
212
+
213
+ if (manifest.threeDWidgets !== undefined) {
214
+ if (!Array.isArray(manifest.threeDWidgets)) {
215
+ errors.push("threeDWidgets должен быть массивом типов");
216
+ } else {
217
+ manifest.threeDWidgets.forEach((kind) => {
218
+ if (typeof kind !== "string") errors.push("threeDWidgets содержит не строку");
219
+ else if (!text(kind)) warnings.push("пустой тип в threeDWidgets пропускается");
220
+ });
221
+ }
222
+ }
203
223
  }
204
224
 
205
225
  /** Проверить один пакет: папку с widget.json или theme.json. */