diff --git a/README.md b/README.md new file mode 100755 index 0000000..ae86188 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# socrates_app + +## Project setup +``` +npm install +``` + +### Compiles and hot-reloads for development +``` +npm run serve +``` + +### Compiles and minifies for production +``` +npm run build +``` + +### Lints and fixes files +``` +npm run lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/apollo.config.js b/apollo.config.js new file mode 100644 index 0000000..08cdb76 --- /dev/null +++ b/apollo.config.js @@ -0,0 +1,23 @@ +const path = require('path') + +// Load .env files +const { loadEnv } = require('vue-cli-plugin-apollo/utils/load-env') +const env = loadEnv([ + path.resolve(__dirname, '.env'), + path.resolve(__dirname, '.env.local') +]) + +module.exports = { + client: { + service: env.VUE_APP_APOLLO_ENGINE_SERVICE, + includes: ['src/**/*.{js,jsx,ts,tsx,vue,gql}'] + }, + service: { + name: env.VUE_APP_APOLLO_ENGINE_SERVICE, + localSchemaFile: path.resolve(__dirname, './node_modules/.temp/graphql/schema.json') + }, + engine: { + endpoint: process.env.APOLLO_ENGINE_API_ENDPOINT, + apiKey: env.VUE_APP_APOLLO_ENGINE_KEY + } +} diff --git a/babel.config.js b/babel.config.js new file mode 100755 index 0000000..e955840 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/dist_electron/index.js b/dist_electron/index.js new file mode 100644 index 0000000..8a7d07d --- /dev/null +++ b/dist_electron/index.js @@ -0,0 +1,1326 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/balanced-match/index.js": +/*!**********************************************!*\ + !*** ./node_modules/balanced-match/index.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n\n\n//# sourceURL=webpack:///./node_modules/balanced-match/index.js?"); + +/***/ }), + +/***/ "./node_modules/brace-expansion/index.js": +/*!***********************************************!*\ + !*** ./node_modules/brace-expansion/index.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var concatMap = __webpack_require__(/*! concat-map */ \"./node_modules/concat-map/index.js\");\nvar balanced = __webpack_require__(/*! balanced-match */ \"./node_modules/balanced-match/index.js\");\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n return e;\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m || /\\$$/.test(m.pre)) return [str];\n\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = concatMap(n, function(el) { return expand(el, false) });\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n\n return expansions;\n}\n\n\n\n//# sourceURL=webpack:///./node_modules/brace-expansion/index.js?"); + +/***/ }), + +/***/ "./node_modules/concat-map/index.js": +/*!******************************************!*\ + !*** ./node_modules/concat-map/index.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (xs, fn) {\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n var x = fn(xs[i], i);\n if (isArray(x)) res.push.apply(res, x);\n else res.push(x);\n }\n return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./node_modules/concat-map/index.js?"); + +/***/ }), + +/***/ "./node_modules/core-util-is/lib/util.js": +/*!***********************************************!*\ + !*** ./node_modules/core-util-is/lib/util.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\n//# sourceURL=webpack:///./node_modules/core-util-is/lib/util.js?"); + +/***/ }), + +/***/ "./node_modules/fs.realpath/index.js": +/*!*******************************************!*\ + !*** ./node_modules/fs.realpath/index.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("module.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = __webpack_require__(/*! fs */ \"fs\")\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = __webpack_require__(/*! ./old.js */ \"./node_modules/fs.realpath/old.js\")\n\nfunction newError (er) {\n return er && er.syscall === 'realpath' && (\n er.code === 'ELOOP' ||\n er.code === 'ENOMEM' ||\n er.code === 'ENAMETOOLONG'\n )\n}\n\nfunction realpath (p, cache, cb) {\n if (ok) {\n return origRealpath(p, cache, cb)\n }\n\n if (typeof cache === 'function') {\n cb = cache\n cache = null\n }\n origRealpath(p, cache, function (er, result) {\n if (newError(er)) {\n old.realpath(p, cache, cb)\n } else {\n cb(er, result)\n }\n })\n}\n\nfunction realpathSync (p, cache) {\n if (ok) {\n return origRealpathSync(p, cache)\n }\n\n try {\n return origRealpathSync(p, cache)\n } catch (er) {\n if (newError(er)) {\n return old.realpathSync(p, cache)\n } else {\n throw er\n }\n }\n}\n\nfunction monkeypatch () {\n fs.realpath = realpath\n fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n fs.realpath = origRealpath\n fs.realpathSync = origRealpathSync\n}\n\n\n//# sourceURL=webpack:///./node_modules/fs.realpath/index.js?"); + +/***/ }), + +/***/ "./node_modules/fs.realpath/old.js": +/*!*****************************************!*\ + !*** ./node_modules/fs.realpath/old.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = __webpack_require__(/*! path */ \"path\");\nvar isWindows = process.platform === 'win32';\nvar fs = __webpack_require__(/*! fs */ \"fs\");\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n // is fairly slow to generate.\n var callback;\n if (DEBUG) {\n var backtrace = new Error;\n callback = debugCallback;\n } else\n callback = missingCallback;\n\n return callback;\n\n function debugCallback(err) {\n if (err) {\n backtrace.message = err.message;\n err = backtrace;\n missingCallback(err);\n }\n }\n\n function missingCallback(err) {\n if (err) {\n if (process.throwDeprecation)\n throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n else if (!process.noDeprecation) {\n var msg = 'fs: missing callback ' + (err.stack || err.message);\n if (process.traceDeprecation)\n console.trace(msg);\n else\n console.error(msg);\n }\n }\n }\n}\n\nfunction maybeCallback(cb) {\n return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return cache[p];\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstatSync(base);\n knownHard[base] = true;\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n // NB: p.length changes.\n while (pos < p.length) {\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n continue;\n }\n\n var resolvedLink;\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // some known symbolic link. no need to stat again.\n resolvedLink = cache[base];\n } else {\n var stat = fs.lstatSync(base);\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n continue;\n }\n\n // read the link if it wasn't read before\n // dev/ino always return 0 on windows, so skip the check.\n var linkTarget = null;\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n linkTarget = seenLinks[id];\n }\n }\n if (linkTarget === null) {\n fs.statSync(base);\n linkTarget = fs.readlinkSync(base);\n }\n resolvedLink = pathModule.resolve(previous, linkTarget);\n // track this, if given a cache.\n if (cache) cache[base] = resolvedLink;\n if (!isWindows) seenLinks[id] = linkTarget;\n }\n\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n\n if (cache) cache[original] = p;\n\n return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n if (typeof cb !== 'function') {\n cb = maybeCallback(cache);\n cache = null;\n }\n\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return process.nextTick(cb.bind(null, null, cache[p]));\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstat(base, function(err) {\n if (err) return cb(err);\n knownHard[base] = true;\n LOOP();\n });\n } else {\n process.nextTick(LOOP);\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n function LOOP() {\n // stop if scanned past end of path\n if (pos >= p.length) {\n if (cache) cache[original] = p;\n return cb(null, p);\n }\n\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n return process.nextTick(LOOP);\n }\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // known symbolic link. no need to stat again.\n return gotResolvedLink(cache[base]);\n }\n\n return fs.lstat(base, gotStat);\n }\n\n function gotStat(err, stat) {\n if (err) return cb(err);\n\n // if not a symlink, skip to the next path part\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n return process.nextTick(LOOP);\n }\n\n // stat & read the link if not read before\n // call gotTarget as soon as the link target is known\n // dev/ino always return 0 on windows, so skip the check.\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n return gotTarget(null, seenLinks[id], base);\n }\n }\n fs.stat(base, function(err) {\n if (err) return cb(err);\n\n fs.readlink(base, function(err, target) {\n if (!isWindows) seenLinks[id] = target;\n gotTarget(err, target);\n });\n });\n }\n\n function gotTarget(err, target, base) {\n if (err) return cb(err);\n\n var resolvedLink = pathModule.resolve(previous, target);\n if (cache) cache[base] = resolvedLink;\n gotResolvedLink(resolvedLink);\n }\n\n function gotResolvedLink(resolvedLink) {\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n};\n\n\n//# sourceURL=webpack:///./node_modules/fs.realpath/old.js?"); + +/***/ }), + +/***/ "./node_modules/glob/common.js": +/*!*************************************!*\ + !*** ./node_modules/glob/common.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("exports.alphasort = alphasort\nexports.alphasorti = alphasorti\nexports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar path = __webpack_require__(/*! path */ \"path\")\nvar minimatch = __webpack_require__(/*! minimatch */ \"./node_modules/minimatch/minimatch.js\")\nvar isAbsolute = __webpack_require__(/*! path-is-absolute */ \"./node_modules/path-is-absolute/index.js\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasorti (a, b) {\n return a.toLowerCase().localeCompare(b.toLowerCase())\n}\n\nfunction alphasort (a, b) {\n return a.localeCompare(b)\n}\n\nfunction setupIgnores (self, options) {\n self.ignore = options.ignore || []\n\n if (!Array.isArray(self.ignore))\n self.ignore = [self.ignore]\n\n if (self.ignore.length) {\n self.ignore = self.ignore.map(ignoreMap)\n }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n var gmatcher = null\n if (pattern.slice(-3) === '/**') {\n var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n gmatcher = new Minimatch(gpattern, { dot: true })\n }\n\n return {\n matcher: new Minimatch(pattern, { dot: true }),\n gmatcher: gmatcher\n }\n}\n\nfunction setopts (self, pattern, options) {\n if (!options)\n options = {}\n\n // base-matching: just use globstar for that.\n if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n if (options.noglobstar) {\n throw new Error(\"base matching requires globstar\")\n }\n pattern = \"**/\" + pattern\n }\n\n self.silent = !!options.silent\n self.pattern = pattern\n self.strict = options.strict !== false\n self.realpath = !!options.realpath\n self.realpathCache = options.realpathCache || Object.create(null)\n self.follow = !!options.follow\n self.dot = !!options.dot\n self.mark = !!options.mark\n self.nodir = !!options.nodir\n if (self.nodir)\n self.mark = true\n self.sync = !!options.sync\n self.nounique = !!options.nounique\n self.nonull = !!options.nonull\n self.nosort = !!options.nosort\n self.nocase = !!options.nocase\n self.stat = !!options.stat\n self.noprocess = !!options.noprocess\n self.absolute = !!options.absolute\n\n self.maxLength = options.maxLength || Infinity\n self.cache = options.cache || Object.create(null)\n self.statCache = options.statCache || Object.create(null)\n self.symlinks = options.symlinks || Object.create(null)\n\n setupIgnores(self, options)\n\n self.changedCwd = false\n var cwd = process.cwd()\n if (!ownProp(options, \"cwd\"))\n self.cwd = cwd\n else {\n self.cwd = path.resolve(options.cwd)\n self.changedCwd = self.cwd !== cwd\n }\n\n self.root = options.root || path.resolve(self.cwd, \"/\")\n self.root = path.resolve(self.root)\n if (process.platform === \"win32\")\n self.root = self.root.replace(/\\\\/g, \"/\")\n\n // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n if (process.platform === \"win32\")\n self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n self.nomount = !!options.nomount\n\n // disable comments and negation in Minimatch.\n // Note that they are not supported in Glob itself anyway.\n options.nonegate = true\n options.nocomment = true\n\n self.minimatch = new Minimatch(pattern, options)\n self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n var nou = self.nounique\n var all = nou ? [] : Object.create(null)\n\n for (var i = 0, l = self.matches.length; i < l; i ++) {\n var matches = self.matches[i]\n if (!matches || Object.keys(matches).length === 0) {\n if (self.nonull) {\n // do like the shell, and spit out the literal glob\n var literal = self.minimatch.globSet[i]\n if (nou)\n all.push(literal)\n else\n all[literal] = true\n }\n } else {\n // had matches\n var m = Object.keys(matches)\n if (nou)\n all.push.apply(all, m)\n else\n m.forEach(function (m) {\n all[m] = true\n })\n }\n }\n\n if (!nou)\n all = Object.keys(all)\n\n if (!self.nosort)\n all = all.sort(self.nocase ? alphasorti : alphasort)\n\n // at *some* point we statted all of these\n if (self.mark) {\n for (var i = 0; i < all.length; i++) {\n all[i] = self._mark(all[i])\n }\n if (self.nodir) {\n all = all.filter(function (e) {\n var notDir = !(/\\/$/.test(e))\n var c = self.cache[e] || self.cache[makeAbs(self, e)]\n if (notDir && c)\n notDir = c !== 'DIR' && !Array.isArray(c)\n return notDir\n })\n }\n }\n\n if (self.ignore.length)\n all = all.filter(function(m) {\n return !isIgnored(self, m)\n })\n\n self.found = all\n}\n\nfunction mark (self, p) {\n var abs = makeAbs(self, p)\n var c = self.cache[abs]\n var m = p\n if (c) {\n var isDir = c === 'DIR' || Array.isArray(c)\n var slash = p.slice(-1) === '/'\n\n if (isDir && !slash)\n m += '/'\n else if (!isDir && slash)\n m = m.slice(0, -1)\n\n if (m !== p) {\n var mabs = makeAbs(self, m)\n self.statCache[mabs] = self.statCache[abs]\n self.cache[mabs] = self.cache[abs]\n }\n }\n\n return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n var abs = f\n if (f.charAt(0) === '/') {\n abs = path.join(self.root, f)\n } else if (isAbsolute(f) || f === '') {\n abs = f\n } else if (self.changedCwd) {\n abs = path.resolve(self.cwd, f)\n } else {\n abs = path.resolve(f)\n }\n\n if (process.platform === 'win32')\n abs = abs.replace(/\\\\/g, '/')\n\n return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\nfunction childrenIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\n\n//# sourceURL=webpack:///./node_modules/glob/common.js?"); + +/***/ }), + +/***/ "./node_modules/glob/glob.js": +/*!***********************************!*\ + !*** ./node_modules/glob/glob.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together. This is PREFIX.\n// If there is no more remaining, then stat(PREFIX) and\n// add to matches if it succeeds. END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n// set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n// If fail, END\n//\n// with ENTRIES\n// If pattern[n] is GLOBSTAR\n// // handle the case where the globstar match is empty\n// // by pruning it out, and testing the resulting pattern\n// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n// // handle other cases.\n// for ENTRY in ENTRIES (not dotfiles)\n// // attach globstar + tail onto the entry\n// // Mark that this entry is a globstar match\n// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n// else // not globstar\n// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n// Test ENTRY against pattern[n]\n// If fails, continue\n// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n// Cache all stats and readdirs results to minimize syscall. Since all\n// we ever care about is existence and directory-ness, we can just keep\n// `true` for files, and [children,...] for directories, or `false` for\n// things that don't exist.\n\nmodule.exports = glob\n\nvar fs = __webpack_require__(/*! fs */ \"fs\")\nvar rp = __webpack_require__(/*! fs.realpath */ \"./node_modules/fs.realpath/index.js\")\nvar minimatch = __webpack_require__(/*! minimatch */ \"./node_modules/minimatch/minimatch.js\")\nvar Minimatch = minimatch.Minimatch\nvar inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits.js\")\nvar EE = __webpack_require__(/*! events */ \"events\").EventEmitter\nvar path = __webpack_require__(/*! path */ \"path\")\nvar assert = __webpack_require__(/*! assert */ \"assert\")\nvar isAbsolute = __webpack_require__(/*! path-is-absolute */ \"./node_modules/path-is-absolute/index.js\")\nvar globSync = __webpack_require__(/*! ./sync.js */ \"./node_modules/glob/sync.js\")\nvar common = __webpack_require__(/*! ./common.js */ \"./node_modules/glob/common.js\")\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = __webpack_require__(/*! inflight */ \"./node_modules/inflight/inflight.js\")\nvar util = __webpack_require__(/*! util */ \"util\")\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = __webpack_require__(/*! once */ \"./node_modules/once/once.js\")\n\nfunction glob (pattern, options, cb) {\n if (typeof options === 'function') cb = options, options = {}\n if (!options) options = {}\n\n if (options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return globSync(pattern, options)\n }\n\n return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n if (add === null || typeof add !== 'object') {\n return origin\n }\n\n var keys = Object.keys(add)\n var i = keys.length\n while (i--) {\n origin[keys[i]] = add[keys[i]]\n }\n return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n var options = extend({}, options_)\n options.noprocess = true\n\n var g = new Glob(pattern, options)\n var set = g.minimatch.set\n\n if (!pattern)\n return false\n\n if (set.length > 1)\n return true\n\n for (var j = 0; j < set[0].length; j++) {\n if (typeof set[0][j] !== 'string')\n return true\n }\n\n return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n\n if (options && options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return new GlobSync(pattern, options)\n }\n\n if (!(this instanceof Glob))\n return new Glob(pattern, options, cb)\n\n setopts(this, pattern, options)\n this._didRealPath = false\n\n // process each pattern in the minimatch set\n var n = this.minimatch.set.length\n\n // The matches are stored as {: true,...} so that\n // duplicates are automagically pruned.\n // Later, we do an Object.keys() on these.\n // Keep them as a list so we can fill in when nonull is set.\n this.matches = new Array(n)\n\n if (typeof cb === 'function') {\n cb = once(cb)\n this.on('error', cb)\n this.on('end', function (matches) {\n cb(null, matches)\n })\n }\n\n var self = this\n this._processing = 0\n\n this._emitQueue = []\n this._processQueue = []\n this.paused = false\n\n if (this.noprocess)\n return this\n\n if (n === 0)\n return done()\n\n var sync = true\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false, done)\n }\n sync = false\n\n function done () {\n --self._processing\n if (self._processing <= 0) {\n if (sync) {\n process.nextTick(function () {\n self._finish()\n })\n } else {\n self._finish()\n }\n }\n }\n}\n\nGlob.prototype._finish = function () {\n assert(this instanceof Glob)\n if (this.aborted)\n return\n\n if (this.realpath && !this._didRealpath)\n return this._realpath()\n\n common.finish(this)\n this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n if (this._didRealpath)\n return\n\n this._didRealpath = true\n\n var n = this.matches.length\n if (n === 0)\n return this._finish()\n\n var self = this\n for (var i = 0; i < this.matches.length; i++)\n this._realpathSet(i, next)\n\n function next () {\n if (--n === 0)\n self._finish()\n }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n var matchset = this.matches[index]\n if (!matchset)\n return cb()\n\n var found = Object.keys(matchset)\n var self = this\n var n = found.length\n\n if (n === 0)\n return cb()\n\n var set = this.matches[index] = Object.create(null)\n found.forEach(function (p, i) {\n // If there's a problem with the stat, then it means that\n // one or more of the links in the realpath couldn't be\n // resolved. just return the abs value in that case.\n p = self._makeAbs(p)\n rp.realpath(p, self.realpathCache, function (er, real) {\n if (!er)\n set[real] = true\n else if (er.syscall === 'stat')\n set[p] = true\n else\n self.emit('error', er) // srsly wtf right here\n\n if (--n === 0) {\n self.matches[index] = set\n cb()\n }\n })\n })\n}\n\nGlob.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n this.aborted = true\n this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n if (!this.paused) {\n this.paused = true\n this.emit('pause')\n }\n}\n\nGlob.prototype.resume = function () {\n if (this.paused) {\n this.emit('resume')\n this.paused = false\n if (this._emitQueue.length) {\n var eq = this._emitQueue.slice(0)\n this._emitQueue.length = 0\n for (var i = 0; i < eq.length; i ++) {\n var e = eq[i]\n this._emitMatch(e[0], e[1])\n }\n }\n if (this._processQueue.length) {\n var pq = this._processQueue.slice(0)\n this._processQueue.length = 0\n for (var i = 0; i < pq.length; i ++) {\n var p = pq[i]\n this._processing--\n this._process(p[0], p[1], p[2], p[3])\n }\n }\n }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n assert(this instanceof Glob)\n assert(typeof cb === 'function')\n\n if (this.aborted)\n return\n\n this._processing++\n if (this.paused) {\n this._processQueue.push([pattern, index, inGlobStar, cb])\n return\n }\n\n //console.error('PROCESS %d', this._processing, pattern)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // see if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index, cb)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip _processing\n if (childrenIgnored(this, read))\n return cb()\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return cb()\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return cb()\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return cb()\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n this._process([e].concat(remain), index, inGlobStar, cb)\n }\n cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n if (this.aborted)\n return\n\n if (isIgnored(this, e))\n return\n\n if (this.paused) {\n this._emitQueue.push([index, e])\n return\n }\n\n var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute)\n e = abs\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n var st = this.statCache[abs]\n if (st)\n this.emit('stat', e, st)\n\n this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n if (this.aborted)\n return\n\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false, cb)\n\n var lstatkey = 'lstat\\0' + abs\n var self = this\n var lstatcb = inflight(lstatkey, lstatcb_)\n\n if (lstatcb)\n fs.lstat(abs, lstatcb)\n\n function lstatcb_ (er, lstat) {\n if (er && er.code === 'ENOENT')\n return cb()\n\n var isSym = lstat && lstat.isSymbolicLink()\n self.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory()) {\n self.cache[abs] = 'FILE'\n cb()\n } else\n self._readdir(abs, false, cb)\n }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n if (this.aborted)\n return\n\n cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n if (!cb)\n return\n\n //console.error('RD %j %j', +inGlobStar, abs)\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs, cb)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return cb()\n\n if (Array.isArray(c))\n return cb(null, c)\n }\n\n var self = this\n fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n return function (er, entries) {\n if (er)\n self._readdirError(abs, er, cb)\n else\n self._readdirEntries(abs, entries, cb)\n }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n if (this.aborted)\n return\n\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n if (this.aborted)\n return\n\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n this.emit('error', error)\n this.abort()\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict) {\n this.emit('error', er)\n // If the error is handled, then we abort\n // if not, we threw out of here\n this.abort()\n }\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n\n return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n //console.error('pgs2', prefix, remain[0], entries)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return cb()\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false, cb)\n\n var isSym = this.symlinks[abs]\n var len = entries.length\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return cb()\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true, cb)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true, cb)\n }\n\n cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var self = this\n this._stat(prefix, function (er, exists) {\n self._processSimple2(prefix, index, er, exists, cb)\n })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n //console.error('ps2', prefix, exists)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return cb()\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return cb()\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return cb(null, c)\n\n if (needDir && c === 'FILE')\n return cb()\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (stat !== undefined) {\n if (stat === false)\n return cb(null, stat)\n else {\n var type = stat.isDirectory() ? 'DIR' : 'FILE'\n if (needDir && type === 'FILE')\n return cb()\n else\n return cb(null, type, stat)\n }\n }\n\n var self = this\n var statcb = inflight('stat\\0' + abs, lstatcb_)\n if (statcb)\n fs.lstat(abs, statcb)\n\n function lstatcb_ (er, lstat) {\n if (lstat && lstat.isSymbolicLink()) {\n // If it's a symlink, then treat it as the target, unless\n // the target does not exist, then treat it as a file.\n return fs.stat(abs, function (er, stat) {\n if (er)\n self._stat2(f, abs, null, lstat, cb)\n else\n self._stat2(f, abs, er, stat, cb)\n })\n } else {\n self._stat2(f, abs, er, lstat, cb)\n }\n }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return cb()\n }\n\n var needDir = f.slice(-1) === '/'\n this.statCache[abs] = stat\n\n if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n return cb(null, false, stat)\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return cb()\n\n return cb(null, c, stat)\n}\n\n\n//# sourceURL=webpack:///./node_modules/glob/glob.js?"); + +/***/ }), + +/***/ "./node_modules/glob/sync.js": +/*!***********************************!*\ + !*** ./node_modules/glob/sync.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar fs = __webpack_require__(/*! fs */ \"fs\")\nvar rp = __webpack_require__(/*! fs.realpath */ \"./node_modules/fs.realpath/index.js\")\nvar minimatch = __webpack_require__(/*! minimatch */ \"./node_modules/minimatch/minimatch.js\")\nvar Minimatch = minimatch.Minimatch\nvar Glob = __webpack_require__(/*! ./glob.js */ \"./node_modules/glob/glob.js\").Glob\nvar util = __webpack_require__(/*! util */ \"util\")\nvar path = __webpack_require__(/*! path */ \"path\")\nvar assert = __webpack_require__(/*! assert */ \"assert\")\nvar isAbsolute = __webpack_require__(/*! path-is-absolute */ \"./node_modules/path-is-absolute/index.js\")\nvar common = __webpack_require__(/*! ./common.js */ \"./node_modules/glob/common.js\")\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n if (!pattern)\n throw new Error('must provide pattern')\n\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n if (!(this instanceof GlobSync))\n return new GlobSync(pattern, options)\n\n setopts(this, pattern, options)\n\n if (this.noprocess)\n return this\n\n var n = this.minimatch.set.length\n this.matches = new Array(n)\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false)\n }\n this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n assert(this instanceof GlobSync)\n if (this.realpath) {\n var self = this\n this.matches.forEach(function (matchset, index) {\n var set = self.matches[index] = Object.create(null)\n for (var p in matchset) {\n try {\n p = self._makeAbs(p)\n var real = rp.realpathSync(p, self.realpathCache)\n set[real] = true\n } catch (er) {\n if (er.syscall === 'stat')\n set[self._makeAbs(p)] = true\n else\n throw er\n }\n }\n })\n }\n common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n assert(this instanceof GlobSync)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // See if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip processing\n if (childrenIgnored(this, read))\n return\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n var entries = this._readdir(abs, inGlobStar)\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix.slice(-1) !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix)\n newPattern = [prefix, e]\n else\n newPattern = [e]\n this._process(newPattern.concat(remain), index, inGlobStar)\n }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n if (isIgnored(this, e))\n return\n\n var abs = this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute) {\n e = abs\n }\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n if (this.stat)\n this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false)\n\n var entries\n var lstat\n var stat\n try {\n lstat = fs.lstatSync(abs)\n } catch (er) {\n if (er.code === 'ENOENT') {\n // lstat failed, doesn't exist\n return null\n }\n }\n\n var isSym = lstat && lstat.isSymbolicLink()\n this.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory())\n this.cache[abs] = 'FILE'\n else\n entries = this._readdir(abs, false)\n\n return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n var entries\n\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return null\n\n if (Array.isArray(c))\n return c\n }\n\n try {\n return this._readdirEntries(abs, fs.readdirSync(abs))\n } catch (er) {\n this._readdirError(abs, er)\n return null\n }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n\n // mark and cache dir-ness\n return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n throw error\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict)\n throw er\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n var entries = this._readdir(abs, inGlobStar)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false)\n\n var len = entries.length\n var isSym = this.symlinks[abs]\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true)\n }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var exists = this._stat(prefix)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return false\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return c\n\n if (needDir && c === 'FILE')\n return false\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (!stat) {\n var lstat\n try {\n lstat = fs.lstatSync(abs)\n } catch (er) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return false\n }\n }\n\n if (lstat && lstat.isSymbolicLink()) {\n try {\n stat = fs.statSync(abs)\n } catch (er) {\n stat = lstat\n }\n } else {\n stat = lstat\n }\n }\n\n this.statCache[abs] = stat\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return false\n\n return c\n}\n\nGlobSync.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\n\n//# sourceURL=webpack:///./node_modules/glob/sync.js?"); + +/***/ }), + +/***/ "./node_modules/immediate/lib/index.js": +/*!*********************************************!*\ + !*** ./node_modules/immediate/lib/index.js ***! + \*********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\nif (process.browser) {\n if (Mutation) {\n var called = 0;\n var observer = new Mutation(nextTick);\n var element = global.document.createTextNode('');\n observer.observe(element, {\n characterData: true\n });\n scheduleDrain = function () {\n element.data = (called = ++called % 2);\n };\n } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n var channel = new global.MessageChannel();\n channel.port1.onmessage = nextTick;\n scheduleDrain = function () {\n channel.port2.postMessage(0);\n };\n } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n scheduleDrain = function () {\n\n // Create a + diff --git a/src/components/BaseAlert.vue b/src/components/BaseAlert.vue new file mode 100755 index 0000000..02dc0be --- /dev/null +++ b/src/components/BaseAlert.vue @@ -0,0 +1,66 @@ + + diff --git a/src/components/BaseButton.vue b/src/components/BaseButton.vue new file mode 100755 index 0000000..8e7d8e9 --- /dev/null +++ b/src/components/BaseButton.vue @@ -0,0 +1,106 @@ + + + diff --git a/src/components/BaseCheckbox.vue b/src/components/BaseCheckbox.vue new file mode 100755 index 0000000..918af77 --- /dev/null +++ b/src/components/BaseCheckbox.vue @@ -0,0 +1,61 @@ + + diff --git a/src/components/BaseDropdown.vue b/src/components/BaseDropdown.vue new file mode 100755 index 0000000..567aa47 --- /dev/null +++ b/src/components/BaseDropdown.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/components/BaseHeader.vue b/src/components/BaseHeader.vue new file mode 100755 index 0000000..7eff333 --- /dev/null +++ b/src/components/BaseHeader.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/BaseInput.vue b/src/components/BaseInput.vue new file mode 100755 index 0000000..2d056d8 --- /dev/null +++ b/src/components/BaseInput.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/components/BaseNav.vue b/src/components/BaseNav.vue new file mode 100755 index 0000000..9abd1c8 --- /dev/null +++ b/src/components/BaseNav.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/components/BasePagination.vue b/src/components/BasePagination.vue new file mode 100755 index 0000000..698e415 --- /dev/null +++ b/src/components/BasePagination.vue @@ -0,0 +1,134 @@ + + diff --git a/src/components/BaseProgress.vue b/src/components/BaseProgress.vue new file mode 100755 index 0000000..6aeba6e --- /dev/null +++ b/src/components/BaseProgress.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/components/BaseRadio.vue b/src/components/BaseRadio.vue new file mode 100755 index 0000000..31045c8 --- /dev/null +++ b/src/components/BaseRadio.vue @@ -0,0 +1,61 @@ + + diff --git a/src/components/BaseSlider.vue b/src/components/BaseSlider.vue new file mode 100755 index 0000000..bfe8c7c --- /dev/null +++ b/src/components/BaseSlider.vue @@ -0,0 +1,96 @@ + + diff --git a/src/components/BaseSwitch.vue b/src/components/BaseSwitch.vue new file mode 100755 index 0000000..6299fa8 --- /dev/null +++ b/src/components/BaseSwitch.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/BaseTable.vue b/src/components/BaseTable.vue new file mode 100755 index 0000000..0c7f710 --- /dev/null +++ b/src/components/BaseTable.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/Card.vue b/src/components/Card.vue new file mode 100755 index 0000000..c8f4b20 --- /dev/null +++ b/src/components/Card.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/Charts/BarChart.js b/src/components/Charts/BarChart.js new file mode 100755 index 0000000..c45092c --- /dev/null +++ b/src/components/Charts/BarChart.js @@ -0,0 +1,30 @@ +import { Bar, mixins } from 'vue-chartjs'; +import globalOptionsMixin from "@/components/Charts/globalOptionsMixin"; + +export default { + name: 'bar-chart', + extends: Bar, + mixins: [mixins.reactiveProp, globalOptionsMixin], + props: { + extraOptions: { + type: Object, + default: () => ({}) + } + }, + data() { + return { + ctx: null + }; + }, + mounted() { + this.$watch( + 'chartData', + (newVal, oldVal) => { + if (!oldVal) { + this.renderChart(this.chartData, this.extraOptions); + } + }, + { immediate: true } + ); + } +}; diff --git a/src/components/Charts/DoughnutChart.js b/src/components/Charts/DoughnutChart.js new file mode 100755 index 0000000..796a198 --- /dev/null +++ b/src/components/Charts/DoughnutChart.js @@ -0,0 +1,30 @@ +import { Doughnut, mixins } from 'vue-chartjs'; +import globalOptionsMixin from "@/components/Charts/globalOptionsMixin"; + +export default { + name: 'doughnut-chart', + extends: Doughnut, + mixins: [mixins.reactiveProp, globalOptionsMixin], + props: { + extraOptions: { + type: Object, + default: () => ({}) + } + }, + data() { + return { + ctx: null + }; + }, + mounted() { + this.$watch( + 'chartData', + (newVal, oldVal) => { + if (!oldVal) { + this.renderChart(this.chartData, this.extraOptions); + } + }, + { immediate: true } + ); + } +}; diff --git a/src/components/Charts/LineChart.js b/src/components/Charts/LineChart.js new file mode 100755 index 0000000..50a3149 --- /dev/null +++ b/src/components/Charts/LineChart.js @@ -0,0 +1,30 @@ +import { Line, mixins } from 'vue-chartjs'; +import globalOptionsMixin from "@/components/Charts/globalOptionsMixin"; + +export default { + name: 'line-chart', + extends: Line, + mixins: [mixins.reactiveProp, globalOptionsMixin], + props: { + extraOptions: { + type: Object, + default: () => ({}) + } + }, + data() { + return { + ctx: null + }; + }, + mounted() { + this.$watch( + 'chartData', + (newVal, oldVal) => { + if (!oldVal) { + this.renderChart(this.chartData, this.extraOptions); + } + }, + { immediate: true } + ); + } +}; diff --git a/src/components/Charts/PieChart.js b/src/components/Charts/PieChart.js new file mode 100755 index 0000000..73f8363 --- /dev/null +++ b/src/components/Charts/PieChart.js @@ -0,0 +1,30 @@ +import { Pie, mixins } from 'vue-chartjs'; +import globalOptionsMixin from "@/components/Charts/globalOptionsMixin"; + +export default { + name: 'pie-chart', + extends: Pie, + mixins: [mixins.reactiveProp, globalOptionsMixin], + props: { + extraOptions: { + type: Object, + default: () => ({}) + } + }, + data() { + return { + ctx: null + }; + }, + mounted() { + this.$watch( + 'chartData', + (newVal, oldVal) => { + if (!oldVal) { + this.renderChart(this.chartData, this.extraOptions); + } + }, + { immediate: true } + ); + } +}; diff --git a/src/components/Charts/config.js b/src/components/Charts/config.js new file mode 100755 index 0000000..55df725 --- /dev/null +++ b/src/components/Charts/config.js @@ -0,0 +1,498 @@ +import { parseOptions } from "@/components/Charts/optionHelpers"; + +export const Charts = { + mode: 'light',//(themeMode) ? themeMode : 'light'; + fonts: { + base: 'Open Sans' + }, + colors: { + gray: { + 100: '#f6f9fc', + 200: '#e9ecef', + 300: '#dee2e6', + 400: '#ced4da', + 500: '#adb5bd', + 600: '#8898aa', + 700: '#525f7f', + 800: '#32325d', + 900: '#212529' + }, + theme: { + 'default': '#172b4d', + 'primary': '#5e72e4', + 'secondary': '#f4f5f7', + 'info': '#11cdef', + 'success': '#2dce89', + 'danger': '#f5365c', + 'warning': '#fb6340' + }, + black: '#12263F', + white: '#FFFFFF', + transparent: 'transparent', + } +}; + +function chartOptions(Chart) { + let { colors, mode, fonts } = Charts; + // Options + let options = { + defaults: { + global: { + responsive: true, + maintainAspectRatio: false, + defaultColor: (mode == 'dark') ? colors.gray[700] : colors.gray[600], + defaultFontColor: (mode == 'dark') ? colors.gray[700] : colors.gray[600], + defaultFontFamily: fonts.base, + defaultFontSize: 13, + layout: { + padding: 0 + }, + legend: { + display: false, + position: 'bottom', + labels: { + usePointStyle: true, + padding: 16 + } + }, + elements: { + point: { + radius: 0, + backgroundColor: colors.theme['primary'] + }, + line: { + tension: .4, + borderWidth: 4, + borderColor: colors.theme['primary'], + backgroundColor: colors.transparent, + borderCapStyle: 'rounded' + }, + rectangle: { + backgroundColor: colors.theme['warning'] + }, + arc: { + backgroundColor: colors.theme['primary'], + borderColor: (mode == 'dark') ? colors.gray[800] : colors.white, + borderWidth: 4 + } + }, + tooltips: { + enabled: true, + mode: 'index', + intersect: false, + } + }, + doughnut: { + cutoutPercentage: 83, + legendCallback: function (chart) { + let data = chart.data; + let content = ''; + + data.labels.forEach(function (label, index) { + let bgColor = data.datasets[0].backgroundColor[index]; + + content += ''; + content += ''; + content += label; + content += ''; + }); + + return content; + } + } + } + }; + + // yAxes + Chart.scaleService.updateScaleDefaults('linear', { + gridLines: { + borderDash: [2], + borderDashOffset: [2], + color: (mode == 'dark') ? colors.gray[900] : colors.gray[300], + drawBorder: false, + drawTicks: false, + lineWidth: 0, + zeroLineWidth: 0, + zeroLineColor: (mode == 'dark') ? colors.gray[900] : colors.gray[300], + zeroLineBorderDash: [2], + zeroLineBorderDashOffset: [2] + }, + ticks: { + beginAtZero: true, + padding: 10, + callback: function (value) { + if (!(value % 10)) { + return value + } + } + } + }); + + // xAxes + Chart.scaleService.updateScaleDefaults('category', { + gridLines: { + drawBorder: false, + drawOnChartArea: false, + drawTicks: false + }, + ticks: { + padding: 20 + }, + maxBarThickness: 10 + }); + + return options; +} + +export function initGlobalOptions(Chart) { + parseOptions(Chart, chartOptions(Chart)); +} + +export const basicOptions = { + maintainAspectRatio: false, + legend: { + display: false + }, + responsive: true +}; +export let blueChartOptions = { + scales: { + yAxes: [{ + gridLines: { + color: Charts.colors.gray[700], + zeroLineColor: Charts.colors.gray[700] + }, + ticks: { + callback: function(value) { + if (!(value % 10)) { + return '$' + value + 'k'; + } + } + } + }] + } +}; + +export let lineChartOptionsBlue = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + responsive: true, + scales: { + yAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.0)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 60, + suggestedMax: 125, + padding: 20, + fontColor: '#9e9e9e' + } + } + ], + + xAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#9e9e9e' + } + } + ] + } +}; + +export let barChartOptionsGradient = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + responsive: true, + scales: { + yAxes: [ + { + gridLines: { + drawBorder: false, + color: 'rgba(253,93,147,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 60, + suggestedMax: 125, + padding: 20, + fontColor: '#9e9e9e' + } + } + ], + + xAxes: [ + { + gridLines: { + drawBorder: false, + color: 'rgba(253,93,147,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#9e9e9e' + } + } + ] + } +}; + +export let pieChartOptions = { + ...basicOptions, + cutoutPercentage: 70, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + + scales: { + yAxes: [ + { + display: 0, + ticks: { + display: false + }, + gridLines: { + drawBorder: false, + zeroLineColor: 'transparent', + color: 'rgba(255,255,255,0.05)' + } + } + ], + + xAxes: [ + { + display: 0, + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(255,255,255,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + display: false + } + } + ] + } +}; + +export let purpleChartOptions = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + scales: { + yAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.0)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 60, + suggestedMax: 125, + padding: 20, + fontColor: '#9a9a9a' + } + } + ], + + xAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(225,78,202,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#9a9a9a' + } + } + ] + } +}; + +export let orangeChartOptions = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + scales: { + yAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.0)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 50, + suggestedMax: 110, + padding: 20, + fontColor: '#ff8a76' + } + } + ], + + xAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(220,53,69,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#ff8a76' + } + } + ] + } +}; +export let greenChartOptions = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + scales: { + yAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.0)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 50, + suggestedMax: 125, + padding: 20, + fontColor: '#9e9e9e' + } + } + ], + + xAxes: [ + { + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(0,242,195,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#9e9e9e' + } + } + ] + } +}; + +export let barChartOptions = { + ...basicOptions, + tooltips: { + backgroundColor: '#f5f5f5', + titleFontColor: '#333', + bodyFontColor: '#666', + bodySpacing: 4, + xPadding: 12, + mode: 'nearest', + intersect: 0, + position: 'nearest' + }, + scales: { + yAxes: [ + { + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + suggestedMin: 60, + suggestedMax: 120, + padding: 20, + fontColor: '#9e9e9e' + } + } + ], + xAxes: [ + { + gridLines: { + drawBorder: false, + color: 'rgba(29,140,248,0.1)', + zeroLineColor: 'transparent' + }, + ticks: { + padding: 20, + fontColor: '#9e9e9e' + } + } + ] + } +}; diff --git a/src/components/Charts/globalOptionsMixin.js b/src/components/Charts/globalOptionsMixin.js new file mode 100755 index 0000000..f976ed3 --- /dev/null +++ b/src/components/Charts/globalOptionsMixin.js @@ -0,0 +1,7 @@ +import Chart from 'chart.js'; +import { initGlobalOptions } from "@/components/Charts/config"; +export default { + mounted() { + initGlobalOptions(Chart); + } +} diff --git a/src/components/Charts/optionHelpers.js b/src/components/Charts/optionHelpers.js new file mode 100755 index 0000000..227b229 --- /dev/null +++ b/src/components/Charts/optionHelpers.js @@ -0,0 +1,10 @@ +// Parse global options +export function parseOptions(parent, options) { + for (let item in options) { + if (typeof options[item] !== 'object') { + parent[item] = options[item]; + } else { + parseOptions(parent[item], options[item]); + } + } +} diff --git a/src/components/CloseButton.vue b/src/components/CloseButton.vue new file mode 100755 index 0000000..7557943 --- /dev/null +++ b/src/components/CloseButton.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100755 index 0000000..879051a --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,58 @@ + + + + + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue new file mode 100755 index 0000000..8083d20 --- /dev/null +++ b/src/components/Modal.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/components/NavbarToggleButton.vue b/src/components/NavbarToggleButton.vue new file mode 100755 index 0000000..bb3513b --- /dev/null +++ b/src/components/NavbarToggleButton.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/NotificationPlugin/Notification.vue b/src/components/NotificationPlugin/Notification.vue new file mode 100755 index 0000000..acc6669 --- /dev/null +++ b/src/components/NotificationPlugin/Notification.vue @@ -0,0 +1,190 @@ + + + diff --git a/src/components/NotificationPlugin/Notifications.vue b/src/components/NotificationPlugin/Notifications.vue new file mode 100755 index 0000000..2689cc9 --- /dev/null +++ b/src/components/NotificationPlugin/Notifications.vue @@ -0,0 +1,55 @@ + + diff --git a/src/components/NotificationPlugin/index.js b/src/components/NotificationPlugin/index.js new file mode 100755 index 0000000..e871fb6 --- /dev/null +++ b/src/components/NotificationPlugin/index.js @@ -0,0 +1,66 @@ +import Notifications from './Notifications.vue'; + +const NotificationStore = { + state: [], // here the notifications will be added + settings: { + overlap: false, + verticalAlign: 'top', + horizontalAlign: 'right', + type: 'info', + timeout: 5000, + closeOnClick: true, + showClose: true + }, + setOptions(options) { + this.settings = Object.assign(this.settings, options); + }, + removeNotification(timestamp) { + const indexToDelete = this.state.findIndex(n => n.timestamp === timestamp); + if (indexToDelete !== -1) { + this.state.splice(indexToDelete, 1); + } + }, + addNotification(notification) { + if (typeof notification === 'string' || notification instanceof String) { + notification = { message: notification }; + } + notification.timestamp = new Date(); + notification.timestamp.setMilliseconds( + notification.timestamp.getMilliseconds() + this.state.length + ); + notification = Object.assign({}, this.settings, notification); + this.state.push(notification); + }, + notify(notification) { + if (Array.isArray(notification)) { + notification.forEach(notificationInstance => { + this.addNotification(notificationInstance); + }); + } else { + this.addNotification(notification); + } + } +}; + +const NotificationsPlugin = { + install(Vue, options) { + let app = new Vue({ + data: { + notificationStore: NotificationStore + }, + methods: { + notify(notification) { + this.notificationStore.notify(notification); + } + } + }); + Vue.prototype.$notify = app.notify; + Vue.prototype.$notifications = app.notificationStore; + Vue.component('Notifications', Notifications); + if (options) { + NotificationStore.setOptions(options); + } + } +}; + +export default NotificationsPlugin; diff --git a/src/components/SidebarPlugin/SideBar.vue b/src/components/SidebarPlugin/SideBar.vue new file mode 100755 index 0000000..4cb48b1 --- /dev/null +++ b/src/components/SidebarPlugin/SideBar.vue @@ -0,0 +1,150 @@ + + diff --git a/src/components/SidebarPlugin/SidebarItem.vue b/src/components/SidebarPlugin/SidebarItem.vue new file mode 100755 index 0000000..c8c83b4 --- /dev/null +++ b/src/components/SidebarPlugin/SidebarItem.vue @@ -0,0 +1,56 @@ + + diff --git a/src/components/SidebarPlugin/index.js b/src/components/SidebarPlugin/index.js new file mode 100755 index 0000000..2239c7c --- /dev/null +++ b/src/components/SidebarPlugin/index.js @@ -0,0 +1,43 @@ +import Sidebar from './SideBar.vue'; +import SidebarItem from './SidebarItem.vue'; + +const SidebarStore = { + showSidebar: false, + sidebarLinks: [], + isMinimized: false, + displaySidebar(value) { + this.showSidebar = value; + }, + toggleMinimize() { + document.body.classList.toggle('sidebar-mini'); + // we simulate the window Resize so the charts will get updated in realtime. + const simulateWindowResize = setInterval(() => { + window.dispatchEvent(new Event('resize')); + }, 180); + + // we stop the simulation of Window Resize after the animations are completed + setTimeout(() => { + clearInterval(simulateWindowResize); + }, 1000); + + this.isMinimized = !this.isMinimized; + } +}; + +const SidebarPlugin = { + install(Vue, options) { + if (options && options.sidebarLinks) { + SidebarStore.sidebarLinks = options.sidebarLinks; + } + let app = new Vue({ + data: { + sidebarStore: SidebarStore + } + }); + Vue.prototype.$sidebar = app.sidebarStore; + Vue.component('side-bar', Sidebar); + Vue.component('sidebar-item', SidebarItem); + } +}; + +export default SidebarPlugin; diff --git a/src/components/StatsCard.vue b/src/components/StatsCard.vue new file mode 100755 index 0000000..c9c2294 --- /dev/null +++ b/src/components/StatsCard.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Tabs/PillsLayout.vue b/src/components/Tabs/PillsLayout.vue new file mode 100755 index 0000000..98ac41d --- /dev/null +++ b/src/components/Tabs/PillsLayout.vue @@ -0,0 +1,6 @@ + diff --git a/src/components/Tabs/Tab.vue b/src/components/Tabs/Tab.vue new file mode 100755 index 0000000..b846d14 --- /dev/null +++ b/src/components/Tabs/Tab.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/Tabs/TabPane.vue b/src/components/Tabs/TabPane.vue new file mode 100755 index 0000000..936b043 --- /dev/null +++ b/src/components/Tabs/TabPane.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/components/Tabs/Tabs.vue b/src/components/Tabs/Tabs.vue new file mode 100755 index 0000000..3743d86 --- /dev/null +++ b/src/components/Tabs/Tabs.vue @@ -0,0 +1,198 @@ + + + diff --git a/src/components/Tabs/TabsLayout.vue b/src/components/Tabs/TabsLayout.vue new file mode 100755 index 0000000..f5de035 --- /dev/null +++ b/src/components/Tabs/TabsLayout.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/stringUtils.js b/src/components/stringUtils.js new file mode 100755 index 0000000..1f4da41 --- /dev/null +++ b/src/components/stringUtils.js @@ -0,0 +1,9 @@ +export function randomString(length = 7) { + const possibleChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + let text = ""; + + for (let i = 0; i < length; i++) + text += possibleChars.charAt(Math.floor(Math.random() * possibleChars.length)); + + return text; +} diff --git a/src/directives/click-ouside.js b/src/directives/click-ouside.js new file mode 100755 index 0000000..fbec7aa --- /dev/null +++ b/src/directives/click-ouside.js @@ -0,0 +1,15 @@ +export default { + bind: function(el, binding, vnode) { + el.clickOutsideEvent = function(event) { + // here I check that click was outside the el and his childrens + if (!(el == event.target || el.contains(event.target))) { + // and if it did, call method provided in attribute value + vnode.context[binding.expression](event); + } + }; + document.body.addEventListener("click", el.clickOutsideEvent); + }, + unbind: function(el) { + document.body.removeEventListener("click", el.clickOutsideEvent); + } +}; diff --git a/src/layout/AuthLayout.vue b/src/layout/AuthLayout.vue new file mode 100755 index 0000000..32b2f42 --- /dev/null +++ b/src/layout/AuthLayout.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/layout/Content.vue b/src/layout/Content.vue new file mode 100755 index 0000000..18790e5 --- /dev/null +++ b/src/layout/Content.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/layout/ContentFooter.vue b/src/layout/ContentFooter.vue new file mode 100755 index 0000000..397e3f3 --- /dev/null +++ b/src/layout/ContentFooter.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/layout/DashboardLayout.vue b/src/layout/DashboardLayout.vue new file mode 100755 index 0000000..1cb6852 --- /dev/null +++ b/src/layout/DashboardLayout.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/layout/DashboardNavbar.vue b/src/layout/DashboardNavbar.vue new file mode 100755 index 0000000..af853e9 --- /dev/null +++ b/src/layout/DashboardNavbar.vue @@ -0,0 +1,79 @@ + + diff --git a/src/main.js b/src/main.js new file mode 100755 index 0000000..ea6f22b --- /dev/null +++ b/src/main.js @@ -0,0 +1,25 @@ +import Vue from 'vue' +import App from './App.vue' +import router from "./router" +import "./registerServiceWorker" +import ArgonDashboard from "./plugins/argon-dashboard" + +import axios from "axios"; +import { createProvider } from './vue-apollo'; +import store from "./store"; + +Vue.config.productionTip = false + +const token = localStorage.getItem("user-token"); + +if(token) { + axios.defaults.headers.common["Authorization"] = token; +} + +Vue.use(ArgonDashboard); +new Vue({ + router, + apolloProvider: createProvider(), + store, + render: h => h(App) +}).$mount('#app'); diff --git a/src/plugins/argon-dashboard.js b/src/plugins/argon-dashboard.js new file mode 100755 index 0000000..6b9878d --- /dev/null +++ b/src/plugins/argon-dashboard.js @@ -0,0 +1,15 @@ +import "@/assets/vendor/nucleo/css/nucleo.css"; +import "@/assets/scss/argon.scss"; +import globalComponents from "./globalComponents"; +import globalDirectives from "./globalDirectives"; +import SidebarPlugin from "@/components/SidebarPlugin/index" +import NotificationPlugin from "@/components/NotificationPlugin/index" + +export default { + install(Vue) { + Vue.use(globalComponents); + Vue.use(globalDirectives); + Vue.use(SidebarPlugin); + Vue.use(NotificationPlugin); + } +}; diff --git a/src/plugins/globalComponents.js b/src/plugins/globalComponents.js new file mode 100755 index 0000000..352376e --- /dev/null +++ b/src/plugins/globalComponents.js @@ -0,0 +1,43 @@ +import Badge from "../components/Badge"; +import BaseAlert from "../components/BaseAlert"; +import BaseButton from "../components/BaseButton"; +import BaseCheckbox from "../components/BaseCheckbox"; +import BaseInput from "../components/BaseInput"; +import BaseDropdown from "../components/BaseDropdown"; +import BaseNav from "../components/BaseNav"; +import BasePagination from "../components/BasePagination"; +import BaseProgress from "../components/BaseProgress"; +import BaseRadio from "../components/BaseRadio"; +import BaseSlider from "../components/BaseSlider"; +import BaseSwitch from "../components/BaseSwitch"; +import BaseTable from "../components/BaseTable"; +import BaseHeader from "../components/BaseHeader"; +import Card from "../components/Card"; +import StatsCard from "../components/StatsCard"; +import Modal from "../components/Modal"; +import TabPane from "../components/Tabs/TabPane"; +import Tabs from "../components/Tabs/Tabs"; + +export default { + install(Vue) { + Vue.component(Badge.name, Badge); + Vue.component(BaseAlert.name, BaseAlert); + Vue.component(BaseButton.name, BaseButton); + Vue.component(BaseInput.name, BaseInput); + Vue.component(BaseNav.name, BaseNav); + Vue.component(BaseDropdown.name, BaseDropdown); + Vue.component(BaseCheckbox.name, BaseCheckbox); + Vue.component(BasePagination.name, BasePagination); + Vue.component(BaseProgress.name, BaseProgress); + Vue.component(BaseRadio.name, BaseRadio); + Vue.component(BaseSlider.name, BaseSlider); + Vue.component(BaseSwitch.name, BaseSwitch); + Vue.component(BaseTable.name, BaseTable); + Vue.component(BaseHeader.name, BaseHeader); + Vue.component(Card.name, Card); + Vue.component(StatsCard.name, StatsCard); + Vue.component(Modal.name, Modal); + Vue.component(TabPane.name, TabPane); + Vue.component(Tabs.name, Tabs); + } +}; diff --git a/src/plugins/globalDirectives.js b/src/plugins/globalDirectives.js new file mode 100755 index 0000000..5edf899 --- /dev/null +++ b/src/plugins/globalDirectives.js @@ -0,0 +1,13 @@ +import clickOutside from "../directives/click-ouside.js"; + +/** + * You can register global directives here and use them as a plugin in your main Vue instance + */ + +const GlobalDirectives = { + install(Vue) { + Vue.directive("click-outside", clickOutside); + } +}; + +export default GlobalDirectives; diff --git a/src/queries/subdomainQueries.js b/src/queries/subdomainQueries.js new file mode 100644 index 0000000..51d9ec7 --- /dev/null +++ b/src/queries/subdomainQueries.js @@ -0,0 +1,11 @@ +import gql from "graphql-tag"; + +export const GET_ALL_SUBDOMAINS_QUERY = gql` + query { + subdomains { + config_file, + type, + port + } + } +` \ No newline at end of file diff --git a/src/queries/userQueries.js b/src/queries/userQueries.js new file mode 100644 index 0000000..dc715b5 --- /dev/null +++ b/src/queries/userQueries.js @@ -0,0 +1,9 @@ +import gql from "graphql-tag"; + +export const LOGIN_MUTATION = gql` + mutation LoginMutation($username: String!, $password: String!) { + login(username: $username, password: $password) { + token + } + } +` \ No newline at end of file diff --git a/src/registerServiceWorker.js b/src/registerServiceWorker.js new file mode 100755 index 0000000..76cede0 --- /dev/null +++ b/src/registerServiceWorker.js @@ -0,0 +1,32 @@ +/* eslint-disable no-console */ + +import { register } from 'register-service-worker' + +if (process.env.NODE_ENV === 'production') { + register(`${process.env.BASE_URL}service-worker.js`, { + ready () { + console.log( + 'App is being served from cache by a service worker.\n' + + 'For more details, visit https://goo.gl/AFskqB' + ) + }, + registered () { + console.log('Service worker has been registered.') + }, + cached () { + console.log('Content has been cached for offline use.') + }, + updatefound () { + console.log('New content is downloading.') + }, + updated () { + console.log('New content is available; please refresh.') + }, + offline () { + console.log('No internet connection found. App is running in offline mode.') + }, + error (error) { + console.error('Error during service worker registration:', error) + } + }) +} diff --git a/src/router.js b/src/router.js new file mode 100755 index 0000000..43c45b2 --- /dev/null +++ b/src/router.js @@ -0,0 +1,92 @@ +import Vue from 'vue' +import Router from 'vue-router' +import DashboardLayout from '@/layout/DashboardLayout' +import AuthLayout from '@/layout/AuthLayout' +import store from "./store"; +Vue.use(Router); + +const ifNotAuthenticated = (to , from, next) => { + if(!store.getters.isAuthenticated) { + next(); + return; + } + + next('/'); +} + +const ifAuthenticated = (to, from, next) => { + if(store.getters.isAuthenticated) { + next(); + return; + } + + next("/login"); +} + +export default new Router({ + linkExactActiveClass: 'active', + mode: "history", + routes: [ + { + path: '/', + redirect: 'subdomains', + component: DashboardLayout, + beforeEnter: ifAuthenticated, + children: [ + { + path: '/subdomains', + name: 'subdomains', + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import(/* webpackChunkName: "demo" */ './views/Subdomains.vue') + }, + { + path: '/projects', + name: 'projects', + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import(/* webpackChunkName: "demo" */ './views/Projects.vue') + }, + { + path: '/icons', + name: 'icons', + component: () => import(/* webpackChunkName: "demo" */ './views/Icons.vue') + }, + { + path: '/profile', + name: 'profile', + component: () => import(/* webpackChunkName: "demo" */ './views/UserProfile.vue') + }, + { + path: '/maps', + name: 'maps', + component: () => import(/* webpackChunkName: "demo" */ './views/Maps.vue') + }, + { + path: '/tables', + name: 'tables', + component: () => import(/* webpackChunkName: "demo" */ './views/Tables.vue') + } + ] + }, + { + path: '/login', + redirect: 'login', + component: AuthLayout, + children: [ + { + path: '/login', + name: 'login', + component: () => import(/* webpackChunkName: "demo" */ './views/Login.vue') + }, + { + path: '/register', + name: 'register', + component: () => import(/* webpackChunkName: "demo" */ './views/Register.vue') + } + ] + } + ] +}) diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue new file mode 100755 index 0000000..e69319c --- /dev/null +++ b/src/views/Dashboard.vue @@ -0,0 +1,206 @@ + + + diff --git a/src/views/Dashboard/PageVisitsTable.vue b/src/views/Dashboard/PageVisitsTable.vue new file mode 100755 index 0000000..bf15646 --- /dev/null +++ b/src/views/Dashboard/PageVisitsTable.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/views/Dashboard/SocialTrafficTable.vue b/src/views/Dashboard/SocialTrafficTable.vue new file mode 100755 index 0000000..fa4f071 --- /dev/null +++ b/src/views/Dashboard/SocialTrafficTable.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/views/Icons.vue b/src/views/Icons.vue new file mode 100755 index 0000000..a90c405 --- /dev/null +++ b/src/views/Icons.vue @@ -0,0 +1,224 @@ + + + diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100755 index 0000000..391a19f --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/views/Maps.vue b/src/views/Maps.vue new file mode 100755 index 0000000..92f838b --- /dev/null +++ b/src/views/Maps.vue @@ -0,0 +1,126 @@ + + + diff --git a/src/views/Projects.vue b/src/views/Projects.vue new file mode 100755 index 0000000..3ce666b --- /dev/null +++ b/src/views/Projects.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/views/Register.vue b/src/views/Register.vue new file mode 100755 index 0000000..0bade9d --- /dev/null +++ b/src/views/Register.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/views/Subdomains.vue b/src/views/Subdomains.vue new file mode 100755 index 0000000..f961b49 --- /dev/null +++ b/src/views/Subdomains.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/views/Tables.vue b/src/views/Tables.vue new file mode 100755 index 0000000..5504b95 --- /dev/null +++ b/src/views/Tables.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/views/Tables/ProjectsTable.vue b/src/views/Tables/ProjectsTable.vue new file mode 100755 index 0000000..cc84d61 --- /dev/null +++ b/src/views/Tables/ProjectsTable.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/views/Tables/SubdomainsTable.vue b/src/views/Tables/SubdomainsTable.vue new file mode 100755 index 0000000..7241b36 --- /dev/null +++ b/src/views/Tables/SubdomainsTable.vue @@ -0,0 +1,149 @@ + + + diff --git a/src/views/UserProfile.vue b/src/views/UserProfile.vue new file mode 100755 index 0000000..b3229a7 --- /dev/null +++ b/src/views/UserProfile.vue @@ -0,0 +1,212 @@ + + + diff --git a/src/vue-apollo.js b/src/vue-apollo.js new file mode 100644 index 0000000..940b65e --- /dev/null +++ b/src/vue-apollo.js @@ -0,0 +1,101 @@ +import Vue from 'vue' +import VueApollo from 'vue-apollo' +import { createApolloClient, restartWebsockets } from 'vue-cli-plugin-apollo/graphql-client' + +// Install the vue plugin +Vue.use(VueApollo) + +// Name of the localStorage item +const AUTH_TOKEN = "user-token"; + +// Http endpoint +const httpEndpoint = process.env.VUE_APP_AMAXA_URL || 'http://localhost:4000/graphql' + +// Config +const defaultOptions = { + // You can use `https` for secure connection (recommended in production) + httpEndpoint, + // You can use `wss` for secure connection (recommended in production) + // Use `null` to disable subscriptions + // wsEndpoint: process.env.VUE_APP_GRAPHQL_WS || 'ws://localhost:4000/graphql', + // LocalStorage token + tokenName: AUTH_TOKEN, + // Enable Automatic Query persisting with Apollo Engine + persisting: false, + // Use websockets for everything (no HTTP) + // You need to pass a `wsEndpoint` for this to work + websocketsOnly: false, + // Is being rendered on the server? + ssr: false, + + // Override default apollo link + // note: don't override httpLink here, specify httpLink options in the + // httpLinkOptions property of defaultOptions. + // link: myLink + + // Override default cache + // cache: myCache + + // Override the way the Authorization header is set + // getAuth: (tokenName) => ... + + // Additional ApolloClient options + // apollo: { ... } + + // Client local data (see apollo-link-state) + // clientState: { resolvers: { ... }, defaults: { ... } } +} + +// Call this in the Vue app file +export function createProvider (options = {}) { + // Create apollo client + const { apolloClient, wsClient } = createApolloClient({ + ...defaultOptions, + ...options, + }) + apolloClient.wsClient = wsClient + + // Create vue apollo provider + const apolloProvider = new VueApollo({ + defaultClient: apolloClient, + defaultOptions: { + $query: { + // fetchPolicy: 'cache-and-network', + }, + }, + errorHandler (error) { + // eslint-disable-next-line no-console + console.log('%cError', 'background: red; color: white; padding: 2px 4px; border-radius: 3px; font-weight: bold;', error.message) + }, + }) + + return apolloProvider +} + +// Manually call this when user log in +export async function onLogin (apolloClient, token) { + if (typeof localStorage !== 'undefined' && token) { + localStorage.setItem(AUTH_TOKEN, token) + } + if (apolloClient.wsClient) restartWebsockets(apolloClient.wsClient) + try { + await apolloClient.resetStore() + } catch (e) { + // eslint-disable-next-line no-console + console.log('%cError on cache reset (login)', 'color: orange;', e.message) + } +} + +// Manually call this when user log out +export async function onLogout (apolloClient) { + if (typeof localStorage !== 'undefined') { + localStorage.removeItem(AUTH_TOKEN) + } + if (apolloClient.wsClient) restartWebsockets(apolloClient.wsClient) + try { + await apolloClient.resetStore() + } catch (e) { + // eslint-disable-next-line no-console + console.log('%cError on cache reset (logout)', 'color: orange;', e.message) + } +}