diff --git a/package.json b/package.json index 30dab50..94a0811 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,18 @@ "author": "", "license": "ISC", "dependencies": { + "@hapi/cookie": "^11.0.2", "@hapi/hapi": "^20.1.2", "@hapi/inert": "^6.0.3", "bcrypt": "^5.0.1", "hapi-auth-jwt2": "^10.2.0", "hapi-swagger": "^14.2.0", "joi": "^17.4.0", + "json-merge-patch": "^1.0.1", "jsonwebtoken": "^8.5.1", "multiparty": "^4.2.2", "nodemon": "^2.0.7", + "pug": "^3.0.2", "sequelize": "^6.6.2", "sqlite3": "^5.0.2" }, diff --git a/packages/hapi-router/dist/hapi-router.cjs.js b/packages/hapi-router/dist/hapi-router.cjs.js index de65ad5..1308360 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js +++ b/packages/hapi-router/dist/hapi-router.cjs.js @@ -174,6 +174,7 @@ var routePlugin = (function () { } routePlugin.prototype.register = function (server, options) { var sourceDir = options.sourceDir; + var type = options.type || "jwt"; var files = walkDir(sourceDir); files.forEach(function (file) { var e_1, _a; @@ -214,14 +215,14 @@ var routePlugin = (function () { if (!options_1.auth) { if (ff.$auth == undefined) { if (route.startsWith("/api")) { - options_1.auth = "jwt"; + options_1.auth = type; } else { options_1.auth = false; } } else if (ff.$auth) { - options_1.auth = "jwt"; + options_1.auth = type; } else { options_1.auth = false; @@ -229,18 +230,25 @@ var routePlugin = (function () { } if (!options_1.validate) { var validateObj = ff.$validate || {}; - if (options_1.auth) { - validateObj = Object.assign(validateObj, { - headers: Joi__namespace.object({ + if (options_1.auth && type === "jwt") { + if (validateObj.headers) { + validateObj.headers = validateObj.headers.keys({ Authorization: Joi__namespace.string(), - }).unknown(), - }); + }); + } + else { + validateObj.headers = Joi__namespace.object({ + headers: Joi__namespace.object({ + Authorization: Joi__namespace.string(), + }).unknown(), + }); + } } if (validateObj) { options_1.validate = validateObj; } } - if (ff.$swagger && route.startsWith("/api")) { + if (ff.$swagger) { options_1.description = ff.$swagger[0]; options_1.notes = ff.$swagger[1]; options_1.tags = ff.$swagger[2]; diff --git a/packages/hapi-router/dist/hapi-router.cjs.js.map b/packages/hapi-router/dist/hapi-router.cjs.js.map index 0a4504f..b742164 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js.map +++ b/packages/hapi-router/dist/hapi-router.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nexport function removeIndex(ss:any) {\n const remove = (str:any) => {\n if (str.endsWith(\"/index\")) {\n return str.slice(0, -6);\n }\n if (str.endsWith(\"index\")) {\n return str.slice(0, -5);\n }\n return str ? str : \"/\";\n };\n let r = true;\n let rr = ss;\n while (r) {\n if (rr.endsWith(\"/index\")) {\n rr = remove(rr);\n } else {\n r = false;\n }\n }\n return rr ? rr : \"/\";\n}\n\nexport function isIndexEnd(str:any) {\n return str.length == 1 && str.endsWith(\"/\");\n}\n\n\nexport function walkDir(\n filePath:any,\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\"]\n) {\n let files:any[] = [];\n function Data(opts:any) {\n this.relativeDir = opts.relativeDir;\n this.relativeFile = opts.relativeFile;\n this.filename = opts.filename;\n this.file = opts.file;\n this.absoluteFile = opts.absoluteFile;\n this.relativeFileNoExt = opts.relativeFileNoExt;\n this.absoluteDir = opts.absoluteDir;\n }\n function readDir(filePath, dirname = \".\") {\n let res = fs.readdirSync(filePath);\n res.forEach((filename) => {\n const filepath = path.resolve(filePath, filename);\n const stat = fs.statSync(filepath);\n const name = filepath.split(path.sep).slice(-1)[0];\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\n return;\n }\n if (Array.isArray(exclude)) {\n for (let i = 0; i < exclude.length; i++) {\n const excludeItem = exclude[i];\n if (new RegExp(excludeItem).test(name)) {\n return;\n }\n }\n }\n if (!stat.isFile()) {\n readDir(filepath, dirname + path.sep + name);\n } else {\n const data = new Data({\n relativeDir: dirname,\n relativeFile: dirname + path.sep + path.parse(filepath).base,\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\n file: path.parse(filepath).base,\n filename: path.parse(filepath).name,\n absoluteFile: filepath,\n absoluteDir: path.parse(filepath).dir,\n });\n files.push(data);\n }\n });\n }\n readDir(filePath);\n return files;\n}\n","// @ts-nocheck\n\nexport function method(opts?:string|Array) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$method = opts\n }\n}\nexport function route(route?:string) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$route = route\n }\n}\n\nexport function config(options:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$options = options\n }\n}\n\nexport function auth(isAuth:boolean = true) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$auth = isAuth\n }\n}\n\nexport function validate(validate:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$validate = validate\n }\n}\n\nexport function swagger(desc,notes,tags) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$swagger = [desc,notes,tags]\n }\n}\n","// @ts-nocheck\n\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\nimport * as Joi from \"joi\";\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nconst routes = [\"所有路由路径:\"];\n\nclass routePlugin {\n public name: string = \"routePlugin\";\n public version: string = \"0.0.1\";\n public register(server: any, options: any) {\n const sourceDir = options.sourceDir;\n\n const files = walkDir(sourceDir);\n files.forEach((file) => {\n let filename = file.relativeFileNoExt;\n let array = filename.split(path.sep).slice(1);\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\n const moduleName = path.resolve(sourceDir, filename);\n const obj = require(moduleName);\n if (obj.default) {\n const func = new (obj.default || obj)();\n const prototype = Object.getPrototypeOf(func);\n const keys = Reflect.ownKeys(prototype);\n for (const key of keys) {\n if (key !== \"constructor\") {\n let ff = func[key];\n // 默认方法\n const method = ff.$method || \"GET\";\n // 路由收集规则\n let route = \"\";\n if (ff.$route) {\n if (isIndexEnd(fileNoExt)) {\n route = ff.$route;\n } else {\n route = fileNoExt + ff.$route;\n }\n } else {\n if (isIndexEnd(fileNoExt)) {\n route = fileNoExt + key.toString();\n } else {\n route = fileNoExt + \"/\" + key.toString();\n }\n }\n route = removeIndex(route);\n // 配置规则\n const options = ff.$options ? ff.$options : {};\n if (!options.auth) {\n if (ff.$auth == undefined) {\n if (route.startsWith(\"/api\")) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n } else if (ff.$auth) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n }\n if (!options.validate) {\n let validateObj = ff.$validate || {};\n if(options.auth){\n validateObj = Object.assign(validateObj,{\n headers: Joi.object({\n Authorization: Joi.string(),\n }).unknown(), // 注意加上这个\n })\n }\n if (validateObj) {\n options.validate = validateObj;\n }\n }\n if (ff.$swagger && route.startsWith(\"/api\")) {\n options.description = ff.$swagger[0];\n options.notes = ff.$swagger[1];\n options.tags = ff.$swagger[2];\n }\n let str = route;\n if (options.auth) {\n str += \" 该路由需要权限\";\n } else {\n str += \" 该路由不需要权限\";\n }\n routes.push(str);\n server.route({\n method: method,\n path: route,\n handler: ff,\n options: options,\n });\n }\n }\n }\n });\n fs.writeFileSync(path.resolve(sourceDir, \"route.txt\"), routes.join(\"\\n\"), {\n encoding: \"utf-8\",\n });\n }\n}\n\nconst plugin = new routePlugin();\n\nexport { plugin };\nexport * from \"./util/decorators\";\n"],"names":["path","fs","Joi"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nexport function removeIndex(ss:any) {\n const remove = (str:any) => {\n if (str.endsWith(\"/index\")) {\n return str.slice(0, -6);\n }\n if (str.endsWith(\"index\")) {\n return str.slice(0, -5);\n }\n return str ? str : \"/\";\n };\n let r = true;\n let rr = ss;\n while (r) {\n if (rr.endsWith(\"/index\")) {\n rr = remove(rr);\n } else {\n r = false;\n }\n }\n return rr ? rr : \"/\";\n}\n\nexport function isIndexEnd(str:any) {\n return str.length == 1 && str.endsWith(\"/\");\n}\n\n\nexport function walkDir(\n filePath:any,\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\"]\n) {\n let files:any[] = [];\n function Data(opts:any) {\n this.relativeDir = opts.relativeDir;\n this.relativeFile = opts.relativeFile;\n this.filename = opts.filename;\n this.file = opts.file;\n this.absoluteFile = opts.absoluteFile;\n this.relativeFileNoExt = opts.relativeFileNoExt;\n this.absoluteDir = opts.absoluteDir;\n }\n function readDir(filePath, dirname = \".\") {\n let res = fs.readdirSync(filePath);\n res.forEach((filename) => {\n const filepath = path.resolve(filePath, filename);\n const stat = fs.statSync(filepath);\n const name = filepath.split(path.sep).slice(-1)[0];\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\n return;\n }\n if (Array.isArray(exclude)) {\n for (let i = 0; i < exclude.length; i++) {\n const excludeItem = exclude[i];\n if (new RegExp(excludeItem).test(name)) {\n return;\n }\n }\n }\n if (!stat.isFile()) {\n readDir(filepath, dirname + path.sep + name);\n } else {\n const data = new Data({\n relativeDir: dirname,\n relativeFile: dirname + path.sep + path.parse(filepath).base,\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\n file: path.parse(filepath).base,\n filename: path.parse(filepath).name,\n absoluteFile: filepath,\n absoluteDir: path.parse(filepath).dir,\n });\n files.push(data);\n }\n });\n }\n readDir(filePath);\n return files;\n}\n","// @ts-nocheck\n\nexport function method(opts?:string|Array) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$method = opts\n }\n}\nexport function route(route?:string) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$route = route\n }\n}\n\nexport function config(options:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$options = options\n }\n}\n\nexport function auth(isAuth:boolean = true) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$auth = isAuth\n }\n}\n\nexport function validate(validate:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$validate = validate\n }\n}\n\nexport function swagger(desc,notes,tags) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$swagger = [desc,notes,tags]\n }\n}\n","// @ts-nocheck\n\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\nimport * as Joi from \"joi\";\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nconst routes = [\"所有路由路径:\"];\n\nclass routePlugin {\n public name: string = \"routePlugin\";\n public version: string = \"0.0.1\";\n public register(server: any, options: any) {\n const sourceDir = options.sourceDir;\n const type = options.type || \"jwt\";\n\n const files = walkDir(sourceDir);\n files.forEach((file) => {\n let filename = file.relativeFileNoExt;\n let array = filename.split(path.sep).slice(1);\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\n const moduleName = path.resolve(sourceDir, filename);\n const obj = require(moduleName);\n if (obj.default) {\n const func = new (obj.default || obj)();\n const prototype = Object.getPrototypeOf(func);\n const keys = Reflect.ownKeys(prototype);\n for (const key of keys) {\n if (key !== \"constructor\") {\n let ff = func[key];\n // 默认方法\n const method = ff.$method || \"GET\";\n // 路由收集规则\n let route = \"\";\n if (ff.$route) {\n if (isIndexEnd(fileNoExt)) {\n route = ff.$route;\n } else {\n route = fileNoExt + ff.$route;\n }\n } else {\n if (isIndexEnd(fileNoExt)) {\n route = fileNoExt + key.toString();\n } else {\n route = fileNoExt + \"/\" + key.toString();\n }\n }\n route = removeIndex(route);\n // 配置规则\n const options = ff.$options ? ff.$options : {};\n if (!options.auth) {\n if (ff.$auth == undefined) {\n if (route.startsWith(\"/api\")) {\n options.auth = type;\n } else {\n options.auth = false;\n }\n } else if (ff.$auth) {\n options.auth = type;\n } else {\n options.auth = false;\n }\n }\n if (!options.validate) {\n let validateObj = ff.$validate || {};\n if(options.auth&&type === \"jwt\"){\n if (validateObj.headers) {\n validateObj.headers = validateObj.headers.keys({\n Authorization: Joi.string(),\n })\n }else{\n validateObj.headers = Joi.object({\n headers: Joi.object({\n Authorization: Joi.string(),\n }).unknown(), // 注意加上这个\n })\n }\n }\n if (validateObj) {\n options.validate = validateObj;\n }\n }\n // && route.startsWith(\"/api\")\n if (ff.$swagger) {\n options.description = ff.$swagger[0];\n options.notes = ff.$swagger[1];\n options.tags = ff.$swagger[2];\n }\n let str = route;\n if (options.auth) {\n str += \" 该路由需要权限\";\n } else {\n str += \" 该路由不需要权限\";\n }\n routes.push(str);\n server.route({\n method: method,\n path: route,\n handler: ff,\n options: options,\n });\n }\n }\n }\n });\n fs.writeFileSync(path.resolve(sourceDir, \"route.txt\"), routes.join(\"\\n\"), {\n encoding: \"utf-8\",\n });\n }\n}\n\nconst plugin = new routePlugin();\n\nexport { plugin };\nexport * from \"./util/decorators\";\n"],"names":["path","fs","Joi"],"mappings":"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"} \ No newline at end of file diff --git a/packages/hapi-router/package.json b/packages/hapi-router/package.json index 51e70db..df10b32 100755 --- a/packages/hapi-router/package.json +++ b/packages/hapi-router/package.json @@ -36,6 +36,7 @@ "typescript": "^3.9.7" }, "dependencies": { - "joi": "^17.4.0" + "joi": "^17.4.0", + "json-merge-patch": "^1.0.1" } } diff --git a/packages/hapi-router/pnpm-lock.yaml b/packages/hapi-router/pnpm-lock.yaml index 4223d5b..3dc8cfd 100644 --- a/packages/hapi-router/pnpm-lock.yaml +++ b/packages/hapi-router/pnpm-lock.yaml @@ -11,6 +11,7 @@ specifiers: fs-extra: ^9.0.1 ftp-deploy: ^2.3.6 joi: ^17.4.0 + json-merge-patch: ^1.0.1 lodash: ^4.17.20 rollup: ^2.26.3 rollup-plugin-sourcemaps: ^0.6.2 @@ -20,6 +21,7 @@ specifiers: dependencies: joi: 17.4.0 + json-merge-patch: 1.0.1 devDependencies: '@rollup/plugin-alias': 3.1.2_rollup@2.51.2 @@ -179,6 +181,11 @@ packages: hasBin: true dev: true + /available-typed-arrays/1.0.4: + resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==} + engines: {node: '>= 0.4'} + dev: false + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -208,6 +215,13 @@ packages: resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==} dev: true + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + /chalk/4.1.1: resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} engines: {node: '>=10'} @@ -267,6 +281,33 @@ packages: engines: {node: '>=0.10'} dev: true + /deep-equal/2.0.5: + resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.2 + get-intrinsic: 1.1.1 + is-arguments: 1.1.0 + is-date-object: 1.0.4 + is-regex: 1.1.3 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.3.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.4 + dev: false + + /define-properties/1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + dependencies: + object-keys: 1.1.1 + dev: false + /detect-indent/0.2.0: resolution: {integrity: sha1-BCkUSYl5rC2fPHPk/z5od9O8krY=} engines: {node: '>=0.10.0'} @@ -297,6 +338,50 @@ packages: once: 1.4.0 dev: true + /es-abstract/1.18.3: + resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + is-callable: 1.2.3 + is-negative-zero: 2.0.1 + is-regex: 1.1.3 + is-string: 1.0.6 + object-inspect: 1.10.3 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: false + + /es-get-iterator/1.1.2: + resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + has-symbols: 1.0.2 + is-arguments: 1.1.0 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.6 + isarray: 2.0.5 + dev: false + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.3 + is-date-object: 1.0.4 + is-symbol: 1.0.4 + dev: false + /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true @@ -337,6 +422,10 @@ packages: path-exists: 4.0.0 dev: true + /foreach/2.0.5: + resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} + dev: false + /fs-extra/8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -381,7 +470,14 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + + /get-intrinsic/1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: false /get-stdin/0.1.0: resolution: {integrity: sha1-WZivJKr8gC0VyCxoVlfuuLENSpE=} @@ -420,17 +516,25 @@ packages: resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} dev: true + /has-bigints/1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + dev: false + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true + /has-symbols/1.0.2: + resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} + engines: {node: '>= 0.4'} + dev: false + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /human-signals/1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} @@ -448,27 +552,116 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /is-arguments/1.1.0: + resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-bigint/1.0.2: + resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==} + dev: false + + /is-boolean-object/1.1.1: + resolution: {integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-callable/1.2.3: + resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==} + engines: {node: '>= 0.4'} + dev: false + /is-core-module/2.4.0: resolution: {integrity: sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==} dependencies: has: 1.0.3 dev: true + /is-date-object/1.0.4: + resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==} + engines: {node: '>= 0.4'} + dev: false + + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false + + /is-negative-zero/2.0.1: + resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} + engines: {node: '>= 0.4'} + dev: false + + /is-number-object/1.0.5: + resolution: {integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==} + engines: {node: '>= 0.4'} + dev: false + /is-reference/1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: '@types/estree': 0.0.48 dev: true + /is-regex/1.1.3: + resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-symbols: 1.0.2 + dev: false + + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false + /is-stream/2.0.0: resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} engines: {node: '>=8'} dev: true + /is-string/1.0.6: + resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==} + engines: {node: '>= 0.4'} + dev: false + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: false + + /is-typed-array/1.1.5: + resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + has-symbols: 1.0.2 + dev: false + + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: false + + /is-weakset/2.0.1: + resolution: {integrity: sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==} + dev: false + /isarray/0.0.1: resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} dev: true + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true @@ -483,6 +676,12 @@ packages: '@sideway/pinpoint': 2.0.0 dev: false + /json-merge-patch/1.0.1: + resolution: {integrity: sha512-yvT2j/jJZ2S53t+WLt1/y2pvyR1UKPl1d/tJUjwnbtwdQQcloPhGS0bkEq/L6I32l1nhleU57GTkbv64t8eHQA==} + dependencies: + deep-equal: 2.0.5 + dev: false + /jsonfile/4.0.0: resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} optionalDependencies: @@ -562,6 +761,33 @@ packages: path-key: 3.1.1 dev: true + /object-inspect/1.10.3: + resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} + dev: false + + /object-is/1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: false + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -670,6 +896,14 @@ packages: util-deprecate: 1.0.2 dev: true + /regexp.prototype.flags/1.3.1: + resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + /resolve/1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: @@ -752,6 +986,14 @@ packages: engines: {node: '>=8'} dev: true + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.10.3 + dev: false + /signal-exit/3.0.3: resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} dev: true @@ -801,6 +1043,20 @@ packages: engines: {node: '>=0.8.0'} dev: true + /string.prototype.trimend/1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + + /string.prototype.trimstart/1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + /string_decoder/0.10.31: resolution: {integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=} dev: true @@ -845,6 +1101,15 @@ packages: hasBin: true dev: true + /unbox-primitive/1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: false + /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -864,6 +1129,38 @@ packages: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} dev: true + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.2 + is-boolean-object: 1.1.1 + is-number-object: 1.0.5 + is-string: 1.0.6 + is-symbol: 1.0.4 + dev: false + + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.1 + dev: false + + /which-typed-array/1.1.4: + resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + function-bind: 1.1.1 + has-symbols: 1.0.2 + is-typed-array: 1.1.5 + dev: false + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/packages/hapi-router/src/index.ts b/packages/hapi-router/src/index.ts index b0ab658..c8f0f85 100755 --- a/packages/hapi-router/src/index.ts +++ b/packages/hapi-router/src/index.ts @@ -12,6 +12,7 @@ class routePlugin { public version: string = "0.0.1"; public register(server: any, options: any) { const sourceDir = options.sourceDir; + const type = options.type || "jwt"; const files = walkDir(sourceDir); files.forEach((file) => { @@ -50,30 +51,37 @@ class routePlugin { if (!options.auth) { if (ff.$auth == undefined) { if (route.startsWith("/api")) { - options.auth = "jwt"; + options.auth = type; } else { options.auth = false; } } else if (ff.$auth) { - options.auth = "jwt"; + options.auth = type; } else { options.auth = false; } } if (!options.validate) { let validateObj = ff.$validate || {}; - if(options.auth){ - validateObj = Object.assign(validateObj,{ - headers: Joi.object({ + if(options.auth&&type === "jwt"){ + if (validateObj.headers) { + validateObj.headers = validateObj.headers.keys({ Authorization: Joi.string(), - }).unknown(), // 注意加上这个 - }) + }) + }else{ + validateObj.headers = Joi.object({ + headers: Joi.object({ + Authorization: Joi.string(), + }).unknown(), // 注意加上这个 + }) + } } if (validateObj) { options.validate = validateObj; } } - if (ff.$swagger && route.startsWith("/api")) { + // && route.startsWith("/api") + if (ff.$swagger) { options.description = ff.$swagger[0]; options.notes = ff.$swagger[1]; options.tags = ff.$swagger[2]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96cd305..653b804 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,7 @@ lockfileVersion: 5.3 specifiers: + '@hapi/cookie': ^11.0.2 '@hapi/hapi': ^20.1.2 '@hapi/inert': ^6.0.3 '@hapi/vision': ^6.1.0 @@ -12,9 +13,11 @@ specifiers: hapi-auth-jwt2: ^10.2.0 hapi-swagger: ^14.2.0 joi: ^17.4.0 + json-merge-patch: ^1.0.1 jsonwebtoken: ^8.5.1 multiparty: ^4.2.2 nodemon: ^2.0.7 + pug: ^3.0.2 sequelize: ^6.6.2 sqlite3: ^5.0.2 ts-node: ^10.0.0 @@ -23,15 +26,18 @@ specifiers: typescript: ^4.3.2 dependencies: + '@hapi/cookie': 11.0.2 '@hapi/hapi': 20.1.4 '@hapi/inert': 6.0.3 bcrypt: 5.0.1 hapi-auth-jwt2: 10.2.0 hapi-swagger: 14.2.0_@hapi+hapi@20.1.4+joi@17.4.0 joi: 17.4.0 + json-merge-patch: 1.0.1 jsonwebtoken: 8.5.1 multiparty: 4.2.2 nodemon: 2.0.7 + pug: 3.0.2 sequelize: 6.6.2_sqlite3@5.0.2 sqlite3: 5.0.2 @@ -48,6 +54,25 @@ devDependencies: packages: + /@babel/helper-validator-identifier/7.14.5: + resolution: {integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/parser/7.14.6: + resolution: {integrity: sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dev: false + + /@babel/types/7.14.5: + resolution: {integrity: sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.14.5 + to-fast-properties: 2.0.0 + dev: false + /@hapi/accept/5.0.2: resolution: {integrity: sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==} dependencies: @@ -111,6 +136,15 @@ packages: '@hapi/boom': 9.1.2 dev: false + /@hapi/cookie/11.0.2: + resolution: {integrity: sha512-LRpSuHC53urzml83c5eUHSPPt7YtK1CaaPZU9KmnhZlacVVojrWJzOUIcwOADDvCZjDxowCO3zPMaOqzEm9kgg==} + dependencies: + '@hapi/boom': 9.1.2 + '@hapi/bounce': 2.0.0 + '@hapi/hoek': 9.2.0 + '@hapi/validate': 1.1.3 + dev: false + /@hapi/cryptiles/5.1.0: resolution: {integrity: sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==} engines: {node: '>=12.0.0'} @@ -381,6 +415,12 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -472,6 +512,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /asap/2.0.6: + resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} + dev: false + /asn1/0.2.4: resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} dependencies: @@ -479,6 +523,10 @@ packages: dev: false optional: true + /assert-never/1.2.1: + resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} + dev: false + /assert-plus/1.0.0: resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} engines: {node: '>=0.8'} @@ -494,6 +542,11 @@ packages: dev: false optional: true + /available-typed-arrays/1.0.4: + resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==} + engines: {node: '>= 0.4'} + dev: false + /aws-sign2/0.7.0: resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} dev: false @@ -504,6 +557,13 @@ packages: dev: false optional: true + /babel-walk/3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/types': 7.14.5 + dev: false + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -584,6 +644,13 @@ packages: responselike: 1.0.2 dev: false + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + /call-me-maybe/1.0.1: resolution: {integrity: sha1-JtII6onje1y95gJQoV8DHBak1ms=} dev: false @@ -628,6 +695,12 @@ packages: supports-color: 7.2.0 dev: false + /character-parser/2.2.0: + resolution: {integrity: sha1-x84o821LzZdE5f/CxfzeHHMmH8A=} + dependencies: + is-regex: 1.1.3 + dev: false + /chokidar/3.5.2: resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} engines: {node: '>= 8.10.0'} @@ -724,6 +797,13 @@ packages: resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} dev: false + /constantinople/4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + dependencies: + '@babel/parser': 7.14.6 + '@babel/types': 7.14.5 + dev: false + /cookie/0.4.1: resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} engines: {node: '>= 0.6'} @@ -807,6 +887,26 @@ packages: mimic-response: 1.0.1 dev: false + /deep-equal/2.0.5: + resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.2 + get-intrinsic: 1.1.1 + is-arguments: 1.1.0 + is-date-object: 1.0.4 + is-regex: 1.1.3 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.3.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.4 + dev: false + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -816,6 +916,13 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: false + /define-properties/1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + dependencies: + object-keys: 1.1.1 + dev: false + /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} @@ -842,6 +949,10 @@ packages: engines: {node: '>=0.3.1'} dev: true + /doctypes/1.1.0: + resolution: {integrity: sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=} + dev: false + /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -910,6 +1021,50 @@ packages: is-arrayish: 0.2.1 dev: true + /es-abstract/1.18.3: + resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + is-callable: 1.2.3 + is-negative-zero: 2.0.1 + is-regex: 1.1.3 + is-string: 1.0.6 + object-inspect: 1.10.3 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: false + + /es-get-iterator/1.1.2: + resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + has-symbols: 1.0.2 + is-arguments: 1.1.0 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.6 + isarray: 2.0.5 + dev: false + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.3 + is-date-object: 1.0.4 + is-symbol: 1.0.4 + dev: false + /escape-goat/2.1.1: resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} engines: {node: '>=8'} @@ -976,6 +1131,10 @@ packages: pinkie-promise: 2.0.1 dev: true + /foreach/2.0.5: + resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} + dev: false + /forever-agent/0.6.1: resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} dev: false @@ -1030,7 +1189,6 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /gauge/2.7.4: resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=} @@ -1045,6 +1203,14 @@ packages: wide-align: 1.1.3 dev: false + /get-intrinsic/1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: false + /get-stdin/4.0.1: resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=} engines: {node: '>=0.10.0'} @@ -1170,6 +1336,10 @@ packages: dev: false optional: true + /has-bigints/1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + dev: false + /has-flag/3.0.0: resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} engines: {node: '>=4'} @@ -1179,6 +1349,11 @@ packages: engines: {node: '>=8'} dev: false + /has-symbols/1.0.2: + resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} + engines: {node: '>= 0.4'} + dev: false + /has-unicode/2.0.1: resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} dev: false @@ -1193,7 +1368,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1299,16 +1473,39 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false + /is-arguments/1.1.0: + resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + dev: false + /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true + /is-bigint/1.0.2: + resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==} + dev: false + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 + /is-boolean-object/1.1.1: + resolution: {integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-callable/1.2.3: + resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==} + engines: {node: '>= 0.4'} + dev: false + /is-ci/2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true @@ -1320,7 +1517,18 @@ packages: resolution: {integrity: sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==} dependencies: has: 1.0.3 - dev: true + + /is-date-object/1.0.4: + resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==} + engines: {node: '>= 0.4'} + dev: false + + /is-expression/4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + dev: false /is-extglob/2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} @@ -1362,11 +1570,25 @@ packages: is-path-inside: 3.0.3 dev: false + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false + + /is-negative-zero/2.0.1: + resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} + engines: {node: '>= 0.4'} + dev: false + /is-npm/4.0.0: resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} engines: {node: '>=8'} dev: false + /is-number-object/1.0.5: + resolution: {integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==} + engines: {node: '>= 0.4'} + dev: false + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1381,6 +1603,45 @@ packages: engines: {node: '>=8'} dev: false + /is-promise/2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: false + + /is-regex/1.1.3: + resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-symbols: 1.0.2 + dev: false + + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false + + /is-string/1.0.6: + resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==} + engines: {node: '>= 0.4'} + dev: false + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: false + + /is-typed-array/1.1.5: + resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + has-symbols: 1.0.2 + dev: false + /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} dev: false @@ -1389,6 +1650,14 @@ packages: resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=} dev: true + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: false + + /is-weakset/2.0.1: + resolution: {integrity: sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==} + dev: false + /is-yarn-global/0.3.0: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} dev: false @@ -1397,6 +1666,10 @@ packages: resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} dev: false + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: false @@ -1427,6 +1700,10 @@ packages: '@sideway/pinpoint': 2.0.0 dev: false + /js-stringify/1.0.2: + resolution: {integrity: sha1-Fzb939lyTyijaCrcYjCufk6Weds=} + dev: false + /js-yaml/3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1444,6 +1721,12 @@ packages: resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} dev: false + /json-merge-patch/1.0.1: + resolution: {integrity: sha512-yvT2j/jJZ2S53t+WLt1/y2pvyR1UKPl1d/tJUjwnbtwdQQcloPhGS0bkEq/L6I32l1nhleU57GTkbv64t8eHQA==} + dependencies: + deep-equal: 2.0.5 + dev: false + /json-schema-ref-parser/4.1.1: resolution: {integrity: sha512-lByoCHZ6H2zgb6NtsXIqtzQ+6Ji7iVqnrhWxsXLhF+gXmgu6E8+ErpDxCMR439MUG1nfMjWI2HAoM8l0XgSNhw==} dependencies: @@ -1510,6 +1793,13 @@ packages: dev: false optional: true + /jstransformer/1.0.0: + resolution: {integrity: sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=} + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + dev: false + /jwa/1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: @@ -1911,6 +2201,33 @@ packages: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} + /object-inspect/1.10.3: + resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} + dev: false + + /object-is/1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: false + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -1974,7 +2291,6 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true /path-type/1.1.0: resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=} @@ -2025,6 +2341,12 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false + /promise/7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + /psl/1.8.0: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: false @@ -2034,6 +2356,97 @@ packages: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: false + /pug-attrs/3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + dev: false + + /pug-code-gen/3.0.2: + resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==} + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.0.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + dev: false + + /pug-error/2.0.0: + resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} + dev: false + + /pug-filters/4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.0.0 + pug-walk: 2.0.0 + resolve: 1.20.0 + dev: false + + /pug-lexer/5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.0.0 + dev: false + + /pug-linker/4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + dependencies: + pug-error: 2.0.0 + pug-walk: 2.0.0 + dev: false + + /pug-load/3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + dev: false + + /pug-parser/6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + dependencies: + pug-error: 2.0.0 + token-stream: 1.0.0 + dev: false + + /pug-runtime/3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + dev: false + + /pug-strip-comments/2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + dependencies: + pug-error: 2.0.0 + dev: false + + /pug-walk/2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + dev: false + + /pug/3.0.2: + resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==} + dependencies: + pug-code-gen: 3.0.2 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + dev: false + /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -2135,6 +2548,14 @@ packages: strip-indent: 1.0.1 dev: true + /regexp.prototype.flags/1.3.1: + resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + /registry-auth-token/4.2.1: resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} engines: {node: '>=6.0.0'} @@ -2189,7 +2610,6 @@ packages: dependencies: is-core-module: 2.4.0 path-parse: 1.0.7 - dev: true /responselike/1.0.2: resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} @@ -2316,6 +2736,14 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.10.3 + dev: false + /signal-exit/3.0.3: resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} @@ -2418,6 +2846,20 @@ packages: strip-ansi: 6.0.0 dev: false + /string.prototype.trimend/1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + + /string.prototype.trimstart/1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -2560,6 +3002,11 @@ packages: engines: {node: '>=8'} dev: false + /to-fast-properties/2.0.0: + resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + engines: {node: '>=4'} + dev: false + /to-readable-stream/1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -2576,6 +3023,10 @@ packages: engines: {node: '>=0.6'} dev: false + /token-stream/1.0.0: + resolution: {integrity: sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=} + dev: false + /token-types/2.1.1: resolution: {integrity: sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q==} engines: {node: '>=0.1.98'} @@ -2744,6 +3195,15 @@ packages: random-bytes: 1.0.0 dev: false + /unbox-primitive/1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: false + /undefsafe/2.0.3: resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} dependencies: @@ -2827,6 +3287,43 @@ packages: dev: false optional: true + /void-elements/3.1.0: + resolution: {integrity: sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=} + engines: {node: '>=0.10.0'} + dev: false + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.2 + is-boolean-object: 1.1.1 + is-number-object: 1.0.5 + is-string: 1.0.6 + is-symbol: 1.0.4 + dev: false + + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.1 + dev: false + + /which-typed-array/1.1.4: + resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + function-bind: 1.1.1 + has-symbols: 1.0.2 + is-typed-array: 1.1.5 + dev: false + /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -2848,6 +3345,16 @@ packages: string-width: 4.2.2 dev: false + /with/7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/parser': 7.14.6 + '@babel/types': 7.14.5 + assert-never: 1.2.1 + babel-walk: 3.0.0-canary-5 + dev: false + /wkx/0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: diff --git a/public/css/common/reset.css b/public/css/common/reset.css new file mode 100644 index 0000000..6fbdd89 --- /dev/null +++ b/public/css/common/reset.css @@ -0,0 +1,57 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + + +blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul { + margin: 0; + padding: 0; +} +body, button, input, select, textarea { + font: 12px/1.5 tahoma,arial,"Hiragino Sans GB",宋体,sans-serif; +} diff --git a/public/css/common/style.css b/public/css/common/style.css new file mode 100644 index 0000000..0f144a6 --- /dev/null +++ b/public/css/common/style.css @@ -0,0 +1,89 @@ +@charset "UTF-8"; +html, +body { + background-color: #f5f5f5; + height: 100%; + overflow: hidden; +} + +.left-list { + position: absolute; + right: calc(100% + 10px); + top: 8%; + min-width: 50px; + padding: 0 10px; + line-height: 3; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.6); +} + +.left-list .item { + white-space: nowrap; +} + +.left-list .item a { + display: inline-block; + text-decoration: none; + font-size: 1.2em; +} + +.container { + width: 1100px; + margin: 0 auto; +} + +.a-flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +/* +图片类样式 +*/ +.img-wrapper { + width: 100px; + height: 100px; + overflow: hidden; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6); + border-radius: 50%; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 3px solid #000; + /* ============== * 深褐色过滤* ==============*/ +} + +.img-wrapper img { + width: 100%; + height: 100px; + -webkit-transition: 0.3s linear; + transition: 0.3s linear; +} + +.img-wrapper img:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.img-wrapper .grayscale-img { + -webkit-filter: grayscale(100%); + filter: grayscale(100%); +} + +.img-wrapper .grayscale-img:hover { + -webkit-filter: grayscale(0); + filter: grayscale(0); +} + +.img-wrapper .sepia-img { + -webkit-filter: sepia(100%); + filter: sepia(100%); +} + +.img-wrapper .sepia-img:hover { + -webkit-filter: sepia(0); + filter: sepia(0); +} +/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/public/css/common/style.css.map b/public/css/common/style.css.map new file mode 100644 index 0000000..9f4c42d --- /dev/null +++ b/public/css/common/style.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": ";AAAA,AAAA,IAAI;AACJ,IAAI,CAAC;EACH,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;CACjB;;AAED,AAAA,UAAU,CAAC;EACT,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,iBAAiB;EACxB,GAAG,EAAE,EAAE;EACP,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,MAAM;EACf,WAAW,EAAE,CAAC;EACd,UAAU,EAAE,MAAM;EAClB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,kBAAkB;CAS3C;;AAjBD,AASE,UATQ,CASR,KAAK,CAAC;EACJ,WAAW,EAAE,MAAM;CAMpB;;AAhBH,AAWI,UAXM,CASR,KAAK,CAEH,CAAC,CAAA;EACC,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,IAAI;EACrB,SAAS,EAAE,KAAK;CACjB;;AAIL,AAAA,UAAU,CAAC;EACT,KAAK,EAAE,MAAM;EACb,MAAM,EAAE,MAAM;CACf;;AAED,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,IAAI;CACd;;AAED;;EAEE;AACF,AAAA,YAAY,CAAC;EACX,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,QAAQ,EAAE,MAAM;EAChB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB;EACxC,aAAa,EAAE,GAAG;EAElB,OAAO,EAAE,YAAY;EACrB,UAAU,EAAE,UAAU;EACtB,MAAM,EAAE,cAAc;EAkBpB,gDAAgD;CASnD;;AApCD,AAUE,YAVU,CAUV,GAAG,CAAC;EACF,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,KAAK;EACb,kBAAkB,EAAE,WAAW;EAC/B,UAAU,EAAE,WAAW;CAIxB;;AAlBH,AAeI,YAfQ,CAUV,GAAG,AAKA,MAAM,CAAC;EACN,SAAS,EAAE,UAAU;CACtB;;AAjBL,AAoBE,YApBU,CAoBV,cAAc,CAAC;EACb,cAAc,EAAE,eAAe;EAC/B,MAAM,EAAE,eAAe;CACxB;;AAvBH,AAwBE,YAxBU,CAwBV,cAAc,AAAA,MAAM,CAAC;EACnB,cAAc,EAAE,YAAY;EAC5B,MAAM,EAAE,YAAY;CACrB;;AA3BH,AA4BE,YA5BU,CA4BV,UAAU,CAAC;EACT,cAAc,EAAE,WAAW;EAC3B,MAAM,EAAE,WAAW;CACpB;;AA/BH,AAgCE,YAhCU,CAgCV,UAAU,AAAA,MAAM,CAAC;EACf,cAAc,EAAE,QAAQ;EACxB,MAAM,EAAE,QAAQ;CACjB", + "sources": [ + "style.scss" + ], + "names": [], + "file": "style.css" +} \ No newline at end of file diff --git a/public/css/common/style.scss b/public/css/common/style.scss new file mode 100644 index 0000000..b4aeaf9 --- /dev/null +++ b/public/css/common/style.scss @@ -0,0 +1,75 @@ +html, +body { + background-color: #f5f5f5; + height: 100%; + overflow: hidden; +} + +.left-list { + position: absolute; + right: calc(100% + 10px); + top: 8%; + min-width: 50px; + padding: 0 10px; + line-height: 3; // 12*3=36px + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.6); + .item { + white-space: nowrap; + a{ + display: inline-block; + text-decoration: none; + font-size: 1.2em; + } + } +} + +.container { + width: 1100px; + margin: 0 auto; +} + +.a-flex { + display: flex; +} + +/* +图片类样式 +*/ +.img-wrapper { + width: 100px; + height: 100px; + overflow: hidden; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6); + border-radius: 50%; + + display: inline-block; + box-sizing: border-box; + border: 3px solid #000; + img { + width: 100%; + height: 100px; + -webkit-transition: 0.3s linear; + transition: 0.3s linear; + &:hover { + transform: scale(1.1); + } + } + + .grayscale-img { + -webkit-filter: grayscale(100%); + filter: grayscale(100%); + } + .grayscale-img:hover { + -webkit-filter: grayscale(0); + filter: grayscale(0); + } /* ============== * 深褐色过滤* ==============*/ + .sepia-img { + -webkit-filter: sepia(100%); + filter: sepia(100%); + } + .sepia-img:hover { + -webkit-filter: sepia(0); + filter: sepia(0); + } +} diff --git a/public/css/tool/_tool.scss b/public/css/tool/_tool.scss new file mode 100644 index 0000000..dddebeb --- /dev/null +++ b/public/css/tool/_tool.scss @@ -0,0 +1,36 @@ +@mixin media($type...) { + @each $screen in $type { + @if $screen == xs { + @media (max-width: 768px) { + @content; + } + } @else if $screen == sm { + @media (max-width: 920px) { + @content; + } + } @else if $screen == md { + @media (max-width: 1200px) { + @content; + } + } @else if $screen == lg { + @media (max-width: 1366px) { + @content; + } + } + } +} + +@mixin ellipsis($lines: 1) { + @if ($lines==1) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } @else { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: $lines; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + } +} diff --git a/public/css/views/404.css b/public/css/views/404.css new file mode 100644 index 0000000..02756e3 --- /dev/null +++ b/public/css/views/404.css @@ -0,0 +1,320 @@ +body{ + margin: 0; + padding: 0; +} + +#app { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + perspective: 1400px; + background: #fff; + font-family: 'Helvetica'; +} +#app #outer { + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + perspective: 1400px; + background: #fff; + transform: scale(0.75); +} +#app .wrap { + position: absolute; + width: 750px; + height: 400px; + -webkit-animation: squiggly-anim 0.3s infinite; + animation: squiggly-anim 0.3s infinite; +} +@-webkit-keyframes squiggly-anim { + 0% { + filter: url("#squiggly-0"); + } + 25% { + filter: url("#squiggly-1"); + } + 50% { + -webkit-filter: url("#squiggly-2"); + } + 75% { + filter: url("#squiggly-3"); + } + 100% { + filter: url("#squiggly-4"); + } +} +@keyframes squiggly-anim { + 0% { + filter: url("#squiggly-0"); + } + 25% { + filter: url("#squiggly-1"); + } + 50% { + -webkit-filter: url("#squiggly-2"); + } + 75% { + filter: url("#squiggly-3"); + } + 100% { + filter: url("#squiggly-4"); + } +} +#app .wrap .ghost { + position: absolute; + width: 50px; + height: 100px; + display: none; + overflow: hidden; +} +#app .wrap .ghost:nth-of-type(3) { + width: 200px; + height: 200px; + display: block; + left: 240px; + -webkit-clip-path: polygon(100% 0, 100% 67%, 82% 100%, 0 100%, 0 0); + clip-path: polygon(100% 0, 100% 67%, 82% 100%, 0 100%, 0 0); +} +#app .wrap .ghost:nth-of-type(3) .inner { + width: 50px; + height: 75px; + left: 100px; + transform-origin: 200% 100%; + box-shadow: inset 0 0 0 2px #ccc; + -webkit-animation: swing 10s ease-in-out infinite alternate; + animation: swing 10s ease-in-out infinite alternate; + transform: rotate(-90deg) translateY(75px); +} +#app .wrap .ghost:nth-of-type(3) .inner:before { + content: ''; + position: absolute; + width: 4px; + height: 4px; + background: #ccc; + border-radius: 100%; + top: 10px; + right: 10px; + box-shadow: -15px 5px 0 0 #ccc; + -webkit-animation: blink2 2s ease-in-out infinite alternate; + animation: blink2 2s ease-in-out infinite alternate; +} +@-webkit-keyframes blink2 { + to { + transform: translateX(-10px) translateY(5px); + box-shadow: -15px -5px 0 0 #ccc; + } +} +@keyframes blink2 { + to { + transform: translateX(-10px) translateY(5px); + box-shadow: -15px -5px 0 0 #ccc; + } +} +@-webkit-keyframes swing { + 68% { + transform: rotate(-90deg) translateY(75px); + } + 70% { + transform: rotate(0deg) translateY(0px); + } + 100% { + transform: rotate(0deg) translateY(0px); + } +} +@keyframes swing { + 68% { + transform: rotate(-90deg) translateY(75px); + } + 70% { + transform: rotate(0deg) translateY(0px); + } + 100% { + transform: rotate(0deg) translateY(0px); + } +} +#app .wrap .ghost:nth-of-type(3) .inner:after { + content: ''; + position: absolute; + width: 200px; + height: 125px; + bottom: -120px; + left: 0; + background: radial-gradient(circle at top, rgba(0, 0, 0, 0) 50px, #cccccc 50px, #cccccc 52px, #ffffff 52px, #ffffff 98px, #cccccc 98px, #cccccc 100px, rgba(0, 0, 0, 0) 100px); +} +#app .wrap .ghost:nth-of-type(2) { + display: block; + top: 80px; + right: 150px; +} +#app .wrap .ghost:nth-of-type(2) .inner { + -webkit-animation: peek1 10s ease-in-out infinite alternate; + animation: peek1 10s ease-in-out infinite alternate; + -webkit-animation-delay: 0.5s; + animation-delay: 0.5s; + transform: translateY(100%); +} +#app .wrap .ghost:nth-of-type(2) .inner:before { + content: ''; + position: absolute; + width: 4px; + height: 4px; + background: #ccc; + border-radius: 100%; + top: 10px; + right: 10px; + box-shadow: -15px 5px 0 0 #ccc; + -webkit-animation: blink 4s linear infinite; + animation: blink 4s linear infinite; + -webkit-animation-delay: 5s; + animation-delay: 5s; +} +#app .wrap .ghost:first-of-type { + top: 65px; + left: 50px; + transform: rotate(-35deg); + display: block; +} +#app .wrap .ghost:first-of-type .inner { + -webkit-animation: peek1 10s ease-in-out infinite alternate; + animation: peek1 10s ease-in-out infinite alternate; + transform: translateY(100%); +} +#app .wrap .ghost:first-of-type .inner:before { + content: ''; + position: absolute; + width: 4px; + height: 4px; + background: #ccc; + border-radius: 100%; + top: 10px; + left: 10px; + box-shadow: 15px 5px 0 0 #ccc; + -webkit-animation: blink 4s linear infinite; + animation: blink 4s linear infinite; + -webkit-animation-delay: 3s; + animation-delay: 3s; +} +@-webkit-keyframes blink { + 90% { + transform: scaleY(1); + } + 92% { + transform: scaleY(0); + } + 94% { + transform: scaleY(1); + } + 96% { + transform: scaleY(0); + } + 98% { + transform: scaleY(1); + } +} +@keyframes blink { + 90% { + transform: scaleY(1); + } + 92% { + transform: scaleY(0); + } + 94% { + transform: scaleY(1); + } + 96% { + transform: scaleY(0); + } + 98% { + transform: scaleY(1); + } +} +@-webkit-keyframes peek1 { + 78% { + transform: translateY(100%); + } + 80% { + transform: translateY(0%); + } + 100% { + transform: translateY(0%); + } +} +@keyframes peek1 { + 78% { + transform: translateY(100%); + } + 80% { + transform: translateY(0%); + } + 100% { + transform: translateY(0%); + } +} +#app .wrap .ghost .inner { + position: absolute; + width: 100%; + height: 100%; + box-shadow: inset 0 0 0 2px #ccc, inset 0 -10px 20px rgba(0, 0, 0, 0.05); + border-radius: 100px 100px 0 0; + top: 3px; + transform-style: preserve-3d; + background: #fff; +} +#app h1 { + z-index: -1; + font-size: 500px; + margin: 0px; + color: #fff; + transform-style: preserve-3d; + transform: rotateY(-30deg) rotateX(50deg); + text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white; + transition: 0.2s ease-in-out; + -webkit-animation: shadow 10s ease-in-out infinite alternate; + animation: shadow 10s ease-in-out infinite alternate; + margin-right: -50px; + will-change: text-shadow; +} +#app h1:nth-of-type(1) { + -webkit-animation-delay: 0.33333s; + animation-delay: 0.33333s; +} +#app h1:nth-of-type(2) { + -webkit-animation-delay: 0.66667s; + animation-delay: 0.66667s; +} +#app h1:nth-of-type(3) { + -webkit-animation-delay: 1s; + animation-delay: 1s; +} +@-webkit-keyframes shadow { + 15% { + transform: rotateY(-30deg) rotateX(50deg) translateY(0px) translateX(0px); + text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9; + } + 25% { + transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px); + text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray; + } + 100% { + transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px); + text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray; + } +} +@keyframes shadow { + 15% { + transform: rotateY(-30deg) rotateX(50deg) translateY(0px) translateX(0px); + text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9; + } + 25% { + transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px); + text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray; + } + 100% { + transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px); + text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray; + } +} diff --git a/public/css/views/color.css b/public/css/views/color.css new file mode 100644 index 0000000..4304a07 --- /dev/null +++ b/public/css/views/color.css @@ -0,0 +1,95 @@ +.page { + min-height: 100%; + padding-top: 20px; + position: relative; +} + +.color_list { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.color_list .color_item { + position: relative; + display: inline-block; + border-radius: 5px; + overflow: hidden; + padding: 5px 10px; + cursor: pointer; + width: 100px; + height: 125px; +} + +.color_list .color_item:hover .color_add { + -webkit-transform: translate(-50%, -50%) scale(1.3); + transform: translate(-50%, -50%) scale(1.3); +} + +.color_list .color_item .color_add { + width: 50px; + height: 50px; + position: absolute; + top: 50%; + left: 50%; + -webkit-transition: -webkit-transform .3s linear; + transition: -webkit-transform .3s linear; + transition: transform .3s linear; + transition: transform .3s linear, -webkit-transform .3s linear; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.color_list .color_item:hover { + background-color: rgba(0, 0, 0, 0.041); +} + +.color_list .color_item:hover .color_toggle_list { + max-height: 99px; +} + +.color_list .color_item .color_toggle_list { + overflow: hidden; + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-height: 0; + -webkit-transition: max-height .5s linear; + transition: max-height .5s linear; + background-color: rgba(180, 180, 180, 0.274); +} + +.color_list .color_item .color_toggle_list .color_toggle_item { + display: inline-block; + padding: 2px 6px; +} + +.color_list .color_item .color_toggle_list .color_toggle_item:hover { + background-color: rgba(0, 0, 0, 0.185); +} + +.color_list .color_item .color_item_bg { + height: 50px; + background-color: red; + position: relative; +} + +.color_list .color_item .color_item_content .color_item_title { + font-size: 1.2em; + font-weight: bold; +} + +.color_list .color_item .color_item_content .color_item_desc { + color: #a7a6a6; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; +} +/*# sourceMappingURL=color.css.map */ \ No newline at end of file diff --git a/public/css/views/color.css.map b/public/css/views/color.css.map new file mode 100644 index 0000000..bf1e812 --- /dev/null +++ b/public/css/views/color.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,KAAK,CAAC;EACJ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;CACnB;;AAED,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;CAgEhB;;AAlED,AAGE,WAHS,CAGT,WAAW,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,QAAQ;EACjB,MAAM,EAAE,OAAO;EACf,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;CAsDd;;AAjEH,AAaM,WAbK,CAGT,WAAW,AASR,MAAM,CACL,UAAU,CAAA;EACR,SAAS,EAAE,qBAAoB,CAAC,UAAU;CAC3C;;AAfP,AAiBI,WAjBO,CAGT,WAAW,CAcT,UAAU,CAAA;EACR,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,oBAAoB;EAChC,SAAS,EAAE,qBAAoB;CAChC;;AAzBL,AA0BI,WA1BO,CAGT,WAAW,AAuBR,MAAM,CAAC;EACN,gBAAgB,EAAE,oBAAoB;CAIvC;;AA/BL,AA4BM,WA5BK,CAGT,WAAW,AAuBR,MAAM,CAEL,kBAAkB,CAAC;EACjB,UAAU,EAAE,IAAI;CACjB;;AA9BP,AAgCI,WAhCO,CAGT,WAAW,CA6BT,kBAAkB,CAAC;EACjB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,CAAC;EACb,UAAU,EAAE,qBAAqB;EACjC,gBAAgB,EAAE,0BAA0B;CAQ7C;;AAjDL,AA0CM,WA1CK,CAGT,WAAW,CA6BT,kBAAkB,CAUhB,kBAAkB,CAAC;EACjB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,OAAO;CAIjB;;AAhDP,AA6CQ,WA7CG,CAGT,WAAW,CA6BT,kBAAkB,CAUhB,kBAAkB,AAGf,MAAM,CAAC;EACN,gBAAgB,EAAE,oBAAoB;CACvC;;AA/CT,AAkDI,WAlDO,CAGT,WAAW,CA+CT,cAAc,CAAC;EACb,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,GAAG;EACrB,QAAQ,EAAE,QAAQ;CACnB;;AAtDL,AAwDM,WAxDK,CAGT,WAAW,CAoDT,mBAAmB,CACjB,iBAAiB,CAAC;EAChB,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,IAAI;CAClB;;AA3DP,AA4DM,WA5DK,CAGT,WAAW,CAoDT,mBAAmB,CAKjB,gBAAgB,CAAC;EACf,KAAK,EAAE,OAAkB;ECzC7B,OAAO,EAAE,WAAW;EACpB,kBAAkB,EAAE,QAAQ;EAC5B,kBAAkB,EDwCI,CAAC;ECvCvB,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE,SAAS;CDsClB", + "sources": [ + "color.scss", + "../tool/_tool.scss" + ], + "names": [], + "file": "color.css" +} \ No newline at end of file diff --git a/public/css/views/color.scss b/public/css/views/color.scss new file mode 100644 index 0000000..954015b --- /dev/null +++ b/public/css/views/color.scss @@ -0,0 +1,75 @@ +@import "../tool/tool"; + +.page { + min-height: 100%; + padding-top: 20px; + position: relative; +} + +.color_list { + display: flex; + flex-wrap: wrap; + .color_item { + position: relative; + display: inline-block; + border-radius: 5px; + overflow: hidden; + padding: 5px 10px; + cursor: pointer; + width: 100px; + height: 125px; + &:hover{ + .color_add{ + transform: translate(-50%,-50%) scale(1.3); + } + } + .color_add{ + width: 50px; + height: 50px; + position: absolute; + top: 50%; + left: 50%; + transition: transform .3s linear; + transform: translate(-50%,-50%); + } + &:hover { + background-color: rgba(0, 0, 0, 0.041); + .color_toggle_list { + max-height: 99px; + } + } + .color_toggle_list { + overflow: hidden; + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-height: 0; + transition: max-height .5s linear; + background-color: rgba(180, 180, 180, 0.274); + .color_toggle_item { + display: inline-block; + padding: 2px 6px; + &:hover { + background-color: rgba(0, 0, 0, 0.185); + } + } + } + .color_item_bg { + height: 50px; + background-color: red; + position: relative; + } + .color_item_content { + .color_item_title { + font-size: 1.2em; + font-weight: bold; + } + .color_item_desc { + color: rgb(167, 166, 166); + @include ellipsis(2); + } + } + } +} diff --git a/public/css/views/index.css b/public/css/views/index.css new file mode 100644 index 0000000..2c5fd57 --- /dev/null +++ b/public/css/views/index.css @@ -0,0 +1,60 @@ +@charset "UTF-8"; +.avatar { + width: 100px; + height: 100px; + border-radius: 50%; +} + +.page { + min-height: 100%; + padding-top: 20px; + position: relative; +} + +/* + 用户信息样式 +*/ +.userinfo { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 500px; +} + +@media (max-width: 768px) { + .userinfo { + width: 100%; + } +} + +@media (max-width: 920px) { + .userinfo { + width: 100%; + } +} + +.userinfo .user_detail { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + margin-left: 10px; +} + +.userinfo .user_detail .user_name { + font-size: 1.67em; +} + +.userinfo .user_detail .user_desc { + text-indent: 10px; + padding-top: 5px; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; +} +/*# sourceMappingURL=index.css.map */ \ No newline at end of file diff --git a/public/css/views/index.css.map b/public/css/views/index.css.map new file mode 100644 index 0000000..0abe0d2 --- /dev/null +++ b/public/css/views/index.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": ";AAOA,AAAA,OAAO,CAAA;EACL,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,aAAa,EAAE,GAAG;CACnB;;AAED,AAAA,KAAK,CAAA;EACH,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;CACnB;;AAED;;EAEE;AACF,AAAA,SAAS,CAAA;EACP,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,KAAK;CAgBb;;ACtCK,MAAM,EAAE,SAAS,EAAE,KAAK;EDmB9B,AAAA,SAAS,CAAA;IAKL,KAAK,EAAE,IAAI;GAcd;;;AClCK,MAAM,EAAE,SAAS,EAAE,KAAK;EDe9B,AAAA,SAAS,CAAA;IAKL,KAAK,EAAE,IAAI;GAcd;;;AAnBD,AAOE,SAPO,CAOP,YAAY,CAAA;EACV,IAAI,EAAE,CAAC;EACP,WAAW,EAAE,IAAI;CASlB;;AAlBH,AAUI,SAVK,CAOP,YAAY,CAGV,UAAU,CAAA;EACR,SAAS,EAAE,MAAM;CAClB;;AAZL,AAaI,SAbK,CAOP,YAAY,CAMV,UAAU,CAAA;EACR,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,GAAG;ECTlB,OAAO,EAAE,WAAW;EACpB,kBAAkB,EAAE,QAAQ;EAC5B,kBAAkB,EDQE,CAAC;ECPrB,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE,SAAS;CDMpB", + "sources": [ + "index.scss", + "../tool/_tool.scss" + ], + "names": [], + "file": "index.css" +} \ No newline at end of file diff --git a/public/css/views/index.scss b/public/css/views/index.scss new file mode 100644 index 0000000..3534111 --- /dev/null +++ b/public/css/views/index.scss @@ -0,0 +1,43 @@ +@import "../tool/tool"; + +// body{ +// background-image: url(/public/image/gezi.png); +// background-size: 20px 20px; +// } + +.avatar{ + width: 100px; + height: 100px; + border-radius: 50%; +} + +.page{ + min-height: 100%; + padding-top: 20px; + position: relative; +} + +/* + 用户信息样式 +*/ +.userinfo{ + display: flex; + align-items: center; + width: 500px; + @include media(xs,sm) { + width: 100%; + } + .user_detail{ + flex: 1; + margin-left: 10px; + .user_name{ + font-size: 1.67em; // 20px/12 + } + .user_desc{ + text-indent: 10px; // + padding-top: 5px; + @include ellipsis(3) + } + } +} + diff --git a/public/image/add.png b/public/image/add.png new file mode 100644 index 0000000..9b04554 Binary files /dev/null and b/public/image/add.png differ diff --git a/public/style.css b/public/style.css deleted file mode 100644 index 595fcdb..0000000 --- a/public/style.css +++ /dev/null @@ -1,3 +0,0 @@ -*{ - color: red; -} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..7edcecf --- /dev/null +++ b/readme.md @@ -0,0 +1,5 @@ +* http://html2jade.org/ +* https://darkmodejs.learn.uno/ +* https://blog.csdn.net/weixin_39923599/article/details/111214071 +* https://pugjs.org/language/attributes.html +* https://blog.meathill.com/tech/fe/interpolation-in-pug-with-extends.html \ No newline at end of file diff --git a/source/db/data.db b/source/db/data.db index bc83ce7..1295270 100644 Binary files a/source/db/data.db and b/source/db/data.db differ diff --git a/source/db/init.ts b/source/db/init.ts index 49e9002..14327d5 100644 --- a/source/db/init.ts +++ b/source/db/init.ts @@ -1,11 +1,17 @@ -import {connect} from "@/db/index" -import User from "@/model/User" + +import {connect, sequelize} from "@/db/index" + +import "@/model/User" +import "@/model/Color" const argv = require('minimist')(process.argv.slice(2)); -const isForce = !!(argv._.indexOf("force")!=-1) || false +const isForce = !!(argv._.indexOf("force")!=-1) || false // 会把之前的表删除,慎用 const isAlter = !!(argv._.indexOf("alter")!=-1) || false connect().then(()=>{ - User.sync({force: isForce,alter: isAlter}) -}) \ No newline at end of file + sequelize.sync({force: isForce,alter: isAlter}); + // User.sync({force: isForce,alter: isAlter}) + // Color.sync({force: isForce,alter: isAlter}) + // ColorChunk.sync({force: isForce,alter: isAlter}) +}) diff --git a/source/model/Color.ts b/source/model/Color.ts new file mode 100644 index 0000000..00f5815 --- /dev/null +++ b/source/model/Color.ts @@ -0,0 +1,27 @@ +import { sequelize, connect } from "@/db/index"; +import { DataTypes } from "sequelize"; +/** + * 图片解析表: + */ +const Color = sequelize.define( + "Color", + { + // 图片地址 + color: { + type: DataTypes.STRING + }, + title: { + type: DataTypes.STRING, + allowNull: true + }, + describe: { + type: DataTypes.STRING, + allowNull: true + }, + }, + { + timestamps: false, + } +); + +export { Color }; diff --git a/source/plugins/index.ts b/source/plugins/index.ts index 1d2a7a5..31b8f21 100644 --- a/source/plugins/index.ts +++ b/source/plugins/index.ts @@ -11,6 +11,7 @@ export default [ plugin: routePlugin, options: { sourceDir: path.resolve(sourceDir, "route"), + type: "session" }, }, ]; diff --git a/source/route/api/user/index.ts b/source/route/api/user/index.ts index ca57e33..e29af3d 100644 --- a/source/route/api/user/index.ts +++ b/source/route/api/user/index.ts @@ -63,7 +63,7 @@ export default class { @method("DELETE") @auth() @route("/del") - @swagger("删除用户", "删除用户账号", ["api"]) + @swagger("删除用户", "删除用户账号", ["sum"]) async del(request, h) { const { id } = request.auth.credentials; let result = await User.findOne({ where: { id: id } }); @@ -78,10 +78,10 @@ export default class { @route("/userinfo") @validate({ headers: Joi.object({ - Authorization: Joi.string(), + test: Joi.number(), }).unknown(), // 注意加上这个 }) - @swagger("获取用户信息", "返回注册用户的信息", ["api"]) + @swagger("获取用户信息", "返回注册用户的信息", ["用户操作","api"]) async userinfo(request, h) { console.log(request); const { id } = request.auth.credentials; diff --git a/source/route/api/wx/index.ts b/source/route/api/wx/index.ts new file mode 100644 index 0000000..728133c --- /dev/null +++ b/source/route/api/wx/index.ts @@ -0,0 +1,7 @@ + + +export default class { + wxinit(req,h){ + // const {subgbat÷}÷ + } +} diff --git a/source/route/color/index.ts b/source/route/color/index.ts new file mode 100644 index 0000000..d986644 --- /dev/null +++ b/source/route/color/index.ts @@ -0,0 +1,46 @@ +import { Color } from "@/model/Color"; +import { gFail, gSuccess } from "@/util"; +import Joi from "joi"; +import { auth, method, route, validate } from "@noderun/hapi-router"; + +export default class { + + index(request,h){ + return h.view('views/color.pug') + } + + @method("POST") + @route("/add") + @validate({ + payload: Joi.object({ + color: Joi.string().required(), + title: Joi.string(), + describe: Joi.string(), + }), + }) + async add(request, h) { + let { color, title, describe } = request.payload || {}; + try { + await Color.create({ color, title, describe }); + return gSuccess("success"); + } catch (error) { + request.log("error", error); + return gFail(null, "添加颜色失败"); + } + } + + @method("GET") + @route("/all_color") + async getAll(request, h) { + try { + let allColors = await Color.findAll(); + if (allColors == null) { + return gFail(null, "不存在颜色"); + } + return gSuccess(allColors, "success"); + } catch (error) { + request.log("error", error); + return gFail(null, "获取颜色失败"); + } + } +} diff --git a/source/route/index/_upload.ts b/source/route/demo/_upload.ts similarity index 96% rename from source/route/index/_upload.ts rename to source/route/demo/_upload.ts index 8c1943d..b5d1695 100644 --- a/source/route/index/_upload.ts +++ b/source/route/demo/_upload.ts @@ -53,8 +53,7 @@ export default function (req, h) { "the form is " + Math.floor(percentComplete) + "%" + " complete" ); }); - - form.parse(req.payload, async function (err, fields, files) { + form.parse(req.payload.file, async function (err, fields, files) { // console.log(err, fields, files); if (err) { diff --git a/source/route/demo/index.ts b/source/route/demo/index.ts new file mode 100644 index 0000000..08612ad --- /dev/null +++ b/source/route/demo/index.ts @@ -0,0 +1,35 @@ +import { config, method, route, swagger, validate } from "@noderun/hapi-router"; +import UploadFunc from "./_upload"; +import Joi from "joi"; +export default class { + index(request, h) { + return h.view("views/demo.ejs"); + } + + @config({ + payload: { + maxBytes: 20000 * 1024 * 1024, + output: "stream", + parse: false, + // multipart: true, + allow: "multipart/form-data", + } + }) + @method("POST") + @swagger("文件上传", "文件上传a ", ["sum", "api"]) + async upload(req, h) { + const startTime = new Date().getTime(); + const res = await UploadFunc(req, h); + const endTime = new Date().getTime(); + console.log( + `该请求处理时间为:${Number(endTime - startTime).toFixed(2)}ms` + ); + return res; + } + + @route("/{path*}") + async 404(req, h) { + // 404页面 + return h.view("404.ejs"); + } +} diff --git a/source/route/index/color.ts b/source/route/index/color.ts new file mode 100644 index 0000000..0935ddd --- /dev/null +++ b/source/route/index/color.ts @@ -0,0 +1,7 @@ + + +export default class { + index(req, h){ + + } +} diff --git a/source/route/index/index.ts b/source/route/index/index.ts index 3f0a0ab..4c31610 100644 --- a/source/route/index/index.ts +++ b/source/route/index/index.ts @@ -1,33 +1,63 @@ -import { config, method, route } from "@noderun/hapi-router"; -import UploadFunc from "./_upload"; - +import { + auth, + config, + method, + route, + swagger, + validate, +} from "@noderun/hapi-router"; +import UploadFunc from "../demo/_upload"; +import Joi from "joi"; +import User from "@/model/User"; +import * as bcrypt from "bcrypt"; export default class { + @auth() + @config({ + auth: { + mode: "try" + } + }) index(request, h) { - return h.view("views/index.ejs"); + // console.log(request.auth); + if(request.isAuthenticated){ + // 登录了 + }else{ + // 未登录 + } + return h.view("views/index.pug"); + } + @method("GET") + @route("/login") + loginView(request, h) { + return h.view("views/login.ejs"); } - @config({ - payload: { - maxBytes: 20000 * 1024 * 1024, - output: "stream", - parse: false, - allow: "multipart/form-data", - }, - }) @method("POST") - async upload(req, h) { - const startTime = new Date().getTime(); - const res = await UploadFunc(req, h); - const endTime = new Date().getTime(); - console.log( - `该请求处理时间为:${Number(endTime - startTime).toFixed(2)}ms` - ); - return res; + @auth(false) + @route("/login") + async login(request, h) { + const { username, password } = request.payload; + const account = await User.findOne({ where: { username: username } }); + + if (!account || !(await bcrypt.compare(password, account.password))) { + return h.view("/login"); + } + + request.cookieAuth.set({ id: account.id }); + + return h.redirect("/"); + } + + @route("/about") + @auth() + about(request, h) { + console.log(request.auth); + return h.view("views/about.ejs"); } @route("/{path*}") async 404(req, h) { // 404页面 - return h.view("404.ejs"); + return h.view("404.pug"); } } diff --git a/source/route/route.txt b/source/route/route.txt index c0b60fa..6abdb08 100644 --- a/source/route/route.txt +++ b/source/route/route.txt @@ -4,6 +4,16 @@ /api/user/login 该路由不需要权限 /api/user/del 该路由需要权限 /api/user/userinfo 该路由需要权限 +/api/wx/wxinit 该路由需要权限 +/color 该路由不需要权限 +/color/add 该路由不需要权限 +/color/all_color 该路由不需要权限 +/demo/{path*} 该路由不需要权限 +/demo 该路由不需要权限 +/demo/upload 该路由不需要权限 +/index/color 该路由不需要权限 /{path*} 该路由不需要权限 -/ 该路由不需要权限 -/upload 该路由不需要权限 \ No newline at end of file +/ 该路由需要权限 +/login 该路由不需要权限 +/login 该路由不需要权限 +/about 该路由需要权限 \ No newline at end of file diff --git a/source/run.ts b/source/run.ts index f828f20..3b1ada8 100644 --- a/source/run.ts +++ b/source/run.ts @@ -1,7 +1,8 @@ "use strict"; import plugins from "@/plugins"; -import { baseDir } from "@/util"; -import validate from "./validate"; +import path from "path"; +import { baseDir,templateDir } from "@/util"; +import { validateJwt, validateSession } from "./validate"; const Hapi = require("@hapi/hapi"); // const HapiSwagger = require("hapi-swagger"); // const HapiSwagger = require("hapi-swaggered-ui"); // swagger v2版本 @@ -15,13 +16,26 @@ const run = async () => { /** * jwt */ - await server.register(require("hapi-auth-jwt2")); - server.auth.strategy("jwt", "jwt", { - key: process.env.KEY, // Never Share your secret key - validate, // validate function defined above - verifyOptions: { algorithms: ["HS256"] }, + // await server.register(require("hapi-auth-jwt2")); + // server.auth.strategy("jwt", "jwt", { + // key: process.env.KEY, // Never Share your secret key + // validate: validateJwt, // validate function defined above + // verifyOptions: { algorithms: ["HS256"] }, + // }); + /** + * cookie + */ + await server.register(require("@hapi/cookie")); + server.auth.strategy("session", "cookie", { + cookie: { + name: "sid", //cookie的名字 + password: process.env.KEY, + isSecure: false, + }, + redirectTo: "/login", + validateFunc: validateSession, }); - server.auth.default("jwt"); + server.auth.default("session"); await server.register(plugins, { routes: { @@ -37,12 +51,20 @@ const run = async () => { server.views({ engines: { ejs: require("ejs"), + pug: require("pug") }, isCached: process.env.NODE_ENV === "development" ? false : true, - compileMode: "sync", + compileMode: "sync", // ejs relativeTo: baseDir, - layout: true, + layout: false, // ejs + layoutPath: path.resolve(templateDir,"layout"), // ejs path: "template", + // pug + compileOptions: { + // By default Pug uses relative paths (e.g. ../root.pug), when using absolute paths (e.g. include /root.pug), basedir is prepended. + // https://pugjs.org/language/includes.html + basedir: templateDir, + }, }); // http://localhost:3000/documentation @@ -55,6 +77,25 @@ const run = async () => { title: "Dream 文档", version: "1.0.0", }, + grouping: "tags", + tags: [ + { + name: "sum", + description: "working with maths", + externalDocs: { + description: "Find out more", + url: "http://example.org", + }, + }, + { + name: "store", + description: "storing data", + externalDocs: { + description: "Find out more", + url: "http://example.org", + }, + }, + ], }, }, ]); diff --git a/source/util/index.ts b/source/util/index.ts index f3a6c08..521e8ab 100644 --- a/source/util/index.ts +++ b/source/util/index.ts @@ -6,4 +6,4 @@ export const baseDir = path.resolve(__dirname, "../../"); export const sourceDir = path.resolve(__dirname, "../../source"); export const publicDir = path.resolve(__dirname, "../../public"); export const uploadDir = path.resolve(publicDir, "upload"); -export const templateDir = path.resolve(publicDir, "template"); +export const templateDir = path.resolve(baseDir, "template"); diff --git a/source/validate.ts b/source/validate.ts index bb72c05..102f8d0 100644 --- a/source/validate.ts +++ b/source/validate.ts @@ -1,6 +1,6 @@ import User from "@/model/User"; -export default async function validate(decoded, request, h) { +export async function validateJwt(decoded, request, h) { if (decoded.id) { const result = await User.findOne({ where: { id: decoded.id } }); if (result == null) { @@ -11,3 +11,17 @@ export default async function validate(decoded, request, h) { return { isValid: false }; } } + +export async function validateSession(request, session) { + console.log(`session id: ${session.id}`); + + if (session.id) { + const result = await User.findOne({ where: { id: session.id } }); + if (result == null) { + return { valid: false }; + } + return { valid: true, credentials: result }; + } else { + return { valid: false }; + } +} diff --git a/template/404.ejs b/template/404.ejs deleted file mode 100644 index f1b1cb3..0000000 --- a/template/404.ejs +++ /dev/null @@ -1 +0,0 @@ -404 diff --git a/template/404.pug b/template/404.pug new file mode 100644 index 0000000..2ab1e4a --- /dev/null +++ b/template/404.pug @@ -0,0 +1,35 @@ +extends layout/layout + +block head + link(rel="stylesheet", href="/public/css/views/404.css") + +block content + #app + #outer + h1 4 + h1 0 + h1 4 + .wrap + .ghost + .inner + .ghost + .inner + .ghost + .inner + svg(xmlns='http://www.w3.org/2000/svg' version='1.1' style='display: none') + defs + filter#squiggly-0 + feturbulence#turbulence(baseFrequency='0.03' numOctaves='3' result='noise' seed='0') + fedisplacementmap#displacement(in='SourceGraphic' in2='noise' scale='2') + filter#squiggly-1 + feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='1') + fedisplacementmap(in='SourceGraphic' in2='noise' scale='3') + filter#squiggly-2 + feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='2') + fedisplacementmap(in='SourceGraphic' in2='noise' scale='0.5') + filter#squiggly-3 + feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='3') + fedisplacementmap(in='SourceGraphic' in2='noise' scale='3') + filter#squiggly-4 + feturbulence#turbulence(baseFrequency='0.05' numOctaves='2' result='noise' seed='4') + fedisplacementmap(in='SourceGraphic' in2='noise' scale='1') diff --git a/template/includes/foot.ejs b/template/includes/foot.ejs deleted file mode 100644 index 308b1d0..0000000 --- a/template/includes/foot.ejs +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/template/includes/head.ejs b/template/includes/head.ejs deleted file mode 100644 index a6baca5..0000000 --- a/template/includes/head.ejs +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - Document - - - - diff --git a/template/layout.ejs b/template/layout.ejs deleted file mode 100644 index 60aca26..0000000 --- a/template/layout.ejs +++ /dev/null @@ -1,4 +0,0 @@ - - <%- include("./includes/head")%> - <%- content %> - <%- include("./includes/foot")%> diff --git a/template/layout/layout.ejs b/template/layout/layout.ejs new file mode 100644 index 0000000..4561dd6 --- /dev/null +++ b/template/layout/layout.ejs @@ -0,0 +1 @@ +<%- content %> diff --git a/template/layout/layout.pug b/template/layout/layout.pug new file mode 100644 index 0000000..1b0ea5e --- /dev/null +++ b/template/layout/layout.pug @@ -0,0 +1,19 @@ +doctype html + +html(lang="en") + block var + i + head + meta(charset="UTF-8") + meta(http-equiv="X-UA-Compatible", content="IE=edge") + //- device-width 宽度低于1100像素的设备直接缩小 + meta(name="viewport", content="width=1100, initial-scale=1.0") + title #{title || 'WEB'} + link(rel="stylesheet", href="/public/css/common/style.css") + block head + i + body + block content + div no content + block script + i diff --git a/template/views/color.pug b/template/views/color.pug new file mode 100644 index 0000000..2136921 --- /dev/null +++ b/template/views/color.pug @@ -0,0 +1,52 @@ +extends /layout/layout + +block var + -title="颜色表" // 网页标题 + +block head + link(rel="stylesheet", href="/public/css/common/reset.css") + link(rel="stylesheet", href="/public/css/views/color.css") + +block content + div(class="container page") + div(class="color_list") + - + var list=[ + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + ] + each item in list + div(class="color_item") + div(class="color_item_bg") + div(class="color_toggle_list") + div(class="color_toggle_item") hex + div(class="color_toggle_item") rgba + div(class="color_item_name") #{item.color} + div(class="color_item_content") + div(class="color_item_title") #{item.title} + div(class="color_item_desc") #{item.describe || "暂无描述"} + div(class="color_item") + img(src="/public/image/add.png", alt="添加" title="添加" class="color_add") + div + form(action="POST" method="post") + div(class=".wrapper_input"): input(type="text" tabindex="1" value="sadsa" name="a") + div(class=".wrapper_input"): input(type="text" tabindex="3" value="sadsa" name="b") + button(type="submit" tabindex="2") 提交 diff --git a/template/views/demo.ejs b/template/views/demo.ejs new file mode 100644 index 0000000..cd6b412 --- /dev/null +++ b/template/views/demo.ejs @@ -0,0 +1,58 @@ +
+ + +
+
+ + diff --git a/template/views/index.ejs b/template/views/index.ejs index cd6b412..cb8d62a 100644 --- a/template/views/index.ejs +++ b/template/views/index.ejs @@ -1,58 +1,3 @@ -
- - -
-
+index - +login diff --git a/template/views/index.pug b/template/views/index.pug new file mode 100644 index 0000000..1d57ddf --- /dev/null +++ b/template/views/index.pug @@ -0,0 +1,41 @@ +extends /layout/layout + +block var + -title="时间就是金钱" // 网页标题 + +block head + link(rel="stylesheet", href="/public/css/common/reset.css") + link(rel="stylesheet", href="/public/css/views/index.css") + +block content + div(class="container page") + ul(class="left-list") + li(class="item"): a(href="/login" ) 登录/注册 + div(class="userinfo") + div(class="img-wrapper user_avatar"): img(object-fit="scale-down" src="https://scpic.chinaz.net/files/pic/pic9/202106/apic33329.jpg") + div(class="user_detail") + -username = "谢亚昕" + - + describe = ` + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + 来自南方的小城,喜爱悠闲 + ` + .user_name #{username} + div(class="user_desc" title=describe ) + |#{describe} + + //- script(src='https://cdn.jsdelivr.net/npm/darkmode-js@1.5.7/lib/darkmode-js.min.js') + //- script. + //- function addDarkmodeWidget() { + //- new Darkmode().showWidget(); + //- } + //- window.addEventListener('load', addDarkmodeWidget); diff --git a/template/views/login.ejs b/template/views/login.ejs new file mode 100644 index 0000000..191c7c4 --- /dev/null +++ b/template/views/login.ejs @@ -0,0 +1,6 @@ +

Please Log In

+
+ Username:
+ Password:
+ +