{"version":3,"sources":["../../../packages/tools/gulp-ps-manifest/index.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,OAAO;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB","file":"index.d.ts","sourcesContent":["'use strict';\r\n\r\nimport fs from 'fs';\r\nimport Path from 'path';\r\nimport log from 'fancy-log';\r\nimport pluginError from 'plugin-error';\r\nimport through2 from 'through2';\r\nimport Vinyl from 'vinyl';\r\nimport * as util from '../utilities';\r\n\r\nconst PLUGIN_NAME = 'gulp-ps-manifest';\r\n\r\n//\r\n// (Options):\r\n//\r\n// name of manifest file.\r\n//  manifest: string; default is 'src/manifest.json'\r\n//\r\n// name of powershell module.\r\n//  powerShellModuleName: string; (required)\r\n//\r\n// flag of comment removable.\r\n//  removeComments: boolean; default is true.\r\n//\r\n// prefix name to be used to remove ambiguity in JEA.\r\n//  prefixName: string; (optional)\r\n//\r\nexport interface Options {\r\n    manifest: string;\r\n    powerShellModuleName: string;\r\n    removeComments: boolean;\r\n    prefixName?: string;\r\n}\r\n\r\n/**\r\n * Plugin level function\r\n */\r\nfunction gulpPsManifest(options: Options) {\r\n    // override options settings if not specified.\r\n    options = Object.assign(\r\n        <Options>{\r\n            manifest: 'src/manifest.json',\r\n            removeComments: true\r\n        },\r\n        options || {});\r\n\r\n    function findCommand(data, result) {\r\n        if (typeof data === 'object') {\r\n            if (data.command) {\r\n                result.push(data);\r\n                return;\r\n            }\r\n\r\n            for (const key in data) {\r\n                if (data.hasOwnProperty(key)) {\r\n                    const next = data[key];\r\n                    findCommand(next, result);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    function convert(command: string, file: string, content: string): string {\r\n        const commentStart = '<#';\r\n        const commentEnd = '#>';\r\n        const comment = '#';\r\n        let script = '##' + command + '##:' + file + '\\n';\r\n        let skipping = false;\r\n        const lines = content.split('\\n');\r\n        lines.forEach(value => {\r\n            let text = value.replace('\\r', '');\r\n            if (options.removeComments) {\r\n                let process = true;\r\n                text = text.trim();\r\n                if (text.startsWith(commentStart)) {\r\n                    skipping = true;\r\n                }\r\n\r\n                if (skipping) {\r\n                    process = false;\r\n                    if (text.endsWith(commentEnd)) {\r\n                        skipping = false;\r\n                    }\r\n                }\r\n\r\n                if (process && !text.startsWith(comment) && text.length > 0) {\r\n                    script += text + '\\n';\r\n                }\r\n            } else {\r\n                script += text + '\\n';\r\n            }\r\n\r\n        });\r\n        return script;\r\n    }\r\n\r\n    const collection = {};\r\n\r\n    return through2.obj(\r\n        function (file, enc, callback) {\r\n            let error = null;\r\n            try {\r\n                if (!options.powerShellModuleName) {\r\n                    throw new Error('gulp-ps-manifest requires \"powerShellModuleName\" option: PowerShell module name.');\r\n                }\r\n\r\n                const path = Path.parse(file.path);\r\n                if (path.ext === '.ps1') {\r\n                    collection[path.base] = file.contents.toString('utf8');\r\n                }\r\n            } catch (e) {\r\n                error = (!e.plugin || (e.plugin !== PLUGIN_NAME)) ?\r\n                    util.extendError(new pluginError({ plugin: PLUGIN_NAME, message: e.message }), e) : e;\r\n            }\r\n\r\n            return callback(error);\r\n        },\r\n        function (callback) {\r\n            try {\r\n                const manifestObject = JSON.parse(fs.readFileSync(options.manifest, 'utf8'));\r\n                manifestObject.powerShellModuleName = options.powerShellModuleName;\r\n                const result = [];\r\n                findCommand(manifestObject.entryPoints, result);\r\n                for (const item of result) {\r\n                    let command: string = item.command;\r\n                    if (options.prefixName) {\r\n                        command = command.replace(options.prefixName, '');\r\n                    }\r\n                    const name = command + '.ps1';\r\n                    if (collection[name]) {\r\n                        item.script = convert(command, name, collection[name]);\r\n                        item.module = options.powerShellModuleName;\r\n                    } else {\r\n                        throw new Error('gulp-ps-manifest failed to locate the script: ' + command);\r\n                    }\r\n                }\r\n\r\n                const manifestFile = new Vinyl({\r\n                    cwd: './',\r\n                    path: options.manifest,\r\n                    contents: Buffer.from(JSON.stringify(manifestObject, null, 2), 'utf8')\r\n                });\r\n\r\n                this.push(manifestFile);\r\n            } catch (e) {\r\n                const error = (!e.plugin || (e.plugin !== PLUGIN_NAME)) ?\r\n                    util.extendError(new pluginError({ plugin: PLUGIN_NAME, message: e.message }), e) : e;\r\n                log.error(error);\r\n            }\r\n\r\n            callback();\r\n        }\r\n    );\r\n}\r\n\r\nmodule.exports = gulpPsManifest;\r\n"]}