@cocreate/plugins 1.8.0 → 2.0.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.
package/README.md CHANGED
@@ -1,92 +1,444 @@
1
- # CoCreate-plugins
2
-
3
- CoCreate plugins Take it for a spin in our [playground!](https://cocreate.app/docs/plugins)
4
-
5
- ![minified](https://img.badgesize.io/https://cdn.cocreate.app/plugins/latest/CoCreate-plugins.min.js?style=flat-square&label=minified&color=orange)
6
- ![gzip](https://img.badgesize.io/https://cdn.cocreate.app/plugins/latest/CoCreate-plugins.min.js?compression=gzip&style=flat-square&label=gzip&color=yellow)
7
- ![brotli](https://img.badgesize.io/https://cdn.cocreate.app/plugins/latest/CoCreate-plugins.min.js?compression=brotli&style=flat-square&label=brotli)
8
- ![GitHub latest release](https://img.shields.io/github/v/release/CoCreate-app/CoCreate-plugins?style=flat-square)
9
- ![GitHub contributors](https://img.shields.io/github/contributors/CoCreate-app/CoCreate-plugins?style=flat-square)
10
- ![License](https://img.shields.io/static/v1?style=flat-square&label=license&message=AGPL-3.0&color=green)
11
- ![Hiring](https://img.shields.io/static/v1?style=flat-square&label=&message=Hiring&color=blueviolet)
12
-
13
- ![CoCreate-plugins](https://cdn.cocreate.app/docs/CoCreate-plugins.gif)
14
-
15
- ## [Docs & Demo](https://cocreate.app/docs/plugins)
16
-
17
- For a complete guide and working demo refer to the [doumentation](https://cocreate.app/docs/plugins)
18
-
19
- ## CDN
20
-
21
- ```html
22
- <script src="https://cdn.cocreate.app/plugins/latest/CoCreate-plugins.min.js"></script>
23
- ```
24
-
25
- ```html
26
- <script src="https://cdn.cocreate.app/plugins/latest/CoCreate-plugins.min.css"></script>
27
- ```
28
-
29
- ## NPM
30
-
31
- ```shell
32
- $ npm i @cocreate/plugins
33
- ```
34
-
35
- ## yarn
36
-
37
- ```shell
38
- $ yarn install @cocreate/plugins
39
- ```
40
-
41
- # Table of Contents
42
-
43
- - [Table of Contents](#table-of-contents)
44
- - [Announcements](#announcements)
45
- - [Roadmap](#roadmap)
46
- - [How to Contribute](#how-to-contribute)
47
- - [About](#about)
48
- - [License](#license)
49
-
50
- <a name="announcements"></a>
51
-
52
- # Announcements
53
-
54
- All updates to this library are documented in our [CHANGELOG](https://github.com/CoCreate-app/CoCreate-plugins/blob/master/CHANGELOG.md) and [releases](https://github.com/CoCreate-app/CoCreate-plugins/releases). You may also subscribe to email for releases and breaking changes.
55
-
56
- <a name="roadmap"></a>
57
-
58
- # Roadmap
59
-
60
- If you are interested in the future direction of this project, please take a look at our open [issues](https://github.com/CoCreate-app/CoCreate-plugins/issues) and [pull requests](https://github.com/CoCreate-app/CoCreate-plugins/pulls). We would love to hear your feedback.
61
-
62
- <a name="about"></a>
63
-
64
- # About
65
-
66
- CoCreate-plugins is guided and supported by the CoCreate Developer Experience Team.
67
-
68
- Please Email the Developer Experience Team [here](mailto:develop@cocreate.app) in case of any queries.
69
-
70
- CoCreate-plugins is maintained and funded by CoCreate. The names and logos for CoCreate are trademarks of CoCreate, LLC.
71
-
72
- <a name="contribute"></a>
73
-
74
- # How to Contribute
75
-
76
- We encourage contribution to our libraries (you might even score some nifty swag), please see our [CONTRIBUTING](https://github.com/CoCreate-app/CoCreate-plugins/blob/master/CONTRIBUTING.md) guide for details.
77
-
78
- We want this library to be community-driven, and CoCreate led. We need your help to realize this goal. To help make sure we are building the right things in the right order, we ask that you create [issues](https://github.com/CoCreate-app/CoCreate-plugins/issues) and [pull requests](https://github.com/CoCreate-app/CoCreate-plugins/pulls) or merely upvote or comment on existing issues or pull requests.
79
-
80
- We appreciate your continued support, thank you!
81
-
82
- <a name="license"></a>
83
-
84
- # License
85
-
86
- This software is dual-licensed under the GNU Affero General Public License version 3 (AGPLv3) and a commercial license.
87
-
88
- - **Open Source Use**: For open-source projects and non-commercial use, this software is available under the AGPLv3. The AGPLv3 allows you to freely use, modify, and distribute this software, provided that all modifications and derivative works are also licensed under the AGPLv3. For the full license text, see the [LICENSE file](https://github.com/CoCreate-app/CoCreate-plugins/blob/master/LICENSE).
89
-
90
- - **Commercial Use**: For-profit companies and individuals intending to use this software for commercial purposes must obtain a commercial license. The commercial license is available when you sign up for an API key on our [website](https://cocreate.app). This license permits proprietary use and modification of the software without the copyleft requirements of the AGPLv3. It is ideal for integrating this software into proprietary commercial products and applications.
91
-
92
- If you have not purchased a commercial license and intend to use this software for commercial purposes, you are required to sign up for an API key on our website.
1
+ # CoCreate Plugins
2
+
3
+ A declarative browser plugin loader and runtime for CoCreate. It loads registered JavaScript and CSS resources, exposes their browser globals to the CoCreate AST, initializes plugin instances on DOM elements, and connects those instances to standard element value APIs.
4
+
5
+ ---
6
+
7
+ ## Documentation
8
+
9
+ For interactive examples, visit the [CoCreate Plugins documentation](https://CoCreateJS.com/docs/plugins).
10
+
11
+ ## Table of Contents
12
+
13
+ - [Architectural Overview](#architectural-overview)
14
+ - [Installation](#installation)
15
+ - [Registering Plugin Resources](#registering-plugin-resources)
16
+ - [Using the `plugin` Attribute](#using-the-plugin-attribute)
17
+ - [AST Execution Model](#ast-execution-model)
18
+ - [Element Value Integration](#element-value-integration)
19
+ - [Programmatic API](#programmatic-api)
20
+ - [Resource Loading](#resource-loading)
21
+ - [Error Handling](#error-handling)
22
+ - [Security](#security)
23
+ - [Announcements](#announcements)
24
+ - [Roadmap](#roadmap)
25
+ - [How to Contribute](#how-to-contribute)
26
+ - [License](#license)
27
+
28
+ ---
29
+
30
+ ## Explicit instance storage
31
+
32
+ Plugin results are not automatically assigned to the host element. To retain a
33
+ returned instance, explicitly assign it using AST:
34
+
35
+ ```html
36
+ <div plugin='{
37
+ "$this.myInstance": {
38
+ "$ExamplePlugin": ["$this", {}]
39
+ }
40
+ }'></div>
41
+ ```
42
+
43
+ Here `$this` identifies the host element and `myInstance` names the property to
44
+ write. The nested initializer executes first, then its returned value is
45
+ assigned to that property. A global plugin call that needs no retained result
46
+ can run without this assignment. Code that previously relied on automatic `element.PluginName`
47
+ storage must explicitly assign and reference the instance instead.
48
+
49
+ ## Architectural Overview
50
+
51
+ `@cocreate/plugins` connects three parts of the browser runtime:
52
+
53
+ 1. A plugin definition in `window.CoCreateConfig.plugins` identifies the JavaScript and CSS resources.
54
+ 2. A DOM element's `plugin` attribute contains an AST configuration.
55
+ 3. AST executes the configuration. Results are stored only where the configuration explicitly assigns them.
56
+
57
+ ```text
58
+ CoCreateConfig.plugins
59
+ │
60
+ ├── load JavaScript and CSS
61
+ │
62
+ ▼
63
+ window.PluginName
64
+ │
65
+ ├── AST executes plugin configuration
66
+ │
67
+ ▼
68
+ result (optionally assigned through AST)
69
+ ```
70
+
71
+ Plugin operations execute sequentially. Plugin names continue to refer to their global libraries; constructor results do not automatically replace those references or attach to the element.
72
+
73
+ The module observes `[plugin]` elements automatically, including elements added or updated after the initial page load.
74
+
75
+ ---
76
+
77
+ ## Installation
78
+
79
+ ### NPM
80
+
81
+ ```shell
82
+ npm install @cocreate/plugins
83
+ ```
84
+
85
+ ### Yarn
86
+
87
+ ```shell
88
+ yarn add @cocreate/plugins
89
+ ```
90
+
91
+ ### CDN
92
+
93
+ ```html
94
+ <script src="https://cdn.CoCreateJS.com/plugins/latest/CoCreate-plugins.min.js"></script>
95
+ ```
96
+
97
+ When using the package as a module:
98
+
99
+ ```javascript
100
+ import plugins from "@cocreate/plugins";
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Registering Plugin Resources
106
+
107
+ Plugin resource definitions live under `window.CoCreateConfig.plugins`. The property name should match the global name created by the external library.
108
+
109
+ ```javascript
110
+ window.CoCreateConfig = {
111
+ plugins: {
112
+ SimpleBar: {
113
+ js: "https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.min.js",
114
+ css: "https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.css"
115
+ },
116
+ FullCalendar: {
117
+ js: "https://cdn.jsdelivr.net/npm/fullcalendar@6.1.15/index.global.min.js"
118
+ }
119
+ }
120
+ };
121
+ ```
122
+
123
+ Both `js` and `css` accept one resource or an array of resources. A resource can be a URL string or an object:
124
+
125
+ ```javascript
126
+ window.CoCreateConfig.plugins.Example = {
127
+ js: [
128
+ {
129
+ src: "https://cdn.example.com/example.min.js",
130
+ crossOrigin: "anonymous",
131
+ integrity: "sha384-..."
132
+ }
133
+ ],
134
+ css: [
135
+ {
136
+ href: "https://cdn.example.com/example.min.css",
137
+ crossOrigin: "anonymous",
138
+ integrity: "sha384-..."
139
+ }
140
+ ]
141
+ };
142
+ ```
143
+
144
+ Plugins can also be registered at runtime:
145
+
146
+ ```javascript
147
+ import { registerPlugin } from "@cocreate/plugins";
148
+
149
+ registerPlugin("SimpleBar", {
150
+ js: "https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.min.js",
151
+ css: "https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.css"
152
+ });
153
+ ```
154
+
155
+ Registration describes where a library is loaded from. Initialization behavior belongs in the element's `plugin` attribute.
156
+
157
+ ---
158
+
159
+ ## Using the `plugin` Attribute
160
+
161
+ ### Constructor or Function
162
+
163
+ Use an explicit AST call to initialize a plugin and a dotted destination to retain its result on the element.
164
+
165
+ ```html
166
+ <div
167
+ plugin='{
168
+ "$this.SimpleBar": { "$SimpleBar": ["$this", {}] }
169
+ }'
170
+ style="max-height: 300px">
171
+ </div>
172
+ ```
173
+
174
+ This is conceptually equivalent to:
175
+
176
+ ```javascript
177
+ element.SimpleBar = new SimpleBar(element, {});
178
+ ```
179
+
180
+ `$this` resolves to the element containing the `plugin` attribute.
181
+
182
+ For a global function that receives a single options object:
183
+
184
+ ```html
185
+ <button
186
+ plugin='{
187
+ "$this.toast": {
188
+ "$Toastify": {
189
+ "text": "Saved successfully",
190
+ "duration": 3000
191
+ }
192
+ },
193
+ "$this.toast.showToast": []
194
+ }'>
195
+ Show notification
196
+ </button>
197
+ ```
198
+
199
+ ### Nested Constructor
200
+
201
+ Some libraries expose constructors as properties of a global namespace. A single nested member identifies the constructor to invoke:
202
+
203
+ ```html
204
+ <div
205
+ id="calendar"
206
+ plugin='{
207
+ "$this.FullCalendar": {
208
+ "$FullCalendar.Calendar": [
209
+ "$this",
210
+ { "initialView": "dayGridMonth", "editable": true }
211
+ ]
212
+ },
213
+ "$this.FullCalendar.render": []
214
+ }'>
215
+ </div>
216
+ ```
217
+
218
+ The first key explicitly creates and stores the instance:
219
+
220
+ ```javascript
221
+ element.FullCalendar = new window.FullCalendar.Calendar(element, options);
222
+ ```
223
+
224
+ The next key operates on that resolved instance:
225
+
226
+ ```javascript
227
+ element.FullCalendar.render();
228
+ ```
229
+
230
+ ### Bare Plugin Name
231
+
232
+ A plain attribute value invokes the registered global without arguments:
233
+
234
+ ```html
235
+ <div plugin="ExamplePlugin"></div>
236
+ ```
237
+
238
+ Use the JSON form whenever the plugin requires the element, options, or additional operations.
239
+
240
+ ### Multiple Configuration Blocks
241
+
242
+ The attribute can contain an array. Each object is processed in order:
243
+
244
+ ```html
245
+ <div
246
+ plugin='[
247
+ { "$FirstPlugin": ["$this"] },
248
+ { "$SecondPlugin": ["$this", {}] }
249
+ ]'>
250
+ </div>
251
+ ```
252
+
253
+ ---
254
+
255
+ ## AST Execution Model
256
+
257
+ Each JSON configuration object is passed unchanged to `astAsync`, once, with
258
+ the registered libraries and `$this` in its sandbox and the host element as
259
+ `node`. The plugin loader does not wrap individual entries or rewrite ordinary
260
+ keys into calls. Sibling entries share AST's evaluation scope, including values
261
+ created by earlier entries. Configuration arrays execute one block at a time.
262
+ The bare-name shorthand is expanded to `{ "$PluginName": [] }`.
263
+
264
+ ```json
265
+ {
266
+ "instance": { "$FullCalendar.Calendar": ["$this", {}] },
267
+ "$this.calendar": "$instance",
268
+ "$instance.render": []
269
+ }
270
+ ```
271
+
272
+ JSON configs that previously relied on implicit plugin calls must use explicit
273
+ `$PluginName` or `$PluginName.method` keys. Ordinary keys declare AST data.
274
+
275
+ Execution follows these rules:
276
+
277
+ - Plugin globals are placed in the AST sandbox.
278
+ - `$this` is the element being initialized.
279
+ - Arrays are passed as positional arguments.
280
+ - An object is passed as a single argument.
281
+ - Native classes are instantiated with `new`.
282
+ - Functions are called normally.
283
+ - A resolved top-level value becomes available to subsequent keys.
284
+ - No result is automatically attached to the element, including `$return` results.
285
+ - Use an explicit AST assignment to retain an instance on `$this` or another destination.
286
+
287
+ Ordinary non-plugin keys remain part of the AST program, so they can store intermediate results or participate in later operations.
288
+
289
+ ```html
290
+ <div
291
+ plugin='{
292
+ "instance": { "$ExamplePlugin": ["$this"] },
293
+ "items": { "$instance.getItems": [] },
294
+ "count": "$items.length"
295
+ }'>
296
+ </div>
297
+ ```
298
+
299
+ Top-level result keys do not automatically become element properties. Use an explicit assignment to store values on the element.
300
+
301
+ ---
302
+
303
+ ## Element Value Integration
304
+
305
+ The reserved `getValue` and `setValue` keys connect a plugin instance to CoCreate's standard element value interface. Unlike initialization operations, these AST expressions are stored and evaluated only when the corresponding element method is called.
306
+
307
+ ```html
308
+ <div
309
+ id="calendar"
310
+ component
311
+ plugin='{
312
+ "FullCalendar": {
313
+ "Calendar": ["$this", { "events": [] }]
314
+ },
315
+ "FullCalendar.render": [],
316
+ "getValue": "$FullCalendar.getEvents",
317
+ "setValue": {
318
+ "$FullCalendar.addEvent": "$event.value"
319
+ }
320
+ }'>
321
+ </div>
322
+ ```
323
+
324
+ ### Reading a Value
325
+
326
+ ```javascript
327
+ const events = document.querySelector("#calendar").getValue();
328
+ ```
329
+
330
+ The string method reference is invoked with no arguments. Asynchronous consumers can use:
331
+
332
+ ```javascript
333
+ const events = await document.querySelector("#calendar").getValueAsync();
334
+ ```
335
+
336
+ ### Setting a Value
337
+
338
+ ```javascript
339
+ document.querySelector("#calendar").setValue({
340
+ title: "Planning meeting",
341
+ start: "2026-09-01"
342
+ });
343
+ ```
344
+
345
+ The runtime scope exposes:
346
+
347
+ | AST value | Description |
348
+ | --- | --- |
349
+ | `$event.value` | Value passed to `element.setValue(value)` |
350
+ | `$event.dispatch` | Optional dispatch argument passed to `setValue` |
351
+ | `$this` | Element containing the plugin instance |
352
+ | `$PluginName` | Resolved plugin instance |
353
+
354
+ ---
355
+
356
+ ## Programmatic API
357
+
358
+ ### `registerPlugin(name, config)`
359
+
360
+ Registers or replaces a resource definition in `window.CoCreateConfig.plugins`.
361
+
362
+ ```javascript
363
+ registerPlugin("ExamplePlugin", {
364
+ js: "https://cdn.example.com/plugin.js",
365
+ css: "https://cdn.example.com/plugin.css"
366
+ });
367
+ ```
368
+
369
+ ### `init(elements)`
370
+
371
+ Finds and initializes plugin configurations. It accepts an element, collection, array, or selector and returns a promise.
372
+
373
+ ```javascript
374
+ import { init } from "@cocreate/plugins";
375
+
376
+ await init(document.querySelector("#calendar"));
377
+ await init(document.querySelectorAll("[plugin]"));
378
+ await init("[plugin]");
379
+ ```
380
+
381
+ Calling `init()` directly is generally unnecessary because the module observes matching elements automatically. It is useful when application code needs to wait for plugin initialization to complete.
382
+
383
+ ---
384
+
385
+ ## Resource Loading
386
+
387
+ - JavaScript resources are cached by URL and loaded once.
388
+ - CSS resources already present in the document are not inserted again.
389
+ - Multiple resources are loaded concurrently with `Promise.allSettled()`.
390
+ - String resource definitions default to `crossOrigin="anonymous"`.
391
+ - Object definitions can override `crossOrigin` or provide `integrity`.
392
+ - After loading, the runtime waits briefly for the expected browser global.
393
+
394
+ The configured name should match the library's browser global. A capitalized fallback is supported, so a configured `simpleBar` can resolve `window.SimpleBar`, but using the exact global name is recommended.
395
+
396
+ ---
397
+
398
+ ## Error Handling
399
+
400
+ Resource failures are logged as warnings. Initialization fails when the expected global is still unavailable after loading:
401
+
402
+ ```text
403
+ [Plugin System] Plugin 'ExamplePlugin' is not available on window.
404
+ ```
405
+
406
+ Invalid JSON, AST failures, constructor errors, and method errors are reported with the original `plugin` attribute for debugging.
407
+
408
+ Because initialization is asynchronous, application code that requires a completed instance should await `init()`.
409
+
410
+ ---
411
+
412
+ ## Security
413
+
414
+ Plugin scripts execute with the same browser privileges as the application. Only register resources from trusted locations.
415
+
416
+ For third-party CDN resources:
417
+
418
+ - Pin versions instead of relying on floating tags such as `latest`.
419
+ - Provide Subresource Integrity metadata when available.
420
+ - Use an appropriate Content Security Policy.
421
+ - Review the library's data access and network behavior.
422
+
423
+ AST configuration controls how an already trusted plugin is initialized; it does not isolate untrusted JavaScript.
424
+
425
+ ---
426
+
427
+ ## Announcements
428
+
429
+ Updates are documented in the project [CHANGELOG](https://github.com/CoCreateJS/plugins/blob/master/CHANGELOG.md) and [releases](https://github.com/CoCreateJS/plugins/releases).
430
+
431
+ ## Roadmap
432
+
433
+ See the open [issues](https://github.com/CoCreateJS/plugins/issues) and [pull requests](https://github.com/CoCreateJS/plugins/pulls) for current development priorities.
434
+
435
+ ## How to Contribute
436
+
437
+ Contributions are welcome. See [CONTRIBUTING.md](https://github.com/CoCreateJS/plugins/blob/master/CONTRIBUTING.md) before opening an issue or pull request.
438
+
439
+ ## License
440
+
441
+ This software is dual-licensed under the GNU Affero General Public License version 3 (AGPLv3) and a commercial license.
442
+
443
+ - **Open-source use:** Modifications and derivative works must comply with the AGPLv3. See the [LICENSE](https://github.com/CoCreateJS/plugins/blob/master/LICENSE).
444
+ - **Commercial use:** A commercial license is available from [CoCreate](https://CoCreateJS.com).
package/docs/index.html CHANGED
@@ -9,7 +9,7 @@
9
9
  rel="icon"
10
10
  type="image/png"
11
11
  sizes="32x32"
12
- href="https://cocreate.app/images/favicon.ico" />
12
+ href="https://CoCreateJS.com/images/favicon.ico" />
13
13
  <meta
14
14
  name="description"
15
15
  content="A simple HTML5 and pure javascript component. Easy configuration using HTML5 attributes or Javscript api and highly styleable." />
@@ -59,7 +59,7 @@
59
59
  share-width="500"
60
60
  share-media="https://via.placeholder.com/300/09f/fff.png">
61
61
  <a
62
- href="https://github.com/CoCreate-app/CoCreate-plugins"
62
+ href="https://github.com/CoCreateJS/CoCreate-plugins"
63
63
  target="_blank"
64
64
  class="margin-right:15px"
65
65
  ><i src="/assets/svg/github.svg"></i
@@ -103,7 +103,7 @@
103
103
  <pre
104
104
  class="margin-top:15px"><code class="language-javascript">npm install cocreate-plugins</code></pre>
105
105
  <p class="padding:10px_0px">Or you can use cdn link:</p>
106
- <pre><code class="language-javascript">https://cdn.cocreate.app/js/CoCreate-plugins.min.js</code></pre>
106
+ <pre><code class="language-javascript">https://cdn.CoCreateJS.com/js/CoCreate-plugins.min.js</code></pre>
107
107
 
108
108
  <h2
109
109
  class="border-bottom:1px_solid_lightgrey margin-top:20px padding:5px_0px">
@@ -247,6 +247,6 @@
247
247
  </div>
248
248
  </main>
249
249
 
250
- <script src="https://CoCreate.app/dist/CoCreate.js"></script>
250
+ <script src="https://CoCreateJS.com/dist/CoCreate.js"></script>
251
251
  </body>
252
252
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/plugins",
3
- "version": "1.8.0",
3
+ "version": "2.0.0",
4
4
  "description": "CoCreate plugins",
5
5
  "author": "CoCreate LLC",
6
6
  "license": "AGPL-3.0",
@@ -14,27 +14,28 @@
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "git+https://github.com/CoCreate-app/CoCreate-plugins.git"
17
+ "url": "git+https://github.com/CoCreateJS/plugins.git"
18
18
  },
19
19
  "bugs": {
20
- "url": "https://github.com/CoCreate-app/CoCreate-plugins/issues"
20
+ "url": "https://github.com/CoCreateJS/plugins/issues"
21
21
  },
22
- "homepage": "https://cocreate.app/docs/plugins",
22
+ "homepage": "https://CoCreateJS.com/docs/plugins",
23
23
  "funding": {
24
24
  "type": "GitHub Sponsors ❤",
25
- "url": "https://github.com/sponsors/CoCreate-app"
25
+ "url": "https://github.com/sponsors/CoCreateJS"
26
26
  },
27
27
  "type": "module",
28
28
  "main": "./src/index.js",
29
29
  "dependencies": {
30
- "@cocreate/observer": "^1.22.0"
30
+ "@cocreate/observer": "^1.23.0",
31
+ "@cocreate/utils": "^1.54.0"
31
32
  },
32
33
  "devDependencies": {
33
- "@cocreate/webpack": "^1.8.0"
34
+ "@cocreate/webpack": "^1.9.0"
34
35
  },
35
36
  "allowScripts": {
36
37
  "@cocreate/observer@1.19.0": true,
37
- "@cocreate/utils@1.42.2": true,
38
+ "@cocreate/utils@1.52.0": true,
38
39
  "@cocreate/webpack@1.4.3": true
39
40
  }
40
41
  }