Skip to content

Commit

Permalink
Merge pull request #2382 from alphagov/experimental-proxy
Browse files Browse the repository at this point in the history
Make any npm module a plugin via a proxy plugin config
  • Loading branch information
BenSurgisonGDS authored Nov 27, 2023
2 parents 7bd79e3 + f839c5d commit 667abeb
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 4 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### New features

- [#2382: Make any npm module a plugin via a proxy plugin config](https://github.com/alphagov/govuk-prototype-kit/pull/2382)

## 13.15.3

### Fixes
Expand Down
9 changes: 7 additions & 2 deletions lib/manage-prototype-handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -439,12 +439,17 @@ function buildPluginData (pluginData) {
async function prepareForPluginPage (isInstalledPage, search) {
const allPackages = await getAllPackages()
const allPlugins = allPackages.filter(({ pluginConfig }) => !!pluginConfig)
const installedPlugins = await getInstalledPackages()
const installedPackages = await getInstalledPackages()
const installedPlugins = installedPackages.filter(({ pluginConfig }) => !!pluginConfig)

const plugins = isInstalledPage
? installedPlugins
: allPlugins.filter(plugin => {
const pluginName = plugin.packageName?.toLowerCase()
const { packageName, available, installed } = plugin || {}
const pluginName = packageName?.toLowerCase()
if (!pluginName || (!available && !installed)) {
return false
}
return pluginName.indexOf(search.toLowerCase()) >= 0
})

Expand Down
7 changes: 7 additions & 0 deletions lib/manage-prototype-handlers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ jest.mock('../known-plugins.json', () => {
plugins: {}
}
})

jest.mock('fs-extra', () => {
return {
readFile: jest.fn().mockResolvedValue(''),
Expand Down Expand Up @@ -90,6 +91,12 @@ jest.mock('./plugins/plugins', () => {
}
})

jest.mock('./plugins/plugin-utils', () => {
return {
getProxyPluginConfig: jest.fn().mockReturnValue({})
}
})

jest.mock('./plugins/packages', () => {
const packageWithPluginConfig = {
packageName: 'test-package',
Expand Down
25 changes: 24 additions & 1 deletion lib/plugins/plugin-utils.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
// This allows npm modules to act as if they are plugins by providing the plugin config for them
const fs = require('fs')
const fse = require('fs-extra')
const { projectDir } = require('../utils/paths')
const path = require('path')

let proxyPluginError = false
function getProxyPluginConfig (packageName) {
const proxyPluginConfig = {
let proxyPluginConfig = {
jquery: {
scripts: ['/dist/jquery.js'],
assets: ['/dist'],
Expand All @@ -14,6 +20,23 @@ function getProxyPluginConfig (packageName) {
}
}
}
const proxyPluginsPath = path.join(projectDir, 'app', 'plugin-proxy.json')
if (fse.existsSync(proxyPluginsPath)) {
let userProxyPluginsContent
try {
userProxyPluginsContent = fs.readFileSync(proxyPluginsPath, 'utf8')
const userProxyPlugins = JSON.parse(userProxyPluginsContent)
proxyPluginConfig = { ...proxyPluginConfig, ...userProxyPlugins }
proxyPluginError = false
} catch (err) {
if (!proxyPluginError) {
console.error(err.message)
console.error(proxyPluginsPath)
console.error(userProxyPluginsContent)
proxyPluginError = true
}
}
}
return proxyPluginConfig[packageName] ? { ...proxyPluginConfig[packageName] } : undefined
}

Expand Down
40 changes: 40 additions & 0 deletions lib/plugins/plugin-utils.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* eslint-env jest */

// npm dependencies
const fs = require('fs')

// local dependencies
const { getProxyPluginConfig } = require('./plugin-utils')

const testPluginConfig = {
scripts: './dist/test-script.js'
}
jest.mock('fs-extra', () => {
return {
existsSync: jest.fn().mockReturnValue(true)
}
})

describe('getProxyPluginConfig', () => {
beforeEach(() => {
jest.spyOn(fs, 'readFileSync').mockImplementation(() => {
return JSON.stringify({
'test-plugin-config': testPluginConfig
})
})
})

afterEach(() => {
jest.restoreAllMocks()
})

it('get jquery proxy plugin config', () => {
const pluginConfig = getProxyPluginConfig('jquery')
expect(Object.keys(pluginConfig)).toEqual(['scripts', 'assets', 'meta'])
})

it('get test script proxy plugin config', () => {
const pluginConfig = getProxyPluginConfig('test-plugin-config')
expect(pluginConfig).toEqual(testPluginConfig)
})
})
6 changes: 5 additions & 1 deletion lib/plugins/plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,11 @@ let pluginsByType
* @private
*/
function setPluginsByType () {
pluginsByType = getPluginsByType()
try {
pluginsByType = getPluginsByType()
} catch (err) {
pluginsByType = {}
}
}

setPluginsByType()
Expand Down

0 comments on commit 667abeb

Please sign in to comment.