{"version":3,"sources":["../../../packages/tools/gulp-ps-code/ps-code-convert.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IAClB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;CAC1B;AAED,qBAAa,eAAe;IAkDZ,OAAO,CAAC,OAAO;IAjD3B,OAAc,YAAY,SAAmB;IAC7C,OAAc,cAAc,SAAqB;IACjD,OAAc,KAAK,WAa8C;IAEjE,OAAO,CAAC,MAAM,CAAC,SAAS,CAMtB;IACF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6B;IAC9D,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAA8B;IAChE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAwB;IACpD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAyB;IACtD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAQ;IACnC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAQ;IACjC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAO;IAC7B,OAAO,CAAC,MAAM,CAAC,WAAW,CAQ5B;IACE,OAAO,CAAC,MAAM,CAAC,YAAY,CAE7B;IACE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAQ;IACpC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAQ;IAElC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,mBAAmB,CAAQ;gBAEf,OAAO,EAAE,OAAO;IAGpC,IAAW,OAAO,IAAI,MAAM,CAE3B;IAEM,YAAY,IAAI,IAAI;IAIpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBrC,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,OAAO;IAsGf,OAAO,CAAC,MAAM;CAQjB","file":"ps-code-convert.d.ts","sourcesContent":["/* eslint-disable unused-imports/no-unused-vars */\r\n/* eslint-disable no-console */\r\ndeclare function escape(data: string): string;\r\ndeclare function unescape(data: string): string;\r\n\r\nexport interface Options {\r\n    powerShellModuleName: string;\r\n    name: string;\r\n    basePath: string;\r\n    generatedPath: string;\r\n    noComments: boolean;\r\n    validate: boolean;\r\n    jea: boolean;\r\n    resourceName?: string;\r\n    prefixName?: string;\r\n}\r\n\r\nexport interface Group {\r\n    [index: string]: string;\r\n}\r\n\r\nexport interface Groups {\r\n    [index: string]: Group;\r\n}\r\n\r\nexport class PsCodeConverter {\r\n    public static defaultGroup = '!!##default__';\r\n    public static generatedGroup = '!!##generated__';\r\n    public static verbs = [\r\n        'Add', 'Clear', 'Close', 'Copy', 'Enter', 'Exit', 'Find', 'Format', 'Get',\r\n        'Hide', 'Join', 'Lock', 'Move', 'New', 'Open', 'Optimize', 'Pop', 'Push',\r\n        'Redo', 'Remove', 'Rename', 'Reset', 'Resize', 'Search', 'Select', 'Set',\r\n        'Show', 'Skip', 'Split', 'Step', 'Switch', 'Undo', 'Unlock', 'Watch', 'Backup',\r\n        'Checkpoint', 'Compare', 'Compress', 'Convert', 'ConvertFrom', 'ConvertTo',\r\n        'Dismount', 'Edit', 'Expand', 'Export', 'Group', 'Import', 'Initialize',\r\n        'Limit', 'Merge', 'Mount', 'Out', 'Publish', 'Restore', 'Save', 'Sync',\r\n        'Unpublish', 'Update', 'Approve', 'Assert', 'Complete', 'Confirm', 'Deny',\r\n        'Disable', 'Enable', 'Install', 'Invoke', 'Register', 'Request', 'Restart',\r\n        'Resume', 'Start', 'Stop', 'Submit', 'Suspend', 'Uninstall', 'Unregister',\r\n        'Wait', 'Debug', 'Measure', 'Ping', 'Repair', 'Resolve', 'Test', 'Trace',\r\n        'Connect', 'Disconnect', 'Read', 'Receive', 'Send', 'Write', 'Block',\r\n        'Grant', 'Protect', 'Revoke', 'Unblock', 'Unprotect', 'Use'];\r\n\r\n    private static fullNames = [\r\n        'Microsoft.PowerShell.Core\\\\Get-Help',\r\n        'Microsoft.PowerShell.Core\\\\Out-Default',\r\n        'Microsoft.PowerShell.Utility\\\\Get-FormatData',\r\n        'Microsoft.PowerShell.Utility\\\\Measure-Object',\r\n        'Microsoft.PowerShell.Utility\\\\Select-Object'\r\n    ];\r\n    private static removeCommentsTrue = '##RemoveComments=true##';\r\n    private static removeCommentsFalse = '##RemoveComments=false##';\r\n    private static skipCheckTrue = '##SkipCheck=true##';\r\n    private static skipCheckFalse = '##SkipCheck=false##';\r\n    private static commentStart = '<#';\r\n    private static commentEnd = '#>';\r\n    private static comment = '#';\r\n    private static openContent =\r\n        `/* eslint:disable */\\r\r\n/**\\r\r\n * @file Source code generated by gulp-ps-code.\\r\r\n * @version 1.1\\r\r\n */\\r\r\nexport module PowerShellScripts {\\r\r\n    'use strict'\\r\r\n`;\r\n    private static closeContent =\r\n        `}\\r\r\n`;\r\n    private static hereTextBegin = '@\"';\r\n    private static hereTextEnd = '\"@';\r\n\r\n    private buffer: string[];\r\n    private jeaErrorDisplayOnce = true;\r\n\r\n    constructor(private options: Options) {\r\n    }\r\n\r\n    public get content(): string {\r\n        return this.buffer.join('\\r\\n');\r\n    }\r\n\r\n    public contentReset(): void {\r\n        this.buffer = [];\r\n    }\r\n\r\n    public generate(groups: Groups): void {\r\n        const tsBase = null;\r\n        this.buffer.push(PsCodeConverter.openContent);\r\n        this.buffer.push(this.indent(1) + 'export const module = ' + '\\'' + this.options.powerShellModuleName + '\\';');\r\n        if (this.options.resourceName) {\r\n            this.buffer.push(this.indent(1) + 'export const resourceName = ' + '\\'' + this.options.resourceName + '\\';');\r\n        }\r\n\r\n        if (this.options.prefixName) {\r\n            this.buffer.push(this.indent(1) + 'export const powerShellPrefix = ' + '\\'' + this.options.prefixName + '\\';');\r\n        }\r\n\r\n        this.addData(groups);\r\n        this.buffer.push(PsCodeConverter.closeContent);\r\n    }\r\n\r\n    private toJsonName(original: string): string {\r\n        const name = this.toCommandName(original);\r\n        return this.replaceAll(name, '-', '_');\r\n    }\r\n\r\n    private toCommandName(original: string): string {\r\n        const index = original.indexOf('.ps1');\r\n        if (index <= 0) {\r\n            console.error('Script file must use .ps1 extension.');\r\n            return original;\r\n        }\r\n\r\n        const scriptName = original.substring(0, index);\r\n        return scriptName;\r\n    }\r\n\r\n    private toPascalName(original: string): string {\r\n        const publicPath = 'public\\\\';\r\n        const internalPath = 'internal\\\\';\r\n        if (original.startsWith(publicPath)) {\r\n            original = original.substring(publicPath.length);\r\n        } else if (original.startsWith(internalPath)) {\r\n            original = original.substring(internalPath.length);\r\n        }\r\n\r\n        const name = original[0].toUpperCase() + original.substring(1);\r\n        let pascal = '';\r\n        let upper = true;\r\n        for (let i = 0; i < name.length; i++) {\r\n            const char = name.charAt(i);\r\n            if (char === '-') {\r\n                upper = true;\r\n            } else if (char === '\\\\') {\r\n                pascal += '_';\r\n            } else {\r\n                pascal += upper ? char.toUpperCase() : char;\r\n                upper = false;\r\n            }\r\n\r\n        }\r\n\r\n        return pascal;\r\n    }\r\n\r\n    private regexEscape(str: string): string {\r\n        return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\r\n    }\r\n\r\n    private replaceAll(input: string, searchValue: string, replaceValue: string): string {\r\n        return input.replace(new RegExp(this.regexEscape(searchValue), 'g'), replaceValue);\r\n    }\r\n\r\n    private addBeginGroup(name: string, indent: number): void {\r\n        this.buffer.push(this.indent(indent) + 'export module ' + name + ' {');\r\n    }\r\n\r\n    private addEndGroup(name: string, indent: number): void {\r\n        this.buffer.push(this.indent(indent) + '}');\r\n    }\r\n\r\n    private addToContent(name: string, command: string, script: string, indent: number): void {\r\n        if (this.options.jea) {\r\n            this.buffer.push(this.indent(indent) + 'export const ' + name + ' = {');\r\n            this.buffer.push(this.indent(indent + 1) + 'command: \\'' + command + '\\',');\r\n            this.buffer.push(this.indent(indent + 1) + 'script: ' + script + '');\r\n            this.buffer.push(this.indent(indent) + '}');\r\n        } else {\r\n            this.buffer.push(this.indent(indent) + 'export const ' + name + ': string = ' + script + ';');\r\n        }\r\n    }\r\n\r\n    private addData(groups: Groups): void {\r\n        let groupKeys = Object.keys(groups);\r\n        groupKeys = groupKeys.sort();\r\n        for (const groupKey of groupKeys) {\r\n            const groupName = this.toPascalName(groupKey);\r\n            let rootGroup = true;\r\n            if (groupKey !== PsCodeConverter.defaultGroup && groupKey !== PsCodeConverter.generatedGroup) {\r\n                rootGroup = false;\r\n            }\r\n\r\n            if (!rootGroup) {\r\n                this.addBeginGroup(groupName, 1);\r\n            }\r\n\r\n            const current = groups[groupKey];\r\n            const keys = Object.keys(current);\r\n            for (const key of keys) {\r\n                let script = '';\r\n                const content: string = current[key];\r\n                const name = this.toJsonName(key);\r\n                const command = this.toCommandName(key);\r\n                script = '##' + command + '##:' + key + '\\n';\r\n                let removeComments = this.options.noComments;\r\n                if (content.indexOf(PsCodeConverter.removeCommentsFalse) > 0) {\r\n                    removeComments = false;\r\n                } else if (content.indexOf(PsCodeConverter.removeCommentsTrue) > 0) {\r\n                    removeComments = true;\r\n                }\r\n\r\n                let skipping = false;\r\n                let skipCheck = false;\r\n                let hereText = false;\r\n                const lines = content.split('\\n');\r\n                lines.forEach((value, index, array) => {\r\n                    let text = value.replace('\\r', '');\r\n                    if (text.endsWith(PsCodeConverter.hereTextBegin)) {\r\n                        hereText = true;\r\n                        script += text + '\\n';\r\n                    } else if (hereText) {\r\n                        if (text === PsCodeConverter.hereTextEnd) {\r\n                            hereText = false;\r\n                        }\r\n\r\n                        script += text + '\\n';\r\n                    } else if (removeComments) {\r\n                        let process = true;\r\n                        text = text.trim();\r\n                        if (text.startsWith(PsCodeConverter.commentStart)) {\r\n                            skipping = true;\r\n                        }\r\n\r\n                        if (text.startsWith(PsCodeConverter.skipCheckTrue)) {\r\n                            skipCheck = true;\r\n                        }\r\n\r\n                        if (text.startsWith(PsCodeConverter.skipCheckFalse)) {\r\n                            skipCheck = false;\r\n                        }\r\n\r\n                        if (skipping) {\r\n                            process = false;\r\n                            if (text.endsWith(PsCodeConverter.commentEnd)) {\r\n                                skipping = false;\r\n                            }\r\n                        }\r\n\r\n                        if (process && !text.startsWith(PsCodeConverter.comment) && text.length > 0) {\r\n                            if (!skipCheck && this.options.jea) {\r\n                                const regex = new RegExp(/[^A-Z\\\\]+(select-object|select|get-formatdata|measure-object|measure|help|get-help|out-default)[^A-Z\\\\]+/i);\r\n                                const matched = regex.exec(' ' + text);\r\n                                if (matched) {\r\n                                    if (this.jeaErrorDisplayOnce) {\r\n                                        this.jeaErrorDisplayOnce = false;\r\n                                        console.error('JEA Error: use one of full name cmdlet.', PsCodeConverter.fullNames.join(' '));\r\n                                        console.error(' If it scanned unwanted lines, use ##SkipCheck=true## and ##SkipCheck=false## to surround region.');\r\n                                    }\r\n\r\n                                    console.error(key + ': ' + text);\r\n                                }\r\n                            }\r\n\r\n                            script += text + '\\n';\r\n                        }\r\n                    } else {\r\n                        script += text + '\\n';\r\n                    }\r\n\r\n                });\r\n                let data = JSON.stringify(script);\r\n                data = this.replaceAll(data, '\\'', '\\\\u0027');\r\n                data = this.replaceAll(data, '<', '\\\\u003c');\r\n                data = this.replaceAll(data, '>', '\\\\u003e');\r\n                data = this.replaceAll(data, '&', '\\\\u0026');\r\n                this.addToContent(name, command, data, rootGroup ? 1 : 2);\r\n            }\r\n\r\n            if (!rootGroup) {\r\n                this.addEndGroup(groupName, 1);\r\n            }\r\n        }\r\n    }\r\n\r\n    private indent(count: number): string {\r\n        let pad = '';\r\n        for (let i = 0; i < count; i++) {\r\n            pad += '    ';\r\n        }\r\n\r\n        return pad;\r\n    }\r\n}\r\n"]}