diff --git a/README.md b/README.md index 9ffaec0..ea7e724 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,6 @@ If you're interested in contributing use the commands below: 1. `npm`: Install deps 1. `npm start`: Start local dev server -1. `npm run build`: Builds the versioned js and css files to [./dist](./dist) +1. `npm run build`: Builds the js and css files to [./dist](./dist) Tested using [Node.js v12.16.1](https://nodejs.org/en/). diff --git a/dist/text-terminal.js b/dist/text-terminal.js index 73a1c36..c7bf524 100644 --- a/dist/text-terminal.js +++ b/dist/text-terminal.js @@ -1,7 +1,7 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c\n \n
\n
'.concat(t).concat(e,'
\n \n
\n \n')};exports.default=t; },{}],"OjAK":[function(require,module,exports) { -module.exports={name:"text-terminal",version:"0.1.1",description:"A simple, extendable terminal interface for the web.",repository:"https://github.com/desholmes/text-terminal",scripts:{clean:"rm -rf ./dist/* ",start:"parcel ./src/index.html",build:"npm run clean && parcel build ./src/scss/main.scss --out-file text-terminal.css && parcel build ./src/modules/textTerminal.js --out-file text-terminal.js",lint:"prettier --check .","lint-fix":"prettier --write ."},main:"dist/text-terminal.js",author:"Des Holmes https://github.com/desholmes",license:"MIT",devDependencies:{"parcel-bundler":"^1.12.4",prettier:"2.1.2",sass:"^1.28.0"}}; +module.exports={name:"text-terminal",version:"0.1.1",description:"A simple, extendable terminal interface for the web.",repository:"https://github.com/desholmes/text-terminal",scripts:{clean:"rm -rf ./dist/*.css ./dist/*.map ./dist/*.js ",start:"parcel ./src/index.html",build:"npm run clean && parcel build ./src/scss/main.scss --out-file text-terminal.css && parcel build ./src/modules/textTerminal.js --out-file text-terminal.js",lint:"prettier --check .","lint-fix":"prettier --write ."},main:"dist/text-terminal.js",types:"dist/text-terminal.d.ts",author:"Des Holmes https://github.com/desholmes",license:"MIT",devDependencies:{"parcel-bundler":"^1.12.4",prettier:"2.1.2",sass:"^1.28.0"}}; },{}],"TNT3":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=r(require("../../package.json"));function r(e){return e&&e.__esModule?e:{default:e}}var t={clear:function(e){return e.clear()},version:function(r){return r.output("Text Terminal v".concat(e.default.version))}};exports.default=t; },{"../../package.json":"OjAK"}],"bzbF":[function(require,module,exports) { diff --git a/dist/text-terminal.js.map b/dist/text-terminal.js.map index 8025b78..b41f2b7 100644 --- a/dist/text-terminal.js.map +++ b/dist/text-terminal.js.map @@ -1 +1 @@ -{"version":3,"sources":["template.js","../../package.json","defaultCommands.js","cloneCommandEl.js","textTerminal.js"],"names":["prompt","separator","module","exports","name","version","description","repository","scripts","clean","start","build","lint","main","author","license","devDependencies","prettier","sass","clear","terminal","output","package","el","line","cloneNode","input","querySelector","autofocus","readOnly","insertAdjacentHTML","value","parentNode","removeChild","classList","add","TextTerminal","configProps","event","commandInput","dom","trim","keyCode","split","command","parameters","Object","history","push","localStorage","JSON","stringify","historyCursor","length","appendChild","keys","commands","includes","callback","focus","stopPropagation","preventDefault","remove","containerId","theme","welcome","containerEl","document","getElementById","Error","assign","defaultCommands","parse","createDom","addListeners","addEventListener","setTimeout","scrollIntoView","window","onKeyUp","onKeyDown","innerHTML","resetCommand","container"],"mappings":"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","file":"text-terminal.js","sourceRoot":"../src/modules","sourcesContent":["export default (prompt, separator) => `\n
\n \n
\n
${prompt}${separator}
\n \n
\n
\n`;\n","module.exports={name:\"text-terminal\",version:\"0.1.1\",description:\"A simple, extendable terminal interface for the web.\",repository:\"https://github.com/desholmes/text-terminal\",scripts:{clean:\"rm -rf ./dist/* \",start:\"parcel ./src/index.html\",build:\"npm run clean && parcel build ./src/scss/main.scss --out-file text-terminal.css && parcel build ./src/modules/textTerminal.js --out-file text-terminal.js\",lint:\"prettier --check .\",\"lint-fix\":\"prettier --write .\"},main:\"dist/text-terminal.js\",author:\"Des Holmes https://github.com/desholmes\",license:\"MIT\",devDependencies:{\"parcel-bundler\":\"^1.12.4\",prettier:\"2.1.2\",sass:\"^1.28.0\"}};","import package from \"../../package.json\";\n\nexport default {\n clear: (terminal) => terminal.clear(),\n\n version: (terminal) => terminal.output(`Text Terminal v${package.version}`),\n};\n","export default (el) => {\n const line = el.cloneNode(true);\n const input = line.querySelector(\".input\");\n\n input.autofocus = false;\n input.readOnly = true;\n input.insertAdjacentHTML(\"beforebegin\", input.value);\n input.parentNode.removeChild(input);\n line.classList.add(\"line\");\n\n return line;\n};\n","import template from \"./template\";\nimport defaultCommands from \"./defaultCommands\";\nimport cloneCommand from \"./cloneCommandEl\";\n\nclass TextTerminal {\n #id = \"TextTerminal\";\n dom = {};\n commands = {};\n history = [];\n historyCursor = 0;\n prompt;\n separator;\n theme;\n welcome;\n\n constructor(configProps = {}) {\n const {\n containerId = \"text-terminal\",\n commands = {},\n prompt = \"\",\n theme = \"dark\",\n welcome = \"Welcome!\",\n separator = \":\",\n } = configProps;\n\n const containerEl = document.getElementById(containerId);\n\n if (!containerEl) {\n throw Error(`Container #${containerId} does not exist!`);\n }\n\n this.commands = Object.assign({}, commands, defaultCommands);\n this.history = localStorage[this.#id]\n ? JSON.parse(localStorage[this.#id])\n : [];\n this.historyCursor = this.history.length;\n this.prompt = prompt;\n this.separator = separator;\n this.theme = theme;\n this.welcome = welcome;\n\n this.createDom(containerEl);\n this.addListeners();\n\n if (this.welcome) this.output(this.welcome);\n }\n\n addListeners() {\n this.dom.output.addEventListener(\n \"DOMSubtreeModified\",\n () => {\n setTimeout(() => this.dom.input.scrollIntoView(), 10);\n },\n false\n );\n\n if (window) {\n window.addEventListener(\"click\", () => this.dom.input.focus(), false);\n }\n\n this.dom.output.addEventListener(\n \"click\",\n (event) => event.stopPropagation(),\n false\n );\n\n this.dom.command.addEventListener(\n \"click\",\n () => this.dom.input.focus(),\n false\n );\n\n this.dom.input.addEventListener(\"keyup\", this.onKeyUp, false);\n this.dom.input.addEventListener(\"keydown\", this.onKeyDown, false);\n }\n\n clear() {\n this.dom.output.innerHTML = \"\";\n this.resetCommand();\n }\n\n createDom(containerEl) {\n containerEl.classList.add(this.#id, this.theme);\n containerEl.insertAdjacentHTML(\n \"beforeEnd\",\n template(this.prompt, this.separator)\n );\n\n this.dom = {\n container: containerEl.querySelector(\".container\"),\n output: containerEl.querySelector(\"output\"),\n command: containerEl.querySelector(\".command\"),\n input: containerEl.querySelector(\".command .input\"),\n prompt: containerEl.querySelector(\".command .prompt\"),\n };\n }\n\n onKeyDown = (event) => {\n const commandInput = this.dom.input.value.trim();\n\n if (event.keyCode !== 13 || !commandInput) {\n return;\n }\n\n const [command, ...parameters] = commandInput.split(\" \");\n\n // Add commands to history\n this.history.push(commandInput);\n localStorage[this.#id] = JSON.stringify(this.history);\n this.historyCursor = this.history.length;\n\n // Clone command as a new output line\n this.dom.output.appendChild(cloneCommand(this.dom.command));\n\n this.dom.input.value = \"\";\n\n // Dispatch command\n if (Object.keys(this.commands).includes(command)) {\n const callback = this.commands[command];\n if (callback) {\n callback(this, parameters);\n }\n } else {\n this.output(`${command}: command not found.`);\n }\n };\n\n onKeyUp = (event) => {\n this.dom.input.focus();\n event.stopPropagation();\n event.preventDefault();\n\n // ESC\n if (event.keyCode === 27) {\n this.dom.input.value = \"\";\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (event.keyCode === 38 || event.keyCode === 40) {\n // UP key\n if (event.keyCode === 38 && this.historyCursor > 0) {\n this.historyCursor -= 1;\n }\n\n // DOWN key\n if (\n event.keyCode === 40 &&\n this.historyCursor < this.history.length - 1\n ) {\n this.historyCursor -= 1;\n }\n\n if (this.history[this.historyCursor]) {\n this.dom.input.value = this.history[this.historyCursor];\n }\n }\n };\n\n output(command = \" \") {\n this.dom.output.insertAdjacentHTML(\"beforeEnd\", `${command}`);\n this.resetCommand();\n }\n\n resetCommand = () => {\n this.dom.input.value = \"\";\n this.dom.command.classList.remove(\"input\");\n };\n}\n\nif (window) {\n window.TextTerminal = TextTerminal;\n}\n\nexport default TextTerminal;\n"]} \ No newline at end of file +{"version":3,"sources":["template.js","../../package.json","defaultCommands.js","cloneCommandEl.js","textTerminal.js"],"names":["prompt","separator","module","exports","name","version","description","repository","scripts","clean","start","build","lint","main","types","author","license","devDependencies","prettier","sass","clear","terminal","output","package","el","line","cloneNode","input","querySelector","autofocus","readOnly","insertAdjacentHTML","value","parentNode","removeChild","classList","add","TextTerminal","configProps","event","commandInput","dom","trim","keyCode","split","command","parameters","Object","history","push","localStorage","JSON","stringify","historyCursor","length","appendChild","keys","commands","includes","callback","focus","stopPropagation","preventDefault","remove","containerId","theme","welcome","containerEl","document","getElementById","Error","assign","defaultCommands","parse","createDom","addListeners","addEventListener","setTimeout","scrollIntoView","window","onKeyUp","onKeyDown","innerHTML","resetCommand","container"],"mappings":"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","file":"text-terminal.js","sourceRoot":"../src/modules","sourcesContent":["export default (prompt, separator) => `\n
\n \n
\n
${prompt}${separator}
\n \n
\n
\n`;\n","module.exports={name:\"text-terminal\",version:\"0.1.1\",description:\"A simple, extendable terminal interface for the web.\",repository:\"https://github.com/desholmes/text-terminal\",scripts:{clean:\"rm -rf ./dist/*.css ./dist/*.map ./dist/*.js \",start:\"parcel ./src/index.html\",build:\"npm run clean && parcel build ./src/scss/main.scss --out-file text-terminal.css && parcel build ./src/modules/textTerminal.js --out-file text-terminal.js\",lint:\"prettier --check .\",\"lint-fix\":\"prettier --write .\"},main:\"dist/text-terminal.js\",types:\"dist/text-terminal.d.ts\",author:\"Des Holmes https://github.com/desholmes\",license:\"MIT\",devDependencies:{\"parcel-bundler\":\"^1.12.4\",prettier:\"2.1.2\",sass:\"^1.28.0\"}};","import package from \"../../package.json\";\n\nexport default {\n clear: (terminal) => terminal.clear(),\n\n version: (terminal) => terminal.output(`Text Terminal v${package.version}`),\n};\n","export default (el) => {\n const line = el.cloneNode(true);\n const input = line.querySelector(\".input\");\n\n input.autofocus = false;\n input.readOnly = true;\n input.insertAdjacentHTML(\"beforebegin\", input.value);\n input.parentNode.removeChild(input);\n line.classList.add(\"line\");\n\n return line;\n};\n","import template from \"./template\";\nimport defaultCommands from \"./defaultCommands\";\nimport cloneCommand from \"./cloneCommandEl\";\n\nclass TextTerminal {\n #id = \"TextTerminal\";\n dom = {};\n commands = {};\n history = [];\n historyCursor = 0;\n prompt;\n separator;\n theme;\n welcome;\n\n constructor(configProps = {}) {\n const {\n containerId = \"text-terminal\",\n commands = {},\n prompt = \"\",\n theme = \"dark\",\n welcome = \"Welcome!\",\n separator = \":\",\n } = configProps;\n\n const containerEl = document.getElementById(containerId);\n\n if (!containerEl) {\n throw Error(`Container #${containerId} does not exist!`);\n }\n\n this.commands = Object.assign({}, commands, defaultCommands);\n this.history = localStorage[this.#id]\n ? JSON.parse(localStorage[this.#id])\n : [];\n this.historyCursor = this.history.length;\n this.prompt = prompt;\n this.separator = separator;\n this.theme = theme;\n this.welcome = welcome;\n\n this.createDom(containerEl);\n this.addListeners();\n\n if (this.welcome) this.output(this.welcome);\n }\n\n addListeners() {\n this.dom.output.addEventListener(\n \"DOMSubtreeModified\",\n () => {\n setTimeout(() => this.dom.input.scrollIntoView(), 10);\n },\n false\n );\n\n if (window) {\n window.addEventListener(\"click\", () => this.dom.input.focus(), false);\n }\n\n this.dom.output.addEventListener(\n \"click\",\n (event) => event.stopPropagation(),\n false\n );\n\n this.dom.command.addEventListener(\n \"click\",\n () => this.dom.input.focus(),\n false\n );\n\n this.dom.input.addEventListener(\"keyup\", this.onKeyUp, false);\n this.dom.input.addEventListener(\"keydown\", this.onKeyDown, false);\n }\n\n clear() {\n this.dom.output.innerHTML = \"\";\n this.resetCommand();\n }\n\n createDom(containerEl) {\n containerEl.classList.add(this.#id, this.theme);\n containerEl.insertAdjacentHTML(\n \"beforeEnd\",\n template(this.prompt, this.separator)\n );\n\n this.dom = {\n container: containerEl.querySelector(\".container\"),\n output: containerEl.querySelector(\"output\"),\n command: containerEl.querySelector(\".command\"),\n input: containerEl.querySelector(\".command .input\"),\n prompt: containerEl.querySelector(\".command .prompt\"),\n };\n }\n\n onKeyDown = (event) => {\n const commandInput = this.dom.input.value.trim();\n\n if (event.keyCode !== 13 || !commandInput) {\n return;\n }\n\n const [command, ...parameters] = commandInput.split(\" \");\n\n // Add commands to history\n this.history.push(commandInput);\n localStorage[this.#id] = JSON.stringify(this.history);\n this.historyCursor = this.history.length;\n\n // Clone command as a new output line\n this.dom.output.appendChild(cloneCommand(this.dom.command));\n\n this.dom.input.value = \"\";\n\n // Dispatch command\n if (Object.keys(this.commands).includes(command)) {\n const callback = this.commands[command];\n if (callback) {\n callback(this, parameters);\n }\n } else {\n this.output(`${command}: command not found.`);\n }\n };\n\n onKeyUp = (event) => {\n this.dom.input.focus();\n event.stopPropagation();\n event.preventDefault();\n\n // ESC\n if (event.keyCode === 27) {\n this.dom.input.value = \"\";\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (event.keyCode === 38 || event.keyCode === 40) {\n // UP key\n if (event.keyCode === 38 && this.historyCursor > 0) {\n this.historyCursor -= 1;\n }\n\n // DOWN key\n if (\n event.keyCode === 40 &&\n this.historyCursor < this.history.length - 1\n ) {\n this.historyCursor -= 1;\n }\n\n if (this.history[this.historyCursor]) {\n this.dom.input.value = this.history[this.historyCursor];\n }\n }\n };\n\n output(command = \" \") {\n this.dom.output.insertAdjacentHTML(\"beforeEnd\", `${command}`);\n this.resetCommand();\n }\n\n resetCommand = () => {\n this.dom.input.value = \"\";\n this.dom.command.classList.remove(\"input\");\n };\n}\n\nif (window) {\n window.TextTerminal = TextTerminal;\n}\n\nexport default TextTerminal;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 003811a..69bc14f 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A simple, extendable terminal interface for the web.", "repository": "https://github.com/desholmes/text-terminal", "scripts": { - "clean": "rm -rf ./dist/* ", + "clean": "rm -rf ./dist/*.css ./dist/*.map ./dist/*.js ", "start": "parcel ./src/index.html", "build": "npm run clean && parcel build ./src/scss/main.scss --out-file text-terminal.css && parcel build ./src/modules/textTerminal.js --out-file text-terminal.js", "lint": "prettier --check .",