-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #38 from pfongkye/feat/config-json
feat(config): use json for project configs
- Loading branch information
Showing
12 changed files
with
259 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import { defaultReleaseManager } from '@/release/commands/create/managers/defaultReleaseManager'; | ||
import { federationReleaseTagManager } from '@/release/commands/create/managers/federationReleaseTagManager'; | ||
import { buildProjectReleaseConfigs } from '@/release/utils/configBuilder'; | ||
|
||
describe('configBuilder', () => { | ||
it('should build configs', () => { | ||
const projects = [ | ||
{ | ||
releaseManager: 'defaultReleaseManager', | ||
releaseTagManager: 'federationReleaseTagManager', | ||
notificationChannelIds: ['C678'], | ||
projectId: 123, | ||
releaseChannelId: 'C456', | ||
}, | ||
{ | ||
releaseManager: 'defaultReleaseManager', | ||
notificationChannelIds: ['C678'], | ||
projectId: 890, | ||
releaseChannelId: 'C456', | ||
}, | ||
]; | ||
expect( | ||
buildProjectReleaseConfigs( | ||
{ projects }, | ||
{ defaultReleaseManager }, | ||
{ federationReleaseTagManager } | ||
) | ||
).toEqual([ | ||
{ | ||
notificationChannelIds: ['C678'], | ||
projectId: 123, | ||
releaseChannelId: 'C456', | ||
releaseManager: defaultReleaseManager, | ||
releaseTagManager: federationReleaseTagManager, | ||
}, | ||
{ | ||
notificationChannelIds: ['C678'], | ||
projectId: 890, | ||
releaseChannelId: 'C456', | ||
releaseManager: defaultReleaseManager, | ||
}, | ||
]); | ||
}); | ||
it('should throw an error if projects is not an array', () => { | ||
expect(() => | ||
buildProjectReleaseConfigs( | ||
{} as any, | ||
{ defaultReleaseManager }, | ||
{ federationReleaseTagManager } | ||
) | ||
).toThrow( | ||
'The config file should contain an array of valid project configurations' | ||
); | ||
}); | ||
it('should throw an error if there is an invalid project configuration', () => { | ||
expect(() => | ||
buildProjectReleaseConfigs( | ||
[{ projectId: 123, releaseManager: 'defaultReleaseManager' }] as any, | ||
{ defaultReleaseManager }, | ||
{ federationReleaseTagManager } | ||
) | ||
).toThrow( | ||
'The config file should contain an array of valid project configurations' | ||
); | ||
}); | ||
}); |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"projects": [ | ||
{ | ||
"description": "project_example", | ||
"notificationChannelIds": ["C0XXXXXXXXX"], | ||
"projectId": 1148, | ||
"releaseChannelId": "C0XXXXXXXXX", | ||
"releaseManager": "defaultReleaseManager", | ||
"releaseTagManager": "stableDateReleaseTagManager" | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
import type { JSONSchemaType } from 'ajv'; | ||
import Ajv from 'ajv'; | ||
import type { | ||
ProjectConfigurationsJSON, | ||
ProjectReleaseConfig, | ||
ProjectConfigJSON, | ||
} from '../typings/ProjectReleaseConfig'; | ||
import type { ReleaseManager } from '../typings/ReleaseManager'; | ||
import type { ReleaseTagManager } from '../typings/ReleaseTagManager'; | ||
|
||
// only one Ajv instance should be used across all the application | ||
// maybe a singleton class would be better | ||
const ajv = new Ajv(); | ||
|
||
const projectSchema: JSONSchemaType<ProjectConfigJSON> = { | ||
type: 'object', | ||
properties: { | ||
notificationChannelIds: { type: 'array', items: { type: 'string' } }, | ||
projectId: { type: 'number' }, | ||
releaseChannelId: { type: 'string' }, | ||
releaseManager: { type: 'string' }, | ||
releaseTagManager: { type: 'string', nullable: true }, | ||
description: { type: 'string', nullable: true }, | ||
hasReleasePipeline: { type: 'boolean', nullable: true }, | ||
}, | ||
required: [ | ||
'notificationChannelIds', | ||
'projectId', | ||
'releaseChannelId', | ||
'releaseManager', | ||
], | ||
additionalProperties: false, | ||
}; | ||
|
||
const configsSchema: JSONSchemaType<ProjectConfigurationsJSON> = { | ||
type: 'object', | ||
properties: { | ||
projects: { | ||
type: 'array', | ||
items: projectSchema, | ||
}, | ||
}, | ||
required: ['projects'], | ||
additionalProperties: false, | ||
}; | ||
|
||
const validateProjectReleaseConfig = ajv.compile(configsSchema); | ||
|
||
export function buildProjectReleaseConfigs( | ||
configs: ProjectConfigurationsJSON, | ||
releaseManagers: Record<string, ReleaseManager>, | ||
releaseTagManagers: Record<string, ReleaseTagManager> | ||
) { | ||
if (!validateProjectReleaseConfig(configs)) { | ||
throw new Error( | ||
'The config file should contain an array of valid project configurations' | ||
); | ||
} | ||
const projects: ProjectReleaseConfig[] = []; | ||
for (const project of configs.projects) { | ||
const { | ||
releaseManager, | ||
releaseTagManager, | ||
notificationChannelIds, | ||
projectId, | ||
releaseChannelId, | ||
} = project; | ||
if (releaseManager in releaseManagers) { | ||
projects.push({ | ||
notificationChannelIds, | ||
projectId, | ||
releaseChannelId, | ||
releaseManager: releaseManagers[releaseManager], | ||
releaseTagManager: releaseTagManager | ||
? releaseTagManagers[releaseTagManager] | ||
: undefined, | ||
}); | ||
} | ||
} | ||
return projects; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters