UNPKG

cc-terminal

Version:
1 lines 61.8 kB
{"version":3,"file":"cc-terminal.mjs","sources":["../../../projects/cc-terminal/src/lib/store.ts","../../../projects/cc-terminal/src/lib/cc-terminal-command-state.ts","../../../projects/cc-terminal/src/lib/cc-terminal-command-store.ts","../../../projects/cc-terminal/src/lib/cc-terminal.service.ts","../../../projects/cc-terminal/src/lib/cc-terminal.component.ts","../../../projects/cc-terminal/src/lib/cc-terminal.component.html","../../../projects/cc-terminal/src/lib/cc-terminal.module.ts","../../../projects/cc-terminal/src/public_api.ts","../../../projects/cc-terminal/src/cc-terminal.ts"],"sourcesContent":["// https://jurebajt.com/state-management-in-angular-with-observable-store-services/\nimport { Observable, BehaviorSubject } from 'rxjs';\n\n/**\n * @description - This Class will work as a storage of any kind of data, but we will going to store the commands for now\n */\nexport class Store<T> {\n state$: Observable<T>;\n private _state$: BehaviorSubject<T>;\n\n protected constructor(initialState: T) {\n this._state$ = new BehaviorSubject(initialState);\n this.state$ = this._state$.asObservable();\n }\n\n public get state(): T {\n return this._state$.getValue();\n }\n\n protected setState(nextState: T): void {\n this._state$.next(nextState);\n }\n}\n","// https://jurebajt.com/state-management-in-angular-with-observable-store-services/\nconst COMMANDS = [\n {\n name: 'help',\n details: {\n output: true,\n readonly: true,\n breakLine: true,\n result: [\n { text: 'List of available commands' },\n {\n text: function (commands) {\n return commands.join(' ');\n }\n }\n ],\n }\n },\n {\n name: 'author',\n details: {\n output: true,\n readonly: true,\n breakLine: true,\n result: [\n { text: 'Pravin Tiwari<code-crash> [pravintiwari1992@gmail.com] github: https://github.com/code-crash' },\n ],\n }\n }\n];\n\n\nexport interface CommandResultInterface {\n text: string | Function; // Can be string or function\n css?: object; // It always will be object of styling\n}\n\nexport interface CommandInterface {\n name: string;\n details: {\n output: boolean,\n readonly?: boolean,\n breakLine?: boolean,\n format?: any,\n result: CommandResultInterface[]\n };\n callback?: Function,\n}\n\nexport class CommandState {\n commands: CommandInterface[] = COMMANDS;\n}\n\n","// https://jurebajt.com/state-management-in-angular-with-observable-store-services/\nimport { Injectable } from '@angular/core';\nimport { Store } from './store';\nimport { CommandState, CommandInterface } from './cc-terminal-command-state';\n\n@Injectable()\nexport class CommandStore extends Store<CommandState> {\n constructor() {\n super(new CommandState());\n }\n\n public addKeyValue(command: { name: string, key: string, value: any }): void {\n this.setState({\n ...this.state,\n commands: this.state.commands.map(c => {\n if (c.name === command.name) {\n if (c.details && !c.details.readonly) {\n if (!c['details'][command.key]) { c['details'][command.key] = null; } // If key not exists, make one\n return { ...c, details: { ...{ ...c.details, [command.key]: command.value } } };\n } else {\n console.error('You are trying to modify the readonly command, which is not allowed, command name: ' + command.name);\n return { ...c }; // You are trying modify readonly command, which is not possible.\n }\n }\n return c;\n })\n });\n }\n\n /**\n * @description - This function will add the command\n *\n * @param command\n */\n public addCommand(command: CommandInterface): void {\n let _regex = /^[a-zA-Z]+$/;\n if (command && command.name && _regex.test(command.name)) {\n if (command && command.details && command.details.hasOwnProperty('output')) {\n const exists = this.state.commands.map(function (e) { return e.name; }).indexOf(command.name);\n if (exists === -1) {\n this.setState({\n ...this.state,\n commands: [...this.state.commands, command]\n });\n } else {\n console.error('You are trying to add duplicate command, which is not allowed, command name: ' + command.name);\n // alert('You are trying to add duplicate command, which is not allowed, command name: ' + command.name);\n // throw 'You are trying to add duplicate command, which is not allowed, command name: ' + command.name;\n }\n } else {\n console.error('To add a new command, we need output property, command name: ' + command.name);\n }\n } else {\n console.error('Command name is not valid to add in command list, command name should be from [a-z | A-Z] without containing space, command name: ' + command.name);\n }\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport { CommandStore } from './cc-terminal-command-store';\nimport cloneDeep from 'lodash.clonedeep';\n\ninterface BroadcastEvent {\n key: any;\n data?: any;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CcTerminalService implements OnDestroy {\n private ngUnsubscribe = new Subject<boolean>(); // https://stackoverflow.com/questions/38008334/angular-rxjs-when-should-i-unsubscribe-from-subscription/41177163#41177163\n prompt: any;\n public store: CommandStore;\n private event: Subject<BroadcastEvent>;\n\n constructor() {\n this.event = new Subject<BroadcastEvent>();\n this.readyStore();\n }\n\n fetch(url: string) {\n\n return Observable.create(observer => {\n // angular http lib does not support arrayBuffer hence XMLHTTP\n const req = new XMLHttpRequest();\n req.open('get', url, true);\n req.responseType = 'arraybuffer';\n req.onreadystatechange = function () {\n if (req.readyState === 4 && req.status === 200) {\n observer.next(req.response);\n observer.complete();\n }\n };\n req.send();\n });\n }\n\n // calls the next event with listener id on listening component and data to send\n broadcast(key: any, data?: any) {\n this.event.next({ key, data });\n }\n\n /**\n * @description - This function will register to execute the store whenever store is ready.\n */\n readyStore() {\n this.on<any>('store-ready').subscribe(_store => {\n this.store = _store;\n this.store.state$.subscribe(state => {\n console.log('StoreReady: In Service:', state);\n });\n });\n }\n\n // filters through active observers and maps data to a matching observer\n on<T>(key: any): Observable<T> {\n return this.event.asObservable().pipe(filter((event) => event.key === key), map(event => <T>event.data));\n }\n\n /**\n * @description - Get the Current prompt\n */\n public getPrompt() {\n return this.prompt;\n }\n\n /**\n * @description - Get the Current store\n */\n public getStore() {\n console.log('here');\n return this.store;\n }\n\n public initPrompt(config: any) {\n this.prompt = {};\n let _user: any, _path: any, _userPathSeparator: any, _promptEnd: any;\n config = config ? config.promptConfiguration : null;\n const build = () => {\n this.prompt.text = _user + _userPathSeparator + _path + _promptEnd;\n };\n this.prompt.reset = () => {\n _user = config && config.user != null ? (config.user || '') : 'anon';\n _path = config && config.path != null ? (config.path || '') : '\\\\';\n _userPathSeparator = config && config.separator != null ? (config.separator || '') : '@';\n _promptEnd = config && config.end != null ? (config.end || '') : ':>';\n build();\n };\n this.prompt.text = '';\n this.prompt.reset();\n return this.prompt;\n }\n\n\n /**\n * @description - This function will help you to interpret your commands.\n * @param cmd - command\n */\n public interpret(cmd: any) {\n const prompt = this.getPrompt();\n // this.store.state$.subscribe(state => { console.log(state); });\n const command = (cmd.command || '').split(' ');\n let _command = null;\n this.store.state$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(state => {\n _command = cloneDeep(state.commands.filter( // Remove the reference of command by making copy, to avoid modifying the command state\n (item) => {\n return item.name === command[0];\n })[0] || null);\n });\n if (_command && _command.name) {\n if (_command.callback && typeof _command.callback === 'function') {\n _command.callback();\n }\n switch (_command.name) {\n case 'help':\n _command.details.result = _command.details.result.map((_result) => {\n if (_result && _result.text && typeof _result.text === 'function') {\n let text = _result.text(this.store.state.commands.map((c) => { return c.name; }));\n return { ..._result, text };\n } else {\n return _result;\n }\n });\n break;\n default:\n _command.details.result = _command.details.result.map((_result) => {\n if (_result && _result.text && typeof _result.text === 'function') {\n let text = (_result.text()).toString();\n return { ..._result, text };\n } else {\n return _result;\n }\n });\n }\n _command.details.result.splice(0, 0, { text: prompt.text + cmd.command });\n console.log('Final:', _command);\n this.broadcast('terminal-output', _command);\n } else {\n let result = '';\n try {\n result = eval(cmd.command); // eval.call(null, cmd.command);\n if (result !== undefined) {\n this.broadcast('terminal-output', {\n details: {\n output: true,\n result: [\n { text: prompt.text + cmd.command, },\n { text: '' + result },\n ],\n breakLine: true,\n }\n });\n }\n } catch (e) {\n this.broadcast('terminal-output', {\n details: {\n output: true,\n result: [\n { text: prompt.text + cmd.command, },\n { text: '' + e, css: { color: 'red' } },\n ],\n breakLine: true,\n }\n });\n }\n }\n\n /**\n * @description - Regex for exact match command\n * note: we can add this in constants\n * TODO: We can design the exact match regex based command also.\n */\n const regex = { // We can design the exact match regex based command also.\n alert: /^alert$/,\n };\n\n // Example of how to work with regex based command\n // else if (regex.alert.test(command[0])) {\n // this.broadcast('terminal-output', {\n // details: {\n // output: true,\n // result: [\n // { text: prompt.text + cmd.command, },\n // { text: '' + e, css: { color: 'red' } }],\n // breakLine: true,\n // }\n // });\n // command.splice(0, 1); // Remove command from command string\n // alert(command.join(' '));\n // console.log(command);\n // }\n }\n\n ngOnDestroy() {\n // Clear Storage allocation of memory.\n this.ngUnsubscribe.next(true);\n this.ngUnsubscribe.complete();\n }\n\n}\n","import {\n Component, OnInit,\n OnDestroy, DoCheck, ElementRef,\n ViewChild, Input, Renderer2\n} from '@angular/core';\nimport { CcTerminalService } from './cc-terminal.service';\nimport Timer = NodeJS.Timer;\nimport { CommandStore } from './cc-terminal-command-store';\nimport { Subject } from 'rxjs';\n@Component({\n selector: 'cc-terminal',\n templateUrl: './cc-terminal.component.html',\n styleUrls: ['./cc-terminal.component.css'],\n providers: [CommandStore]\n})\nexport class CcTerminalComponent implements OnInit, OnDestroy, DoCheck {\n title = 'cc-terminal';\n private ngUnsubscribe = new Subject<boolean>(); // https://stackoverflow.com/questions/38008334/angular-rxjs-when-should-i-unsubscribe-from-subscription/41177163#41177163\n _command: String = '';\n _cursor: String = '_';\n _prompt: any;\n _results: any = [];\n _showPrompt: Boolean = true;\n _tService: CcTerminalService;\n private _cmdHistory: any = [];\n private _cmdIndex: number = -1;\n private _initial: Boolean = true;\n private _nonPrintRE: any;\n private _config: any;\n private _outputDelay: any;\n private _allowTypingWriteDisplaying: Boolean;\n private _hasFocus: Timer;\n private _mOver: Boolean = false; // Mouse Over\n private _aContext: AudioContext; // Audio Context\n private _aBuffer: AudioBuffer; // Audio Buffer\n private _prevLength: number = 0;\n private _disposableOutputObserver: any;\n private _disposableCommandObserver: any;\n @ViewChild('cc_terminal') terminal: ElementRef;\n @ViewChild('cc_terminal_viewport') terminalViewport: ElementRef;\n @ViewChild('cc_terminal_results') terminalResults: ElementRef;\n @ViewChild('cc_terminal_target') terminalTarget: ElementRef;\n @Input() ccStyle: any; // Get All the external classes\n @Input() ccPrompt: { end: string, user: string, separator: string, path: string }; // Get the prompt\n\n /**\n * @description - adds \\n to all strings that need formatting at index of string\n * - function is not able to break line twice in case the remaining string is still longer than\n * - screen -> but it would be best this does not happen -> maybe require min width of terminal div\n * @param width - width\n * @param text - text\n * @param chr - character\n */\n static _insertLineBreakToString(width: number, text: string, chr: string) {\n const index = Math.round(width / 8);\n if (text.length > index) {\n // returns text with line-break chr added at element width offset ratio\n return text.substr(0, index) + chr + text.substr(index + 1);\n } else {\n return text;\n }\n }\n\n /**\n * @description - This static function will clear the all output of the terminal commands\n */\n static _clearTerminalResultsChildElements() {\n const elements = document.getElementById('cc_terminal_results');\n while (elements.firstChild) {\n elements.removeChild(elements.firstChild);\n }\n }\n\n constructor(_tService: CcTerminalService, private renderer: Renderer2, private store: CommandStore) { // renderer to add the class dynamically, while creating and rendering the output element\n this._initializeConfig();\n this._tService = _tService;\n this._prompt = _tService.initPrompt(this._config);\n this._outputDelay = this._config.outputDelay;\n this._allowTypingWriteDisplaying = this._config.allowTypingWriteDisplaying;\n this._disposableOutputObserver = _tService.on<any>('terminal-output').subscribe(termOut => {\n if (!termOut.added) {\n termOut.added = true; // TODO: We are not using this, we storing this commands in history, may be we can think of something to perform\n this._results.push(termOut);\n }\n });\n this._tService.broadcast('store-ready', this.store); // BroadCast to let all component know that store is ready to use.\n this._registerCommand(); // Register commands which will help to do the terminal operation\n this._disposableCommandObserver = _tService.on<any>('terminal-command').subscribe(cmd => {\n _tService.interpret(cmd);\n });\n }\n\n _initializeConfig() {\n this._command = '';\n this._nonPrintRE = /[\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u037F-\\u0383\\u038B\\u038D\\u03A2\\u0528-\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B-\\u058E\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08A1\\u08AD-\\u08E3\\u08FF\\u0978\\u0980\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0C00\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C34\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5A-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C80\\u0C81\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D01\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D4F-\\u0D56\\u0D58-\\u0D5F\\u0D64\\u0D65\\u0D76-\\u0D78\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F5-\\u13FF\\u169D-\\u169F\\u16F1-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191D-\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C80-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7-\\u1CFF\\u1DE7-\\u1DFB\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BB-\\u20CF\\u20F1-\\u20FF\\u218A-\\u218F\\u23F4-\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2700\\u2B4D-\\u2B4F\\u2B5A-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E3C-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FCD-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA698-\\uA69E\\uA6F8-\\uA6FF\\uA78F\\uA794-\\uA79F\\uA7AB-\\uA7F7\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C5-\\uA8CD\\uA8DA-\\uA8DF\\uA8FC-\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9E0-\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAA7C-\\uAA7F\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F-\\uABBF\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE27-\\uFE2F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF]/g;\n this._config = {\n outputDelay: 8, // Output display should be more than 0 to see the effect\n allowTypingWriteDisplaying: true,\n maxHistory: 50,\n typeSoundUrl: './assets/type.wav',\n startSoundUrl: './assets/start.wav',\n promptConfiguration: { end: ':>', user: 'CodeCrash', separator: '@', path: '\\\\' }\n };\n }\n\n _handlePaste(e: any) {\n function is_type(item, type) {\n return item.type.indexOf(type) !== -1;\n }\n if (e.clipboardData) {\n const items = e.clipboardData.items;\n if (items) {\n for (let i = 0; i < items.length; i++) {\n if (is_type(items[i], 'image')) {\n this._tService.broadcast('terminal-output', {\n details: {\n output: true,\n result: [{ text: this._prompt.text + this._command }, { text: 'You can\\'t paste file' }],\n breakLine: true,\n }\n });\n } else if (is_type(items[i], 'text/plain')) {\n items[i].getAsString((string, stay) => {\n this._command = string;\n });\n }\n }\n } else if (e.clipboardData.getData) {\n const text = e.clipboardData.getData('text/plain');\n this._command = text;\n }\n return false;\n }\n }\n\n ngOnInit() {\n this._aContext = new AudioContext();\n this._doSound(this._config.startSoundUrl);\n // this.store.addKeyValue({ name: 'author', key: 'output', value: true }); // Note: We can't modify read only properties\n // if (this.ccStyle && this.ccStyle.section) {\n // Object.keys(this.ccStyle.section || {}).forEach((key) => {\n // // Only allow background and color in section css style\n // if (key !== 'color' && key !== 'background') {\n // delete this.ccStyle.section[key];\n // }\n // });\n // }\n // if (this.ccStyle && this.ccStyle.viewport) {\n // Object.keys(this.ccStyle.viewport || {}).forEach((key) => {\n // // Only allow background and color in viewport css style\n // if (key !== 'color' && key !== 'background') {\n // delete this.ccStyle.viewport[key];\n // }\n // });\n // }\n // console.log('ccStyle:', this.ccStyle);\n // console.log('ccPrompt:', this.ccPrompt);\n if (this.ccPrompt) {\n this._prompt = this._tService.initPrompt({ promptConfiguration: this.ccPrompt });\n }\n }\n\n ngOnDestroy() {\n // Clear Observable allocation of memory.\n this._disposableOutputObserver.unsubscribe();\n this._disposableCommandObserver.unsubscribe();\n\n // Clear Storage allocation of memory.\n this.ngUnsubscribe.next(true);\n this.ngUnsubscribe.complete();\n }\n\n ngDoCheck() {\n // simple added to array detection\n if (this._prevLength < this._results.length) {\n // check if history grows too big then maxHistory\n if (this._results.length > this._config.maxHistory) {\n this._results.splice(0, 1);\n this.terminalResults.nativeElement.children[0].remove();\n }\n this._addToTerminalResults();\n }\n this._prevLength = this._results.length;\n }\n\n /**\n * @description - This will add the output on the terminal\n * TODO: We need to simulate the commands which is not added on terminal output\n *\n * TODO: @example -\n *\n * this.store.addCommand({\n * name: 'example',\n * details: {\n * breakLine: true,\n * output: true, // Output false have error\n * readonly: false,\n * result: [{\n * text: () => {\n * return 10 + 10;\n * }\n * }],\n * },\n * callback: () => {\n * this._tService.broadcast('terminal-command', { command: 'help' });\n * this._tService.broadcast('terminal-output', {\n * details: {\n * output: true,\n * breakLine: true,\n * result: [\n * { text: 'yum yum' }\n * ]\n * }\n * });\n * alert('done');\n * }\n * });\n */\n private _addToTerminalResults() {\n const _handlePromptScroll = [() => {\n this._showPrompt = true; // while rendering output, hide prompt\n this.terminalViewport.nativeElement.scrollTop = this.terminalViewport.nativeElement.scrollHeight; // always put scroll to bottom\n }];\n this._showPrompt = false;\n const change = this._results[this._results.length - 1].details;\n const spanElement = this.renderer.createElement('span');\n if (this._outputDelay) {\n for (let i = change.result.length - 1; i >= 0; i--) { // only reverse loop will type out the lines with delay proper and in order\n this._createTypedOutputElement(spanElement, change, i, _handlePromptScroll);\n }\n setTimeout(() => { // start line by line typing execution chain to handle show/hide prompt\n _handlePromptScroll[_handlePromptScroll.length - 1]();\n }, 200);\n } else {\n this._showPrompt = true;\n for (let i = 0; i < change.result.length; i++) { // paste everything at once\n this._createOutputElement(spanElement, change, i);\n }\n if (change.breakLine) {\n const breakLine = this.renderer.createElement('br');\n spanElement.appendChild(breakLine);\n }\n }\n }\n\n /**\n * @description - This will will create a command typed to command prompt and do print on output\n */\n private _createTypedOutputElement(span: HTMLSpanElement, change: any, i: number, _handlePromptScroll: (() => any)[]) {\n const lineBr = ' -> \\n ';\n const { line, textLine } = this._createOutputLineElement(change, i, lineBr);\n if (change.output) { // If output is enabled for the command, then only print it\n line.textContent = ' ';\n const fi = _handlePromptScroll.length - 1;\n const wLine = line; // World Line\n const wTextLine = textLine; // World Text Line\n const wf = _handlePromptScroll[fi]; // to call the next _handlePromptScroll[i] recursively after previous line type has finished\n const wBreak = i === change.result.length - 1 && change.breakLine; // World Break\n _handlePromptScroll.push(() => {\n span.appendChild(wLine); // initialize empty line to type out\n this.terminalResults.nativeElement.appendChild(span);\n this._type(wLine, wTextLine, 0, wf); // send line to type() so each character gets displayed coupled with a type sound\n this.terminalViewport.nativeElement.scrollTop = this.terminalViewport.nativeElement.scrollHeight;\n if (wBreak) {\n const breakLine = this.renderer.createElement('br');\n span.appendChild(breakLine);\n this.terminalResults.nativeElement.appendChild(span);\n }\n });\n } else {\n // line.textContent = textLine;\n // span.appendChild(line);\n // this.terminalResults.nativeElement.appendChild(span);\n }\n }\n\n private _createOutputElement(span: HTMLSpanElement, change: any, i: number) {\n const lineBr = ' -> \\n';\n const { line, textLine } = this._createOutputLineElement(change, i, lineBr);\n line.textContent = textLine;\n span.appendChild(line);\n this.terminalResults.nativeElement.appendChild(span);\n }\n\n private _createOutputLineElement(change: any, i: number, lineBr: string) {\n const line = this.renderer.createElement('div');\n if (change.result[i] && change.result[i]['css']) {\n if (Object.keys(change.result[i]['css'] || {}).length) {\n let style = '';\n Object.keys(change.result[i]['css'] || {}).forEach((key) => {\n style += key + ':' + change.result[i]['css'][key] + ';';\n });\n line.style = style;\n }\n }\n this.renderer.addClass(line, 'cc_terminal_line');\n let textLine: string;\n const elWidth = this.terminalViewport.nativeElement.firstElementChild.clientWidth;\n // format -> the stream needs formatting to show with appropriate line breaks on the screen\n if (change.format) {\n textLine = CcTerminalComponent._insertLineBreakToString(elWidth, change.result[i].text, lineBr);\n } else {\n textLine = (change.result[i] && change.result[i].text) || '';\n }\n return { line, textLine };\n }\n\n _type(input, line, i, endCallback) {\n setTimeout(() => {\n this._doSound(this._config.typeSoundUrl);\n input.textContent += (i < line.length ? line[i] : '');\n if (i < line.length - 1) {\n this._doSound(this._config.typeSoundUrl);\n this._type(input, line, i + 1, endCallback);\n } else if (endCallback) {\n endCallback();\n }\n }, this._outputDelay);\n }\n\n _doSound(uri: string): void {\n this._loadAudio(uri).then((_audioBuffer) => {\n this._aBuffer = _audioBuffer;\n this._playAudio();\n }).catch(error => { throw error; });\n }\n\n _loadAudio(source: string): Promise<AudioBuffer> {\n return new Promise((resolve, reject) => {\n this._tService.fetch(source).subscribe(buffer => {\n this._aContext.decodeAudioData(buffer, resolve, reject);\n });\n });\n }\n\n _playAudio() {\n const bufferSource = this._aContext.createBufferSource();\n bufferSource.buffer = this._aBuffer;\n bufferSource.connect(this._aContext.destination);\n bufferSource.start(0);\n }\n\n _mouseover() {\n this._mOver = true;\n }\n\n _mouseleave() {\n this._mOver = false;\n }\n\n _clickHandler() {\n this.terminalTarget.nativeElement.focus();\n this.terminal.nativeElement.classList.toggle('cc_terminal_focused', true);\n }\n\n _blur() {\n clearInterval(this._hasFocus);\n if (!this._mOver) {\n this._cursor = '_';\n }\n this.terminal.nativeElement.classList.toggle('cc_terminal_focused', false);\n }\n\n /**\n * @description - This will called when user will focus on input\n */\n _focus() {\n if (this._initial) {\n this._tService.broadcast('terminal-output', {\n details: {\n result: [{ text: 'How can I help you?', css: { color: 'red' } }],\n breakLine: true,\n output: true,\n format: true\n }\n });\n }\n this._initial = false;\n this._hasFocus = setInterval(() => {\n if (this._cursor === '') {\n this._cursor = '_';\n } else {\n this._cursor = '';\n }\n }, 500);\n }\n\n _key(e) {\n if (this._showPrompt || this._allowTypingWriteDisplaying) {\n this._keypress(e.which);\n }\n e.preventDefault();\n }\n\n _keypress(keyCode: number) {\n if (this._command.length < 80) {\n this._cmdIndex = -1;\n }\n if (keyCode !== 13) {\n this._command += String.fromCharCode(keyCode);\n }\n }\n\n _keydown(e) {\n\n if (e.keyCode === 9) { // Tab ke\n e.preventDefault();\n }\n if (e.keyCode === 8) { // Backspace key\n if (this._showPrompt || this._allowTypingWriteDisplaying) {\n this._backspace();\n }\n e.preventDefault();\n } else if (e.keyCode === 13) { // Enter key\n if (this._showPrompt || this._allowTypingWriteDisplaying) {\n this._execute();\n }\n } else if (e.keyCode === 38) { // key-up\n if (this._showPrompt || this._allowTypingWriteDisplaying) {\n this._previousCommand();\n }\n e.preventDefault();\n } else if (e.keyCode === 40) { // key-down key\n if (this._showPrompt || this._allowTypingWriteDisplaying) {\n this._nextCommand();\n }\n e.preventDefault();\n }\n }\n\n _nextCommand() {\n if (this._cmdIndex === -1) {\n return;\n }\n if (this._cmdIndex < this._cmdHistory.length - 1) {\n this._command = this._cmdHistory[++this._cmdIndex];\n } else {\n this._command = '';\n }\n }\n\n _previousCommand() {\n if (this._cmdIndex === -1) {\n this._cmdIndex = this._cmdHistory.length;\n }\n if (this._cmdIndex === 0) {\n return;\n }\n this._command = this._cmdHistory[--this._cmdIndex];\n }\n\n _cleanNonPrintableCharacters(input: String) {\n return input.replace(this._nonPrintRE, '');\n }\n\n _execute() {\n const command = this._cleanNonPrintableCharacters(this._command);\n this._command = '';\n if (!command) {\n // return; // If you want to do nothing if command is only enter, un comment this.\n this._tService.broadcast('terminal-output', {\n details: {\n output: true,\n result: [\n { text: this._prompt.text + this._command, },\n ],\n breakLine: true,\n }\n });\n }\n if (this._cmdHistory.length > 10) {\n this._cmdHistory.splice(0, 1);\n }\n if (command !== this._cmdHistory[this._cmdHistory.length - 1]) {\n this._cmdHistory.push(command);\n }\n this._tService.broadcast('terminal-command', { command: command });\n }\n\n _backspace() {\n if (this._command) {\n this._command = this._command.substring(0, this._command.length - 1);\n }\n }\n\n\n /**\n * @description - This function will help you to register the commands\n */\n _registerCommand = () => {\n // Clear Command to clear the terminal\n this.store.addCommand({\n name: 'clear',\n details: { result: [], readonly: true, output: false },\n callback: () => {\n this._results.splice(0, this._results.length);\n CcTerminalComponent._clearTerminalResultsChildElements();\n }\n });\n\n // Reset Command to reset the terminal\n this.store.addCommand({\n name: 'reset',\n details: { result: [], readonly: true, output: false },\n callback: () => {\n this._initializeConfig();\n this._results = [];\n CcTerminalComponent._clearTerminalResultsChildElements();\n this._initial = true;\n // this.ngOnInit();\n this.ngOnInit();\n this._blur();\n this._clickHandler();\n }\n });\n }\n}\n","<section class='cc_terminal' on-mouseover=\"_mouseover()\" on-mouseleave=\"_mouseleave()\" #cc_terminal id=\"cc_terminal\"\n on-paste='_handlePaste($event)' [ngStyle]=\"ccStyle?.section\">\n <div class='cc_terminal_viewport' #cc_terminal_viewport id=\"cc_terminal_viewport\" on-click=\"_clickHandler()\"\n [ngStyle]=\"ccStyle?.viewport\">\n <div class='cc_terminal_results' #cc_terminal_results id=\"cc_terminal_results\"></div>\n <span class='cc_terminal_prompt' *ngIf='_showPrompt'>\n {{ _prompt?.text }}\n </span>\n <span class='cc_terminal_input' [ngStyle]=\"ccStyle?.input\" *ngIf='_showPrompt'>\n {{ _command }}\n </span>\n <span class='cc_terminal_cursor' [ngStyle]=\"ccStyle?.cursor\" *ngIf='_showPrompt'>\n {{ _cursor }}\n </span>\n <input type='text' class='cc_terminal_target' [(ngModel)]='_command' (blur)=\"_blur()\" (focus)=\"_focus()\" on-keydown=\"_keydown($event)\"\n on-keypress=\"_key($event)\" #cc_terminal_target id=\"cc_terminal_target\" />\n </div>\n</section>\n","import { NgModule } from '@angular/core';\nimport { CcTerminalComponent } from './cc-terminal.component';\nimport { FormsModule } from '@angular/forms';\nimport { BrowserModule } from '@angular/platform-browser';\n\n@NgModule({\n declarations: [CcTerminalComponent],\n imports: [\n BrowserModule,\n FormsModule,\n ],\n exports: [CcTerminalComponent]\n})\nexport class CcTerminalModule { }\n","/*\n * Public API Surface of cc-terminal\n */\n\nexport * from './lib/cc-terminal.component';\nexport * from './lib/cc-terminal.service';\nexport * from './lib/cc-terminal.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.CcTerminalService","i2.CommandStore"],"mappings":"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