openvibers/openvibe.shared Commits
4.106.1: the OpenVibe mark opens the site switcher again, on every site (#271)
Changes
@@@ -4,6 +4,13 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semvebreaking change to any exported module, browser global or served file name is a new major.A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).++## 4.106.1 — 2026-11-02++++- **The OpenVibe mark opens the site switcher again, on every site.** `site-switcher.js` (4.48.0) was never in++ `files.js`'s `BROWSER` list, and sites serve `/shared/*` from that list only: the mark loaded it on the first tap, the++ site answered 404 and the switcher never opened. It is on the list now. `test/browser-files-complete.test.js` fails++ when a browser file loads a file of this package that no list serves.++## 4.106.0 — 2026-11-02- **The ghost cursor** (`motion.js` `[data-ov-ghost]`, MOTION-1): a scene shows how it is used. An arrow walks to each@@@ -2,7 +2,7 @@> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.--**Status:** alpha, v4.106.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed++**Status:** alpha, v4.106.1 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployedconsumer installs a tagged release and none keeps a vendored copy([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` namesthe tag it pins.@@@ -4,7 +4,7 @@"code": true,"wave": "W2","package": "openvibe-shared",-- "version": "4.106.0",++ "version": "4.106.1","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","deployed": false,"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",@@@ -25,6 +25,7 @@ const BROWSER = Object.freeze(['dock-vibe.js', // the Dock's Vibe tab (L48 V2); dock.js loads it the first time the tab opens'dock-timer.js', // the Dock's timer (L48 R2); dock.js loads it while a timer runs or its menu opens'account-switcher.js',++ 'site-switcher.js', // the OpenVibe mark's site switcher (4.48.0); navbar.js loads it on the first tap. Missing from this list until 4.106.1, so every site answered 404 for it and the mark did nothing'user-card.js','ov-mark.js', // the OV brand mark drop-in'ov-glyphs.js', // the network's own icons in place of Font Awesome's (built from glyphs.js; navbar.js loads it)@@@ -1,12 +1,12 @@{"name": "openvibe-shared",-- "version": "4.106.0",++ "version": "4.106.1","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-shared",-- "version": "4.106.0",++ "version": "4.106.1","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0",@@@ -1,6 +1,6 @@{"name": "openvibe-shared",-- "version": "4.106.0",++ "version": "4.106.1","description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site","main": "index.js","bin": {nnew file mode 100644@@@ -0,0 +1,25 @@++'use strict';++// Every file a browser file loads is itself served. Sites serve /shared/* from files.js's lists only (a name not on a++// list answers 404), so a script that loads a sibling the lists leave out fails on every site. site-switcher.js was++// left out from 4.48.0 to 4.106.0: the OpenVibe mark loaded it on the first tap, every site answered 404, and the++// switcher never opened.++// node test/browser-files-complete.test.js++const assert = require('assert');++const fs = require('fs');++const path = require('path');++const files = require('../files');++++const ROOT = path.join(__dirname, '..');++const served = new Set([...files.BROWSER, ...(files.STYLES || []), ...(files.FONTS || []), ...(files.IMAGES || [])]);++const missing = [];++files.BROWSER.forEach((name) => {++ const src = fs.readFileSync(path.join(ROOT, name), 'utf8');++ // A quoted file name of this package (sibling('x.js'), a <script src>, a <link href>): if it is a file here, it is served.++ for (const m of src.matchAll(/['"]([a-z][a-z0-9-]+\.(?:js|css))['"]/g)) {++ const n = m[1];++ if (n !== name && !served.has(n) && fs.existsSync(path.join(ROOT, n))) missing.push(`${name} loads ${n}`);++ }++});++assert.deepStrictEqual([...new Set(missing)], [], 'files a browser file loads but no site serves');++assert.ok(files.BROWSER.includes('site-switcher.js'), 'the mark\'s switcher is served');++console.log('browser files complete: all checks passed');
@@ -4,6 +4,13 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
@@ -4,6 +4,13 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
breaking change to any exported module, browser global or served file name is a new major.
breaking change to any exported module, browser global or served file name is a new major.
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
+## 4.106.1 — 2026-11-02
+
+- **The OpenVibe mark opens the site switcher again, on every site.** `site-switcher.js` (4.48.0) was never in
+ `files.js`'s `BROWSER` list, and sites serve `/shared/*` from that list only: the mark loaded it on the first tap, the
+ site answered 404 and the switcher never opened. It is on the list now. `test/browser-files-complete.test.js` fails
+ when a browser file loads a file of this package that no list serves.
+
## 4.106.0 — 2026-11-02
## 4.106.0 — 2026-11-02
- **The ghost cursor** (`motion.js` `[data-ov-ghost]`, MOTION-1): a scene shows how it is used. An arrow walks to each
- **The ghost cursor** (`motion.js` `[data-ov-ghost]`, MOTION-1): a scene shows how it is used. An arrow walks to each
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.
> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.
-**Status:** alpha, v4.106.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
+**Status:** alpha, v4.106.1 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
the tag it pins.
@@ -4,7 +4,7 @@
@@ -4,7 +4,7 @@
"code": true,
"code": true,
"wave": "W2",
"wave": "W2",
"package": "openvibe-shared",
"package": "openvibe-shared",
- "version": "4.106.0",
+ "version": "4.106.1",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"deployed": false,
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
@@ -25,6 +25,7 @@ const BROWSER = Object.freeze([
@@ -25,6 +25,7 @@ const BROWSER = Object.freeze([
'dock-vibe.js', // the Dock's Vibe tab (L48 V2); dock.js loads it the first time the tab opens
'dock-vibe.js', // the Dock's Vibe tab (L48 V2); dock.js loads it the first time the tab opens
'dock-timer.js', // the Dock's timer (L48 R2); dock.js loads it while a timer runs or its menu opens
'dock-timer.js', // the Dock's timer (L48 R2); dock.js loads it while a timer runs or its menu opens
'account-switcher.js',
'account-switcher.js',
+ 'site-switcher.js', // the OpenVibe mark's site switcher (4.48.0); navbar.js loads it on the first tap. Missing from this list until 4.106.1, so every site answered 404 for it and the mark did nothing
'user-card.js',
'user-card.js',
'ov-mark.js', // the OV brand mark drop-in
'ov-mark.js', // the OV brand mark drop-in
'ov-glyphs.js', // the network's own icons in place of Font Awesome's (built from glyphs.js; navbar.js loads it)
'ov-glyphs.js', // the network's own icons in place of Font Awesome's (built from glyphs.js; navbar.js loads it)
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "4.106.0",
+ "version": "4.106.1",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "4.106.0",
+ "version": "4.106.1",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "4.106.0",
+ "version": "4.106.1",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"main": "index.js",
"bin": {
"bin": {
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
+'use strict';
+// Every file a browser file loads is itself served. Sites serve /shared/* from files.js's lists only (a name not on a
+// list answers 404), so a script that loads a sibling the lists leave out fails on every site. site-switcher.js was
+// left out from 4.48.0 to 4.106.0: the OpenVibe mark loaded it on the first tap, every site answered 404, and the
+// switcher never opened.
+// node test/browser-files-complete.test.js
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+const files = require('../files');
+
+const ROOT = path.join(__dirname, '..');
+const served = new Set([...files.BROWSER, ...(files.STYLES || []), ...(files.FONTS || []), ...(files.IMAGES || [])]);
+const missing = [];
+files.BROWSER.forEach((name) => {
+ const src = fs.readFileSync(path.join(ROOT, name), 'utf8');
+ // A quoted file name of this package (sibling('x.js'), a <script src>, a <link href>): if it is a file here, it is served.
+ for (const m of src.matchAll(/['"]([a-z][a-z0-9-]+\.(?:js|css))['"]/g)) {
+ const n = m[1];
+ if (n !== name && !served.has(n) && fs.existsSync(path.join(ROOT, n))) missing.push(`${name} loads ${n}`);
+ }
+});
+assert.deepStrictEqual([...new Set(missing)], [], 'files a browser file loads but no site serves');
+assert.ok(files.BROWSER.includes('site-switcher.js'), 'the mark\'s switcher is served');
+console.log('browser files complete: all checks passed');