From d0ce7f1f89e770afda63a54d0992b0e33e1ae427 Mon Sep 17 00:00:00 2001 From: Tom Pereira Date: Tue, 24 Dec 2024 17:31:32 +0000 Subject: [PATCH 1/7] 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 2/7] [#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 3/7] [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 4/7] 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 a7d18e71355ca515f3713740288fa2d4d99d1613 Mon Sep 17 00:00:00 2001 From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com> Date: Tue, 27 May 2025 20:28:52 +0100 Subject: [PATCH 5/7] Move to allow variant globs array A few cherry-picks from #21... --- examples/express/docs/CHANGELOG.md | 6 +++ examples/express/package.json | 2 +- examples/express/webpack.config.js | 6 ++- examples/next/docs/CHANGELOG.md | 6 +++ examples/next/next.config.mjs | 3 +- examples/next/package.json | 2 +- .../experiments/4-varied-variant/README.mdx | 2 +- examples/serve/README.md | 2 +- examples/serve/docs/CHANGELOG.md | 6 +++ examples/serve/package.json | 2 +- .../src/fixtures/audience/__pointCutConfig.js | 2 +- .../src/fixtures/config/__pointCutConfig.js | 2 +- .../src/fixtures/event/__pointCutConfig.js | 2 +- .../fixtures/translation/__pointCutConfig.js | 2 +- package-lock.json | 12 ++--- packages/webpack/docs/CHANGELOG.md | 13 +++++- packages/webpack/docs/README.md | 20 +++++---- packages/webpack/package.json | 2 +- .../src/plugins/togglePointInjection/index.js | 8 ++-- .../togglePointInjection/integration.test.js | 8 ++-- .../fillDefaultOptionalValues.js | 4 +- .../fillDefaultOptionalValues.test.js | 20 ++++----- .../processPointCuts/getVariantFiles.js | 17 ------- .../processPointCuts/getVariantPaths.js | 19 ++++++++ ...tFiles.test.js => getVariantPaths.test.js} | 25 +++++------ .../processPointCuts/index.js | 11 +++-- .../processPointCuts/index.test.js | 19 ++++---- .../processVariantFiles/index.js | 16 +++---- .../processVariantFiles/index.test.js | 45 +++++++++---------- .../processVariantFiles/isJoinPointInvalid.js | 18 ++++---- .../isJoinPointInvalid.test.js | 12 ++--- .../plugins/togglePointInjection/schema.json | 26 ++++++++--- 32 files changed, 191 insertions(+), 149 deletions(-) delete mode 100644 packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.js create mode 100644 packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.js rename packages/webpack/src/plugins/togglePointInjection/processPointCuts/{getVariantFiles.test.js => getVariantPaths.test.js} (60%) diff --git a/examples/express/docs/CHANGELOG.md b/examples/express/docs/CHANGELOG.md index 6ac4195..3d21ffe 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.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) + ## [0.2.3] - 2024-12-24 ### Changed diff --git a/examples/express/package.json b/examples/express/package.json index 995407b..75ecd27 100644 --- a/examples/express/package.json +++ b/examples/express/package.json @@ -1,6 +1,6 @@ { "name": "web-toggle-point-express-example", - "version": "0.2.3", + "version": "0.2.4", "type": "module", "engines": { "node": ">=20.6.0" diff --git a/examples/express/webpack.config.js b/examples/express/webpack.config.js index 3507cb4..73d72f4 100644 --- a/examples/express/webpack.config.js +++ b/examples/express/webpack.config.js @@ -6,7 +6,7 @@ import { fileURLToPath } from "url"; const configPointCutConfig = { name: "configuration variants", - variantGlob: "./src/routes/config/__variants__/*/*/*.jsx", + variantGlobs: ["./src/routes/config/__variants__/*/*/*.jsx"], togglePointModule: "/src/routes/config/togglePoint.js" }; @@ -48,7 +48,9 @@ const config = [ configPointCutConfig, { name: "animal apis by version", - variantGlob: "./src/routes/animals/api/**/v[1-9]*([0-9])/*.js", + variantGlobs: [ + "./src/routes/animals/api/**/v{1..9}*([[:digit:]])/*.js" + ], joinPointResolver: (variantPath) => posix.resolve( variantPath, diff --git a/examples/next/docs/CHANGELOG.md b/examples/next/docs/CHANGELOG.md index 8f4e287..caca39c 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.3] - 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) + ## [0.2.2] - 2024-12-24 ### Fixed diff --git a/examples/next/next.config.mjs b/examples/next/next.config.mjs index 397e9b9..428a031 100644 --- a/examples/next/next.config.mjs +++ b/examples/next/next.config.mjs @@ -12,8 +12,9 @@ const togglePointInjection = new TogglePointInjection({ { name: "experiments", togglePointModule: "/src/app/fixtures/experiments/withTogglePoint", - variantGlob: + variantGlobs: [ "./src/app/fixtures/experiments/**/__variants__/*/*/!(*.spec).tsx" + ] } ], webpackNormalModule: async () => diff --git a/examples/next/package.json b/examples/next/package.json index b7478e4..60a4744 100644 --- a/examples/next/package.json +++ b/examples/next/package.json @@ -1,6 +1,6 @@ { "name": "web-toggle-point-next-example", - "version": "0.2.2", + "version": "0.2.3", "private": true, "type": "module", "scripts": { diff --git a/examples/next/src/app/fixtures/experiments/4-varied-variant/README.mdx b/examples/next/src/app/fixtures/experiments/4-varied-variant/README.mdx index 1cfddca..1f71f95 100644 --- a/examples/next/src/app/fixtures/experiments/4-varied-variant/README.mdx +++ b/examples/next/src/app/fixtures/experiments/4-varied-variant/README.mdx @@ -2,7 +2,7 @@ This example shows compound variation, in that a component varied by "feature 1" can be varied again by a "feature 2". In this instance, the same point cut -(for experimentation) is acting on both, since it's `variantGlob` is defined +(for experimentation) is acting on both, since it has a `variantGlob` defined with a recursive [`globstar`](https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html#:~:text=globstar,only%20directories%20and%20subdirectories%20match.). If an `experiments` header is set, with a `"test-feature": { "bucket": "test-variant" }` diff --git a/examples/serve/README.md b/examples/serve/README.md index cd95bcf..268f6e1 100644 --- a/examples/serve/README.md +++ b/examples/serve/README.md @@ -6,7 +6,7 @@ This example shows the use of [`webpack`](../../packages/webpack/docs/README.md) It uses a `globalFeaturesStoreFactory` from the `features` package, to hold a invariant global toggle state. -It demonstrates a setup that utilises the `toggleHandler`, `variantGlob`, and `controlResolver` options of the Webpack plugin, with some basic convention-based filesystem approaches to toggling: +It demonstrates a setup that utilises the `toggleHandler`, `variantGlobs`, and `controlResolver` options of the Webpack plugin, with some basic convention-based filesystem approaches to toggling: 1. selecting a translations JSON file based on [`navigator.language`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language). - This uses language files stored at: diff --git a/examples/serve/docs/CHANGELOG.md b/examples/serve/docs/CHANGELOG.md index 9f2b321..6447d60 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.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) + ## [0.2.3] - 2025-02-27 ### Changed diff --git a/examples/serve/package.json b/examples/serve/package.json index 20a3f5d..c46e176 100644 --- a/examples/serve/package.json +++ b/examples/serve/package.json @@ -1,6 +1,6 @@ { "name": "web-toggle-point-serve-example", - "version": "0.2.3", + "version": "0.2.4", "type": "module", "private": true, "scripts": { diff --git a/examples/serve/src/fixtures/audience/__pointCutConfig.js b/examples/serve/src/fixtures/audience/__pointCutConfig.js index 49df1c5..b0d5d34 100644 --- a/examples/serve/src/fixtures/audience/__pointCutConfig.js +++ b/examples/serve/src/fixtures/audience/__pointCutConfig.js @@ -4,7 +4,7 @@ import getToggleHandlerPath from "../../getToggleHandlerPath.js"; export default { name: "audience", togglePointModule: "/src/fixtures/audience/__togglePoint.js", - variantGlob: "./src/fixtures/audience/**/cohort-[1-9]*([0-9])/*.js", + variantGlobs: ["./src/fixtures/audience/**/cohort-[1-9]*([0-9])/*.js"], toggleHandler: getToggleHandlerPath("singlePathSegment.js"), joinPointResolver: (path) => posix.resolve(path, "../..", basename(path).replace("bespoke", "control")) diff --git a/examples/serve/src/fixtures/config/__pointCutConfig.js b/examples/serve/src/fixtures/config/__pointCutConfig.js index 092ce28..ca7293a 100644 --- a/examples/serve/src/fixtures/config/__pointCutConfig.js +++ b/examples/serve/src/fixtures/config/__pointCutConfig.js @@ -4,7 +4,7 @@ import joinPointResolver from "../../joinPointResolver.js"; export default { name: "configuration", togglePointModule: "/src/fixtures/config/__togglePoint.js", - variantGlob: "./src/fixtures/config/**/sites/*/*.js", + variantGlobs: ["./src/fixtures/config/**/sites/*/*.js"], toggleHandler: getToggleHandlerPath("listExtractionFromPathSegment.js"), joinPointResolver }; diff --git a/examples/serve/src/fixtures/event/__pointCutConfig.js b/examples/serve/src/fixtures/event/__pointCutConfig.js index 857abfc..b5c3ca6 100644 --- a/examples/serve/src/fixtures/event/__pointCutConfig.js +++ b/examples/serve/src/fixtures/event/__pointCutConfig.js @@ -3,7 +3,7 @@ import getToggleHandlerPath from "../../getToggleHandlerPath.js"; export default { name: "event", togglePointModule: "/src/fixtures/event/__togglePoint.js", - variantGlob: "./src/fixtures/event/**/*.*.css", + variantGlobs: ["./src/fixtures/event/**/*.*.css"], toggleHandler: getToggleHandlerPath("singleFilenameDottedSegment.js"), joinPointResolver: (path) => path.replace(/\.([^.]+)\.css$/, ".css") }; diff --git a/examples/serve/src/fixtures/translation/__pointCutConfig.js b/examples/serve/src/fixtures/translation/__pointCutConfig.js index 3b0e8ee..99cee63 100644 --- a/examples/serve/src/fixtures/translation/__pointCutConfig.js +++ b/examples/serve/src/fixtures/translation/__pointCutConfig.js @@ -3,6 +3,6 @@ import joinPointResolver from "../../joinPointResolver.js"; export default { name: "translation", togglePointModule: "/src/fixtures/translation/__togglePoint.js", - variantGlob: "./src/fixtures/translation/languages/*/*.json", + variantGlobs: ["./src/fixtures/translation/languages/*/*.json"], joinPointResolver }; diff --git a/package-lock.json b/package-lock.json index 1601923..538c9da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@asos/web-toggle-point", - "version": "0.10.3", + "version": "0.10.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@asos/web-toggle-point", - "version": "0.10.3", + "version": "0.10.4", "license": "MIT", "workspaces": [ "packages/features", @@ -57,7 +57,7 @@ }, "examples/express": { "name": "web-toggle-point-express-example", - "version": "0.2.3", + "version": "0.2.4", "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.2", + "version": "0.2.3", "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.3", + "version": "0.2.4", "dependencies": { "@asos/web-toggle-point-features": "file:../../packages/features", "@asos/web-toggle-point-webpack": "file:../../packages/webpack", @@ -20477,7 +20477,7 @@ }, "packages/webpack": { "name": "@asos/web-toggle-point-webpack", - "version": "0.7.4", + "version": "0.8.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", diff --git a/packages/webpack/docs/CHANGELOG.md b/packages/webpack/docs/CHANGELOG.md index 424440a..5b2551f 100644 --- a/packages/webpack/docs/CHANGELOG.md +++ b/packages/webpack/docs/CHANGELOG.md @@ -5,11 +5,22 @@ 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.8.0] - 2025-05-27 + +### Changed + +- moved to accept an array for variant globs in the plugin, allowing cherry-picking of disparately-located files to be selected where a common pattern does not apply + +### Fixed + +- fixed typo in JSDoc comment +- fixed typo in `README.md` + ## [0.7.4] - 2025-03-03 ### Changed -- Added `package.json` [repository](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#repository), [bugs](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#bugs), and [`directories/doc`](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#directories) fields, for clarity once on NPM +- added `package.json` [repository](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#repository), [bugs](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#bugs), and [`directories/doc`](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#directories) fields, for clarity once on NPM ## [0.7.3] - 2024-12-26 diff --git a/packages/webpack/docs/README.md b/packages/webpack/docs/README.md index f4c7b1d..a262523 100644 --- a/packages/webpack/docs/README.md +++ b/packages/webpack/docs/README.md @@ -37,7 +37,7 @@ import { NormalModule } from 'webpack'; interface PointCut { name: string; togglePointModule: string; - variantGlob?: string; + variantGlobs?: string[]; joinPointResolver?: (variantPath: string) => string; } @@ -53,7 +53,7 @@ interface TogglePointInjectionOptions { > [!IMPORTANT] > N.B. when setting up multiple pointcuts, the path matched by the [globs](https://en.wikipedia.org/wiki/Glob_(programming)) must be mutually exclusive. Otherwise, the pointcut defined earlier in the array "wins", and a warning is emitted into the compilation indicating that the subsequent cuts are neutered for those matching files. > -> Also, due to the way Webpack works, there should only be a sinlge `TogglePointInjection` plugin per webpack configuration, so utilize the point cuts array, rather than having separate plugin instances per point cut. +> Also, due to the way Webpack works, there should only be a single `TogglePointInjection` plugin per webpack configuration, so utilize the point cuts array, rather than having separate plugin instances per point cut. #### _`name`_ @@ -70,11 +70,13 @@ It's paramount that this module is compatible with the modules it is varying. e Also, the interface of the toggle point, and the variations that it may supplant, needs to be interchangeable with the base/default module. [Liskov Substitution Principle](https://en.wikipedia.org/wiki/Liskov_substitution_principle) must apply; functionality may differ, but it must still be compatible with all the consumers of the base module. -#### _`variantGlob`_ +#### _`variantGlobs`_ -A [glob](https://en.wikipedia.org/wiki/Glob_(programming)) which points at varied code modules. The default/base modules are extrapolated from this source location.[^2] +An array of [globs](https://en.wikipedia.org/wiki/Glob_(programming)) which point at varied code modules. The default/base modules are extrapolated from these source locations.[^2] -This can be as specific or generic as needed, but ideally the most specific possible for the use-cases in effect. +These can be as specific or generic as needed, but ideally the most specific possible for the use-cases in effect. + +The common case is a single glob, but an array is provided to mitigate the need for complex ["brace expansion"](https://github.com/micromatch/braces) or [extended globs](https://github.com/micromatch/micromatch#extglobs), which could be complex when targeting variations which are located in disparate parts of a codebase. It should match modules that are compatible with the `togglePointModule` - e.g. if all React code is held within a `/components` folder, it makes sense to include this in the glob path to avoid inadvertently toggling non-react code (should a variant be set up for non-React code without considering the configuration). @@ -97,13 +99,13 @@ If not supplied, a default `glob` of `/**/__variants__/*/*/!(*.test).{js,jsx,ts, #### _`toggleHandler`_ -This module unpicks the [WebPack context module](https://webpack.js.org/guides/dependency-management/#context-module-api) produced by enacting the configured `variantGlob` and converts it into a form suitable for the configured `togglePoint`. +This module unpicks the [WebPack context module](https://webpack.js.org/guides/dependency-management/#context-module-api) produced by enacting the configured `variantGlobs` and converts it into a form suitable for the configured `togglePoint`. -If not supplied, a default handler (`@asos/web-toggle-point-webpack/pathSegmentToggleHandler`) is used, compatible with the default `variantGlob`, that converts the matched paths into a tree data structure held in a `Map`, with each path segment as a node in the tree, and the variant modules as the leaf nodes. +If not supplied, a default handler (`@asos/web-toggle-point-webpack/pathSegmentToggleHandler`) is used, compatible with the default `variantGlobs`, that converts the matched paths into a tree data structure held in a `Map`, with each path segment as a node in the tree, and the variant modules as the leaf nodes. #### _`joinPointResolver`_ -This marries with the `variantGlob`, in that it "undoes" the variation in file path made to the base/default module. +This marries with the `variantGlobs`, in that it "undoes" the variation in file path made to the base/default module. For every variant path found, the plugin executes this method to locate the related base/default path. @@ -163,7 +165,7 @@ const plugin = new TogglePointInjection({ pointCuts: [{ name: "my point cut", togglePointModule: "/src/modules/withTogglePoint", - variantGlob: "./src/modules/**/__variants__/*/*/*.js" + variantGlobs: ["./src/modules/**/__variants__/*/*/*.js"] }] }); ``` diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 36798ae..9276395 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.4", + "version": "0.8.0", "license": "MIT", "type": "module", "main": "./lib/main.cjs", diff --git a/packages/webpack/src/plugins/togglePointInjection/index.js b/packages/webpack/src/plugins/togglePointInjection/index.js index 0148828..3bdee5b 100644 --- a/packages/webpack/src/plugins/togglePointInjection/index.js +++ b/packages/webpack/src/plugins/togglePointInjection/index.js @@ -19,9 +19,9 @@ class TogglePointInjection { * @param {object[]} options.pointCuts toggle point point cut configuration, with target toggle point code as advice. The first matching point cut will be used * @param {string} options.pointCuts[].name name to describe the nature of the point cut, for clarity in logs and dev tools etc. * @param {string} options.pointCuts[].togglePointModule path, from root of the compilation, of where the toggle point sits. Or a resolvable node_module. - * @param {object} [options.pointCuts[].variantGlob=.\/**\/__variants__/*\/*\/!(*.test).{js,jsx,ts,tsx}] {@link https://en.wikipedia.org/wiki/Glob_(programming)|Globs} to identified variant modules. The plugin uses {@link https://github.com/mrmlnc/fast-glob|fast-glob} under the hood, so supports any glob that it does. + * @param {string[]} [options.pointCuts[].variantGlobs=[.\/**\/__variants__/*\/*\/!(*.test).{js,jsx,ts,tsx}]] {@link https://en.wikipedia.org/wiki/Glob_(programming)|Globs} to identified variant modules. The plugin uses {@link https://github.com/mrmlnc/fast-glob|fast-glob} under the hood, so supports any glob that it does. * @param {function} [options.pointCuts[].joinPointResolver=(variantPath) => path.posix.resolve(variantPath, "../../../..", path.basename(variantPath))] A function that takes the path to a variant module and returns a join point / base module. N.B. This is executed at build-time, so cannot use run-time context. It should use posix path segments, so on Windows be sure to use path.posix.resolve. - * @param {string} [options.pointsCuts[].toggleHandler] Path to a toggle handler that unpicks a {@link https://webpack.js.org/api/module-methods/#requirecontext|require.context} containing potential variants, passing that plus a joint point module to a toggle point function. If not provided, the plugin will use a default handler that processes folder names into a tree held in a Map. Leaf nodes of the tree are the variant modules. + * @param {string} [options.pointCuts[].toggleHandler] Path to a toggle handler that unpicks a {@link https://webpack.js.org/api/module-methods/#requirecontext|require.context} containing potential variants, passing that plus a joint point module to a toggle point function. If not provided, the plugin will use a default handler that processes folder names into a tree held in a Map. Leaf nodes of the tree are the variant modules. * @param {function} [options.webpackNormalModule] A function that returns the Webpack NormalModule class. This is required for Next.js, as it does not expose the NormalModule class directly * @returns {external:Webpack.WebpackPluginInstance} WebpackPluginInstance * @example N.B. forward slashes are escaped in the glob, due to JSDoc shortcomings, but in reality should be un-escaped @@ -29,11 +29,11 @@ class TogglePointInjection { * pointCuts: [ * { * togglePointModule: "/withToggledHook", - * variantGlob: "./**\/__variants__/*\/*\/use!(*.test).{ts,tsx}" + * variantGlobs: ["./**\/__variants__/*\/*\/use!(*.test).{ts,tsx}"] * }, * { * togglePointModule: "/withTogglePoint", - * variantGlob: "./**\/!(use*|*.test).{ts,tsx}" + * variantGlobs: ["./**\/__variants__/*\/*\/!(*.test).{ts,tsx}"] * } * ] * }); diff --git a/packages/webpack/src/plugins/togglePointInjection/integration.test.js b/packages/webpack/src/plugins/togglePointInjection/integration.test.js index bfa008c..d28aa06 100644 --- a/packages/webpack/src/plugins/togglePointInjection/integration.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/integration.test.js @@ -19,13 +19,13 @@ describe("togglePointInjection", () => { { name: "not react hooks", togglePointModule: togglePointModule1, - variantGlob: `${modulesFolder}**/${variantsFolder}/*/*/!(*use)*.js`, + variantGlobs: [`${modulesFolder}**/${variantsFolder}/*/*/!(*use)*.js`], moduleName: "testModule.js" }, { name: "react hooks", togglePointModule: togglePointModule2, - variantGlob: `${modulesFolder}**/${variantsFolder}/*/*/use*.js`, + variantGlobs: [`${modulesFolder}**/${variantsFolder}/*/*/use*.js`], moduleName: "useTestModule.js" } ]; @@ -158,7 +158,9 @@ describe("togglePointInjection", () => { const [{ moduleName }] = testCases; beforeEach(async () => { - testCases[1].variantGlob = `${modulesFolder}**/${variantsFolder}/*/*/*.js`; + testCases[1].variantGlobs = [ + `${modulesFolder}**/${variantsFolder}/*/*/*.js` + ]; plugin = new TogglePointInjection({ pointCuts: testCases.map(({ moduleName, ...rest }) => rest) // eslint-disable-line no-unused-vars }); diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.js index e50b71e..fecdcd5 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.js @@ -2,12 +2,12 @@ import { posix, basename } from "path"; const fillPointCutDefaults = (pointCut) => { const { - variantGlob = "./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}", + variantGlobs = ["./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}"], joinPointResolver = (variantPath) => posix.resolve(variantPath, ...Array(4).fill(".."), basename(variantPath)) } = pointCut; - return { variantGlob, joinPointResolver }; + return { variantGlobs, joinPointResolver }; }; export default fillPointCutDefaults; diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.test.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.test.js index cf5d997..a199b19 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/fillDefaultOptionalValues.test.js @@ -14,7 +14,7 @@ describe("fillDefaultOptionalValues", () => { }); }; - describe("when the point cut has no variantGlob or joinPointResolver", () => { + describe("when the point cut has no variantGlobs or joinPointResolver", () => { const pointCut = {}; beforeEach(() => { @@ -23,7 +23,7 @@ describe("fillDefaultOptionalValues", () => { it("should fill the defaults", () => { expect(result).toEqual({ - variantGlob: "./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}", + variantGlobs: ["./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}"], joinPointResolver: expect.any(Function) }); }); @@ -31,8 +31,8 @@ describe("fillDefaultOptionalValues", () => { makeDefaultJoinPointResolverAssertions(); }); - describe("when the point cut has a variantGlob but no joinPointResolver", () => { - const pointCut = { variantGlob: Symbol("test-variant-glob") }; + describe("when the point cut has a variantGlobs but no joinPointResolver", () => { + const pointCut = { variantGlobs: Symbol("test-variant-globs") }; beforeEach(() => { result = fillPointCutDefaults(pointCut); @@ -40,7 +40,7 @@ describe("fillDefaultOptionalValues", () => { it("should fill the defaults", () => { expect(result).toEqual({ - variantGlob: pointCut.variantGlob, + variantGlobs: pointCut.variantGlobs, joinPointResolver: expect.any(Function) }); }); @@ -48,23 +48,23 @@ describe("fillDefaultOptionalValues", () => { makeDefaultJoinPointResolverAssertions(); }); - describe("when the point cut has a joinPointResolver but no variantGlob", () => { - it("should return the supplied joinPointResolver and fill a default variantGlob", () => { + describe("when the point cut has a joinPointResolver but no variantGlobs", () => { + it("should return the supplied joinPointResolver and fill default variantGlobs", () => { const pointCut = { joinPointResolver: Symbol("test-join-point-resolver") }; const result = fillPointCutDefaults(pointCut); expect(result).toEqual({ - variantGlob: "./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}", + variantGlobs: ["./**/__variants__/*/*/!(*.test).{js,jsx,ts,tsx}"], joinPointResolver: pointCut.joinPointResolver }); }); }); - describe("when the point cut has a variantGlob and a joinPointResolver", () => { + describe("when the point cut has variantGlobs and a joinPointResolver", () => { it("should return the point cut supplied values", () => { const pointCut = { - variantGlob: Symbol("test-variant-glob"), + variantGlobs: Symbol("test-variant-glob"), joinPointResolver: Symbol("test-join-point-resolver") }; const result = fillPointCutDefaults(pointCut); diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.js deleted file mode 100644 index c458c6a..0000000 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.js +++ /dev/null @@ -1,17 +0,0 @@ -import { posix } from "path"; -import fastGlob from "fast-glob"; -const { relative, join } = posix; - -const getVariantFiles = async ({ variantGlob, appRoot, fileSystem }) => { - const results = await fastGlob.glob(join(appRoot, variantGlob), { - objectMode: true, - fs: fileSystem - }); - - return results.map(({ path, name }) => ({ - path: `/${relative(appRoot, path)}`, - name - })); -}; - -export default getVariantFiles; diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.js new file mode 100644 index 0000000..4bf6894 --- /dev/null +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.js @@ -0,0 +1,19 @@ +import { posix } from "path"; +import fastGlob from "fast-glob"; +const { relative, join } = posix; + +const getVariantPaths = async ({ variantGlobs, appRoot, fileSystem }) => { + const variantPaths = new Set(); + for await (const glob of variantGlobs) { + const results = await fastGlob.glob(join(appRoot, glob), { + objectMode: true, + fs: fileSystem + }); + for (const { path } of results) { + variantPaths.add(`/${relative(appRoot, path)}`); + } + } + return variantPaths; +}; + +export default getVariantPaths; diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.test.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.test.js similarity index 60% rename from packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.test.js rename to packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.test.js index 8a63b86..d6bbf9a 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantFiles.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/getVariantPaths.test.js @@ -1,8 +1,8 @@ import { fs as fileSystem, vol } from "memfs"; import { join, sep } from "path"; -import getVariantFiles from "./getVariantFiles"; +import getVariantPaths from "./getVariantPaths"; -describe("getVariantFiles", () => { +describe("getVariantPaths", () => { const appRoot = "/test-folder"; let result; beforeEach(async () => { @@ -42,23 +42,20 @@ describe("getVariantFiles", () => { sep ); - result = await getVariantFiles({ - variantGlob: "./**/test-matching-folder/**/test-matching-*.js", + result = await getVariantPaths({ + variantGlobs: [ + "./**/test-matching-folder/**/test-matching-*.js", + "./**/test-matching-folder/test-matching-*.js" + ], appRoot, fileSystem }); }); - it("should return the matching files as an object with the file name and the path relative to the application root", () => { - expect(result).toEqual([ - expect.objectContaining({ - name: "test-matching-file-1.js", - path: "/test-matching-folder/test-matching-file-1.js" - }), - expect.objectContaining({ - name: "test-matching-file-2.js", - path: "/test-matching-folder/test-matching-file-2.js" - }) + it("should return the distinct matching file paths relative to the application root", () => { + expect(Array.from(result)).toEqual([ + "/test-matching-folder/test-matching-file-1.js", + "/test-matching-folder/test-matching-file-2.js" ]); }); }); diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.js index 01162c9..503b057 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.js @@ -1,5 +1,5 @@ import processVariantFiles from "./processVariantFiles/index.js"; -import getVariantFiles from "./getVariantFiles.js"; +import getVariantPaths from "./getVariantPaths.js"; import fillDefaultOptionalValues from "./fillDefaultOptionalValues.js"; const processPointCuts = async ({ @@ -11,21 +11,20 @@ const processPointCuts = async ({ const configFiles = new Map(); const warnings = []; for await (const pointCut of pointCuts.values()) { - const { variantGlob, joinPointResolver } = + const { variantGlobs, joinPointResolver } = fillDefaultOptionalValues(pointCut); - const variantFiles = await getVariantFiles({ - variantGlob, + const variantPaths = await getVariantPaths({ + variantGlobs, appRoot, fileSystem }); await processVariantFiles({ - variantFiles, + variantPaths, joinPointFiles, pointCut, joinPointResolver, - variantGlob, warnings, configFiles, fileSystem, diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.test.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.test.js index 39ff6bf..62768a2 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/index.test.js @@ -1,15 +1,15 @@ import processVariantFiles from "./processVariantFiles/index.js"; -import getVariantFiles from "./getVariantFiles.js"; +import getVariantPaths from "./getVariantPaths.js"; import processPointCuts from "./index.js"; import fillDefaultOptionalValues from "./fillDefaultOptionalValues.js"; jest.mock("./processVariantFiles/index", () => jest.fn()); -jest.mock("./getVariantFiles", () => +jest.mock("./getVariantPaths", () => jest.fn(() => Symbol("test-variant-files")) ); jest.mock("./fillDefaultOptionalValues", () => jest.fn(() => ({ - variantGlob: Symbol("test-variant-glob"), + variantGlobs: Symbol("test-variant-globs"), joinPointResolver: Symbol("test-join-point-resolver") })) ); @@ -42,10 +42,10 @@ describe("processPointCuts", () => { it("should get variant files for each of the point cuts", () => { for (const index of pointCutsValues.keys()) { - const { variantGlob } = + const { variantGlobs } = fillDefaultOptionalValues.mock.results[index].value; - expect(getVariantFiles).toHaveBeenCalledWith({ - variantGlob, + expect(getVariantPaths).toHaveBeenCalledWith({ + variantGlobs, appRoot, fileSystem }); @@ -54,15 +54,14 @@ describe("processPointCuts", () => { it("should process the variant files, and keep a shared record of config files found between each point cut", () => { for (const [index, pointCut] of pointCutsValues.entries()) { - const variantFiles = getVariantFiles.mock.results[index].value; - const { variantGlob, joinPointResolver } = + const variantPaths = getVariantPaths.mock.results[index].value; + const { joinPointResolver } = fillDefaultOptionalValues.mock.results[index].value; expect(processVariantFiles).toHaveBeenCalledWith({ - variantFiles, + variantPaths, joinPointFiles, pointCut, joinPointResolver, - variantGlob, warnings, configFiles: expect.any(Map), fileSystem, diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.js index 63629cc..8d8e09a 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.js @@ -1,24 +1,24 @@ import { posix } from "path"; import isJoinPointInvalid from "./isJoinPointInvalid"; -const { dirname, relative } = posix; +const { parse, relative } = posix; const processVariantFiles = async ({ - variantFiles, + variantPaths, joinPointFiles, pointCut, joinPointResolver, warnings, ...rest }) => { - for (const { name, path } of variantFiles) { - const joinPointPath = joinPointResolver(path); - const joinDirectory = dirname(joinPointPath); + for (const variantPath of variantPaths) { + const joinPointPath = joinPointResolver(variantPath); + const { dir: directory, base: filename } = parse(joinPointPath); if (!joinPointFiles.has(joinPointPath)) { const isInvalid = await isJoinPointInvalid({ - name, + filename, joinPointPath, - joinDirectory, + directory, ...rest }); @@ -40,7 +40,7 @@ const processVariantFiles = async ({ } joinPointFile.variants.push( - relative(joinDirectory, path).replace(/^([^./])/, "./$1") + relative(directory, variantPath).replace(/^([^./])/, "./$1") ); } }; diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.test.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.test.js index bf8adc7..1ff96c5 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/index.test.js @@ -1,7 +1,7 @@ import processVariantFiles from "."; import { memfs } from "memfs"; import { posix } from "path"; -const { resolve, basename, join, sep } = posix; +const { resolve, join, sep } = posix; describe("processVariantFiles", () => { let joinPointFiles; @@ -10,7 +10,7 @@ describe("processVariantFiles", () => { let warnings; const variantFileGlob = "test-variant-*.*"; - const variantGlob = `/${variantFileGlob}`; + const variantGlobs = [`/${variantFileGlob}`]; const appRoot = "/test-app-root/"; const moduleFile = "test-module.js"; const joinPointFolder = "test-folder"; @@ -24,14 +24,14 @@ describe("processVariantFiles", () => { joinPointFiles = new Map(); }); - const act = async ({ variantFiles, configFiles }) => { + const act = async ({ variantPaths, configFiles }) => { await processVariantFiles({ - variantFiles, + variantPaths, configFiles, joinPointFiles, pointCut, joinPointResolver, - variantGlob, + variantGlobs, warnings, name: moduleFile, fileSystem, @@ -41,7 +41,7 @@ describe("processVariantFiles", () => { describe("when given no variant files", () => { beforeEach(async () => { - await act({ variantFiles: [], configFiles: new Map() }); + await act({ variantPaths: new Set(), configFiles: new Map() }); }); it("should add no warnings, and not modify joinPointFiles", async () => { @@ -50,30 +50,25 @@ describe("processVariantFiles", () => { }); }); - const variantFilePath = variantFileGlob.replaceAll("*", "1"); + const variantPath = variantFileGlob.replaceAll("*", "1"); describe.each` - variantFilePath | expectedVariant - ${variantFilePath} | ${"." + sep + variantFilePath} - ${"." + variantFilePath} | ${"." + variantFilePath} - ${"." + sep + variantFilePath} | ${"." + sep + variantFilePath} - ${".." + sep + variantFilePath} | ${".." + sep + variantFilePath} + variantPath | expectedVariant + ${variantPath} | ${"." + sep + variantPath} + ${"." + variantPath} | ${"." + variantPath} + ${"." + sep + variantPath} | ${"." + sep + variantPath} + ${".." + sep + variantPath} | ${".." + sep + variantPath} `( - "when given a variant path ($variantFilePath)", - ({ variantFilePath, expectedVariant }) => { - const variantFiles = [ - { - name: basename(variantFilePath), - path: resolve(joinPointFolder, variantFilePath) - } - ]; + "when given a variant path ($variantPath)", + ({ variantPath, expectedVariant }) => { + const variantPaths = new Set([resolve(joinPointFolder, variantPath)]); describe("when given a variant file that has no matching join point file", () => { beforeEach(async () => { joinPointResolver.mockReturnValue( join(joinPointFolder, "test-not-matching-control") ); - await act({ variantFiles, configFiles: new Map() }); + await act({ variantPaths, configFiles: new Map() }); }); it("should add no warnings, and not modify joinPointFiles", async () => { @@ -89,7 +84,7 @@ describe("processVariantFiles", () => { describe("and no config file precludes it being valid", () => { beforeEach(async () => { - await act({ variantFiles, configFiles: new Map() }); + await act({ variantPaths, configFiles: new Map() }); }); it("should add no warnings, and add a single joinPointFile representing the matched join point", async () => { @@ -111,7 +106,7 @@ describe("processVariantFiles", () => { describe("and a config file confirms it as valid", () => { beforeEach(async () => { await act({ - variantFiles, + variantPaths, configFiles: new Map([ [joinPointFolder, { joinPoints: [moduleFile] }] ]) @@ -137,7 +132,7 @@ describe("processVariantFiles", () => { describe("and a config file precludes it from being valid", () => { beforeEach(async () => { await act({ - variantFiles, + variantPaths, configFiles: new Map([[joinPointFolder, { joinPoints: [] }]]) }); }); @@ -155,7 +150,7 @@ describe("processVariantFiles", () => { pointCut: testOtherPointCut }); await act({ - variantFiles, + variantPaths, configFiles: new Map() }); }); diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.js index 90c2b75..c88885a 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.js @@ -17,32 +17,32 @@ const fileExists = async (fileSystem, path) => { const ensureConfigFile = async ({ configFiles, fileSystem, - joinDirectory, + directory, appRoot }) => { - if (!configFiles.has(joinDirectory)) { + if (!configFiles.has(directory)) { let configFile = null; - const path = `${join(appRoot, joinDirectory, TOGGLE_CONFIG)}`; + const path = `${join(appRoot, directory, TOGGLE_CONFIG)}`; if (await fileExists(fileSystem, path)) { configFile = JSON.parse(await readFile({ fileSystem, path })); validateConfigSchema({ configFile, appRoot, path }); } - configFiles.set(joinDirectory, configFile); + configFiles.set(directory, configFile); } }; const isJoinPointInvalid = async ({ configFiles, - name, + filename, fileSystem, appRoot, joinPointPath, - joinDirectory + directory }) => { - await ensureConfigFile({ configFiles, fileSystem, joinDirectory, appRoot }); + await ensureConfigFile({ configFiles, fileSystem, directory, appRoot }); - if (configFiles.has(joinDirectory)) { - if (configFiles.get(joinDirectory)?.joinPoints.includes(name) === false) { + if (configFiles.has(directory)) { + if (configFiles.get(directory)?.joinPoints.includes(filename) === false) { return true; } } diff --git a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.test.js b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.test.js index 1cc0804..2b431a2 100644 --- a/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.test.js +++ b/packages/webpack/src/plugins/togglePointInjection/processPointCuts/processVariantFiles/isJoinPointInvalid.test.js @@ -10,10 +10,10 @@ jest.mock("../../constants", () => ({ jest.mock("./validateConfigSchema", () => jest.fn()); const appRoot = "test-app-root"; -const joinDirectory = "test-join-directory"; +const directory = "test-join-directory"; const mockJoinPoint = "test-join-point"; -const joinPointPath = join(joinDirectory, mockJoinPoint); -const toggleConfigPath = join(appRoot, joinDirectory, TOGGLE_CONFIG); +const joinPointPath = join(directory, mockJoinPoint); +const toggleConfigPath = join(appRoot, directory, TOGGLE_CONFIG); const joinPointFullPath = join(appRoot, joinPointPath); describe("isJoinPointInvalid", () => { @@ -22,7 +22,7 @@ describe("isJoinPointInvalid", () => { beforeEach(() => { configFiles = new Map(); ({ fs: fileSystem, vol } = memfs()); - vol.fromJSON({ [join(appRoot, joinDirectory)]: {} }); + vol.fromJSON({ [join(appRoot, directory)]: {} }); jest.spyOn(fileSystem, "stat"); jest.spyOn(fileSystem, "readFile"); }); @@ -30,11 +30,11 @@ describe("isJoinPointInvalid", () => { const act = () => isJoinPointInvalid({ configFiles, - name: mockJoinPoint, + filename: mockJoinPoint, fileSystem, appRoot, joinPointPath, - joinDirectory + directory }); const makeSecondCallAssertions = (expectedResult) => { diff --git a/packages/webpack/src/plugins/togglePointInjection/schema.json b/packages/webpack/src/plugins/togglePointInjection/schema.json index 21094df..7911ab9 100644 --- a/packages/webpack/src/plugins/togglePointInjection/schema.json +++ b/packages/webpack/src/plugins/togglePointInjection/schema.json @@ -6,9 +6,18 @@ "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "togglePointModule": { "type": "string" }, - "variantGlob": { "type": "string" }, + "name": { + "type": "string" + }, + "togglePointModule": { + "type": "string" + }, + "variantGlobs": { + "type": "array", + "items": { + "type": "string" + } + }, "toggleHandler": { "type": "string" }, @@ -17,7 +26,10 @@ } }, "additionalProperties": false, - "required": ["name", "togglePointModule"] + "required": [ + "name", + "togglePointModule" + ] } }, "webpackNormalModule": { @@ -25,5 +37,7 @@ } }, "additionalProperties": false, - "required": ["pointCuts"] -} + "required": [ + "pointCuts" + ] +} \ No newline at end of file From 17f431d67db792a4e74344f2de75bb6377145752 Mon Sep 17 00:00:00 2001 From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com> Date: Tue, 27 May 2025 20:33:20 +0100 Subject: [PATCH 6/7] EOF blank line to keep GitHub happy --- packages/webpack/src/plugins/togglePointInjection/schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webpack/src/plugins/togglePointInjection/schema.json b/packages/webpack/src/plugins/togglePointInjection/schema.json index 7911ab9..b75b215 100644 --- a/packages/webpack/src/plugins/togglePointInjection/schema.json +++ b/packages/webpack/src/plugins/togglePointInjection/schema.json @@ -40,4 +40,4 @@ "required": [ "pointCuts" ] -} \ No newline at end of file +} From bbcbb305dfe82e9f439a8d3e2fcfef1220a7a646 Mon Sep 17 00:00:00 2001 From: TomStrepsil <10725179+TomStrepsil@users.noreply.github.com> Date: Tue, 27 May 2025 20:45:50 +0100 Subject: [PATCH 7/7] add change to use posix character classes and brace expansions to the CHANGELOG --- examples/express/docs/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/express/docs/CHANGELOG.md b/examples/express/docs/CHANGELOG.md index 3d21ffe..f7dbb6b 100644 --- a/examples/express/docs/CHANGELOG.md +++ b/examples/express/docs/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### 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) +- used some differing syntax from [`micromatch`](https://github.com/micromatch/micromatch) to define `variantGlobs`, for coverage and where may be preferred ## [0.2.3] - 2024-12-24