ose-plugin 0.1.2 → 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
@@ -311,10 +311,11 @@ npx ose-plugin check <папка> --json # для скриптов и CI
311
311
 
312
312
  ## Ограничения
313
313
 
314
- - Пакет исполняется в странице оверлея с полными правами: ставить можно только
315
- доверенный код, песочницы пока нет.
316
- - Только 2D-виджеты; 3D-наборы и `threeDWidgets` у тем ещё не читаются.
317
- - Установка — папкой; zip, обновления и подписи — следующий этап.
314
+ - Код пакета живёт в рамке-песочнице (`iframe` без доступа к странице оверлея),
315
+ но сеть ей доступна — ставить можно только доверенный код.
316
+ - 3D-виджет и его тема — два пакета: в одном каталоге один манифест, а тема
317
+ ссылается на тип виджета через `threeDWidgets`.
318
+ - Установка — папкой или zip; обновления и подписи — следующий этап.
318
319
 
319
320
  ## Публикация в npm
320
321
 
package/index.d.ts CHANGED
@@ -122,8 +122,11 @@ declare namespace Ose {
122
122
  readCssVar?: (name: string) => string;
123
123
  t?: (key: string, params?: Record<string, unknown>) => string;
124
124
  escapeHtml?: (text: string) => string;
125
+ escapeAttr?: (text: string) => string;
126
+ formatMoney?: (value: number) => string;
127
+ currencySymbol?: (code: string) => string;
125
128
  resolveMediaUrl?: (path: string) => string;
126
- state?: Record<string, unknown>;
129
+ ICONS?: Record<string, string>;
127
130
  [key: string]: unknown;
128
131
  }
129
132
 
@@ -257,6 +260,10 @@ declare namespace Ose {
257
260
  entry: string;
258
261
  styles?: string[];
259
262
  icon?: string;
263
+ /** 3D-виджет: canvas или 3d-webgl. По умолчанию — обычный DOM-виджет. */
264
+ renderType?: "2d" | "canvas" | "3d-webgl";
265
+ /** Семейство темы; обязательно для 3D-виджета. */
266
+ theme?: string;
260
267
  defaultGeometry?: Partial<Pick<Geometry, "x" | "y" | "w" | "h">>;
261
268
  minW?: number;
262
269
  minH?: number;
@@ -267,6 +274,8 @@ declare namespace Ose {
267
274
  kind: "theme";
268
275
  tokens: Record<`--${string}`, string>;
269
276
  css?: string;
277
+ /** Типы 3D-виджетов этой темы: включаются тумблером «3D» на карточке. */
278
+ threeDWidgets?: string[];
270
279
  }
271
280
  }
272
281
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ose-plugin",
3
- "version": "0.1.2",
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).",
@@ -1,7 +1,7 @@
1
1
  /*
2
- Стили пакета действуют на всю страницу оверлея. Корневой элемент виджета
3
- помечен data-type="plugin:{{id}}" — по нему и ограничивайте правила, иначе
4
- они заденут встроенные виджеты.
2
+ Стили пакета действуют только внутри рамки виджета: они не заденут ни
3
+ встроенные виджеты, ни остальную страницу. Корневой элемент виджета помечен
4
+ data-type="plugin:{{id}}" — по нему и ограничивайте правила.
5
5
  */
6
6
  .widget-instance[data-type="plugin:{{id}}"] {
7
7
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
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. */