neo.mjs 8.1.3 → 8.3.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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.1.3'
23
+ * @member {String} version='8.3.0'
24
24
  */
25
- version: '8.1.3'
25
+ version: '8.3.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-01-12",
19
+ "datePublished": "2025-01-13",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.1.3'
110
+ html : 'v8.3.0'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.1.3'
23
+ * @member {String} version='8.3.0'
24
24
  */
25
- version: '8.1.3'
25
+ version: '8.3.0'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.1.3",
3
+ "version": "8.3.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -54,7 +54,7 @@
54
54
  "envinfo": "^7.14.0",
55
55
  "fs-extra": "^11.2.0",
56
56
  "highlightjs-line-numbers.js": "^2.9.0",
57
- "inquirer": "^12.3.0",
57
+ "inquirer": "^12.3.1",
58
58
  "marked": "^15.0.6",
59
59
  "monaco-editor": "0.50.0",
60
60
  "neo-jsdoc": "1.0.1",
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.1.3'
265
+ * @default '8.3.0'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.1.3'
270
+ version: '8.3.0'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
@@ -16,6 +16,7 @@ const
16
16
  addUnits = value => value == null ? value : isNaN(value) ? value : `${value}px`,
17
17
  closestController = Symbol.for('closestController'),
18
18
  closestProvider = Symbol.for('closestProvider'),
19
+ {currentWorker} = Neo,
19
20
  lengthRE = /^\d+\w+$/,
20
21
  twoWayBindingSymbol = Symbol.for('twoWayBinding');
21
22
 
