adapt-authoring-config 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/releases.yml +9 -2
- package/.github/workflows/standardjs.yml +13 -0
- package/docs/plugins/configuration.js +53 -49
- package/package.json +9 -10
- package/tests/configModule.spec.js +57 -55
- package/tests/configUtils.spec.js +35 -33
- package/tests/data/conf/config.schema.js +1 -1
- package/tests/data/incorrecttype/conf/config.schema.js +1 -1
- package/tests/data/invalid/conf/config.schema.js +1 -1
- package/tests/data/required/conf/config.schema.js +1 -1
- package/.eslintignore +0 -1
- package/.eslintrc +0 -14
|
@@ -3,10 +3,16 @@ on:
|
|
|
3
3
|
push:
|
|
4
4
|
branches:
|
|
5
5
|
- master
|
|
6
|
+
|
|
6
7
|
jobs:
|
|
7
8
|
release:
|
|
8
9
|
name: Release
|
|
9
10
|
runs-on: ubuntu-latest
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write # to be able to publish a GitHub release
|
|
13
|
+
issues: write # to be able to comment on released issues
|
|
14
|
+
pull-requests: write # to be able to comment on released pull requests
|
|
15
|
+
id-token: write # to enable use of OIDC for trusted publishing and npm provenance
|
|
10
16
|
steps:
|
|
11
17
|
- name: Checkout
|
|
12
18
|
uses: actions/checkout@v3
|
|
@@ -16,10 +22,11 @@ jobs:
|
|
|
16
22
|
uses: actions/setup-node@v3
|
|
17
23
|
with:
|
|
18
24
|
node-version: 'lts/*'
|
|
25
|
+
- name: Update npm
|
|
26
|
+
run: npm install -g npm@latest
|
|
19
27
|
- name: Install dependencies
|
|
20
28
|
run: npm ci
|
|
21
29
|
- name: Release
|
|
22
30
|
env:
|
|
23
31
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
24
|
-
|
|
25
|
-
run: npx semantic-release
|
|
32
|
+
run: npx semantic-release
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: Standard.js formatting check
|
|
2
|
+
on: push
|
|
3
|
+
jobs:
|
|
4
|
+
default:
|
|
5
|
+
runs-on: ubuntu-latest
|
|
6
|
+
steps:
|
|
7
|
+
- uses: actions/checkout@master
|
|
8
|
+
- uses: actions/setup-node@master
|
|
9
|
+
with:
|
|
10
|
+
node-version: 'lts/*'
|
|
11
|
+
cache: 'npm'
|
|
12
|
+
- run: npm ci
|
|
13
|
+
- run: npx standard
|
|
@@ -1,70 +1,74 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import path from 'path'
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
3
|
|
|
4
4
|
export default class Configuration {
|
|
5
|
-
async run() {
|
|
6
|
-
const schemas = this.loadSchemas()
|
|
7
|
-
this.contents = Object.keys(schemas).sort()
|
|
8
|
-
this.manualFile = 'configuration.md'
|
|
5
|
+
async run () {
|
|
6
|
+
const schemas = this.loadSchemas()
|
|
7
|
+
this.contents = Object.keys(schemas).sort()
|
|
8
|
+
this.manualFile = 'configuration.md'
|
|
9
9
|
this.replace = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
10
|
+
CODE_EXAMPLE: this.generateCodeExample(schemas),
|
|
11
|
+
LIST: this.generateList(schemas)
|
|
12
|
+
}
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
|
|
15
|
+
loadSchemas () {
|
|
16
|
+
const schemas = {}
|
|
16
17
|
Object.values(this.app.dependencies).forEach(c => {
|
|
17
|
-
const confDir = path.join(c.rootDir, 'conf')
|
|
18
|
+
const confDir = path.join(c.rootDir, 'conf')
|
|
18
19
|
try {
|
|
19
|
-
schemas[c.name] = JSON.parse(fs.readFileSync(path.join(confDir, 'config.schema.json')))
|
|
20
|
-
} catch(e) {}
|
|
21
|
-
})
|
|
22
|
-
return schemas
|
|
20
|
+
schemas[c.name] = JSON.parse(fs.readFileSync(path.join(confDir, 'config.schema.json')))
|
|
21
|
+
} catch (e) {}
|
|
22
|
+
})
|
|
23
|
+
return schemas
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
generateCodeExample (schemas) {
|
|
27
|
+
let output = '```javascript\nexport default {\n'
|
|
26
28
|
this.contents.forEach((name) => {
|
|
27
|
-
const schema = schemas[name]
|
|
28
|
-
output += ` '${name}': {\n
|
|
29
|
+
const schema = schemas[name]
|
|
30
|
+
output += ` '${name}': {\n`
|
|
29
31
|
Object.entries(schema.properties).forEach(([attr, config]) => {
|
|
30
|
-
const required = schema.required && schema.required.includes(attr)
|
|
31
|
-
if(config.description) output += ` // ${config.description}\n
|
|
32
|
-
output += ` ${attr}: ${this.defaultToMd(config)}, // ${config.type}, ${required ? 'required' : 'optional'}\n
|
|
33
|
-
})
|
|
34
|
-
output +=
|
|
35
|
-
})
|
|
36
|
-
output +=
|
|
37
|
-
return output
|
|
32
|
+
const required = schema.required && schema.required.includes(attr)
|
|
33
|
+
if (config.description) output += ` // ${config.description}\n`
|
|
34
|
+
output += ` ${attr}: ${this.defaultToMd(config)}, // ${config.type}, ${required ? 'required' : 'optional'}\n`
|
|
35
|
+
})
|
|
36
|
+
output += ' },\n'
|
|
37
|
+
})
|
|
38
|
+
output += '};\n```'
|
|
39
|
+
return output
|
|
38
40
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
generateList (schemas) {
|
|
43
|
+
let output = ''
|
|
41
44
|
|
|
42
45
|
this.contents.forEach(dep => {
|
|
43
|
-
const schema = schemas[dep]
|
|
44
|
-
output += `<h3 id="${dep}" class="dep">${dep}</h3>\n\n
|
|
45
|
-
output +=
|
|
46
|
+
const schema = schemas[dep]
|
|
47
|
+
output += `<h3 id="${dep}" class="dep">${dep}</h3>\n\n`
|
|
48
|
+
output += '<div class="options">\n'
|
|
46
49
|
Object.entries(schema.properties).forEach(([attr, config]) => {
|
|
47
|
-
const required = schema.required && schema.required.includes(attr)
|
|
48
|
-
output +=
|
|
49
|
-
output += `<div class="title"><span class="main">${attr}</span> (${config.type || ''}, ${required ? 'required' : 'optional'})</div>\n
|
|
50
|
-
output +=
|
|
51
|
-
output += `<div class="description">${config.description}</div>\n
|
|
52
|
-
if(!required) {
|
|
53
|
-
output += `<div class="default"><span class="label">Default</span>: <pre>${this.defaultToMd(config)}</pre></div>\n
|
|
50
|
+
const required = schema.required && schema.required.includes(attr)
|
|
51
|
+
output += '<div class="attribute">\n'
|
|
52
|
+
output += `<div class="title"><span class="main">${attr}</span> (${config.type || ''}, ${required ? 'required' : 'optional'})</div>\n`
|
|
53
|
+
output += '<div class="inner">\n'
|
|
54
|
+
output += `<div class="description">${config.description}</div>\n`
|
|
55
|
+
if (!required) {
|
|
56
|
+
output += `<div class="default"><span class="label">Default</span>: <pre>${this.defaultToMd(config)}</pre></div>\n`
|
|
54
57
|
}
|
|
55
|
-
output +=
|
|
56
|
-
output +=
|
|
57
|
-
})
|
|
58
|
-
output +=
|
|
59
|
-
output +=
|
|
60
|
-
})
|
|
58
|
+
output += '</div>\n'
|
|
59
|
+
output += '</div>\n'
|
|
60
|
+
})
|
|
61
|
+
output += '</div>'
|
|
62
|
+
output += '\n\n'
|
|
63
|
+
})
|
|
61
64
|
|
|
62
|
-
return output
|
|
65
|
+
return output
|
|
63
66
|
}
|
|
67
|
+
|
|
64
68
|
/**
|
|
65
69
|
* Returns a string formatted nicely for markdown
|
|
66
70
|
*/
|
|
67
|
-
defaultToMd(config) {
|
|
68
|
-
return JSON.stringify(config.default)
|
|
71
|
+
defaultToMd (config) {
|
|
72
|
+
return JSON.stringify(config.default)
|
|
69
73
|
}
|
|
70
74
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adapt-authoring-config",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "A configuration module for the Adapt authoring tool.",
|
|
5
5
|
"homepage": "https://github.com/adapt-security/adapt-authoring-config",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -19,16 +19,15 @@
|
|
|
19
19
|
"adapt-authoring-core": "github:adapt-security/adapt-authoring-core"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"
|
|
23
|
-
"standard": "^17.1.0",
|
|
24
|
-
"@semantic-release/commit-analyzer": "^9.0.2",
|
|
22
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
25
23
|
"@semantic-release/git": "^10.0.1",
|
|
26
|
-
"@semantic-release/github": "^
|
|
27
|
-
"@semantic-release/npm": "^
|
|
28
|
-
"@semantic-release/release-notes-generator": "^
|
|
29
|
-
"conventional-changelog-eslint": "^
|
|
30
|
-
"semantic-release": "^
|
|
31
|
-
"semantic-release-replace-plugin": "^1.2.7"
|
|
24
|
+
"@semantic-release/github": "^12.0.2",
|
|
25
|
+
"@semantic-release/npm": "^13.1.2",
|
|
26
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
27
|
+
"conventional-changelog-eslint": "^6.0.0",
|
|
28
|
+
"semantic-release": "^25.0.2",
|
|
29
|
+
"semantic-release-replace-plugin": "^1.2.7",
|
|
30
|
+
"standard": "^17.1.0"
|
|
32
31
|
},
|
|
33
32
|
"release": {
|
|
34
33
|
"plugins": [
|
|
@@ -1,61 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const should = require('should');
|
|
1
|
+
/* global before describe, it */
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
it('should
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
it('should be able to verify a value
|
|
21
|
-
const exists = this.config.has('adapt-authoring-testing.
|
|
22
|
-
exists.should.
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
config.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
3
|
+
const Config = require('../lib/configUtils')
|
|
4
|
+
const path = require('path')
|
|
5
|
+
// const should = require('should')
|
|
6
|
+
|
|
7
|
+
describe('Config module', function () {
|
|
8
|
+
before(function () {
|
|
9
|
+
this.config = new Config(global.ADAPT.app, {})
|
|
10
|
+
this.configJson = require(path.join(process.cwd(), 'conf', 'testing.config.js'))
|
|
11
|
+
})
|
|
12
|
+
describe('#initialise()', function () {
|
|
13
|
+
it('should error on missing required attribute', runConfigInitialise('required'))
|
|
14
|
+
it('should error on incorrect attribute type', runConfigInitialise('incorrecttype'))
|
|
15
|
+
it('should error on validator fail', runConfigInitialise('invalid'))
|
|
16
|
+
})
|
|
17
|
+
describe('#has()', function () {
|
|
18
|
+
it('should be able to verify a value exists', function () {
|
|
19
|
+
const exists = this.config.has('adapt-authoring-testing.test')
|
|
20
|
+
exists.should.be.true()
|
|
21
|
+
})
|
|
22
|
+
it('should be able to verify a value doesn\'t exist', function () {
|
|
23
|
+
const exists = this.config.has('adapt-authoring-testing.nonono')
|
|
24
|
+
exists.should.not.be.true()
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
describe('#get()', function () {
|
|
28
|
+
it('should be able to retrieve a value', function () {
|
|
29
|
+
const actualValue = this.config.get('adapt-authoring-testing.test')
|
|
30
|
+
const expectedValue = this.configJson['adapt-authoring-testing'].test
|
|
31
|
+
actualValue.should.equal(expectedValue)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
describe('#set()', function () {
|
|
35
|
+
it('should be able to set a value', function () {
|
|
36
|
+
const newValue = 'newtestvalue'
|
|
37
|
+
this.config.set('adapt-authoring-testing.test', newValue)
|
|
38
|
+
const actualValue = this.config.get('adapt-authoring-testing.test')
|
|
39
|
+
actualValue.should.equal(newValue)
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
describe('#getPublicConfig()', function () {
|
|
43
|
+
it('should be able to retrieve values marked as public', function () {
|
|
44
|
+
this.config.app.dependencies = [{ name: 'adapt-authoring-testing', dir: path.join(__dirname, 'data') }]
|
|
45
|
+
this.config.initialise()
|
|
46
|
+
const config = this.config.getPublicConfig()
|
|
47
|
+
const value = config['adapt-authoring-testing.one']
|
|
48
|
+
config.should.be.an.Object()
|
|
49
|
+
value.should.equal('default')
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
})
|
|
51
53
|
/**
|
|
52
54
|
* Checks ConfigUtility#initialise
|
|
53
55
|
* Loads the testing data in tests/data/dirname
|
|
54
56
|
*/
|
|
55
|
-
function runConfigInitialise(dirname) {
|
|
56
|
-
return function() {
|
|
57
|
-
this.config.app.dependencies = [{ name: 'adapt-authoring-testing', dir: path.join(__dirname, 'data', dirname) }]
|
|
58
|
-
this.config.initialise()
|
|
59
|
-
this.config.errors.length.should.be.exactly(1)
|
|
60
|
-
}
|
|
57
|
+
function runConfigInitialise (dirname) {
|
|
58
|
+
return function () {
|
|
59
|
+
this.config.app.dependencies = [{ name: 'adapt-authoring-testing', dir: path.join(__dirname, 'data', dirname) }]
|
|
60
|
+
this.config.initialise()
|
|
61
|
+
this.config.errors.length.should.be.exactly(1)
|
|
62
|
+
}
|
|
61
63
|
}
|
|
@@ -1,34 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
const utils = require('../lib/ConfigUtils');
|
|
3
|
-
const should = require('should');
|
|
1
|
+
/* global describe, it */
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
3
|
+
const path = require('path')
|
|
4
|
+
const utils = require('../lib/ConfigUtils')
|
|
5
|
+
const should = require('should')
|
|
6
|
+
|
|
7
|
+
describe('Config utils', function () {
|
|
8
|
+
describe('#loadFile()', function () {
|
|
9
|
+
it('should be able to load a valid file', function () {
|
|
10
|
+
const filepath = path.join(__dirname, 'data', 'testfile.json')
|
|
11
|
+
const actualContents = utils.loadFile(filepath)
|
|
12
|
+
const expectedContents = require(filepath)
|
|
13
|
+
actualContents.should.deepEqual(expectedContents)
|
|
14
|
+
})
|
|
15
|
+
it('should not error on a missing file', function () {
|
|
16
|
+
should.doesNotThrow(function () {
|
|
17
|
+
const contents = utils.loadFile(path.join('this', 'path', 'does', 'not', 'exist.xyz'))
|
|
18
|
+
should(contents).be.undefined()
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
describe('#loadConfigSchema()', function () {
|
|
23
|
+
it('should be able to load a valid schema file', function () {
|
|
24
|
+
const dir = path.join(__dirname, 'data')
|
|
25
|
+
const actualContents = utils.loadConfigSchema(dir)
|
|
26
|
+
const expectedContents = require(path.join(dir, 'conf', 'config.schema.js'))
|
|
27
|
+
actualContents.should.deepEqual(expectedContents)
|
|
28
|
+
})
|
|
29
|
+
it('should not error on a missing schema file', function () {
|
|
30
|
+
should.doesNotThrow(function () {
|
|
31
|
+
const contents = utils.loadConfigSchema(path.join(__dirname, 'doesntexist'))
|
|
32
|
+
should(contents).be.undefined()
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
})
|
package/.eslintignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
node_modules
|