From d0ce7f1f89e770afda63a54d0992b0e33e1ae427 Mon Sep 17 00:00:00 2001
From: Tom Pereira
Date: Tue, 24 Dec 2024 17:31:32 +0000
Subject: [PATCH 01/15] change initial commit message in changelogs (#3)
---
docs/CHANGELOG.md | 2 +-
packages/features/docs/CHANGELOG.md | 2 +-
packages/react-pointcuts/docs/CHANGELOG.md | 2 +-
packages/ssr/docs/CHANGELOG.md | 2 +-
packages/webpack/docs/CHANGELOG.md | 3 +--
5 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index fe59d05..6f9d606 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -233,4 +233,4 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
### Added
-- Initial version, copying code from PLP.
+- Initial commit.
diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md
index be37a9f..abc3dd8 100644
--- a/packages/features/docs/CHANGELOG.md
+++ b/packages/features/docs/CHANGELOG.md
@@ -93,4 +93,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Initial version, copying code from PLP
+- Initial commit.
diff --git a/packages/react-pointcuts/docs/CHANGELOG.md b/packages/react-pointcuts/docs/CHANGELOG.md
index 10c985a..932854d 100644
--- a/packages/react-pointcuts/docs/CHANGELOG.md
+++ b/packages/react-pointcuts/docs/CHANGELOG.md
@@ -103,4 +103,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Initial version, copying code from PLP
+- Initial commit.
diff --git a/packages/ssr/docs/CHANGELOG.md b/packages/ssr/docs/CHANGELOG.md
index f7b0824..75ca4ea 100644
--- a/packages/ssr/docs/CHANGELOG.md
+++ b/packages/ssr/docs/CHANGELOG.md
@@ -83,4 +83,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Initial version, copying code from PLP
+- Initial commit.
diff --git a/packages/webpack/docs/CHANGELOG.md b/packages/webpack/docs/CHANGELOG.md
index ae2c30c..5102394 100644
--- a/packages/webpack/docs/CHANGELOG.md
+++ b/packages/webpack/docs/CHANGELOG.md
@@ -103,5 +103,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Initial version, copying code from PLP
-- Added unit tests around the plugin itself, not originally developed in PLP
+- Initial commit
From 27e436a05e74b57ec5de78cb88fe09594c55c70e Mon Sep 17 00:00:00 2001
From: Tom Pereira <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 30 Jan 2025 15:30:26 +0000
Subject: [PATCH 02/15] [#18] Fix JSDoc module names (#19)
* rename to proper module namespace
* update docs links
* update versions
* web toggle point in readme title
* fixup changelog from revised 0.x range
* 2.0.0 -> 0.5.0 in oss version scheme
* fix broken link syntax in CHANGELOG
* consistent quoting
* more version history issues
* fixup module name in jsdoc
* add web
remove sdkInstanceProvider
* remove SDKInstanceProvider
* fixup jsdoc dedupe
* tweak
* clarity re: ssr package
* casing etc
---
docs/CHANGELOG.md | 17 +++++++++-----
docs/README.md | 2 +-
docs/dedupeExternalJsdocPlugin.js | 10 ++++-----
package-lock.json | 12 +++++-----
package.json | 2 +-
packages/features/docs/CHANGELOG.md | 10 +++++++--
packages/features/docs/README.md | 2 +-
packages/features/package.json | 2 +-
packages/features/src/global.js | 14 ++++++------
packages/features/src/global/store.js | 10 ++++-----
.../features/src/nodeRequestScoped/store.js | 10 ++++-----
packages/features/src/reactContext/store.js | 10 ++++-----
.../src/ssrBackedReactContext/store.js | 12 +++++-----
packages/react-pointcuts/docs/CHANGELOG.md | 8 ++++++-
packages/react-pointcuts/docs/README.md | 2 +-
packages/react-pointcuts/package.json | 2 +-
packages/react-pointcuts/src/external.js | 11 ----------
.../src/getCodeSelectionPlugins.js | 2 +-
packages/react-pointcuts/src/index.js | 2 +-
.../src/withTogglePointFactory/index.js | 8 +++----
.../src/withToggledHookFactory/index.js | 8 +++----
packages/ssr/docs/CHANGELOG.md | 8 ++++++-
packages/ssr/docs/README.md | 2 +-
packages/ssr/package.json | 2 +-
packages/ssr/src/external.js | 11 ----------
packages/ssr/src/index.js | 4 ++--
.../ssr/src/serializationFactory/index.js | 22 +++++++++----------
packages/ssr/src/withJsonIsomorphism/index.js | 2 +-
packages/webpack/docs/CHANGELOG.md | 6 +++++
packages/webpack/docs/README.md | 2 +-
packages/webpack/package.json | 2 +-
packages/webpack/src/index.js | 2 +-
.../src/plugins/togglePointInjection/index.js | 2 +-
33 files changed, 115 insertions(+), 106 deletions(-)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 6f9d606..532c7d8 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -14,6 +14,13 @@ N.B. See changelogs for individual packages, where most change will occur:
This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
+## [0.10.2] - 2024-12-26
+
+### Fixed
+
+- "Toggle Point" to "Web Toggle Point" in title of `README.md`
+- fixed the dedupe external JSDoc plugin, after move to type imports
+
## [0.10.1] - 2024-12-24
### Fixed
@@ -73,7 +80,7 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
### Fixed
-- Removed old `yarn.lock` left over from 1.0.3 update.
+- Removed old `yarn.lock` left over from 0.4.3 update.
## Added
@@ -85,7 +92,7 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
- Moved to v4 of [`upload-artifact`](https://github.com/actions/upload-artifact) and [`download-artifact`](https://github.com/actions/download-artifact) actions
- Changed nature of pre-release packages to `beta` from `alpha` (better matching the reality of how these pre-releases are used)
-- Fixed up contribution guide since version 2.0.0 added the proposed update checks
+- Fixed up contribution guide since version 0.5.0 added the proposed update checks
- Updated to JSDoc 4, issue with factories resolved
### Changed
@@ -127,7 +134,7 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
### Fixed
-- Fixup documentation left fallow from package split (2.0.0)
+- Fixup documentation left fallow from package split (0.5.0)
- Upgrade serialize-javascript to 6.0.2 to avoid [`SNYK-JS-SERIALIZEJAVASCRIPT-614760`](https://security.snyk.io/vuln/SNYK-JS-SERIALIZEJAVASCRIPT-6147607)
- snyk ignore [`SNYK-JS-INFLIGHT-6095116`](https://security.snyk.io/vuln/SNYK-JS-INFLIGHT-6095116)
- move to use asos runner groups
@@ -157,7 +164,7 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
### Changed
- Split the "app" package into separate "ssr", "features" and "react-pointcuts" packages.
-- Move to explicit rather than wildcard workspaces, to enable reification of the repo when publishing (waiting on [https://github.com/Roaders/workspace-version/issues/3](an issue to resolve))
+- Move to explicit rather than wildcard workspaces, to enable reification of the repo when publishing (waiting on [an issue to resolve](https://github.com/Roaders/workspace-version/issues/3))
- Updated the `dedupeExternalJsdocPlugin` to de-duplicate members of external namespaces, rather than just the namespaces themselves (to ensure we don't duplicate React, HostApplication etc. in the html documentation)
- Updated packages for snyk vulnerabilities, populated policy file
- Removed redundant export fields from workspace `package.json`
@@ -175,7 +182,7 @@ This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
### Added
-- Danger support, with checks for CHANGELOG.md updates and package-lock.json updates
+- Danger support, with checks for `CHANGELOG.md` updates and `package-lock.json` updates
### Fixed
diff --git a/docs/README.md b/docs/README.md
index 116c4fd..e6e59fa 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,5 +1,5 @@
-
Toggle Point
+ Web Toggle Point
A library providing a means to toggle or branch web application code.
diff --git a/docs/dedupeExternalJsdocPlugin.js b/docs/dedupeExternalJsdocPlugin.js
index e339a52..56ee304 100644
--- a/docs/dedupeExternalJsdocPlugin.js
+++ b/docs/dedupeExternalJsdocPlugin.js
@@ -18,15 +18,15 @@ exports.defineTags = function (dictionary) {
.synonym("external");
};
-const seenExternals = new Map();
+const seen = new Map();
exports.handlers = {
jsdocCommentFound: function (e) {
if (e.filename.endsWith("external.js")) {
- const match = e.comment.match(/external:(\S+)/);
+ const match = e.comment.match(/(?:[\s\S]*@typedef \{.+\} (?.+))?[\s\S]+external:(?\S+)/);
if (match) {
- const [external] = match;
- if (!seenExternals.has(external)) {
- seenExternals.set(external, true);
+ const symbol = match.groups.typedef || match.groups.external;
+ if (!seen.has(symbol)) {
+ seen.set(symbol, true);
} else {
e.comment = "/**/";
}
diff --git a/package-lock.json b/package-lock.json
index e3b0abd..71ede54 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@asos/web-toggle-point",
- "version": "0.10.1",
+ "version": "0.10.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@asos/web-toggle-point",
- "version": "0.10.1",
+ "version": "0.10.2",
"license": "MIT",
"workspaces": [
"packages/features",
@@ -20346,7 +20346,7 @@
},
"packages/features": {
"name": "@asos/web-toggle-point-features",
- "version": "0.3.0",
+ "version": "0.3.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0"
@@ -20403,7 +20403,7 @@
},
"packages/react-pointcuts": {
"name": "@asos/web-toggle-point-react-pointcuts",
- "version": "0.4.0",
+ "version": "0.4.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0"
@@ -20441,7 +20441,7 @@
},
"packages/ssr": {
"name": "@asos/web-toggle-point-ssr",
- "version": "0.2.0",
+ "version": "0.2.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0",
@@ -20477,7 +20477,7 @@
},
"packages/webpack": {
"name": "@asos/web-toggle-point-webpack",
- "version": "0.7.2",
+ "version": "0.7.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0",
diff --git a/package.json b/package.json
index 5c5e40e..d72f35a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@asos/web-toggle-point",
- "version": "0.10.1",
+ "version": "0.10.2",
"repository": "git@github.com:asos/web-toggle-point.git",
"homepage": "https://asos.github.io/web-toggle-point/",
"license": "MIT",
diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md
index abc3dd8..fa7b6a2 100644
--- a/packages/features/docs/CHANGELOG.md
+++ b/packages/features/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.3.1] - 2024-12-26
+
+### Fixed
+
+- updated some errant JSDoc namespaces
+
## [0.3.0] - 2024-11-28
### Changed
@@ -32,7 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- updated to latest `@testing-library/react` to remove errant warning about import of `act`
- updated to `react@18.3.1`, set minimum required react to `17`
- - technically a breaking change, but `jsx-runtime` already introduced in [version 1.0.0](#100---2023-09-12)... so was already broken, oops.
+ - technically a breaking change, but `jsx-runtime` already introduced in [version 0.1.0](#010---2023-09-12)... so was already broken, oops.
- renamed commonJs exports to have `.cjs` extension to prevent `[ERR_REQUIRE_ESM]` errors in consumers that aren't `"type": "module"`
## [0.2.2] - 2024-12-26
@@ -61,7 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
-- Fixup documentation left fallow from package split (0.1.0)
+- Fixup documentation left fallow from package split ([version 0.1.0](#010---2023-09-12))
## [0.1.1] - 2023-11-16
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index 0353466..fd7cdef 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -8,7 +8,7 @@ A store should be chosen based on the requirement for global or partitioned stat
## Usage
-See: [JSDoc output](https://asos.github.io/web-toggle-point/module-asos-web-toggle-point-features.html)
+See: [JSDoc output](https://asos.github.io/web-toggle-point/module-web-toggle-point-features.html)
> [!WARNING]
> ### Use with React 17
diff --git a/packages/features/package.json b/packages/features/package.json
index 36abbcf..e38f533 100644
--- a/packages/features/package.json
+++ b/packages/features/package.json
@@ -1,7 +1,7 @@
{
"name": "@asos/web-toggle-point-features",
"description": "toggle point features code",
- "version": "0.3.0",
+ "version": "0.3.1",
"license": "MIT",
"type": "module",
"main": "./lib/main.es5.cjs",
diff --git a/packages/features/src/global.js b/packages/features/src/global.js
index abf4590..bd618e8 100644
--- a/packages/features/src/global.js
+++ b/packages/features/src/global.js
@@ -2,21 +2,21 @@ import "./external";
/**
* Application code for holding feature toggle state
- * @module toggle-point-features
+ * @module web-toggle-point-features
*/
/**
* Interface for feature toggle stores
*
* @interface FeaturesStore
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
*/
/**
* Method to return the value of the feature toggle store.
* For {@link https://reactjs.org/docs/context.html|React context}-backed feature stores, this should be called following {@link https://react.dev/warnings/invalid-hook-call-warning|the rules of hooks}
*
* @function
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
* @name FeaturesStore#getFeatures
*/
@@ -24,13 +24,13 @@ import "./external";
* Interface for singleton value-based feature toggle stores
*
* @interface SingletonFeaturesStore
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
*/
/**
* Method to set a value to the feature toggle store.
*
* @function
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
* @name SingletonFeaturesStore#useValue
* @param {object} params parameters
* @param {object} params.value A value to store, used to drive feature toggles.
@@ -40,13 +40,13 @@ import "./external";
* Interface for {@link https://reactjs.org/docs/context.html|React context}-based feature toggle stores
*
* @interface ContextFeaturesStore
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
*/
/**
* Method to create a React context provider, linked to the features store.
*
* @function
- * @memberof module:toggle-point-features
+ * @memberof module:web-toggle-point-features
* @name ContextFeaturesStore#providerFactory
* @returns {external:React.Component} A react context provider that accepts a `value` prop, representing the feature toggle state.
*/
diff --git a/packages/features/src/global/store.js b/packages/features/src/global/store.js
index 7722bd3..2a0c8da 100644
--- a/packages/features/src/global/store.js
+++ b/packages/features/src/global/store.js
@@ -8,16 +8,16 @@ const storeMap = new WeakMap();
* A thin wrapper around a singleton, used as an extension point for future plugins.
* Consider {@link https://github.com/christophehurpeau/deep-freeze-es6|deep freezing} the value to prevent accidental mutation, if this is intended to be static.
* For reactive decisions, consider implementing something that allows for reactivity e.g. a {@link https://github.com/pmndrs/valtio|valtio/vanilla} proxy, and subscribe appropriately in a toggle point.
- * @memberof module:toggle-point-features
- * @returns {module:toggle-point-features.globalFeaturesStore} A store for features, held globally in the application.
+ * @memberof module:web-toggle-point-features
+ * @returns {module:web-toggle-point-features.globalFeaturesStore} A store for features, held globally in the application.
*/
const globalFeaturesStoreFactory = () => {
const identifier = Symbol();
/**
* @name globalFeaturesStore
- * @memberof module:toggle-point-features
- * @implements module:toggle-point-features.FeaturesStore
- * @implements module:toggle-point-features.SingletonFeaturesStore
+ * @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStore
+ * @implements module:web-toggle-point-features.SingletonFeaturesStore
*/
return {
useValue: ({ value }) => {
diff --git a/packages/features/src/nodeRequestScoped/store.js b/packages/features/src/nodeRequestScoped/store.js
index 0092fb4..c2232df 100644
--- a/packages/features/src/nodeRequestScoped/store.js
+++ b/packages/features/src/nodeRequestScoped/store.js
@@ -4,17 +4,17 @@ import { AsyncLocalStorage } from "async_hooks";
* A factory function used to create a store for features, held in request-scoped global value.
* Should only be used server-side, for anything user or request specific.
* A thin wrapper around node {@link https://nodejs.org/api/async_context.html#class-asynclocalstorage|AsyncLocalStorage}, used as an extension point for future plugins.
- * @memberof module:toggle-point-features
- * @returns {module:toggle-point-features.requestScopedFeaturesStore} A store for features, scoped for the current request.
+ * @memberof module:web-toggle-point-features
+ * @returns {module:web-toggle-point-features.requestScopedFeaturesStore} A store for features, scoped for the current request.
*/
const requestScopedFeaturesStoreFactory = () => {
const store = new AsyncLocalStorage();
/**
* @name requestScopedFeaturesStore
- * @memberof module:toggle-point-features
- * @implements module:toggle-point-features.FeaturesStore
- * @implements module:toggle-point-features.SingletonFeaturesStore
+ * @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStore
+ * @implements module:web-toggle-point-features.SingletonFeaturesStore
*/
return {
useValue: ({ value, scopeCallBack }) => {
diff --git a/packages/features/src/reactContext/store.js b/packages/features/src/reactContext/store.js
index db64c55..6ef45cb 100644
--- a/packages/features/src/reactContext/store.js
+++ b/packages/features/src/reactContext/store.js
@@ -4,17 +4,17 @@ import PropTypes from "prop-types";
/**
* A factory function used to create a store for features, held in a {@link https://reactjs.org/docs/context.html|React context}.
* A thin wrapper around a context, used as an extension point for future plugins.
- * @memberof module:toggle-point-features
- * @returns {module:toggle-point-features.reactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
+ * @memberof module:web-toggle-point-features
+ * @returns {module:web-toggle-point-features.reactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
*/
const reactContextFeaturesStoreFactory = ({ name }) => {
const context = createContext();
/**
* @name reactContextFeaturesStore
- * @memberof module:toggle-point-features
- * @implements module:toggle-point-features.FeaturesStore
- * @implements module:toggle-point-features.ContextFeaturesStore
+ * @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStore
+ * @implements module:web-toggle-point-features.ContextFeaturesStore
*/
return {
providerFactory: () => {
diff --git a/packages/features/src/ssrBackedReactContext/store.js b/packages/features/src/ssrBackedReactContext/store.js
index ea91d06..44b624f 100644
--- a/packages/features/src/ssrBackedReactContext/store.js
+++ b/packages/features/src/ssrBackedReactContext/store.js
@@ -3,9 +3,9 @@ import reactContextFeaturesStoreFactory from "../reactContext/store";
/**
* A factory function used to create a store for features, held in a {@link https://reactjs.org/docs/context.html|React context}, backed by server-side rendering.
- * A wrapper around a {@link module:toggle-point-features.reactContextFeaturesStore|reactContextFeaturesStore}, with server-side rendering supplied by the {@link module:toggle-point-ssr|toggle-point-ssr} package.
- * @memberof module:toggle-point-features
- * @returns {module:toggle-point-features.ssrBackedReactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
+ * A wrapper around a {@link module:web-toggle-point-features.reactContextFeaturesStore|reactContextFeaturesStore}, with server-side rendering supplied by the {@link module:web-toggle-point-ssr|toggle-point-ssr} package.
+ * @memberof module:web-toggle-point-features
+ * @returns {module:web-toggle-point-features.ssrBackedReactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
*/
const ssrBackedReactContextFeaturesStoreFactory = ({
namespace = "toggles",
@@ -18,9 +18,9 @@ const ssrBackedReactContextFeaturesStoreFactory = ({
/**
* @name ssrBackedReactContextFeaturesStore
- * @memberof module:toggle-point-features
- * @implements module:toggle-point-features.FeaturesStore
- * @implements module:toggle-point-features.ContextFeaturesStore
+ * @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStore
+ * @implements module:web-toggle-point-features.ContextFeaturesStore
*/
return {
providerFactory: () => {
diff --git a/packages/react-pointcuts/docs/CHANGELOG.md b/packages/react-pointcuts/docs/CHANGELOG.md
index 932854d..cd6be4f 100644
--- a/packages/react-pointcuts/docs/CHANGELOG.md
+++ b/packages/react-pointcuts/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.4.2] - 2024-12-26
+
+### Fixed
+
+- updated some errant JSDoc namespaces
+
## [0.4.1] - 2024-12-17
### Removed
@@ -33,7 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- a `Map` of features (de-coupling from a webpack-specific data structure)
- a [javascript module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), rather than its `default` export (preparing for support of named exports)
- updated to `react@18.3.1`, set minimum required react to `17`
- - technically a breaking change, but `jsx-runtime` already introduced in [version 1.0.0](#100---2023-09-05)... so was already broken, oops.
+ - technically a breaking change, but `jsx-runtime` already introduced in [version 0.1.0](#010---2023-09-05)... so was already broken, oops.
- moved package to `"type": "module"` and renamed commonJs exports to have `.cjs` extension to prevent `[ERR_REQUIRE_ESM]` errors in consumers that aren't `"type": "module"`
### Fixed
diff --git a/packages/react-pointcuts/docs/README.md b/packages/react-pointcuts/docs/README.md
index 8fb4694..92347dc 100644
--- a/packages/react-pointcuts/docs/README.md
+++ b/packages/react-pointcuts/docs/README.md
@@ -18,7 +18,7 @@ Both accept plugins, currently supporting a hook called during code activation (
## Usage
-See: [JSDoc output](https://asos.github.io/web-toggle-point/module-asos-web-toggle-point-react-pointcuts.html)
+See: [JSDoc output](https://asos.github.io/web-toggle-point/module-web-toggle-point-react-pointcuts.html)
> [!WARNING]
> ### Use with React 17
diff --git a/packages/react-pointcuts/package.json b/packages/react-pointcuts/package.json
index 62282e7..7ade338 100644
--- a/packages/react-pointcuts/package.json
+++ b/packages/react-pointcuts/package.json
@@ -1,7 +1,7 @@
{
"name": "@asos/web-toggle-point-react-pointcuts",
"description": "react pointcut code",
- "version": "0.4.0",
+ "version": "0.4.2",
"license": "MIT",
"type": "module",
"main": "./lib/main.es5.cjs",
diff --git a/packages/react-pointcuts/src/external.js b/packages/react-pointcuts/src/external.js
index ef62d00..d3834a4 100644
--- a/packages/react-pointcuts/src/external.js
+++ b/packages/react-pointcuts/src/external.js
@@ -2,17 +2,6 @@
* Code expected in the host application
* @external HostApplication
*/
-/**
- * A factory for SDKs; should return an instance of asos-web-features when called with "features"
- * @callback external:HostApplication.sdkInstanceProvider
- * @async
- * @type {Function}
- * @param {string} sdkName Name of the SDK to access; will be passed "features"
- * @returns {external:asos-web-features}
- * @see SiteChrome SDK interface {@link https://asoscom.atlassian.net/wiki/spaces/WEB/pages/593592455/SCP+-+Interface+Definition#SDK-Instances|SDK Instances}
- * @example
- * const sdkInstance = await sdkInstanceProvider("features");
- */
/**
* A delegate passed to log an error
* @callback external:HostApplication.logError
diff --git a/packages/react-pointcuts/src/getCodeSelectionPlugins.js b/packages/react-pointcuts/src/getCodeSelectionPlugins.js
index 7dde7b2..4aa9b83 100644
--- a/packages/react-pointcuts/src/getCodeSelectionPlugins.js
+++ b/packages/react-pointcuts/src/getCodeSelectionPlugins.js
@@ -1,6 +1,6 @@
/**
* A plugin for the point cuts package
- * @typedef {object} module:toggle-point-react-pointcuts~plugin
+ * @typedef {object} module:web-toggle-point-react-pointcuts~plugin
* @property {string} name plugin name, used as a prefix when creating {@link https://legacy.reactjs.org/docs/higher-order-components.html|React Higher-Order-Components} when toggling
* @property {Function} onCodeSelected hook to be called when a code selection is made
*/
diff --git a/packages/react-pointcuts/src/index.js b/packages/react-pointcuts/src/index.js
index fc91576..b31c5df 100644
--- a/packages/react-pointcuts/src/index.js
+++ b/packages/react-pointcuts/src/index.js
@@ -4,6 +4,6 @@ import "./external";
/**
* Application code for creating a React {@link https://en.wikipedia.org/wiki/Pointcut|pointcut}.
- * @module toggle-point-react-pointcuts
+ * @module web-toggle-point-react-pointcuts
*/
export { withTogglePointFactory, withToggledHookFactory };
diff --git a/packages/react-pointcuts/src/withTogglePointFactory/index.js b/packages/react-pointcuts/src/withTogglePointFactory/index.js
index cd8e6f0..ecd92a2 100644
--- a/packages/react-pointcuts/src/withTogglePointFactory/index.js
+++ b/packages/react-pointcuts/src/withTogglePointFactory/index.js
@@ -7,17 +7,17 @@ import getCodeSelectionPlugins from "../getCodeSelectionPlugins";
{}
/**
* A factory function used to create a withTogglePoint React Higher-Order-Component.
- * @memberof module:toggle-point-react-pointcuts
+ * @memberof module:web-toggle-point-react-pointcuts
* @inner
* @function
* @param {object} params parameters
* @param {function} params.getActiveFeatures a method to get active features. Called honouring the rules of hooks.
* @param {external:HostApplication.logError} params.logError a method that logs errors
* @param {string} [params.variantKey=bucket] A key use to identify a variant from the features data structure. Remaining members of the feature will be passed to the variant as props.
- * @param {Array} [params.plugins] plugins to be used when toggling
+ * @param {Array} [params.plugins] plugins to be used when toggling
* Will be used when a toggled component throws an error that can be caught by an {@link https://reactjs.org/docs/error-boundaries.html|ErrorBoundary}.
* When errors are caught, the control/base code will be used as the fallback component.
- * @returns {module:toggle-point-react-pointcuts.withTogglePoint} withTogglePoint React Higher-Order-Component.
+ * @returns {module:web-toggle-point-react-pointcuts.withTogglePoint} withTogglePoint React Higher-Order-Component.
* @example
* const withTogglePoint = withTogglePointFactory({
* getActiveFeatures,
@@ -37,7 +37,7 @@ const withTogglePointFactory = ({
/**
* A React Higher-Order-Component that wraps a base / control component and swaps in a variant when deemed appropriate by a context
* @function withTogglePoint
- * @memberof module:toggle-point-react-pointcuts
+ * @memberof module:web-toggle-point-react-pointcuts
* @param {ReactComponentModuleNamespaceObject} controlModule The control / base module
* @param {external:React.Component} controlModule.default The control react component
* @param {Map} featuresMap A map of features and their variants, with features as top-level keys and variants as nested keys with modules as the values.
diff --git a/packages/react-pointcuts/src/withToggledHookFactory/index.js b/packages/react-pointcuts/src/withToggledHookFactory/index.js
index 61baeb7..13c7413 100644
--- a/packages/react-pointcuts/src/withToggledHookFactory/index.js
+++ b/packages/react-pointcuts/src/withToggledHookFactory/index.js
@@ -6,13 +6,13 @@ import getCodeSelectionPlugins from "../getCodeSelectionPlugins";
{}
/**
* A factory function used to create a withToggledHook React hook, wrapping an existing hook/function.
- * @memberof module:toggle-point-react-pointcuts
+ * @memberof module:web-toggle-point-react-pointcuts
* @inner
* @function
* @param {object} params parameters
* @param {function} params.getActiveFeatures a method to get active features, which is called honouring the rules of hooks.
- * @param {Array} [params.plugins] plugins to be used when toggling
- * @returns {module:toggle-point-react-pointcuts.withToggledHook} withToggledHook hook function, use to wrap a function (either a hook itself, or a function that must be called wherever a hook can...).
+ * @param {Array} [params.plugins] plugins to be used when toggling
+ * @returns {module:web-toggle-point-react-pointcuts.withToggledHook} withToggledHook hook function, use to wrap a function (either a hook itself, or a function that must be called wherever a hook can...).
* @example
* const getActiveFeatures = () => useContext(myContext);
* const withToggledHook = withToggledHookFactory({
@@ -28,7 +28,7 @@ const withToggledHookFactory = ({ getActiveFeatures, plugins = [] }) => {
/**
* A React hook that wraps a base / control function or hook and swaps in a variant when deemed appropriate by a context
* @function withToggledHook
- * @memberof module:toggle-point-react-pointcuts
+ * @memberof module:web-toggle-point-react-pointcuts
* @param {ReactHookModuleNamespaceObject} controlModule The control / base module
* @param {(external:React.Hook|function)} controlModule.default The control react hook or function.
* @param {Map} featuresMap A map of features and their variants, with features as top-level keys and variants as nested keys with modules as the values.
diff --git a/packages/ssr/docs/CHANGELOG.md b/packages/ssr/docs/CHANGELOG.md
index 75ca4ea..31ed972 100644
--- a/packages/ssr/docs/CHANGELOG.md
+++ b/packages/ssr/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.2.1] - 2024-12-26
+
+### Fixed
+
+- updated some errant JSDoc namespaces
+
## [0.2.0] - 2024-12-17
### Removed
@@ -50,7 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- updated to latest `@testing-library/react` to remove errant warning about import of `act`
- updated to `react@18.3.1`, set minimum required react to `17`
- - technically a breaking change, but `jsx-runtime` already introduced in [version 1.0.0](#100---2023-09-05)... so was already broken, oops.
+ - technically a breaking change, but `jsx-runtime` already introduced in [version 0.1.0](#010---2023-09-05)... so was already broken, oops.
- renamed commonJs exports to have `.cjs` extension to prevent `[ERR_REQUIRE_ESM]` errors in consumers that aren't `"type": "module"`
## [0.1.2] - 2024-12-06
diff --git a/packages/ssr/docs/README.md b/packages/ssr/docs/README.md
index 78845c2..54873d8 100644
--- a/packages/ssr/docs/README.md
+++ b/packages/ssr/docs/README.md
@@ -28,7 +28,7 @@ For the browser:
## Usage
-See: [JSDoc output](https://asos.github.io/web-toggle-point/module-asos-web-toggle-point-ssr.html)
+See: [JSDoc output](https://asos.github.io/web-toggle-point/module-web-toggle-point-ssr.html)
> [!WARNING]
> ### Use with React 17
diff --git a/packages/ssr/package.json b/packages/ssr/package.json
index 2a6578d..10b2ff7 100644
--- a/packages/ssr/package.json
+++ b/packages/ssr/package.json
@@ -1,7 +1,7 @@
{
"name": "@asos/web-toggle-point-ssr",
"description": "toggle point server side rendering code",
- "version": "0.2.0",
+ "version": "0.2.1",
"license": "MIT",
"type": "module",
"main": "./lib/main.es5.cjs",
diff --git a/packages/ssr/src/external.js b/packages/ssr/src/external.js
index 3603746..68c0153 100644
--- a/packages/ssr/src/external.js
+++ b/packages/ssr/src/external.js
@@ -2,17 +2,6 @@
* Code expected in the host application
* @external HostApplication
*/
-/**
- * A factory for SDKs; should return an instance of asos-web-features when called with "features"
- * @callback external:HostApplication.sdkInstanceProvider
- * @async
- * @type {Function}
- * @param {string} sdkName Name of the SDK to access; will be passed "features"
- * @returns {external:asos-web-features}
- * @see SiteChrome SDK interface {@link https://asoscom.atlassian.net/wiki/spaces/WEB/pages/593592455/SCP+-+Interface+Definition#SDK-Instances|SDK Instances}
- * @example
- * const sdkInstance = await sdkInstanceProvider("features");
- */
/**
* A delegate passed to log a warning
* @callback external:HostApplication.logWarning
diff --git a/packages/ssr/src/index.js b/packages/ssr/src/index.js
index cbba6c8..e4d6750 100644
--- a/packages/ssr/src/index.js
+++ b/packages/ssr/src/index.js
@@ -3,7 +3,7 @@ import withJsonIsomorphism from "./withJsonIsomorphism";
import "./external";
/**
- * Server Side Rendering code for Isomorphic React applications
- * @module asos-web-toggle-point-ssr
+ * Server Side Rendering code for isomorphic / universal applications
+ * @module web-toggle-point-ssr
*/
export { withJsonIsomorphism, serializationFactory };
diff --git a/packages/ssr/src/serializationFactory/index.js b/packages/ssr/src/serializationFactory/index.js
index 53ab300..c3e6794 100644
--- a/packages/ssr/src/serializationFactory/index.js
+++ b/packages/ssr/src/serializationFactory/index.js
@@ -5,16 +5,16 @@ import parse from "html-react-parser";
{}
/**
* A factory for creating a serialization object that has methods for serializing and deserializing JSON data in server-rendered web applications.
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @inner
* @function
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @inner
* @function
* @param {object} params parameters
* @param {string} params.id The id attribute of the backing application/json script.
* @param {external:HostApplication.logWarning} params.logWarning A method that logs warnings; will be used when malformed JSON is found in the backing store when deserialize on the client, which should only be possible if processed in a system downstream from the origin.
- * @returns {module:asos-web-toggle-point-ssr.serialization} Some serialization / deserialization methods
+ * @returns {module:web-toggle-point-ssr.serialization} Some serialization / deserialization methods
* @example
* const logWarning = (warning) => console.log(warning);
* const id = "app_features";
@@ -23,33 +23,33 @@ import parse from "html-react-parser";
const serializationFactory = ({ id, logWarning }) =>
/**
* @typedef {function} getScriptMarkup
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @param {object} params parameters
* @param {object} params.content The JSON content to be serialized.
*/
/**
* @typedef {function} getScriptReactElement
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @param {object} params parameters
* @param {object} params.content The JSON content to be serialized.
*/
/**
* @typedef {function} getJSONFromScript
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @returns {object} The JSON content of the script element.
*/
/**
* An object containing methods for serializing and deserializing JSON data in server-rendered web applications.
* @typedef {object} serialization
- * @memberof module:asos-web-toggle-point-ssr
- * @property {module:asos-web-toggle-point-ssr.getScriptMarkup} getScriptMarkup Gets a string containing markup for a type="application/json" script element with the specified content.
- * @property {module:asos-web-toggle-point-ssr.getScriptReactElement} getScriptReactElement - Gets a React element for a type="application/json" script element with the specified content.
- * @property {module:asos-web-toggle-point-ssr.getJSONFromScript} getJSONFromScript - Returns the JSON content of the script element.
+ * @memberof module:web-toggle-point-ssr
+ * @property {module:web-toggle-point-ssr.getScriptMarkup} getScriptMarkup Gets a string containing markup for a type="application/json" script element with the specified content.
+ * @property {module:web-toggle-point-ssr.getScriptReactElement} getScriptReactElement - Gets a React element for a type="application/json" script element with the specified content.
+ * @property {module:web-toggle-point-ssr.getJSONFromScript} getJSONFromScript - Returns the JSON content of the script element.
*/
({
/**
- * @memberof module:asos-web-toggle-point-ssr.serialization
+ * @memberof module:web-toggle-point-ssr.serialization
* @param {object} content The JSON content to be serialized.
* @returns {string} A string containing markup for a type="application/json" script element with the specified content.
*/
diff --git a/packages/ssr/src/withJsonIsomorphism/index.js b/packages/ssr/src/withJsonIsomorphism/index.js
index b68c691..8559f37 100644
--- a/packages/ssr/src/withJsonIsomorphism/index.js
+++ b/packages/ssr/src/withJsonIsomorphism/index.js
@@ -8,7 +8,7 @@ import { useState, useEffect } from "react";
* which are then realised into a prop when first hydrating on the client. It will be reactive to subsequent non-`undefined` prop values,
* for that prop.
* The package "browser" export includes the code to read the script, omitted from the "import" / "require" export (server package).
- * @memberof module:asos-web-toggle-point-ssr
+ * @memberof module:web-toggle-point-ssr
* @inner
* @function
* @param {external:React.Component} WrappedComponent The React component that will receive the props.
diff --git a/packages/webpack/docs/CHANGELOG.md b/packages/webpack/docs/CHANGELOG.md
index 5102394..9467746 100644
--- a/packages/webpack/docs/CHANGELOG.md
+++ b/packages/webpack/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.7.3] - 2024-12-26
+
+### Fixed
+
+- updated some errant JSDoc namespaces
+
## [0.7.2] - 2024-12-17
### Removed
diff --git a/packages/webpack/docs/README.md b/packages/webpack/docs/README.md
index 823c534..f4c7b1d 100644
--- a/packages/webpack/docs/README.md
+++ b/packages/webpack/docs/README.md
@@ -20,7 +20,7 @@ The join points are configured using a [glob](https://en.wikipedia.org/wiki/Glob
### Configuration
-See [JSDoc output](https://asos.github.io/web-toggle-point/module-asos-web-toggle-point-webpack.html)
+See [JSDoc output](https://asos.github.io/web-toggle-point/module-web-toggle-point-webpack.html)
Different code paths may have different toggling needs, and may want a toggle point applied in differing ways. Independent point cuts should be configured for each different:
diff --git a/packages/webpack/package.json b/packages/webpack/package.json
index 38fbc45..ec17f81 100644
--- a/packages/webpack/package.json
+++ b/packages/webpack/package.json
@@ -1,7 +1,7 @@
{
"name": "@asos/web-toggle-point-webpack",
"description": "toggle point webpack plugin",
- "version": "0.7.2",
+ "version": "0.7.3",
"license": "MIT",
"type": "module",
"main": "./lib/main.cjs",
diff --git a/packages/webpack/src/index.js b/packages/webpack/src/index.js
index a99fcdc..a11c1e9 100644
--- a/packages/webpack/src/index.js
+++ b/packages/webpack/src/index.js
@@ -2,6 +2,6 @@ import "./external.js";
/**
* Webpack code for injecting toggle points
- * @module toggle-point-webpack
+ * @module web-toggle-point-webpack
*/
export { TogglePointInjection } from "./plugins";
diff --git a/packages/webpack/src/plugins/togglePointInjection/index.js b/packages/webpack/src/plugins/togglePointInjection/index.js
index df98970..0148828 100644
--- a/packages/webpack/src/plugins/togglePointInjection/index.js
+++ b/packages/webpack/src/plugins/togglePointInjection/index.js
@@ -9,7 +9,7 @@ import schema from "./schema.json";
/**
* Toggle Point Injection Plugin
- * @memberof module:toggle-point-webpack
+ * @memberof module:web-toggle-point-webpack
* @inner
*/
class TogglePointInjection {
From 1f0cb29d36b158f19c1301eba2c122c0810c146b Mon Sep 17 00:00:00 2001
From: Tom Pereira <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 6 Mar 2025 12:18:52 +0000
Subject: [PATCH 03/15] [26] Fix public/scoped package publishing (#27)
* update workflows
* version
* typo
* update chromium linux snaps
* versions for serve update
* package.json repository field
* update root package.lock
* bugs & directories/doc fields
* fix changelog
---------
Co-authored-by: Tom Pereira
---
.github/actions/publish/publish.sh | 2 +-
.github/workflows/release.yaml | 2 ++
docs/CHANGELOG.md | 6 ++++++
examples/serve/docs/CHANGELOG.md | 7 +++++++
examples/serve/package.json | 2 +-
.../-screenshots-control-chromium-linux.png | Bin 1515 -> 1281 bytes
...enshots-st-patricks-day-chromium-linux.png | Bin 3354 -> 3079 bytes
package-lock.json | 14 +++++++-------
package.json | 2 +-
packages/features/docs/CHANGELOG.md | 6 ++++++
packages/features/package.json | 13 ++++++++++++-
packages/react-pointcuts/docs/CHANGELOG.md | 6 ++++++
packages/react-pointcuts/package.json | 13 ++++++++++++-
packages/ssr/docs/CHANGELOG.md | 6 ++++++
packages/ssr/package.json | 13 ++++++++++++-
packages/webpack/docs/CHANGELOG.md | 6 ++++++
packages/webpack/package.json | 13 ++++++++++++-
17 files changed, 97 insertions(+), 14 deletions(-)
diff --git a/.github/actions/publish/publish.sh b/.github/actions/publish/publish.sh
index cd06cdf..cd8920a 100755
--- a/.github/actions/publish/publish.sh
+++ b/.github/actions/publish/publish.sh
@@ -1,2 +1,2 @@
TAG=$([ "$PRE_RELEASE" == "true" ] && echo "--tag=pre-release ")
-npm publish $TAG--workspace=$WORKSPACE 2> publish_stderr_digest.log
+npm publish --access public $TAG--workspace=$WORKSPACE 2> publish_stderr_digest.log
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index eb97d40..ef7b596 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -219,3 +219,5 @@ jobs:
name: ${{ matrix.package.name }}
version: ${{ steps.newVersion.outputs.version }}
is-pre-release: ${{ env.IS_PRE_RELEASE }}
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 532c7d8..42e9399 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -14,6 +14,12 @@ N.B. See changelogs for individual packages, where most change will occur:
This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
+## [0.10.3] - 2025-02-27
+
+### Fixed
+
+- GHA pipelines for publishing to public/scoped NPM repository
+
## [0.10.2] - 2024-12-26
### Fixed
diff --git a/examples/serve/docs/CHANGELOG.md b/examples/serve/docs/CHANGELOG.md
index 126a3c8..9f2b321 100644
--- a/examples/serve/docs/CHANGELOG.md
+++ b/examples/serve/docs/CHANGELOG.md
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.2.3] - 2025-02-27
+
+### Changed
+
+- updated some linux playwright snapshots
+ - no code changes, so this must be a change in linux chromium. Assets look identical to eye, so presumably need to relax the fuzziness.
+
## [0.2.2] - 2024-12-17
### Removed
diff --git a/examples/serve/package.json b/examples/serve/package.json
index 945644b..20a3f5d 100644
--- a/examples/serve/package.json
+++ b/examples/serve/package.json
@@ -1,6 +1,6 @@
{
"name": "web-toggle-point-serve-example",
- "version": "0.2.0",
+ "version": "0.2.3",
"type": "module",
"private": true,
"scripts": {
diff --git a/examples/serve/src/fixtures/event/playwright.spec.ts-snapshots/-screenshots-control-chromium-linux.png b/examples/serve/src/fixtures/event/playwright.spec.ts-snapshots/-screenshots-control-chromium-linux.png
index 6615aa1a81dce531b97b8f2d111a015ab6a08e19..f1aa0ebed6c0d579a89a296353976c95a38abd46 100644
GIT binary patch
delta 1249
zcmV<71RneA3xNudFn)my&Yb+>UG`%YU6`?^f*U%c*q61R@!uK()RUrEOE
zp4{I7pq}kA#OdlH001CSx2CS*gd+OMdUO6JcDvo8#RP%DFF
zbljMgS+zGGRDX&b%W_hAuu78Epe%8P0w+~Qo8*RjZM2FWr8wAZIz_%RPfjND3a|Ep
zy8&lqR_!fjjgr6?3Y<`C&i1ESHigqcg~swc>zA#25mHW(O@Xs@$!N|Nog!D6-x6oi
zFeIKWu$*Kx=fTaAuKMzf6d9BRyWMUVj10cOtCh}Vv44q@vywk12G5r|^G%c_AInii
z;-uy>IYwuBwJ{H(D45kGRwxI98%o2Ih&efQQObVUE^7qWsS+H
z&}d??>fmryE^55g`8ujsTlXWRCjF)Yw}dTR4}ZFY{yb)wXMf`jQD5at2ZMSO^
zPnnZHjbqUdfsT(0DK;iS`qZVm4!o(0NgIQ3c+VIEAZqfdP>3L;^y-y39Gh~>0{{Sk
zEq}*r$(P%=BiyeLe_MfnZV4-1y+z%6>sV=NpU!|`4ke}c<)IYmhkEG#{^dEuT7B#Q
z4fn@uA_8zN{rM3-b25j=7YnVs9-GXC4}?$Jm<080k7{7*V$wzcgm;Y{02t;x?sX{u
z07S;VPU+1mKuUzPq~B72+IFh2k6<44<$s|R*_3<(vD+o}>GpgPBE(Qik*uJ#?Vf#Q
z<2&|NRK!Pz+Jh7Yt=%<)J^^ufSw)%+HVJa3u4lX0G|`g*Q(++7yFvK0QLd1NbR#p_G1RU3>dv2NG=FOXT?%bg|^jDJRdhu{3
z003sQxvsA6>VMU%008iKy!Q6?l9G}$XU=4F!Zd#oD2nR!`ttJf-Q8U@hRw~*_V#v>
zNW|fAsNF;K*-2`3Y`gpzG!-o%VZ*OBh4Gj%Xo;)E*2!dcqNr}Z`
zSzTQ<8jUO#%j5B&D7v$=)6~?|)zuY=LK9u2d?0^X84y=@bfuo12?>_@hUU8XFs#p21yNs@#znGCn*=jX4luM=Lxfqy{Y)TvWgyQQV&?%lfthqxKYSCN_mafN;G
z-~nMicDwz;g$o=G2e)AP6YfhwDaaRM#sD91ai!1^=?Wy`8+zi4!LZ3JNS1%f!TlR;x`iAqiPoS$JSh
zPEH0_K{Yn6uyMoZ=H@mwHe&7R?0-uJl*FELrKP3A!^43<06~zKFJDeiPv5w4Ln4t>
zRaITPcFpVcuC1+&jEp>f{J5*DE6LQw#l@E{UD9YYU%!4027|M+vllO3G#CuY`{;DK
zTeof%78VKwf+Q1WoOFur6&ow;z`#Ikcv)H5*|TSBYiqxK`xXj?j7DQoQGZb=6iRbn
zGN2@O$9eVYl}sk%a=BbCx1yrLVzFTMt*xz&jt;R{oSmI5lgU1Q{D@zXKoI=#;|JC@
z8jTed75I=+sl+Z*csQHQmPjP{2hnIqe0)A1004u7g9)9ZCxfDBV`JmPhYtzYw^#@l
z;k_~>QY16DxJI9zHa0fe+S)`S5u42}FE9V}=@X@WA(0{-B^mTT_h_g>
n|6oZ&8T!!BP=-DuSX(O1u+tD@
zm(@Y&RzWYTjGbEFVzVc&FX_s;vjXnY_%H#E5Z-uU{D#rR%+{;Xea-wCU_j%VA`
zwo`Gv%X6t;alM<3=C={vL^@H>)T4UdyYv0CdqO3DL&)EX`nYrFqq&{9MPawq+AY-B
zESuig_dv9#cc5>mI)8rYmc3Um@8$a2apg_sQl??PJAV@Zd~{IY*iPAJ+9U
zu7}85^pU~G-m6aB!}rHHetxlb_L6_8wlF}ph#Nn*`rTMDReWZ&24HaCUbDDIreNNr
zq5tbMuYU(ypWKrW+6noi1m=vV(-R&*5?V2}^5flLLj=l$r{Y~PsKi78yfCcY=3v?(
zs>@EgDeQI%>A3TKj-Laf;UXJ9Ti7Wa*hoIUz9+m`Ti|=5+xj>EUx0l(zEhd|WhBxw
zK!*Bz<4t|}u3Kw-lJ(s(1pp!pXG;5R`GlMn?|+sd&z~+99G8VeR?=F`vptUxN&rel
z+WziLrDQlRs;)CNHiaEzJncYGl}sYOs*OrHUZi&i9Wg-w7^N%y#~debjGIoC5vu4)
zIw^Kk0qqcV8=Q1g*zFWjPb3o77I{PgZ0_xU|AU`=dh1{QyYpA!;z9(tcf+T)fBe%w
z{C~yQYxMwi#Q1xkRQ{u>FCmfKl6(5xEHIYNCmc1Kk!1?dkxYRIQp+&>>0*AoWXIFR
zJ+e1lwi%Iz6p;X-S9VI4$An>B7q2u!zCDr8+otU^5J4G9XB4$bl2@`E(!>+eW7GPZ
z8UU0{<TM5?1xRkg@Cd
z=7g1PI0$h80P|gsh|5c=Neo@&Cv+{lSe&$3Oid~Ri2~e>h2)#Bs`^_@-D?=b)IO0)
z9V?m#%EggZwRDq2b(`(w=%%pS*|mGc{_gQ#K6n4%1_0aoH}^z(rrCTye@|uZSAU@5}Ai?bkBpm?BoKu~~e6uVwC$N$3<_)KXJS
z-DegRnfRsDQQZ;>)vZlN2%~9ahTtLQ#0h)#cL4#tDq;%D;`$E&Jd(
zf~3o=ls|Jii0(M7myIDaapVt2H$VG7Pi2~p6s)-1rkpl3cXwWLGRC>700W=>l#$<`
zlu4_A#V+yVPaDZ%W^|73+9DC(KFP>n%~uZirIF>;>?Ea^kC9#f=_FJFfPWRVBZtQN
zpZHO#n20q?B6Hg(s%en7%=YaO_A0w}i}l5~&W>*S*b<4+NKd`KcqyEHXVzIe!J{MLwFds*U^<^rMHq
zH-*IGwv#UBV&a{ivFw@Gq
za>@JFdq00P;h#FB7IJp$N9zhdtdx53>Cri|@5{FRHLLth=S^j0LE01M40u_Tmy}Tz
z5__M2Ue%cAvZhHSZ4=cZ$oAR(P=&opYv*_;7JIx6eSG8V`QU>G)^FO_H+11QTy$L!
z>G3wK;}_~Rf8i2<>VL%rg!gT~=QFK+va0J;96y#Y^c1S4Wd5;Z=bq6DzLm-ePQj{y
z-
zW}e7eAOOJ0k8YzhWWcgvwUuRDk)wv~xt3RQdCichYc@9~lz#%?wbbs$oF{6-Qf9^x
z1qq?e0K^)L41&;SA)$oQ7^NIo$oxJ#bxtxT{LmM+r~cb}j*HYU1dZ7Q>j`)M-FI7fV}3DJNFJLF5PkGt
z(j@?hB{Irqi^op}?-ufIE>raZh=SZmBO#Omv$L)j0vux@2w9?t5DM^=(rYVYKu}}=
z!^+@Wr>U4LB~%IkZrO2(Aj>z+Ks$;xod0yFa}V1WwAjB2Y}KTX&G=g_*ptDqBM5(<^+wBSvCgA!wP?T
z%$;^1D*zDM`I1qlN#hZfwMZh`B&ua<+GV>Hx-0C}Tf3cGzPOQmqF%29k-^v}AKv!u
zFMZ;>y?@dET77|V8y?;H&oc{)?=4(v7)PT$y?e3qvwR%Oti<
zltbxxE=yFX*r4{aY74C)MJ&NYWF)jCm=!KVC^Uxzh*?(sRkSar56r*swQvNl!H0y|*B;80kU2Ze~
zB?N)%dw>K0%&~p&Lz+rj#^85@pLjwa%$}UFO~=JYX3T1wf?cNxTW7l&2m`KK|fsV7npUE(`nS-?eMNIR4d#9{BRZ+kd|T
zU~ay0YUY*d{Dp0s)FJv%G_p!@dXq-_HKQ~$6)gS04-6=}nm1&L00`aUtI704*{^{P
zDBA99ZjUMe%(u%Gk8zSJu5iHOd6r%AJm!OH`f#^SU>vh-`9ebP?094e%o$JWmgRGz
zB4u;hiYJ@PY@Ui2zB%sEp>$z?LVo~r%6j62&EjeEV7i$s&^>EQSn-te`mTHp9~PKzl_p(KMH`kV;5r4HCK9XfgstT2qn5;ug>KzpA)UD}
zp8u~W4}bB+jq8Peeq#q7*06@V5FHCUn$2cAxZkG!``%}j@4xX4u7{U|-|xV~8rE#=KC!$$(03H$#6xPes0BF2(|00000NkvXXu0mjf
DQGgC^
delta 3339
zcmV+m4fOJd7@8W8Fn-0yzBd+#^j+yT++_0Wet^r2@!&AUxQD1R;ONgw*~_F;Bn59&Zj}_CYeRQ3cNTqk7eVNWCV7)R%N_ybZTr&e=wV`aduvzM`jGs=py96l
zm`-*~YZi@4Q-42e{?l|LBAKYDuBh-uVM$|2i>ie@S<+ZS=!x$7^UuSv;$ssJO$-%;
z-mSa)c0Ium?5Dz?@HCwL9XtJI`rCD;x6#AIHfd|8(J94>DlWqlL#Z}&7pYoAo~P6P
zx}AozO)+(?>e|vXOUV>rQCKW0OC%H7&};x8%p)vkPJfOmM*i8D;5A{^u~|NLJ|i4Q
zylr1#{DARkm(zUv`6dS?zinSE4+|!C*M)So{MT#3?~+jSbz!lM~vdDX~%g{K#09-G;$Y+ezv!W57H
zUikUe&wnQ$pCoj|mgp_R9EO>~v7%bBs4O2lpEvI8Yv5+>1^`nAP3i4{OcBbmMl6`v
zCKXcNV*yT+0bp94@>caeKc|nlbbBUBC{p@Qg6U<2QhUnty_`PtK|c)x44OoUNSi)ZVdY+G}(g
zFRm92qnT)=xS{yudmlX}L1eW7XNm
zYk#yl4Fcd~C@Am(9#J}VH;xPpK
z(C0%2&M@xAjpsKG+&kcE?YcT_b>WM`dTD*QN4Pc3T1}`kOERCld@_E(_z>3+13$Yo
zTTmpZmQ-^Y-06d-FY;f6BCmfT?8pps34h#_zv)`lwGB}l0ASVmRX3mC%$$|!Yw!D7
zvt>{xncX@qA)K}|t|UqXYtA-go2firUAbALkJLKzzv
zgY5=m+kaK3xYn;K8$(dNUN6^(Yg-=cbozp7fmS8tQJJc6Z%GULeXp|k5{_3@eUF$ZJF-d(k%I!qAud)eupmC&V0#iQFF<{7dk#{|w`&^XsH_
zZ8_wsvF498GltBNuYZvXrV94o-5;G1ttQk)e6WZ)@
z`XXRYz`2TZQTwB=&%b`6J|zB(}zsYxSz2$Z*78K0syE8)#m}9FZN#y
z0OJOX%PGrQ61ZeZ;1a_op6vcrw^Rdwhpor=e}0dnID#M;g2j5rDm03Ao)}?jlKRVE!5$zB?x_^a$>*wQbul2
zM>~%OfPZLy^v3*+QT?NKP2L3nYC@e`o;$*EM1R}%ukXg0fi8iWC7HKg+=}y!qheGe
zWHq4%0B@c*9e=fek?$K({iDb=l1*i6by@^LevJ9Cqb#M3rENJFf+@91!_*9uwWZq{
zcev;JWR+%-d_#AEe0L=$*cQRA!Ga>e1JMKWP=BdaF8qCAf7|{k5h+H3NXlZ0P!>@e
zL$JH7=XcZ0e1_Pl<(L~4T
zL9RgzoMFV_p6lal@7pe9Ib}Iy`=QipUhDK9)Q#k-!czWTBkT0khb=Txw34RHAm3b1C
zBw<*>?4h$ASPrlC#|SfqACqz^#ofj|%p=S=naAX1&B`)#_SJ+s#4RMmEkr054tE$%
z#i+Ml+**HSeWkdP!{Bs`tEa7JTYruYbaIXSnfMubRiRasH52(wxeK2c4;<>pk(g01&hKu|H=8qxr+n$1lrJSm=xyGxTBK>P9nc&
zbQZ*J3AH79%iQ5}Ev|MiC3d&}*N(*2KN9>sCXe-+0{}90E~KXpMsi#aRJv28|94>mBh`)t?kv$g4lDRxW7SfTz
zb!tMH7`)kxdr2s?irUs%1VQYX_J(bq0a~3_5Bk?et`EHpp;&mj{C_l`%a7(qBYyk$FIYD25Qpi=qH)Zy(1$*}gD^X>v6Pe)Gsfex
zoF&ReL4Goh(tI4pm|>w0eRv09c4C|PL;?UUp?=a(=*b&F@8o^14}JJM!o0-(AFhOd
V$k~JKp#T5?07*qoL
Date: Thu, 6 Mar 2025 14:23:30 +0000
Subject: [PATCH 04/15] fix registry url etc (#34)
Co-authored-by: Tom Pereira
---
.github/actions/publish/action.yaml | 2 ++
docs/CHANGELOG.md | 6 ++++++
package.json | 2 +-
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/.github/actions/publish/action.yaml b/.github/actions/publish/action.yaml
index bb3659c..2106e92 100644
--- a/.github/actions/publish/action.yaml
+++ b/.github/actions/publish/action.yaml
@@ -21,6 +21,8 @@ runs:
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
+ registry-url: https://registry.npmjs.org/
+ always-auth: true
cache: npm
- name: Install
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 42e9399..bfcd51b 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -14,6 +14,12 @@ N.B. See changelogs for individual packages, where most change will occur:
This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo).
+## [0.10.4] - 2025-03-06
+
+### Fixed
+
+- Ensured that the registry is explicitly set, to ensure that [`@actions/setup-node`](https://github.com/actions/setup-node) honours the `NODE_AUTH_TOKEN`
+
## [0.10.3] - 2025-02-27
### Fixed
diff --git a/package.json b/package.json
index a2992c6..540f361 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@asos/web-toggle-point",
- "version": "0.10.3",
+ "version": "0.10.4",
"repository": "git@github.com:asos/web-toggle-point.git",
"homepage": "https://asos.github.io/web-toggle-point/",
"license": "MIT",
From 239d0dc4961d34a1726f9552a3a9ecae52d0a878 Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 08:59:07 +0100
Subject: [PATCH 05/15] update features
---
package-lock.json | 2 +-
packages/features/docs/CHANGELOG.md | 15 +++++
packages/features/docs/README.md | 18 +++++-
packages/features/package.json | 2 +-
packages/features/src/global.js | 10 +++-
packages/features/src/global/store.js | 14 +++--
packages/features/src/global/store.test.js | 5 +-
.../features/src/nodeRequestScoped/store.js | 55 +++++++++++--------
.../src/nodeRequestScoped/store.test.js | 2 +-
packages/features/src/reactContext/store.js | 7 ++-
.../features/src/reactContext/store.test.js | 2 +-
.../src/ssrBackedReactContext/store.js | 17 ++++--
12 files changed, 104 insertions(+), 45 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index df4b789..a94386f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19816,7 +19816,7 @@
},
"packages/features": {
"name": "@asos/web-toggle-point-features",
- "version": "0.3.4",
+ "version": "0.4.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0"
diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md
index bd60f58..0021e41 100644
--- a/packages/features/docs/CHANGELOG.md
+++ b/packages/features/docs/CHANGELOG.md
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.4.0] - 2025-07-24
+
+### Changed
+
+- added a `FeaturesStoreFactory` interface that insists on a `toggleType` input to all features store factories
+ - for the `nodeRequestScopedFeaturesStoreFactory`, this becomes a unique key against [a realm-wide Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#shared_symbols_in_the_global_symbol_registry), to ensure the store is shared in multi-runtime realms (e.g. NextJS compiled applications)
+
+### Fixed
+
+- ensured interfaces in JSDoc output properly
+ - concede to a [`@callback`](https://jsdoc.app/tags-callback) to represent the `FeaturesStoreFactory` interface.
+- descriptions in test files properly matching factories
+- some line-breaks in this CHANGELOG
+
## [0.3.4] - 2025-07-14
### Fixed
@@ -47,6 +61,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `nodeRequestScopedStoreFactory` export, a "feature store" factory function designed for use within a request-scoped server runtime, e.g. primed within Express middleware
- `reactContextFeaturesStoreFactory` export, a "feature store" factory function, designed to wrap a proportion of a react application with a contextual features state
- `ssrBackedReactContextFeaturesStoreFactory` export, a "feature store" factory function, designed to wrap a proportion of a react application with a contextual features state, backed by the [`ssr` package](../../ssr/docs/README.md) for use without an SSR-compatible React framework.
+
...after spending _far too long_ trying to get node `"exports"` with paths working, so that could better create specific node/browser import paths, before giving up (it works, but ESLint doesn't play ball...)
## [0.2.4] - 2024-11-27
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index 4290324..7116057 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -16,7 +16,11 @@ The package contains the following exports:
### `globalFeaturesStoreFactory`
-A "global" features store factory: a thin wrapper around a singleton, this is an extension point for future plugins etc.
+A "global" features store factory: a thin wrapper around a singleton, this is an extension point for future plugins etc. Each invocation will create a new store, even with a `toggleType` matching a prior invocation.
+
+It accepts the following parameters:
+- `toggleType`
+ - the type of the toggle, used only for debugging.
It exports a store with:
@@ -51,6 +55,10 @@ const getActiveFeatures = useSnapshot.bind(undefined, value); // passed to `with
A "request scoped" features store factory, for use in [Node](https://nodejs.org/).
+It accepts the following parameters:
+- `toggleType`
+ - the type of the toggle, this is keyed against a singleton referenced by [a runtime-wide global symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#shared_symbols_in_the_global_symbol_registry), to ensure it works across multi-compilation runtimes (e.g. NextJs) / throughout a [realm](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model#realms). N.B. Each invocation with the same toggleType will return the initial store.
+
It exports a store with:
- a `useValue` function that sets a current value, taking a `scopeCallBack` (along with a `value`), under which the value is scoped.
- This is using [`AsyncLocalStorage.run`](https://nodejs.org/api/async_context.html#asynclocalstoragerunstore-callback-args) under the hood, which can be plugged into Express middleware thus:
@@ -74,6 +82,10 @@ It exports a store with:
### `reactContextFeaturesStoreFactory`
+It accepts the following parameters:
+- `toggleType`
+ - the type of the toggle, forming the displayName of the react context provider
+
It exports a store with:
- a `providerFactory` factory function, creating a [react context provider](https://reactjs.org/docs/context.html#contextprovider).
- appropriate parts of the react tree, that need to have toggled react components, should be wrapped by this provider. It should be passed a value representing active features state.
@@ -88,8 +100,8 @@ It exports a store with the same signature as that exported by `reactContextFeat
It accepts the following parameters:
- `namespace`
- this becomes a prefix for the `id` of the `application/json` script written to the page, useful for pages running multiple react applications.
-- `name`
- - the type of the toggle, the latter part of the `id` of the aforementioned script, and becoming the prop holding the features state.
+- `toggleType`
+ - the type of the toggle, the latter part of the `id` of the aforementioned script, and becoming the prop holding the features state, and forming the displayName of the underlying react context provider
- `logWarning`
- a method to log warnings, should the serialized json somehow become malformed when hydrating the client application
- this was designed to allow modifications of markup in systems upstream of the origin, but downstream of the browser, with a view to ensure adequate telemetry is in place.
diff --git a/packages/features/package.json b/packages/features/package.json
index f5a92a7..f865628 100644
--- a/packages/features/package.json
+++ b/packages/features/package.json
@@ -1,7 +1,7 @@
{
"name": "@asos/web-toggle-point-features",
"description": "toggle point features code",
- "version": "0.3.4",
+ "version": "0.4.0",
"license": "MIT",
"type": "module",
"main": "./lib/main.es5.cjs",
diff --git a/packages/features/src/global.js b/packages/features/src/global.js
index bd618e8..cf11de1 100644
--- a/packages/features/src/global.js
+++ b/packages/features/src/global.js
@@ -4,7 +4,15 @@ import "./external";
* Application code for holding feature toggle state
* @module web-toggle-point-features
*/
-
+/**
+ * Factories for feature toggle stores
+ *
+ * @callback FeaturesStoreFactory
+ * @memberof module:web-toggle-point-features
+ * @param {object} params parameters
+ * @param {string} params.toggleType The type of toggle in the store
+ * @returns {module:web-toggle-point-features.FeaturesStore} A store for features
+ */
/**
* Interface for feature toggle stores
*
diff --git a/packages/features/src/global/store.js b/packages/features/src/global/store.js
index 2a0c8da..7cd4f97 100644
--- a/packages/features/src/global/store.js
+++ b/packages/features/src/global/store.js
@@ -1,7 +1,8 @@
const storeMap = new WeakMap();
-// eslint-disable-next-line prettier/prettier, no-empty -- https://github.com/babel/babel/issues/15156
-{}
+// eslint-disable-next-line no-empty -- https://github.com/babel/babel/issues/15156
+{
+}
/**
* A factory function used to create a store for features, held globally in the application.
* This is a singleton, and should not be used server-side for anything user or request specific.
@@ -9,10 +10,13 @@ const storeMap = new WeakMap();
* Consider {@link https://github.com/christophehurpeau/deep-freeze-es6|deep freezing} the value to prevent accidental mutation, if this is intended to be static.
* For reactive decisions, consider implementing something that allows for reactivity e.g. a {@link https://github.com/pmndrs/valtio|valtio/vanilla} proxy, and subscribe appropriately in a toggle point.
* @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStoreFactory
+ * @param {object} params parameters
+ * @param {string} params.toggleType The type of toggle in the store, used for debugging
* @returns {module:web-toggle-point-features.globalFeaturesStore} A store for features, held globally in the application.
*/
-const globalFeaturesStoreFactory = () => {
- const identifier = Symbol();
+const globalFeaturesStoreFactory = ({ toggleType }) => {
+ const identifier = Symbol(toggleType);
/**
* @name globalFeaturesStore
* @memberof module:web-toggle-point-features
@@ -23,7 +27,7 @@ const globalFeaturesStoreFactory = () => {
useValue: ({ value }) => {
storeMap.set(identifier, value);
},
- getFeatures: () => storeMap.get(identifier)
+ getFeatures: () => storeMap.get(identifier),
};
};
diff --git a/packages/features/src/global/store.test.js b/packages/features/src/global/store.test.js
index 67cbda6..62ef229 100644
--- a/packages/features/src/global/store.test.js
+++ b/packages/features/src/global/store.test.js
@@ -1,10 +1,11 @@
import globalFeaturesStoreFactory from "./store";
describe("globalFeaturesStoreFactory", () => {
+ const name = "test-name";
let featuresStoreFactory;
beforeEach(() => {
- featuresStoreFactory = globalFeaturesStoreFactory();
+ featuresStoreFactory = globalFeaturesStoreFactory({ name });
});
describe("when using a value", () => {
@@ -34,7 +35,7 @@ describe("globalFeaturesStoreFactory", () => {
let newFeaturesStoreFactory;
beforeEach(() => {
- newFeaturesStoreFactory = globalFeaturesStoreFactory();
+ newFeaturesStoreFactory = globalFeaturesStoreFactory({ name });
});
it("should not share the value with the new store", () => {
diff --git a/packages/features/src/nodeRequestScoped/store.js b/packages/features/src/nodeRequestScoped/store.js
index c2232df..a8a65fc 100644
--- a/packages/features/src/nodeRequestScoped/store.js
+++ b/packages/features/src/nodeRequestScoped/store.js
@@ -1,33 +1,44 @@
import { AsyncLocalStorage } from "async_hooks";
+const globalSingleton = Symbol.for(
+ "web-toggle-point-features.node-request-scoped-features-store"
+);
+
/**
* A factory function used to create a store for features, held in request-scoped global value.
* Should only be used server-side, for anything user or request specific.
* A thin wrapper around node {@link https://nodejs.org/api/async_context.html#class-asynclocalstorage|AsyncLocalStorage}, used as an extension point for future plugins.
* @memberof module:web-toggle-point-features
- * @returns {module:web-toggle-point-features.requestScopedFeaturesStore} A store for features, scoped for the current request.
+ * @implements module:web-toggle-point-features.FeaturesStoreFactory
+ * @param {object} params parameters
+ * @param {string} params.toggleType The type of toggle in the store, which should be unique within a javascript realm.
+ * @returns {module:web-toggle-point-features.nodeRequestScopedFeaturesStore} A store for features, scoped for the current request.
*/
-const requestScopedFeaturesStoreFactory = () => {
- const store = new AsyncLocalStorage();
-
- /**
- * @name requestScopedFeaturesStore
- * @memberof module:web-toggle-point-features
- * @implements module:web-toggle-point-features.FeaturesStore
- * @implements module:web-toggle-point-features.SingletonFeaturesStore
- */
- return {
- useValue: ({ value, scopeCallBack }) => {
- store.run(value, scopeCallBack);
- },
- getFeatures: () => {
- const features = store.getStore();
- if (features === undefined) {
- throw Error("Called outside of request context");
+const nodeRequestScopedFeaturesStoreFactory = ({ toggleType }) => {
+ if (!Object.getOwnPropertySymbols(globalThis).includes(globalSingleton)) {
+ globalThis[globalSingleton] = {};
+ }
+ if (!globalThis[globalSingleton][toggleType]) {
+ const store = new AsyncLocalStorage();
+ globalThis[globalSingleton][toggleType] = /**
+ * @name nodeRequestScopedFeaturesStore
+ * @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStore
+ * @implements module:web-toggle-point-features.SingletonFeaturesStore
+ */ {
+ useValue: ({ value, scopeCallBack }) => {
+ store.run(value, scopeCallBack);
+ },
+ getFeatures: () => {
+ const features = store.getStore();
+ if (features === undefined) {
+ throw Error("Called outside of request context");
+ }
+ return features;
}
- return features;
- }
- };
+ };
+ }
+ return globalThis[globalSingleton][toggleType];
};
-export default requestScopedFeaturesStoreFactory;
+export default nodeRequestScopedFeaturesStoreFactory;
diff --git a/packages/features/src/nodeRequestScoped/store.test.js b/packages/features/src/nodeRequestScoped/store.test.js
index ed50279..a815a76 100644
--- a/packages/features/src/nodeRequestScoped/store.test.js
+++ b/packages/features/src/nodeRequestScoped/store.test.js
@@ -8,7 +8,7 @@ jest.mock("async_hooks", () => ({
}))
}));
-describe("store", () => {
+describe("nodeRequestScopedFeaturesStoreFactory", () => {
let requestScopedStore;
beforeEach(() => {
diff --git a/packages/features/src/reactContext/store.js b/packages/features/src/reactContext/store.js
index 6ef45cb..f056ab3 100644
--- a/packages/features/src/reactContext/store.js
+++ b/packages/features/src/reactContext/store.js
@@ -5,9 +5,12 @@ import PropTypes from "prop-types";
* A factory function used to create a store for features, held in a {@link https://reactjs.org/docs/context.html|React context}.
* A thin wrapper around a context, used as an extension point for future plugins.
* @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStoreFactory
+ * @param {object} params parameters.
+ * @param {string} params.name The name of type of toggle in the store, used for debugging and the display name of the react context provider.
* @returns {module:web-toggle-point-features.reactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
*/
-const reactContextFeaturesStoreFactory = ({ name }) => {
+const reactContextFeaturesStoreFactory = ({ toggleType }) => {
const context = createContext();
/**
@@ -25,7 +28,7 @@ const reactContextFeaturesStoreFactory = ({ name }) => {
children: PropTypes.node.isRequired,
value: PropTypes.object.isRequired
};
- Provider.displayName = `${name[0].toUpperCase() + name.slice(1)}ToggleProvider`;
+ Provider.displayName = `${toggleType[0].toUpperCase() + toggleType.slice(1)}ToggleProvider`;
return Provider;
},
getFeatures: useContext.bind(undefined, context)
diff --git a/packages/features/src/reactContext/store.test.js b/packages/features/src/reactContext/store.test.js
index f5e0344..79f824c 100644
--- a/packages/features/src/reactContext/store.test.js
+++ b/packages/features/src/reactContext/store.test.js
@@ -1,7 +1,7 @@
import reactContextStoreFactory from "./store";
import { render, screen } from "@testing-library/react";
-describe("reactContextStoreFactory", () => {
+describe("reactContextFeaturesStoreFactory", () => {
const name = "test-name";
let reactContextStore;
diff --git a/packages/features/src/ssrBackedReactContext/store.js b/packages/features/src/ssrBackedReactContext/store.js
index 44b624f..a03ba3d 100644
--- a/packages/features/src/ssrBackedReactContext/store.js
+++ b/packages/features/src/ssrBackedReactContext/store.js
@@ -5,15 +5,20 @@ import reactContextFeaturesStoreFactory from "../reactContext/store";
* A factory function used to create a store for features, held in a {@link https://reactjs.org/docs/context.html|React context}, backed by server-side rendering.
* A wrapper around a {@link module:web-toggle-point-features.reactContextFeaturesStore|reactContextFeaturesStore}, with server-side rendering supplied by the {@link module:web-toggle-point-ssr|toggle-point-ssr} package.
* @memberof module:web-toggle-point-features
+ * @implements module:web-toggle-point-features.FeaturesStoreFactory
+ * @param {object} params parameters
+ * @param {string} [params.namespace="toggles"] The namespace for the script tag used to inject the initial state into the client-side application.
+ * @param {string} params.toggleType The type of toggle in the store, used for debugging, display name of the react context provider, the script name of the json script and the prop name used to pass the value to the provider.
+ * @param {function} params.logWarning A function to log warnings, used to highlight any malformed JSON in-case this is processed outside of the SSR process.
* @returns {module:web-toggle-point-features.ssrBackedReactContextFeaturesStore} A store for features, held within a {@link https://reactjs.org/docs/context.html|React context}.
*/
const ssrBackedReactContextFeaturesStoreFactory = ({
namespace = "toggles",
- name,
+ toggleType,
logWarning
}) => {
const { providerFactory, ...rest } = reactContextFeaturesStoreFactory({
- name
+ toggleType
});
/**
@@ -26,17 +31,17 @@ const ssrBackedReactContextFeaturesStoreFactory = ({
providerFactory: () => {
const FeaturesProvider = providerFactory();
const SSRBackedFeaturesProvider = withJsonIsomorphism(
- ({ children, [name]: value }) => (
+ ({ children, [toggleType]: value }) => (
{children}
),
logWarning,
{
- scriptId: `${namespace}_${name}`,
- propName: name
+ scriptId: `${namespace}_${toggleType}`,
+ propName: toggleType
}
);
return ({ children, value }) => (
-
+
{children}
);
From 3242acb3ab34b2c662faac462095794f939f103d Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 09:11:58 +0100
Subject: [PATCH 06/15] revert prettier change
---
packages/features/src/global/store.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/packages/features/src/global/store.js b/packages/features/src/global/store.js
index 7cd4f97..9564110 100644
--- a/packages/features/src/global/store.js
+++ b/packages/features/src/global/store.js
@@ -1,8 +1,7 @@
const storeMap = new WeakMap();
// eslint-disable-next-line no-empty -- https://github.com/babel/babel/issues/15156
-{
-}
+{}
/**
* A factory function used to create a store for features, held globally in the application.
* This is a singleton, and should not be used server-side for anything user or request specific.
From 21102640b939865e4814b38bf900a185238c9579 Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 09:20:12 +0100
Subject: [PATCH 07/15] fixup some tests
---
packages/features/src/global/store.js | 2 +-
packages/features/src/global/store.test.js | 4 +-
.../src/nodeRequestScoped/store.test.js | 40 +++++++++++++++----
.../features/src/reactContext/store.test.js | 8 ++--
.../src/ssrBackedReactContext/store.test.js | 16 ++++----
5 files changed, 48 insertions(+), 22 deletions(-)
diff --git a/packages/features/src/global/store.js b/packages/features/src/global/store.js
index 9564110..974a0c2 100644
--- a/packages/features/src/global/store.js
+++ b/packages/features/src/global/store.js
@@ -26,7 +26,7 @@ const globalFeaturesStoreFactory = ({ toggleType }) => {
useValue: ({ value }) => {
storeMap.set(identifier, value);
},
- getFeatures: () => storeMap.get(identifier),
+ getFeatures: () => storeMap.get(identifier)
};
};
diff --git a/packages/features/src/global/store.test.js b/packages/features/src/global/store.test.js
index 62ef229..3dee870 100644
--- a/packages/features/src/global/store.test.js
+++ b/packages/features/src/global/store.test.js
@@ -1,11 +1,11 @@
import globalFeaturesStoreFactory from "./store";
describe("globalFeaturesStoreFactory", () => {
- const name = "test-name";
+ const toggleType = "test-toggle-type";
let featuresStoreFactory;
beforeEach(() => {
- featuresStoreFactory = globalFeaturesStoreFactory({ name });
+ featuresStoreFactory = globalFeaturesStoreFactory({ toggleType });
});
describe("when using a value", () => {
diff --git a/packages/features/src/nodeRequestScoped/store.test.js b/packages/features/src/nodeRequestScoped/store.test.js
index a815a76..882e466 100644
--- a/packages/features/src/nodeRequestScoped/store.test.js
+++ b/packages/features/src/nodeRequestScoped/store.test.js
@@ -9,10 +9,11 @@ jest.mock("async_hooks", () => ({
}));
describe("nodeRequestScopedFeaturesStoreFactory", () => {
+ const toggleType = "test-toggle-type";
let requestScopedStore;
beforeEach(() => {
- requestScopedStore = requestScopedStoreFactory();
+ requestScopedStore = requestScopedStoreFactory({ toggleType });
});
it("should create an AsyncLocalStorage store", () => {
@@ -30,23 +31,23 @@ describe("nodeRequestScopedFeaturesStoreFactory", () => {
describe("when using a value", () => {
const value = Symbol("test-value");
const scopeCallBack = Symbol("test-callback");
+ let storeMock;
beforeEach(() => {
requestScopedStore.useValue({ value, scopeCallBack });
+ storeMock = AsyncLocalStorage.mock.results[0].value;
});
it("should scope the value to the descendants of the callback, by running it in the local storage", () => {
- expect(
- AsyncLocalStorage.mock.results.pop().value.run
- ).toHaveBeenCalledWith(value, scopeCallBack);
+ expect(storeMock.run).toHaveBeenCalledWith(value, scopeCallBack);
});
describe("when getting the features", () => {
const returnedValue = Symbol("test-value");
beforeEach(() => {
- AsyncLocalStorage.mock.results
- .pop()
- .value.getStore.mockReturnValue(returnedValue);
+ AsyncLocalStorage.mock.results[0].value.getStore.mockReturnValue(
+ returnedValue
+ );
});
it("should return the value scoped to the current request", () => {
@@ -54,4 +55,29 @@ describe("nodeRequestScopedFeaturesStoreFactory", () => {
});
});
});
+
+ describe("when creating a new store with the same toggleType", () => {
+ let newRequestScopedStore;
+ beforeEach(() => {
+ newRequestScopedStore = requestScopedStoreFactory({ toggleType });
+ });
+
+ it("should return the same store instance", () => {
+ expect(newRequestScopedStore).toBe(requestScopedStore);
+ });
+ });
+
+ describe("when creating a new store with a different toggleType", () => {
+ let newRequestScopedStore;
+ const newToggleType = "new-test-toggle-type";
+ beforeEach(() => {
+ newRequestScopedStore = requestScopedStoreFactory({
+ toggleType: newToggleType
+ });
+ });
+
+ it("should return a different store instance", () => {
+ expect(newRequestScopedStore).not.toBe(requestScopedStore);
+ });
+ });
});
diff --git a/packages/features/src/reactContext/store.test.js b/packages/features/src/reactContext/store.test.js
index 79f824c..c92b0b0 100644
--- a/packages/features/src/reactContext/store.test.js
+++ b/packages/features/src/reactContext/store.test.js
@@ -2,11 +2,11 @@ import reactContextStoreFactory from "./store";
import { render, screen } from "@testing-library/react";
describe("reactContextFeaturesStoreFactory", () => {
- const name = "test-name";
+ const toggleType = "test-toggle-type";
let reactContextStore;
beforeEach(() => {
- reactContextStore = reactContextStoreFactory({ name });
+ reactContextStore = reactContextStoreFactory({ toggleType });
});
describe("when creating a provider", () => {
@@ -27,9 +27,9 @@ describe("reactContextFeaturesStoreFactory", () => {
);
});
- it("should set an appropriate display name for the provider", () => {
+ it("should set an appropriate display name for the provider, based on the provided toggleType", () => {
expect(Provider.displayName).toBe(
- `${name[0].toUpperCase() + name.slice(1)}ToggleProvider`
+ `${toggleType[0].toUpperCase() + toggleType.slice(1)}ToggleProvider`
);
});
diff --git a/packages/features/src/ssrBackedReactContext/store.test.js b/packages/features/src/ssrBackedReactContext/store.test.js
index 440d10d..24b2e68 100644
--- a/packages/features/src/ssrBackedReactContext/store.test.js
+++ b/packages/features/src/ssrBackedReactContext/store.test.js
@@ -25,15 +25,15 @@ describe("ssrBackedReactContextFeaturesStoreFactory", () => {
beforeEach(() => {
props = {
- name: "test-name",
+ toggleType: "test-toggle-type",
logWarning: Symbol("test-log-warning")
};
});
const makeCommonAssertions = () => {
- it("should call the reactContextStoreFactory with the name", () => {
+ it("should call the reactContextStoreFactory with the toggleType", () => {
expect(reactContextFeaturesStoreFactory).toHaveBeenCalledWith({
- name: props.name
+ toggleType: props.toggleType
});
});
@@ -55,13 +55,13 @@ describe("ssrBackedReactContextFeaturesStoreFactory", () => {
expect(mockReactContextStoreFactory.providerFactory).toHaveBeenCalled();
});
- it("should create an SSR-backed react component that serializes the provided value in a script with a namespace & named id", () => {
+ it("should create an SSR-backed react component that serializes the provided value in a script with a namespace & named id, using the supplied toggleType", () => {
expect(withJsonIsomorphism).toHaveBeenCalledWith(
expect.any(Function),
props.logWarning,
{
scriptId: expect.any(String),
- propName: props.name
+ propName: props.toggleType
}
);
});
@@ -81,7 +81,7 @@ describe("ssrBackedReactContextFeaturesStoreFactory", () => {
it("should pass the value to the SSR-backed component", () => {
expect(MockSSRBackedFeaturesProvider).toHaveBeenCalledWith(
expect.objectContaining({
- [props.name]: value
+ [props.toggleType]: value
}),
expect.anything()
);
@@ -110,7 +110,7 @@ describe("ssrBackedReactContextFeaturesStoreFactory", () => {
expect.anything(),
expect.anything(),
expect.objectContaining({
- scriptId: `${props.namespace}_${props.name}`
+ scriptId: `${props.namespace}_${props.toggleType}`
})
);
});
@@ -128,7 +128,7 @@ describe("ssrBackedReactContextFeaturesStoreFactory", () => {
expect.anything(),
expect.anything(),
expect.objectContaining({
- scriptId: `toggles_${props.name}`
+ scriptId: `toggles_${props.toggleType}`
})
);
});
From d3f4bdb95d68070ef5c32b100ec85e9605ddc061 Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 09:25:57 +0100
Subject: [PATCH 08/15] fixup examples
---
examples/express/src/routes/animals/featuresStore.js | 2 +-
examples/express/src/routes/config/featuresStore.js | 2 +-
examples/next/src/app/fixtures/experiments/featuresStore.ts | 2 +-
examples/serve/src/fixtures/audience/__featuresStore.js | 2 +-
examples/serve/src/fixtures/config/__featuresStore.js | 2 +-
examples/serve/src/fixtures/event/__featuresStore.js | 2 +-
examples/serve/src/fixtures/translation/__featuresStore.js | 2 +-
packages/features/docs/README.md | 2 +-
packages/features/src/global/store.test.js | 2 +-
9 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/examples/express/src/routes/animals/featuresStore.js b/examples/express/src/routes/animals/featuresStore.js
index e446d88..7968aac 100644
--- a/examples/express/src/routes/animals/featuresStore.js
+++ b/examples/express/src/routes/animals/featuresStore.js
@@ -1,5 +1,5 @@
import { nodeRequestScopedStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
-const featuresStore = featuresStoreFactory();
+const featuresStore = featuresStoreFactory({ toggleType: "api version" });
export default featuresStore;
diff --git a/examples/express/src/routes/config/featuresStore.js b/examples/express/src/routes/config/featuresStore.js
index 89fc5d4..e36c3be 100644
--- a/examples/express/src/routes/config/featuresStore.js
+++ b/examples/express/src/routes/config/featuresStore.js
@@ -1,7 +1,7 @@
import { ssrBackedReactContextFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
const featuresStore = featuresStoreFactory({
- name: "config",
+ toggleType: "config",
logWarning: console.log
});
diff --git a/examples/next/src/app/fixtures/experiments/featuresStore.ts b/examples/next/src/app/fixtures/experiments/featuresStore.ts
index 622d5fb..2f2853f 100644
--- a/examples/next/src/app/fixtures/experiments/featuresStore.ts
+++ b/examples/next/src/app/fixtures/experiments/featuresStore.ts
@@ -3,7 +3,7 @@
import { reactContextFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
const reactContextStore = featuresStoreFactory({
- name: "Experiments"
+ toggleType: "experiments"
});
export default reactContextStore;
diff --git a/examples/serve/src/fixtures/audience/__featuresStore.js b/examples/serve/src/fixtures/audience/__featuresStore.js
index 515ddd0..91cb68b 100644
--- a/examples/serve/src/fixtures/audience/__featuresStore.js
+++ b/examples/serve/src/fixtures/audience/__featuresStore.js
@@ -1,6 +1,6 @@
import { globalFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
-const featuresStore = featuresStoreFactory();
+const featuresStore = featuresStoreFactory({ toggleType: "audience" });
const [, audience] = document.cookie.match(/audience=(.+?)(;|$)/) || [];
diff --git a/examples/serve/src/fixtures/config/__featuresStore.js b/examples/serve/src/fixtures/config/__featuresStore.js
index 8654560..057ed4b 100644
--- a/examples/serve/src/fixtures/config/__featuresStore.js
+++ b/examples/serve/src/fixtures/config/__featuresStore.js
@@ -1,6 +1,6 @@
import { globalFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
-const featuresStore = featuresStoreFactory();
+const featuresStore = featuresStoreFactory({ toggleType: "config" });
featuresStore.useValue({ value: new URL(document.URL).pathname.slice(1) });
diff --git a/examples/serve/src/fixtures/event/__featuresStore.js b/examples/serve/src/fixtures/event/__featuresStore.js
index 0c3bfa6..94ac2ba 100644
--- a/examples/serve/src/fixtures/event/__featuresStore.js
+++ b/examples/serve/src/fixtures/event/__featuresStore.js
@@ -1,6 +1,6 @@
import { globalFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
-const featuresStore = featuresStoreFactory();
+const featuresStore = featuresStoreFactory({ toggleType: "events" });
const getEvent = () => {
const dateString = new Intl.DateTimeFormat("en-GB").format(new Date());
diff --git a/examples/serve/src/fixtures/translation/__featuresStore.js b/examples/serve/src/fixtures/translation/__featuresStore.js
index d2c00a1..e2135d9 100644
--- a/examples/serve/src/fixtures/translation/__featuresStore.js
+++ b/examples/serve/src/fixtures/translation/__featuresStore.js
@@ -1,6 +1,6 @@
import { globalFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
-const featuresStore = featuresStoreFactory();
+const featuresStore = featuresStoreFactory({ toggleType: "language" });
featuresStore.useValue({
value: navigator.language || document.documentElement.lang
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index 7116057..f1451bf 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -66,7 +66,7 @@ It exports a store with:
import express from "express";
const app = express();
- const featuresStore = requestScopedFeaturesStoreFactory();
+ const featuresStore = requestScopedFeaturesStoreFactory({ toggleType: "some type of toggle" });
app.use((request, response, next) => {
const value = ?? // some value holding toggle state, either based on `request`, or scoped from outside this middleware, etc.
diff --git a/packages/features/src/global/store.test.js b/packages/features/src/global/store.test.js
index 3dee870..5cbb32e 100644
--- a/packages/features/src/global/store.test.js
+++ b/packages/features/src/global/store.test.js
@@ -35,7 +35,7 @@ describe("globalFeaturesStoreFactory", () => {
let newFeaturesStoreFactory;
beforeEach(() => {
- newFeaturesStoreFactory = globalFeaturesStoreFactory({ name });
+ newFeaturesStoreFactory = globalFeaturesStoreFactory({ toggleType });
});
it("should not share the value with the new store", () => {
From f3984ce69e41b35b50be5f108afd8b5d6426fa52 Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 10:03:05 +0100
Subject: [PATCH 09/15] fixup example versions
---
examples/express/docs/CHANGELOG.md | 6 ++++++
examples/express/package.json | 2 +-
examples/next/docs/CHANGELOG.md | 6 ++++++
examples/next/package.json | 2 +-
examples/serve/docs/CHANGELOG.md | 6 ++++++
examples/serve/package.json | 2 +-
6 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/examples/express/docs/CHANGELOG.md b/examples/express/docs/CHANGELOG.md
index af7bab2..d4192b5 100644
--- a/examples/express/docs/CHANGELOG.md
+++ b/examples/express/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.2.6] - 2025-07-24
+
+### Changed
+
+- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+
## [0.2.5] - 2025-05-27
### Changed
diff --git a/examples/express/package.json b/examples/express/package.json
index 07a30e8..4894627 100644
--- a/examples/express/package.json
+++ b/examples/express/package.json
@@ -1,6 +1,6 @@
{
"name": "web-toggle-point-express-example",
- "version": "0.2.5",
+ "version": "0.2.6",
"type": "module",
"engines": {
"node": ">=20.6.0"
diff --git a/examples/next/docs/CHANGELOG.md b/examples/next/docs/CHANGELOG.md
index 91c3ed8..3250c94 100644
--- a/examples/next/docs/CHANGELOG.md
+++ b/examples/next/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.2.5] - 2025-07-24
+
+### Changed
+
+- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+
## [0.2.4] - 2025-05-27
### Changed
diff --git a/examples/next/package.json b/examples/next/package.json
index e1d85f0..a7b9aa1 100644
--- a/examples/next/package.json
+++ b/examples/next/package.json
@@ -1,6 +1,6 @@
{
"name": "web-toggle-point-next-example",
- "version": "0.2.4",
+ "version": "0.2.5",
"private": true,
"type": "module",
"scripts": {
diff --git a/examples/serve/docs/CHANGELOG.md b/examples/serve/docs/CHANGELOG.md
index b3f8ea1..29e108a 100644
--- a/examples/serve/docs/CHANGELOG.md
+++ b/examples/serve/docs/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.2.7] - 2025-07-24
+
+### Changed
+
+- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+
## [0.2.6] - 2025-07-14
### Changed
diff --git a/examples/serve/package.json b/examples/serve/package.json
index 0ea90d2..4835f1d 100644
--- a/examples/serve/package.json
+++ b/examples/serve/package.json
@@ -1,6 +1,6 @@
{
"name": "web-toggle-point-serve-example",
- "version": "0.2.6",
+ "version": "0.2.7",
"type": "module",
"private": true,
"scripts": {
From e2c98e94ccfd2000e62a07f34542fa01d4e20a05 Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 10:05:27 +0100
Subject: [PATCH 10/15] lint
---
packages/features/src/global/store.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/features/src/global/store.js b/packages/features/src/global/store.js
index 974a0c2..a6d7a66 100644
--- a/packages/features/src/global/store.js
+++ b/packages/features/src/global/store.js
@@ -1,6 +1,6 @@
const storeMap = new WeakMap();
-// eslint-disable-next-line no-empty -- https://github.com/babel/babel/issues/15156
+// eslint-disable-next-line prettier/prettier, no-empty -- https://github.com/babel/babel/issues/15156
{}
/**
* A factory function used to create a store for features, held globally in the application.
From 09b6d2741d5cf9f87cf3ed2c7d971871a42efbaa Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 10:09:06 +0100
Subject: [PATCH 11/15] fixup changelogs
---
examples/express/docs/CHANGELOG.md | 4 ++--
examples/next/docs/CHANGELOG.md | 4 ++--
examples/serve/docs/CHANGELOG.md | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/examples/express/docs/CHANGELOG.md b/examples/express/docs/CHANGELOG.md
index d4192b5..1ef0bdf 100644
--- a/examples/express/docs/CHANGELOG.md
+++ b/examples/express/docs/CHANGELOG.md
@@ -9,13 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+- updated to features [version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
## [0.2.5] - 2025-05-27
### Changed
-- updated to use `variantGlobs` array, with updated webpack plugin [0.8.0][version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
+- updated to use `variantGlobs` array, with updated webpack plugin [version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
- used some differing syntax from [`micromatch`](https://github.com/micromatch/micromatch) to define `variantGlobs`, for coverage and where may be preferred
## [0.2.4] - 2024-02-07
diff --git a/examples/next/docs/CHANGELOG.md b/examples/next/docs/CHANGELOG.md
index 3250c94..6f76c1a 100644
--- a/examples/next/docs/CHANGELOG.md
+++ b/examples/next/docs/CHANGELOG.md
@@ -9,13 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+- updated to features [version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
## [0.2.4] - 2025-05-27
### Changed
-- updated to use `variantGlobs` array, with updated webpack plugin [0.8.0][version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
+- updated to use `variantGlobs` array, with updated webpack plugin [version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
## [0.2.3] - 2025-02-07
diff --git a/examples/serve/docs/CHANGELOG.md b/examples/serve/docs/CHANGELOG.md
index 29e108a..b779cc5 100644
--- a/examples/serve/docs/CHANGELOG.md
+++ b/examples/serve/docs/CHANGELOG.md
@@ -9,13 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- updated to features [0.4.0][version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
+- updated to features [version 0.4.0](../../../packages/features/docs/CHANGELOG.md#040---2025-07-24)
## [0.2.6] - 2025-07-14
### Changed
-- updated to use `variantGlobs` array, with updated webpack plugin [0.8.0][version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
+- updated to use `variantGlobs` array, with updated webpack plugin [version 0.8.0](../../../packages/webpack/docs/CHANGELOG.md#080---2025-05-27)
## [0.2.5] - 2025-07-14
From 602b87f77bd70fcdb44c2810539e14c4fb0580bc Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 24 Jul 2025 18:40:24 +0100
Subject: [PATCH 12/15] package-lock rename of
nodeRequestScopedFeaturesStoreFactory
---
examples/express/src/routes/animals/featuresStore.js | 2 +-
package-lock.json | 6 +++---
packages/features/docs/CHANGELOG.md | 1 +
packages/features/docs/README.md | 2 +-
packages/features/src/node.js | 2 +-
5 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/examples/express/src/routes/animals/featuresStore.js b/examples/express/src/routes/animals/featuresStore.js
index 7968aac..09184a0 100644
--- a/examples/express/src/routes/animals/featuresStore.js
+++ b/examples/express/src/routes/animals/featuresStore.js
@@ -1,4 +1,4 @@
-import { nodeRequestScopedStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
+import { nodeRequestScopedFeaturesStoreFactory as featuresStoreFactory } from "@asos/web-toggle-point-features";
const featuresStore = featuresStoreFactory({ toggleType: "api version" });
diff --git a/package-lock.json b/package-lock.json
index a94386f..6070fbc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -57,7 +57,7 @@
},
"examples/express": {
"name": "web-toggle-point-express-example",
- "version": "0.2.5",
+ "version": "0.2.6",
"dependencies": {
"@asos/web-toggle-point-features": "file:../../packages/features",
"@asos/web-toggle-point-react-pointcuts": "file:../../packages/react-pointcuts",
@@ -89,7 +89,7 @@
},
"examples/next": {
"name": "web-toggle-point-next-example",
- "version": "0.2.4",
+ "version": "0.2.5",
"dependencies": {
"@asos/web-toggle-point-features": "file:../../packages/features",
"@asos/web-toggle-point-react-pointcuts": "file:../../packages/react-pointcuts",
@@ -116,7 +116,7 @@
},
"examples/serve": {
"name": "web-toggle-point-serve-example",
- "version": "0.2.6",
+ "version": "0.2.7",
"dependencies": {
"@asos/web-toggle-point-features": "file:../../packages/features",
"@asos/web-toggle-point-webpack": "file:../../packages/webpack",
diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md
index 0021e41..d7cba9d 100644
--- a/packages/features/docs/CHANGELOG.md
+++ b/packages/features/docs/CHANGELOG.md
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
+- renamed `nodeRequestScopedFeaturesStoreFactory` from `nodeRequestScopedStoreFactory` for consistency
- ensured interfaces in JSDoc output properly
- concede to a [`@callback`](https://jsdoc.app/tags-callback) to represent the `FeaturesStoreFactory` interface.
- descriptions in test files properly matching factories
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index f1451bf..191e7c9 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -51,7 +51,7 @@ const getActiveFeatures = useSnapshot.bind(undefined, value); // passed to `with
```
...which will then re-render consuming components based on the parts of the toggle state they are reliant on.
-### `nodeRequestScopedStoreFactory`
+### `nodeRequestScopedFeaturesStoreFactory`
A "request scoped" features store factory, for use in [Node](https://nodejs.org/).
diff --git a/packages/features/src/node.js b/packages/features/src/node.js
index c4489a3..face978 100644
--- a/packages/features/src/node.js
+++ b/packages/features/src/node.js
@@ -1,5 +1,5 @@
import "./global";
export { default as globalFeaturesStoreFactory } from "./global/store";
-export { default as nodeRequestScopedStoreFactory } from "./nodeRequestScoped/store";
+export { default as nodeRequestScopedFeaturesStoreFactory } from "./nodeRequestScoped/store";
export { default as reactContextFeaturesStoreFactory } from "./reactContext/store";
export { default as ssrBackedReactContextFeaturesStoreFactory } from "./ssrBackedReactContext/store";
From f8eba32fcc39c70fc39ca0b301b5b3b8a1e2831e Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Thu, 31 Jul 2025 09:20:34 +0100
Subject: [PATCH 13/15] valtio examples update
---
packages/features/docs/CHANGELOG.md | 1 +
packages/features/docs/README.md | 19 +++++++++++++------
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md
index d7cba9d..50f4ebf 100644
--- a/packages/features/docs/CHANGELOG.md
+++ b/packages/features/docs/CHANGELOG.md
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- concede to a [`@callback`](https://jsdoc.app/tags-callback) to represent the `FeaturesStoreFactory` interface.
- descriptions in test files properly matching factories
- some line-breaks in this CHANGELOG
+- more accurate [`valtio`](https://github.com/pmndrs/valtio) examples in the README
## [0.3.4] - 2025-07-14
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index 191e7c9..f82cecb 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -31,23 +31,30 @@ It exports a store with:
For protection against variation (or other) code modifying the toggle state unduly, the value passed could be [deep frozen](https://github.com/christophehurpeau/deep-freeze-es6), e.g.
```js
import { deepFreeze } from "deep-freeze-es6";
-const value = deepFreeze(input);
+const initialValue = {};
+featuresStore.useValue({ value: deepFreeze(initialValue) });
```
-For reactive values, without the need for a React or other contextual wrapper, consider [`valtio`](https://github.com/pmndrs/valtio):
+For reactive values, without the need for a React or other contextual wrapper, consider wrapping an object with [`valtio`](https://github.com/pmndrs/valtio):
```js
import { proxy } from "valtio/vanilla";
-const value = proxy(input);
+const initialValue = {};
+featuresStore.useValue({ value: proxy(initialValue) });
```
...which can then be subscribed to in an appropriate toggle point, to re-evaluate toggled functions:
```js
import { subscribe } from "valtio/vanilla";
-subscribe(value, () => { /* re-evaluate */ });
+subscribe(featuresStore.getFeatures(), () => { /* re-evaluate */ });
```
If using React (e.g. `react-pointcuts` package), can just use the native support in Valtio:
```js
import { proxy, useSnapshot } from "valtio";
-const value = proxy(input); // passed to `stores/global`
-const getActiveFeatures = useSnapshot.bind(undefined, value); // passed to `withTogglePointFactory`
+const initialValue = {};
+featuresStore.useValue({ value: proxy(initialValue) });
+export const useValue = (input) => // consumed in updating code-paths
+ featuresStore.useValue({
+ value: Object.assign(featuresStore.getFeatures(), input)
+ });
+export const getActiveFeatures = () => useSnapshot(featuresStore.getFeatures()); // passed to `withTogglePointFactory`
```
...which will then re-render consuming components based on the parts of the toggle state they are reliant on.
From 09a26bacc198dc18ea7008f96e7b8d53378a33ef Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Mon, 20 Oct 2025 17:49:39 +0100
Subject: [PATCH 14/15] fixup from useValue -> setValue mergedown
---
packages/features/docs/README.md | 10 +++++-----
.../nodeRequestScopedFeaturesStoreFactory.js | 2 +-
.../nodeRequestScopedFeaturesStoreFactory.test.js | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/packages/features/docs/README.md b/packages/features/docs/README.md
index 6689c4e..b53cb74 100644
--- a/packages/features/docs/README.md
+++ b/packages/features/docs/README.md
@@ -38,13 +38,13 @@ For protection against variation (or other) code modifying the toggle state undu
```js
import { deepFreeze } from "deep-freeze-es6";
const initialValue = {};
-featuresStore.useValue({ value: deepFreeze(initialValue) });
+featuresStore.setValue({ value: deepFreeze(initialValue) });
```
For reactive values, without the need for a React or other contextual wrapper, consider wrapping an object with [`valtio`](https://github.com/pmndrs/valtio):
```js
import { proxy } from "valtio/vanilla";
const initialValue = {};
-featuresStore.useValue({ value: proxy(initialValue) });
+featuresStore.setValue({ value: proxy(initialValue) });
```
...which can then be subscribed to in an appropriate toggle point, to re-evaluate toggled functions:
```js
@@ -55,9 +55,9 @@ If using React (e.g. `react-pointcuts` package), can just use the native support
```js
import { proxy, useSnapshot } from "valtio";
const initialValue = {};
-featuresStore.useValue({ value: proxy(initialValue) });
-export const useValue = (input) => // consumed in updating code-paths
- featuresStore.useValue({
+featuresStore.setValue({ value: proxy(initialValue) });
+export const setValue = (input) => // consumed in updating code-paths
+ featuresStore.setValue({
value: Object.assign(featuresStore.getFeatures(), input)
});
export const getActiveFeatures = () => useSnapshot(featuresStore.getFeatures()); // passed to `withTogglePointFactory`
diff --git a/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.js b/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.js
index a8a65fc..5666b27 100644
--- a/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.js
+++ b/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.js
@@ -26,7 +26,7 @@ const nodeRequestScopedFeaturesStoreFactory = ({ toggleType }) => {
* @implements module:web-toggle-point-features.FeaturesStore
* @implements module:web-toggle-point-features.SingletonFeaturesStore
*/ {
- useValue: ({ value, scopeCallBack }) => {
+ setValue: ({ value, scopeCallBack }) => {
store.run(value, scopeCallBack);
},
getFeatures: () => {
diff --git a/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.test.js b/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.test.js
index cfaace5..8e1216f 100644
--- a/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.test.js
+++ b/packages/features/src/storeFactories/nodeRequestScopedFeaturesStoreFactory.test.js
@@ -34,7 +34,7 @@ describe("nodeRequestScopedFeaturesStoreFactory", () => {
let storeMock;
beforeEach(() => {
- requestScopedStore.useValue({ value, scopeCallBack });
+ requestScopedStore.setValue({ value, scopeCallBack });
storeMock = AsyncLocalStorage.mock.results[0].value;
});
From fd2d2b9d1476103521843b09dac751c45c652cbb Mon Sep 17 00:00:00 2001
From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com>
Date: Mon, 20 Oct 2025 17:58:41 +0100
Subject: [PATCH 15/15] empty commit to kick off pr check re-run after blip in
pull request checks merge