All files / src/configgen jsonProjectConfigGen.ts

91.17% Statements 31/34
57.14% Branches 4/7
100% Functions 12/12
100% Lines 30/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 941x 1x   1x   1x       2x 2x 4x 4x   2x           2x                   2x               4x         4x                   2x 2x       2x 2x       2x 2x       4x 4x 2x 2x         4x 2x         2x 2x 2x 2x   2x            
import { ContractSchemaImpl } from '../codegen/contractSchema';
import { parseJson } from '../codegen/contractSchemaJsonParser';
import { ContractConfig, ContractRelation, MintConfig, ProjectConfig, ScopeConfig } from "../types";
import { JSONContractConfigGen } from './jsonContractConfigGen';
 
export class JSONProjectConfigGen {
    constructor() { }
 
    gen(projectConfig: ProjectConfig): string {
        let contractConfigString = '';
        Object.entries(projectConfig.contracts).forEach(([key, value]) => {
            if (contractConfigString.length > 0) { contractConfigString += ',\n' };
            contractConfigString += this.genContractConfig(key, value, projectConfig.contractRelations[key]);
        });
        return `` +
            `{\n` +
            `    "$schema": "https://patchwork.dev/schema/patchwork-project-config.schema.json",\n` +
            `    "name": "${projectConfig.name}",\n` +
            `    "scopes": {\n` +
            projectConfig.scopes.map(scope => {
                return this.genScopeConfig(scope);
            }).join(',\n') +
            `\n    },\n` +
            `    "contracts": {\n` +
            contractConfigString + `\n` +
            `    }\n` +
            `}`;
    }
 
    genScopeConfig(scopeConfig: ScopeConfig): string {
        return `        "${scopeConfig.name}": {\n` +
            `            "name": "${scopeConfig.name}",\n` +
            `            "owner": "${scopeConfig.owner}",\n` +
            `            "whitelist": ${scopeConfig.whitelist},\n` +
            `            "userAssign": ${scopeConfig.userAssign},\n` +
            `            "userPatch": ${scopeConfig.userPatch},\n` +
            `            "bankers": [` +
            scopeConfig.bankers?.map(banker => {
                return `"${banker}"`;
            }).join(',') +
            `],\n` +
            `            "operators": [` +
            scopeConfig.operators?.map(operator => {
                return `"${operator}"`;
            }).join(',') +
            `],\n` +
            `            "mintConfigs": ${this.genMintConfigs(scopeConfig.mintConfigs)},\n` +
            `            "patchFees": ${this.genPatchFees(scopeConfig.patchFees)},\n` +
            `            "assignFees": ${this.genAssignFees(scopeConfig.assignFees)}\n` +
            `        }`;
    }
 
    genMintConfigs(mintConfigs: Record<string, MintConfig> | undefined): string {
        Iif (!mintConfigs) return '{}';
        return JSON.stringify(mintConfigs);
    }
 
    genPatchFees(patchFees: Record<string, number> | undefined): string {
        Iif (!patchFees) return '{}';
        return JSON.stringify(patchFees);
    }
 
    genAssignFees(assignFees: Record<string, number> | undefined): string {
        Iif (!assignFees) return '{}';
        return JSON.stringify(assignFees);
    }
 
    genContractConfig(name: string, value: string | ContractConfig, relations: ContractRelation | undefined): string {
        let fragments = '';
        if (relations) {
            fragments = `,\n            "fragments": [\n` + relations.fragments.map(fragment => {
                return `                "${fragment}"`;
            }).join(',\n') +
                `\n            ]`;
        }
        
        if (typeof value === 'string') {
            return `        "${name}": {\n` +
                   `            "config": "${value}"` +
                   `${fragments}\n` +
                   `        }`;
        } else {
            const generator = new JSONContractConfigGen();
            const contractConfig = parseJson(value);
            const contractConfigString = generator.gen(new ContractSchemaImpl(contractConfig)).split('\n');
            contractConfigString.pop();
 
            return `        "${name}": {\n` +
                   `            "config": ${contractConfigString.join('\n            ')}` +
                   `${fragments}\n` +
                   `        }`;
        }
    }
}