diff --git a/.gitignore b/.gitignore index 120b559c..0a2d9c58 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,6 @@ yarn.lock # aws sam stuff .aws-sam samconfig.toml + +# test file to be ignored +test.log diff --git a/lib/deploymentConfig.js b/lib/deploymentConfig.js index cd3391a1..6cfbc460 100644 --- a/lib/deploymentConfig.js +++ b/lib/deploymentConfig.js @@ -23,7 +23,7 @@ class DeploymentConfig { if (this.isIterable(overridevalidators)) { for (const validator of overridevalidators) { // eslint-disable-next-line no-new-func - const f = new Function('baseconfig', 'overrideconfig', validator.script) + const f = new Function('baseconfig', 'overrideconfig', 'githubContext', validator.script) this.overridevalidators[validator.plugin] = { canOverride: f, error: validator.error } } } @@ -31,7 +31,7 @@ class DeploymentConfig { if (this.isIterable(configvalidators)) { for (const validator of configvalidators) { // eslint-disable-next-line no-new-func - const f = new Function('baseconfig', validator.script) + const f = new Function('baseconfig', 'githubContext', validator.script) this.configvalidators[validator.plugin] = { isValid: f, error: validator.error } } } diff --git a/lib/mergeArrayBy.js b/lib/mergeArrayBy.js index 5e07bf30..9faa42e2 100644 --- a/lib/mergeArrayBy.js +++ b/lib/mergeArrayBy.js @@ -11,26 +11,26 @@ function findMatchingIndex (properties, sourceItem, target) { } } -function mergeBy (key, configvalidator, overridevalidator, properties, target, source, options) { +function mergeBy (key, configvalidator, overridevalidator, properties, target, source, options, githubContext) { const destination = target.slice() source.forEach(sourceItem => { const matchingIndex = findMatchingIndex(properties, sourceItem, target) if (matchingIndex > -1) { if (overridevalidator) { - if (!overridevalidator.canOverride(target[matchingIndex], sourceItem)) { + if (!overridevalidator.canOverride(target[matchingIndex], sourceItem, githubContext)) { throw new Error(overridevalidator.error) } } destination[matchingIndex] = merge(target[matchingIndex], sourceItem, options) if (configvalidator) { - if (!configvalidator.isValid(destination[matchingIndex])) { + if (!configvalidator.isValid(destination[matchingIndex], githubContext)) { throw new Error(configvalidator.error) } } } else { destination.push(sourceItem) if (configvalidator) { - if (!configvalidator.isValid(sourceItem)) { + if (!configvalidator.isValid(sourceItem, githubContext)) { throw new Error(configvalidator.error) } } diff --git a/lib/mergeDeep.js b/lib/mergeDeep.js index 69b5c548..8fc3bb56 100644 --- a/lib/mergeDeep.js +++ b/lib/mergeDeep.js @@ -6,8 +6,9 @@ const NAME_USERNAME_PROPERTY = item => NAME_FIELDS.find(prop => Object.prototype const GET_NAME_USERNAME_PROPERTY = item => { if (NAME_USERNAME_PROPERTY(item)) return item[NAME_USERNAME_PROPERTY(item)] } class MergeDeep { - constructor (log, ignorableFields, configvalidators = {}, overridevalidators = {}) { + constructor (log, github, ignorableFields, configvalidators = {}, overridevalidators = {}) { this.log = log + this.github = github this.ignorableFields = ignorableFields this.configvalidators = DeploymentConfig.configvalidators this.overridevalidators = DeploymentConfig.overridevalidators @@ -269,7 +270,7 @@ class MergeDeep { } if (this.overridevalidators[key]) { // this.log.debug(`Calling overridevalidator for key ${key} `) - if (!this.overridevalidators[key].canOverride(baseconfig, overrideconfig)) { + if (!this.overridevalidators[key].canOverride(baseconfig, overrideconfig, this.github)) { this.log.error(`Error in calling overridevalidator for key ${key} ${this.overridevalidators[key].error}`) throw new Error(this.overridevalidators[key].error) } @@ -279,7 +280,7 @@ class MergeDeep { validateConfig (key, baseconfig) { if (this.configvalidators[key]) { // this.log.debug(`Calling configvalidator for key ${key} `) - if (!this.configvalidators[key].isValid(baseconfig)) { + if (!this.configvalidators[key].isValid(baseconfig, this.github)) { this.log.error(`Error in calling configvalidator for key ${key} ${this.configvalidators[key].error}`) throw new Error(this.configvalidators[key].error) } @@ -311,7 +312,7 @@ class MergeDeep { // Deep merge Array so that if the same element is there in source and target, // override the target with source otherwise include both source and target elements if (Array.isArray(source[key]) && Array.isArray(target[key])) { - const combined = mergeBy(key, this.configvalidators[key], this.overridevalidators[key], NAME_FIELDS, target[key], source[key]) + const combined = mergeBy(key, this.configvalidators[key], this.overridevalidators[key], NAME_FIELDS, target[key], source[key], this.github) Object.assign(target, { [key]: combined }) diff --git a/lib/settings.js b/lib/settings.js index c2db6631..4877cd72 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -77,19 +77,20 @@ class Settings { if (this.isIterable(overridevalidators)) { for (const validator of overridevalidators) { // eslint-disable-next-line no-new-func - const f = new Function('baseconfig', 'overrideconfig', validator.script) + const f = new Function('baseconfig', 'overrideconfig', 'githubContext', validator.script) this.overridevalidators[validator.plugin] = { canOverride: f, error: validator.error } } } const configvalidators = config.configvalidators if (this.isIterable(configvalidators)) { for (const validator of configvalidators) { + this.log.debug(`Logging each script: ${typeof validator.script}`) // eslint-disable-next-line no-new-func - const f = new Function('baseconfig', validator.script) + const f = new Function('baseconfig', 'githubContext', validator.script) this.configvalidators[validator.plugin] = { isValid: f, error: validator.error } } } - this.mergeDeep = new MergeDeep(this.log, [], this.configvalidators, this.overridevalidators) + this.mergeDeep = new MergeDeep(this.log, this.github, [], this.configvalidators, this.overridevalidators) } // Create a check in the Admin repo for safe-settings. @@ -411,7 +412,7 @@ ${this.results.reduce((x, y) => { const configValidator = this.configvalidators[section] if (configValidator) { this.log.debug(`Calling configvalidator for key ${section} `) - if (!configValidator.isValid(overrideConfig)) { + if (!configValidator.isValid(overrideConfig, this.github)) { this.log.error(`Error in calling configvalidator for key ${section} ${configValidator.error}`) throw new Error(configValidator.error) } @@ -419,7 +420,7 @@ ${this.results.reduce((x, y) => { const overridevalidator = this.overridevalidators[section] if (overridevalidator) { this.log.debug(`Calling overridevalidator for key ${section} `) - if (!overridevalidator.canOverride(baseConfig, overrideConfig)) { + if (!overridevalidator.canOverride(baseConfig, overrideConfig, this.github)) { this.log.error(`Error in calling overridevalidator for key ${section} ${overridevalidator.error}`) throw new Error(overridevalidator.error) } diff --git a/test/unit/lib/mergeDeep.test.js b/test/unit/lib/mergeDeep.test.js index a6c56a0f..2fe015c6 100644 --- a/test/unit/lib/mergeDeep.test.js +++ b/test/unit/lib/mergeDeep.test.js @@ -182,7 +182,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`source ${JSON.stringify(source, null, 2)}`) console.log(`target ${JSON.stringify(target, null, 2)}`) @@ -238,7 +245,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(undefined, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -280,7 +294,14 @@ branches: hasChanges: true } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep({}, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -395,7 +416,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`source ${JSON.stringify(source, null, 2)}`) console.log(`target ${JSON.stringify(target, null, 2)}`) @@ -419,7 +447,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) // console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -466,7 +501,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) // console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -493,7 +535,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -521,7 +570,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -589,7 +645,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) // console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -624,7 +687,14 @@ branches: const expected = JSON.parse(`{"additions":{"x":[{"name":"new","values":{"a":["b"]}}]},"modifications":{"x":[{"values":{"a":["b"]},"name":"default"}]},"hasChanges":true}`) const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) // console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -699,7 +769,14 @@ branches: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) //console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.additions).toEqual(expected.additions) @@ -784,7 +861,14 @@ entries: hasChanges: true } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged).toEqual(expected) @@ -792,7 +876,14 @@ entries: it('CompareDeep does not mutate source object', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = { teams: [ { name: 'developers' }, @@ -814,7 +905,14 @@ entries: it('CompareDeep produces correct result for arrays of named objects', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = { teams: [ { name: 'developers' }, @@ -836,7 +934,14 @@ entries: it('CompareDeep result has changes when source is empty and target is not', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = { required_pull_request_reviews: { dismissal_restrictions: { @@ -863,7 +968,14 @@ entries: it('CompareDeep result has no change when source and target match', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = { required_pull_request_reviews: { dismissal_restrictions: { @@ -890,7 +1002,14 @@ entries: it('CompareDeep finds modifications on top-level arrays with different ordering', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = [ { username: 'collaborator-1' }, { username: 'collaborator-2' }, @@ -906,7 +1025,14 @@ entries: it('CompareDeep does not report changes for matching empty targets', () => { const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const target = [] const source = [] const result = mergeDeep.compareDeep(target, source) @@ -945,7 +1071,14 @@ entries: } const ignorableFields = [] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) console.log(`diffs ${JSON.stringify(merged, null, 2)}`) expect(merged.deletions).toEqual(expected.deletions) @@ -1168,7 +1301,14 @@ entries: } ] const ignorableFields = ['id', 'node_id', 'default', 'url'] - const mergeDeep = new MergeDeep(log, ignorableFields) + const mockReturnGitHubContext = jest.fn().mockReturnValue({ + request: () => {}, + }); + const mergeDeep = new MergeDeep( + log, + mockReturnGitHubContext, + ignorableFields + ); const merged = mergeDeep.compareDeep(target, source) expect(merged.hasChanges).toBeFalsy() //console.log(`source ${JSON.stringify(source, null, 2)}`)