{"version":3,"file":"globals.js","sourceRoot":"","sources":["../../src/bundler/globals.ts"],"names":[],"mappings":";;AAAA,6BAA+B;AAC/B,+BAAiC;AACjC,uBAAyB;AAGzB,6CAA2C;AAG3C;IAEI,iBAAoB,MAAqB,EAAU,QAAkB;QAAjD,WAAM,GAAN,MAAM,CAAe;QAAU,aAAQ,GAAR,QAAQ,CAAU;IAAI,CAAC;IAEnE,qBAAG,GAAV,UAAW,MAAoB,EAAE,WAAqB,EAAE,cAA0B;QAAlF,iBAkBC;QAhBG,IAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,UAAC,IAAgB,EAAE,gBAAgB;YACvD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,UAAC,UAAU,EAAE,gBAAgB;gBAC7D,KAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;oBAC3D,gBAAgB,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC,EAAE;gBACC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACrB,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,gBAAgB,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,cAAc,CAAC,CAAC;IACvB,CAAC;IAEO,gCAAc,GAAtB,UAAuB,KAAmB;QAEtC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE;YAE3C,IAAM,MAAI,GAAG,qBAAqB,CAAC;YAEnC,KAAK,CAAC,IAAI,CAAC,IAAI,wBAAU,CAAC,MAAI,EAAE,MAAI,EAChC,EAAE,CAAC,GAAG,GAAG,qCAAqC;gBAC9C,EAAE,CAAC,GAAG,GAAG,yCAAyC,EAClD,SAAS,EAAE;gBACP,IAAI,wBAAU,CAAC,UAAU,CAAC;gBAC1B,IAAI,wBAAU,CAAC,QAAQ,CAAC;aAC3B,CAAC,CACL,CAAC;SACL;IACL,CAAC;IAEO,8BAAY,GAApB,UAAqB,KAAmB;QAAxC,iBAgBC;QAdG,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAM,IAAI,GAAG,kBAAkB,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;YAC1D,IAAI,KAAK,GAAG,KAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACzB,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aACjC;YACD,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE;YACR,KAAK,CAAC,IAAI,CAAC,IAAI,wBAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;SACjE;IACL,CAAC;IACL,cAAC;AAAD,CAAC,AA1DD,IA0DC;AA1DY,0BAAO","sourcesContent":["import * as async from \"async\";\nimport * as lodash from \"lodash\";\nimport * as os from \"os\";\n\nimport { Configuration } from \"../shared/configuration\";\nimport { BundleItem } from \"./bundle-item\";\nimport { Resolver } from \"./resolve/resolver\";\n\nexport class Globals {\n\n    constructor(private config: Configuration, private resolver: Resolver) { }\n\n    public add(buffer: BundleItem[], entrypoints: string[], onGlobalsAdded: () => void) {\n\n        const items: BundleItem[] = [];\n\n        this.addConstants(items);\n        this.addNodeGlobals(items);\n\n        async.eachSeries(items, (item: BundleItem, onGlobalResolved) => {\n            async.eachSeries(item.dependencies, (dependency, onModuleResolved) => {\n                this.resolver.resolveModule(item.filename, dependency, buffer, () => {\n                    onModuleResolved();\n                });\n            }, () => {\n                buffer.unshift(item);\n                entrypoints.unshift(item.filename);\n                onGlobalResolved();\n            });\n        }, onGlobalsAdded);\n    }\n\n    private addNodeGlobals(items: BundleItem[]): void {\n\n        if (this.config.bundlerOptions.addNodeGlobals) {\n\n            const name = \"bundle/node-globals\";\n\n            items.push(new BundleItem(name, name,\n                os.EOL + \"global.process=require('_process');\" +\n                os.EOL + \"global.Buffer=require('buffer').Buffer;\",\n                undefined, [\n                    new BundleItem(\"_process\"),\n                    new BundleItem(\"buffer\")\n                ])\n            );\n        }\n    }\n\n    private addConstants(items: BundleItem[]): void {\n\n        let source = \"\";\n        const name = \"bundle/constants\";\n\n        Object.keys(this.config.bundlerOptions.constants).forEach((key) => {\n            let value = this.config.bundlerOptions.constants[key];\n            if (!lodash.isString(value)) {\n                value = JSON.stringify(value);\n            }\n            source += os.EOL + \"global.\" + key + \"=\" + value + \";\";\n        });\n\n        if (source) {\n            items.push(new BundleItem(name, name, source, undefined, []));\n        }\n    }\n}\n"]}