@@ -573,7 +574,7 @@ class Component extends Base {
573
574
  afterSetConfig(key, value, oldValue) {
574
575
  let me = this;
575
576
 
576
- if (Neo.currentWorker.isUsingStateProviders && me[twoWayBindingSymbol] && oldValue !== undefined) {
577
+ if (currentWorker.isUsingStateProviders && me[twoWayBindingSymbol] && oldValue !== undefined) {
577
578
  let binding = me.bind?.[key];
578
579
 
579
580
  if (binding?.twoWay) {
@@ -1057,7 +1058,7 @@ class Component extends Base {
1057
1058
  controller = me.controller;
1058
1059
 
1059
1060
  if (value) {
1060
- Neo.currentWorker.insertThemeFiles(value, me.__proto__);
1061
+ currentWorker.insertThemeFiles(value, me.__proto__);
1061
1062
 
1062
1063
  if (controller) {
1063
1064
  controller.windowId = value
@@ -1544,7 +1545,7 @@ class Component extends Base {
1544
1545
  opts = {},
1545
1546
  deltas;
1546
1547
 
1547
- if (Neo.currentWorker.isSharedWorker) {
1548
+ if (currentWorker.isSharedWorker) {
1548
1549
  opts.appName = me.appName;
1549
1550
  opts.windowId = me.windowId
1550
1551
  }
@@ -1783,7 +1784,7 @@ class Component extends Base {
1783
1784
  * @returns {Neo.state.Provider|null}
1784
1785
  */
1785
1786
  getStateProvider(ntype) {
1786
- if (!Neo.currentWorker.isUsingStateProviders) {
1787
+ if (!currentWorker.isUsingStateProviders) {
1787
1788
  return null
1788
1789
  }
1789
1790
 
@@ -2055,7 +2056,7 @@ class Component extends Base {
2055
2056
 
2056
2057
  me.render(true)
2057
2058
  } else {
2058
- await Neo.currentWorker.promiseMessage('main', {
2059
+ await currentWorker.promiseMessage('main', {
2059
2060
  action : 'mountDom',
2060
2061
  appName : me.appName,
2061
2062
  id : me.id,
@@ -2282,10 +2283,19 @@ class Component extends Base {
2282
2283
  * @param {Boolean} [mount] Mount the DOM after the vnode got created
2283
2284
  */
2284
2285
  async render(mount) {
2285
- let me = this,
2286
- autoMount = mount || me.autoMount,
2287
- app = me.app,
2288
- useVdomWorker = Neo.config.useVdomWorker;
2286
+ let me = this,
2287
+ autoMount = mount || me.autoMount,
2288
+ {app} = me,
2289
+ {useVdomWorker} = Neo.config;
2290
+
2291
+ // Verify that the critical rendering path => CSS files for the new tree is in place
2292
+ if (currentWorker.countLoadingThemeFiles !== 0) {
2293
+ currentWorker.on('themeFilesLoaded', function() {
2294
+ me.render(mount)
2295
+ }, me, {once: true});
2296
+
2297
+ return
2298
+ }
2289
2299
 
2290
2300
  me.rendering = true;
2291
2301
 
@@ -2612,11 +2622,11 @@ class Component extends Base {
2612
2622
  deltas: [{id, style: delta}]
2613
2623
  };
2614
2624
 
2615
- if (Neo.currentWorker.isSharedWorker) {
2625
+ if (currentWorker.isSharedWorker) {
2616
2626
  opts.appName = me.appName
2617
2627
  }
2618
2628
 
2619
- Neo.currentWorker.sendMessage('main', opts)
2629
+ currentWorker.sendMessage('main', opts)
2620
2630
  }
2621
2631
  }
2622
2632
  }
@@ -2659,7 +2669,14 @@ class Component extends Base {
2659
2669
  && mounted
2660
2670
  && vnode
2661
2671
  ) {
2662
- me.#executeVdomUpdate(vdom, vnode, resolve, reject)
2672
+ // Verify that the critical rendering path => CSS files for the new tree is in place
2673
+ if (currentWorker.countLoadingThemeFiles !== 0) {
2674
+ currentWorker.on('themeFilesLoaded', function() {
2675
+ me.updateVdom(vdom, vnode, resolve, reject)
2676
+ }, me, {once: true})
2677
+ } else {
2678
+ me.#executeVdomUpdate(vdom, vnode, resolve, reject)
2679
+ }
2663
2680
  }
2664
2681
  }
2665
2682
  }
@@ -92,11 +92,12 @@ class Stylesheet extends Base {
92
92
  * @param {String} data.className
93
93
  * @param {String[]} data.folders
94
94
  */
95
- addThemeFiles(data) {
95
+ async addThemeFiles(data) {
96
96
  let {className} = data,
97
97
  {config} = Neo,
98
98
  env = config.environment,
99
99
  path = env.startsWith('dist/') ? '' : config.appPath.includes('docs') ? `../dist/${env}/` : `../../dist/${env}/`,
100
+ promises = [],
100
101
  rootPath = config.basePath.substring(6);
101
102
 
102
103
  if (className.startsWith('Neo.')) {
@@ -107,13 +108,15 @@ class Stylesheet extends Base {
107
108
 
108
109
  data.folders.forEach(folder => {
109
110
  if (folder === 'src' || folder.includes('theme-') && config.themes.includes(`neo-${folder}`)) {
110
- this.createStyleSheet(
111
+ promises.push(this.createStyleSheet(
111
112
  null,
112
113
  null,
113
114
  `${rootPath}${path}css/${folder}/${className}.css`
114
- )
115
+ ))
115
116
  }
116
- })
117
+ });
118
+
119
+ await Promise.all(promises)
117
120
  }
118
121
 
119
122
  /**
@@ -121,28 +124,34 @@ class Stylesheet extends Base {
121
124
  * @param {String} [name]
122
125
  * @param {String} [id]
123
126
  * @param {String} [href]
127
+ * @returns {Promise<void>}
124
128
  */
125
- createStyleSheet(name, id, href) {
129
+ async createStyleSheet(name, id, href) {
126
130
  if (!name && !href) {
127
131
  throw new Error('createStyleSheet: you need to either pass a name or a href')
128
132
  }
129
133
 
130
- let link = document.createElement('link'),
131
- env = Neo.config.environment,
132
- path = env.startsWith('dist/') ? env : ('dist/' + env),
133
- url = href ? href : Neo.config.basePath + path + '/' + name;
134
+ return new Promise((resolve, reject) => {
135
+ let link = document.createElement('link'),
136
+ env = Neo.config.environment,
137
+ path = env.startsWith('dist/') ? env : ('dist/' + env),
138
+ url = href ? href : Neo.config.basePath + path + '/' + name;
134
139
 
135
- Object.assign(link, {
136
- href: url,
137
- rel : 'stylesheet',
138
- type: 'text/css'
139
- });
140
+ Object.assign(link, {
141
+ href: url,
142
+ rel : 'stylesheet',
143
+ type: 'text/css'
144
+ });
140
145
 
141
- if (id) {
142
- link.id = id
143
- }
146
+ if (id) {
147
+ link.id = id
148
+ }
144
149
 
145
- document.head.appendChild(link)
150
+ link.addEventListener('error', function() {reject()})
151
+ link.addEventListener('load', function() {resolve()})
152
+
153
+ document.head.appendChild(link)
154
+ })
146
155
  }
147
156
 
148
157
  /**
@@ -20,6 +20,10 @@ class App extends Base {
20
20
  * @protected
21
21
  */
22
22
  className: 'Neo.worker.App',
23
+ /**
24
+ * @member {Number} countLoadingThemeFiles_=0
25
+ */
26
+ countLoadingThemeFiles_: 0,
23
27
  /**
24
28
  * Remote method access for other workers
25
29
  * @member {Object} remote
@@ -77,6 +81,18 @@ class App extends Base {
77
81
  Neo.setCssVariable = me.setCssVariable.bind(me)
78
82
  }
79
83
 
84
+ /**
85
+ * Triggered after the countLoadingThemeFiles config got changed
86
+ * @param {Number} value
87
+ * @param {Number} oldValue
88
+ * @protected
89
+ */
90
+ afterSetCountLoadingThemeFiles(value, oldValue) {
91
+ if (value === 0 && oldValue !== undefined) {
92
+ this.fire('themeFilesLoaded')
93
+ }
94
+ }
95
+
80
96
  /**
81
97
  * @param {String} appName
82
98
  * @param {Array|Object} deltas
@@ -319,10 +335,14 @@ class App extends Base {
319
335
 
320
336
  ns[fileName] = true;
321
337
 
338
+ me.countLoadingThemeFiles++;
339
+
322
340
  Neo.main.addon.Stylesheet.addThemeFiles({
323
341
  className: mapClassName || className,
324
342
  folders : themeFolders,
325
343
  windowId
344
+ }).then(() => {
345
+ me.countLoadingThemeFiles--
326
346
  })
327
347
  }
328
348
  }