accelerator-core
Version:
[](https://travis-ci.org/furkleindustries/accelerator-core)
69 lines (55 loc) • 1.74 kB
text/typescript
import {
checkMutatorObject,
} from './checkMutatorObject';
import {
precedenceSort,
} from '../functions/precedenceSort';
import {
InkMutatorObject,
} from './InkMutatorObject';
import {
assert,
} from 'ts-assertions';
import manifest from '../../ink-mutators/mutators-manifest';
export const strings = {
MUTATORS_MANIFEST_INVALID:
'The mutators-manifest.json file was not parseable into an array.',
MUTATOR_OBJECT_INVALID:
'One of the mutator objects, found at %FILEPATH%, was invalid. ' +
'%REASON%',
};
assert(Array.isArray(manifest), strings.MUTATORS_MANIFEST_INVALID);
/* Memoize results and return them without computation on repeat calls. */
let mutatorsList: readonly InkMutatorObject[] | null = null;
export const getInkMutators = (): readonly InkMutatorObject[] => {
if (mutatorsList) {
return mutatorsList;
}
type temp = { [key: string]: InkMutatorObject[] } & { none: InkMutatorObject[] };
const mutatorsPrecedenceMap: temp = { none: [] };
manifest.forEach(({
asset,
filepath,
}) => {
const mutatorObj = asset;
try {
checkMutatorObject(mutatorObj);
} catch (err) {
const errStr = strings.MUTATOR_OBJECT_INVALID
.replace('%FILEPATH%', filepath)
.replace('%REASON%', err);
throw new Error(errStr);
}
if (mutatorObj.precedence! > 0) {
const precedence = String(mutatorObj.precedence);
if (!mutatorsPrecedenceMap[precedence]) {
mutatorsPrecedenceMap[precedence] = [];
}
mutatorsPrecedenceMap[precedence].push(mutatorObj);
} else {
mutatorsPrecedenceMap.none.push(mutatorObj);
}
});
mutatorsList = precedenceSort(mutatorsPrecedenceMap);
return mutatorsList;
};